From f733c43c87a0b64175e26e0e9a4833291c1d04c4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 11 Aug 2024 15:36:26 +0800 Subject: [PATCH 0001/2029] modify code --- src/class121/Code05_FireFighting1.java | 10 +++------- src/class121/Code05_FireFighting2.java | 2 +- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/class121/Code05_FireFighting1.java b/src/class121/Code05_FireFighting1.java index f95769325..a74109a66 100644 --- a/src/class121/Code05_FireFighting1.java +++ b/src/class121/Code05_FireFighting1.java @@ -127,15 +127,10 @@ public static int compute() { // 用h和t表示单调队列的头和尾 int h = 0, t = 0; int ans = Integer.MAX_VALUE; - // 直径上维护的窗口[l...r-1] + // 窗口范围[l,r),左闭右开,直径上的窗口[l...r-1] // l是窗口左端点,r是窗口右端点的再下一个点 - // (右端点只到了r前一个节点) - // [l, r)左闭右开 + // 课上图解是从start到end,实际是从end到start,思路没有区别 for (int l = end, r = end; l != 0; l = last[l]) { - // 课上图解是从start到end - // 实际是从end到start - // 思路没有区别 - suml += pred[l]; while (r != 0 && sumr - suml + pred[r] <= s) { while (h < t && maxDist[queue[t - 1]] <= maxDist[r]) { t--; @@ -148,6 +143,7 @@ public static int compute() { if (queue[h] == l) { h++; } + suml += pred[l]; } return ans; } diff --git a/src/class121/Code05_FireFighting2.java b/src/class121/Code05_FireFighting2.java index f8d974a30..d4fa0e3cb 100644 --- a/src/class121/Code05_FireFighting2.java +++ b/src/class121/Code05_FireFighting2.java @@ -157,7 +157,6 @@ public static int compute() { int h = 0, t = 0; int ans = Integer.MAX_VALUE; for (int l = end, r = end; l != 0; l = last[l]) { - suml += pred[l]; while (r != 0 && sumr + pred[r] - suml <= s) { while (h < t && maxDist[queue[t - 1]] <= maxDist[r]) { t--; @@ -170,6 +169,7 @@ public static int compute() { if (queue[h] == l) { h++; } + suml += pred[l]; } return ans; } From 04e1ab412503e0e581975b7447f3a2050f1384b8 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 13 Aug 2024 17:32:14 +0800 Subject: [PATCH 0002/2029] modify code --- src/class139/Code01.java | 35 ++++++++++++++++ src/class139/Code02.java | 44 +++++++++++++++++++ src/class139/Code03.java | 35 ++++++++++++++++ src/class139/Code04.java | 91 ++++++++++++++++++++++++++++++++++++++++ src/class139/Code05.java | 87 ++++++++++++++++++++++++++++++++++++++ src/class139/Exgcd.java | 57 +++++++++++++++++++++++++ src/class140/Code01.java | 6 +++ src/class140/Code02.java | 7 ++++ src/class140/Code03.java | 6 +++ src/class140/Code04.java | 6 +++ src/class140/Code05.java | 6 +++ 11 files changed, 380 insertions(+) create mode 100644 src/class139/Code01.java create mode 100644 src/class139/Code02.java create mode 100644 src/class139/Code03.java create mode 100644 src/class139/Code04.java create mode 100644 src/class139/Code05.java create mode 100644 src/class139/Exgcd.java create mode 100644 src/class140/Code01.java create mode 100644 src/class140/Code02.java create mode 100644 src/class140/Code03.java create mode 100644 src/class140/Code04.java create mode 100644 src/class140/Code05.java diff --git a/src/class139/Code01.java b/src/class139/Code01.java new file mode 100644 index 000000000..c98481ea9 --- /dev/null +++ b/src/class139/Code01.java @@ -0,0 +1,35 @@ +package class139; + +// 测试链接 : https://www.luogu.com.cn/problem/P4549 + +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 Code01 { + + public static int gcd(int a, int b) { + return b == 0 ? a : gcd(b, a % b); + } + + 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(); + int n = (int) in.nval; + int ans = 0; + for (int i = 1; i <= n; i++) { + in.nextToken(); + ans = gcd(Math.abs((int) in.nval), ans); + } + out.println(ans); + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class139/Code02.java b/src/class139/Code02.java new file mode 100644 index 000000000..3f5b9afde --- /dev/null +++ b/src/class139/Code02.java @@ -0,0 +1,44 @@ +package class139; + +// 测试链接 : https://acm.hdu.edu.cn/showproblem.php?pid=5512 +// 测试链接 : https://vjudge.net/problem/HDU-5512 + +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 Code02 { + + public static int gcd(int a, int b) { + return b == 0 ? a : gcd(b, a % b); + } + + 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(); + int cases = (int) in.nval; + for (int t = 1, n, a, b; t <= cases; t++) { + in.nextToken(); + n = (int) in.nval; + in.nextToken(); + a = (int) in.nval; + in.nextToken(); + b = (int) in.nval; + out.print("Case #" + t + ": "); + if (((n / gcd(a, b)) & 1) == 1) { + out.println("Yuwgna"); + } else { + out.println("Iaka"); + } + } + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class139/Code03.java b/src/class139/Code03.java new file mode 100644 index 000000000..c27a65768 --- /dev/null +++ b/src/class139/Code03.java @@ -0,0 +1,35 @@ +package class139; + +// 测试链接 : http://poj.org/problem?id=1597 + +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 Code03 { + + public static int gcd(int a, int b) { + return b == 0 ? a : gcd(b, a % b); + } + + 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) { + int step = (int) in.nval; + in.nextToken(); + int mod = (int) in.nval; + out.print(String.format("%10d", step) + String.format("%10d", mod) + " "); + out.println(gcd(step, mod) == 1 ? "Good Choice" : "Bad Choice"); + out.println(" "); + } + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class139/Code04.java b/src/class139/Code04.java new file mode 100644 index 000000000..9e22ad711 --- /dev/null +++ b/src/class139/Code04.java @@ -0,0 +1,91 @@ +package class139; + +// 测试链接 : https://www.luogu.com.cn/problem/P1082 + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.util.StringTokenizer; + +public class Code04 { + + // 扩展欧几里得算法 + public static long x, y; + + public static void exgcd(long a, long b) { + long n = 0, m = 1, pn = 1, pm = 0, tmp, q, r; + while (b != 0) { + q = a / b; + r = a % b; + a = b; + b = r; + tmp = n; + n = pn - q * n; + pn = tmp; + tmp = m; + m = pm - q * m; + pm = tmp; + } + x = pn; + y = pm; + } + + public static void main(String[] args) throws IOException { + Kattio io = new Kattio(); + long a = io.nextLong(); + long b = io.nextLong(); + exgcd(a, b); + io.println((x % b + b) % b); + io.flush(); + io.close(); + } + + // Kattio类IO效率很好,但还是不如StreamTokenizer + // 只有StreamTokenizer无法正确处理时,才考虑使用这个类 + // 参考链接 : https://oi-wiki.org/lang/java-pro/ + public static class Kattio extends PrintWriter { + private BufferedReader r; + private StringTokenizer st; + + public Kattio() { + this(System.in, System.out); + } + + public Kattio(InputStream i, OutputStream o) { + super(o); + r = new BufferedReader(new InputStreamReader(i)); + } + + public Kattio(String intput, String output) throws IOException { + super(output); + r = new BufferedReader(new FileReader(intput)); + } + + public String next() { + try { + while (st == null || !st.hasMoreTokens()) + st = new StringTokenizer(r.readLine()); + return st.nextToken(); + } catch (Exception e) { + } + return null; + } + + public int nextInt() { + return Integer.parseInt(next()); + } + + public double nextDouble() { + return Double.parseDouble(next()); + } + + public long nextLong() { + return Long.parseLong(next()); + } + } + +} diff --git a/src/class139/Code05.java b/src/class139/Code05.java new file mode 100644 index 000000000..45ec74b15 --- /dev/null +++ b/src/class139/Code05.java @@ -0,0 +1,87 @@ +package class139; + +// 测试链接 : https://www.luogu.com.cn/problem/P2054 + +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 Code05 { + + // 扩展欧几里得算法 + public static long x, y; + + public static void exgcd(long a, long b) { + long n = 0, m = 1, pn = 1, pm = 0, tmp, q, r; + while (b != 0) { + q = a / b; + r = a % b; + a = b; + b = r; + tmp = n; + n = pn - q * n; + pn = tmp; + tmp = m; + m = pm - q * m; + pm = tmp; + } + x = pn; + y = pm; + } + + // 原理来自,讲解033,位运算实现乘法 + // a * b的过程自己实现,每一个中间过程都 % mod + // 这么写目的是防止溢出 + public static long multiply(long a, long b, long mod) { + long ans = 0; + while (b != 0) { + if ((b & 1) != 0) { + ans = (ans + a) % mod; + } + a = (a + a) % mod; + b >>= 1; + } + return ans; + } + + // 原理来自,讲解098,乘法快速幂 + // 计算a的b次方,最终 % mod 的结果 + public static long power(long a, long b, long mod) { + long ans = 1; + while (b > 0) { + if ((b & 1) == 1) { + ans = multiply(ans, a, mod); + } + a = multiply(a, a, mod); + b >>= 1; + } + return ans; + } + + public static long compute(long n, long m, long l) { + long mod = n + 1; + exgcd(power(2, m, mod), mod); + x = (x % mod + mod) % mod; + return multiply(x, l, mod); + } + + 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(); + long n = (long) in.nval; + in.nextToken(); + long m = (long) in.nval; + in.nextToken(); + long l = (long) in.nval; + out.println(compute(n, m, l)); + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class139/Exgcd.java b/src/class139/Exgcd.java new file mode 100644 index 000000000..8b4a603e8 --- /dev/null +++ b/src/class139/Exgcd.java @@ -0,0 +1,57 @@ +package class139; + +public class Exgcd { + + // 扩展欧几里得算法 + public static long x, y; + + public static void exgcd(long a, long b) { + long n = 0, m = 1, pn = 1, pm = 0, tmp, q, r; + while (b != 0) { + q = a / b; + r = a % b; + a = b; + b = r; + tmp = n; + n = pn - q * n; + pn = tmp; + tmp = m; + m = pm - q * m; + pm = tmp; + } + x = pn; + y = pm; + } + + // 讲解099,费马小定理计算逆元 + public static long fermat(long num, long mod) { + return power(num, mod - 2, mod); + } + + public static long power(long num, long p, long mod) { + long ans = 1; + while (p > 0) { + if ((p & 1) == 1) { + ans = (ans * num) % mod; + } + num = (num * num) % mod; + p >>= 1; + } + return ans; + } + + public static void main(String[] args) { + System.out.println("测试开始"); + long mod = 1000000007; + long test = 10000000; + for (long num = 1; num <= test; num++) { + exgcd(num, mod); + x = (x % mod + mod) % mod; + if (x != fermat(num, mod)) { + System.out.println("出错了!"); + } + } + System.out.println("测试结束"); + } + +} diff --git a/src/class140/Code01.java b/src/class140/Code01.java new file mode 100644 index 000000000..273cdecea --- /dev/null +++ b/src/class140/Code01.java @@ -0,0 +1,6 @@ +package class140; + +// 测试链接 : https://lightoj.com/problem/how-many-points +public class Code01 { + +} diff --git a/src/class140/Code02.java b/src/class140/Code02.java new file mode 100644 index 000000000..5cc7dce25 --- /dev/null +++ b/src/class140/Code02.java @@ -0,0 +1,7 @@ +package class140; + +// 测试链接 : http://poj.org/problem?id=1265 + +public class Code02 { + +} diff --git a/src/class140/Code03.java b/src/class140/Code03.java new file mode 100644 index 000000000..031673196 --- /dev/null +++ b/src/class140/Code03.java @@ -0,0 +1,6 @@ +package class140; + +// 测试链接 : https://www.luogu.com.cn/problem/P5656 +public class Code03 { + +} diff --git a/src/class140/Code04.java b/src/class140/Code04.java new file mode 100644 index 000000000..865842957 --- /dev/null +++ b/src/class140/Code04.java @@ -0,0 +1,6 @@ +package class140; + +// 测试链接 : https://www.luogu.com.cn/problem/P1516 +public class Code04 { + +} diff --git a/src/class140/Code05.java b/src/class140/Code05.java new file mode 100644 index 000000000..d0eaf50ef --- /dev/null +++ b/src/class140/Code05.java @@ -0,0 +1,6 @@ +package class140; + +// 测试链接 : https://www.luogu.com.cn/problem/P3951 +public class Code05 { + +} From 3e8392241badda0b75b1de3bfc16f627bdf1ead2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 13 Aug 2024 17:39:14 +0800 Subject: [PATCH 0003/2029] modify code --- src/class140/Code02.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/class140/Code02.java b/src/class140/Code02.java index 5cc7dce25..204534745 100644 --- a/src/class140/Code02.java +++ b/src/class140/Code02.java @@ -1,7 +1,6 @@ package class140; // 测试链接 : http://poj.org/problem?id=1265 - public class Code02 { } From 204b59a4fc2525eac97c6ed981d7085f690ff113 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 15 Aug 2024 12:13:21 +0800 Subject: [PATCH 0004/2029] modify code --- src/class139/Code04.java | 25 ++++++++++--------------- src/class139/Code05.java | 25 ++++++++++--------------- src/class139/Exgcd.java | 40 +++++++++++++++++++++++----------------- src/class140/Code05.java | 22 ++++++++++++++++++++++ 4 files changed, 65 insertions(+), 47 deletions(-) diff --git a/src/class139/Code04.java b/src/class139/Code04.java index 9e22ad711..48197e981 100644 --- a/src/class139/Code04.java +++ b/src/class139/Code04.java @@ -14,24 +14,19 @@ public class Code04 { // 扩展欧几里得算法 - public static long x, y; + public static long d, x, y; public static void exgcd(long a, long b) { - long n = 0, m = 1, pn = 1, pm = 0, tmp, q, r; - while (b != 0) { - q = a / b; - r = a % b; - a = b; - b = r; - tmp = n; - n = pn - q * n; - pn = tmp; - tmp = m; - m = pm - q * m; - pm = tmp; + if (b == 0) { + d = a; + x = 1; + y = 0; + } else { + exgcd(b, a % b); + long tmp = x; + x = y; + y = tmp - a / b * y; } - x = pn; - y = pm; } public static void main(String[] args) throws IOException { diff --git a/src/class139/Code05.java b/src/class139/Code05.java index 45ec74b15..16788d4c3 100644 --- a/src/class139/Code05.java +++ b/src/class139/Code05.java @@ -12,24 +12,19 @@ public class Code05 { // 扩展欧几里得算法 - public static long x, y; + public static long d, x, y; public static void exgcd(long a, long b) { - long n = 0, m = 1, pn = 1, pm = 0, tmp, q, r; - while (b != 0) { - q = a / b; - r = a % b; - a = b; - b = r; - tmp = n; - n = pn - q * n; - pn = tmp; - tmp = m; - m = pm - q * m; - pm = tmp; + if (b == 0) { + d = a; + x = 1; + y = 0; + } else { + exgcd(b, a % b); + long tmp = x; + x = y; + y = tmp - a / b * y; } - x = pn; - y = pm; } // 原理来自,讲解033,位运算实现乘法 diff --git a/src/class139/Exgcd.java b/src/class139/Exgcd.java index 8b4a603e8..774e5b048 100644 --- a/src/class139/Exgcd.java +++ b/src/class139/Exgcd.java @@ -3,24 +3,22 @@ public class Exgcd { // 扩展欧几里得算法 - public static long x, y; + // 对于方程ax + by = gcd(a,b) + // 当a和b确定,那么gcd(a,b)也确定 + // 扩展欧几里得算法可以给出a和b的最大公约数d、以及其中一个特解x, y + public static long d, x, y; public static void exgcd(long a, long b) { - long n = 0, m = 1, pn = 1, pm = 0, tmp, q, r; - while (b != 0) { - q = a / b; - r = a % b; - a = b; - b = r; - tmp = n; - n = pn - q * n; - pn = tmp; - tmp = m; - m = pm - q * m; - pm = tmp; + if (b == 0) { + d = a; + x = 1; + y = 0; + } else { + exgcd(b, a % b); + long tmp = x; + x = y; + y = tmp - a / b * y; } - x = pn; - y = pm; } // 讲解099,费马小定理计算逆元 @@ -41,7 +39,15 @@ public static long power(long num, long p, long mod) { } public static void main(String[] args) { - System.out.println("测试开始"); + // 扩展欧几里得算法展示 + int a = 60; + int b = 100; + exgcd(a, b); + System.out.println("gcd(" + a + ", " + b + ")" + " = " + d); + System.out.println("x = " + x + ", " + " y = " + y); + + // 扩展欧几里得算法可以去求逆元 + System.out.println("逆元测试开始"); long mod = 1000000007; long test = 10000000; for (long num = 1; num <= test; num++) { @@ -51,7 +57,7 @@ public static void main(String[] args) { System.out.println("出错了!"); } } - System.out.println("测试结束"); + System.out.println("逆元测试结束"); } } diff --git a/src/class140/Code05.java b/src/class140/Code05.java index d0eaf50ef..28aec2712 100644 --- a/src/class140/Code05.java +++ b/src/class140/Code05.java @@ -1,6 +1,28 @@ package class140; // 测试链接 : https://www.luogu.com.cn/problem/P3951 + +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 Code05 { + 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(); + long a = (long) in.nval; + in.nextToken(); + long b = (long) in.nval; + out.println(a * b - a - b); + out.flush(); + out.close(); + br.close(); + } + } From 1fe4a8359e8d27b7b3fd003574b41b7de310fa5d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 15 Aug 2024 12:24:41 +0800 Subject: [PATCH 0005/2029] modify code --- src/class139/Exgcd.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class139/Exgcd.java b/src/class139/Exgcd.java index 774e5b048..223d732a2 100644 --- a/src/class139/Exgcd.java +++ b/src/class139/Exgcd.java @@ -47,7 +47,7 @@ public static void main(String[] args) { System.out.println("x = " + x + ", " + " y = " + y); // 扩展欧几里得算法可以去求逆元 - System.out.println("逆元测试开始"); + System.out.println("求逆元测试开始"); long mod = 1000000007; long test = 10000000; for (long num = 1; num <= test; num++) { @@ -57,7 +57,7 @@ public static void main(String[] args) { System.out.println("出错了!"); } } - System.out.println("逆元测试结束"); + System.out.println("求逆元测试结束"); } } From abafd1058569d278fa4f3aa8f36f97af52229bff Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 15 Aug 2024 12:26:45 +0800 Subject: [PATCH 0006/2029] modify code --- src/class139/Exgcd.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class139/Exgcd.java b/src/class139/Exgcd.java index 223d732a2..d0335959f 100644 --- a/src/class139/Exgcd.java +++ b/src/class139/Exgcd.java @@ -5,7 +5,7 @@ public class Exgcd { // 扩展欧几里得算法 // 对于方程ax + by = gcd(a,b) // 当a和b确定,那么gcd(a,b)也确定 - // 扩展欧几里得算法可以给出a和b的最大公约数d、以及其中一个特解x, y + // 扩展欧几里得算法可以给出a和b的最大公约数d、以及其中一个特解x、y public static long d, x, y; public static void exgcd(long a, long b) { @@ -39,9 +39,9 @@ public static long power(long num, long p, long mod) { } public static void main(String[] args) { - // 扩展欧几里得算法展示 - int a = 60; - int b = 100; + // 扩展欧几里得算法例子 + int a = 6; + int b = 10; exgcd(a, b); System.out.println("gcd(" + a + ", " + b + ")" + " = " + d); System.out.println("x = " + x + ", " + " y = " + y); From 0012901431bfc8d39f4d003e9e61aa18843b6b46 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 15 Aug 2024 15:41:37 +0800 Subject: [PATCH 0007/2029] modify code --- src/class140/Code01.java | 6 --- src/class140/Code01_1.java | 87 ++++++++++++++++++++++++++++++++++++++ src/class140/Code01_2.java | 61 ++++++++++++++++++++++++++ src/class140/Code02.java | 33 ++++++++++++++- src/class140/Code03.java | 2 +- src/class140/Code04.java | 2 +- 6 files changed, 182 insertions(+), 9 deletions(-) delete mode 100644 src/class140/Code01.java create mode 100644 src/class140/Code01_1.java create mode 100644 src/class140/Code01_2.java diff --git a/src/class140/Code01.java b/src/class140/Code01.java deleted file mode 100644 index 273cdecea..000000000 --- a/src/class140/Code01.java +++ /dev/null @@ -1,6 +0,0 @@ -package class140; - -// 测试链接 : https://lightoj.com/problem/how-many-points -public class Code01 { - -} diff --git a/src/class140/Code01_1.java b/src/class140/Code01_1.java new file mode 100644 index 000000000..7a937e0f0 --- /dev/null +++ b/src/class140/Code01_1.java @@ -0,0 +1,87 @@ +package class140; + +// 测试链接 : https://www.luogu.com.cn/problem/P5656 + +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 Code01_1 { + + // 扩展欧几里得算法 + public static long d, x, y; + + public static void exgcd(long a, long b) { + if (b == 0) { + d = a; + x = 1; + y = 0; + } else { + exgcd(b, a % b); + long tmp = x; + x = y; + y = tmp - a / b * y; + } + } + + 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(); + int cases = (int) in.nval; + for (int i = 1; i <= cases; i++) { + in.nextToken(); + long a = (long) in.nval; + in.nextToken(); + long b = (long) in.nval; + in.nextToken(); + long c = (long) in.nval; + exgcd(a, b); + if (c % d == 0) { + x *= c / d; + y *= c / d; + long xd = b / d; + long yd = a / d; + if (x < 0) { + // x要想增长到>=1且最小的值,差几个xd,算出来,应该是(1 - x) / xd,向上取整 + // a/b 向上取整可以写成,(a + b - 1) / b + // 所以(1 - x) / xd,向上取整为,(1 - x + xd - 1) / xd + // 化简为(xd - x) / xd + long k = (xd - x) / xd; + x += xd * k; + y -= yd * k; + } else { + // x要想减少到>=1且最小的值,差几个xd,算出来,自然向下取整 + long k = (x - 1) / xd; + x -= xd * k; + y += yd * k; + } + if (y > 0) { + // 有正整数解 + out.print(((y - 1) / yd + 1) + " "); + out.print(x + " "); + out.print(((y - 1) % yd + 1) + " "); + out.print((x + (y - 1) / yd * xd) + " "); + out.println(y); + } else { + // 无正整数解 + out.print(x + " "); + // (1 - y) / yd,向上取整为 + // ((1 - y) + yd - 1) / yd,化简成,(yd - y) / yd + out.println(y + yd * ((yd - y) / yd)); + } + } else { + // 无整数解 + out.println(-1); + } + } + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class140/Code01_2.java b/src/class140/Code01_2.java new file mode 100644 index 000000000..fd3d7aa74 --- /dev/null +++ b/src/class140/Code01_2.java @@ -0,0 +1,61 @@ +package class140; + +// 测试链接 : https://www.luogu.com.cn/problem/P5656 + +//#include +//#include +// +//using namespace std; +// +//long long d, x, y; +// +//void exgcd(long long a, long long b) { +// if (b == 0) { +// d = a; +// x = 1; +// y = 0; +// } else { +// exgcd(b, a % b); +// long long tmp = x; +// x = y; +// y = tmp - a / b * y; +// } +//} +// +//int main() { +// int cases; +// scanf("%d", &cases); +// for (int i = 1; i <= cases; i++) { +// long long a, b, c; +// scanf("%lld %lld %lld", &a, &b, &c); +// exgcd(a, b); +// if (c % d == 0) { +// x *= c / d; +// y *= c / d; +// long long xd = b / d; +// long long yd = a / d; +// if (x < 0) { +// long long k = (xd - x) / xd; +// x += xd * k; +// y -= yd * k; +// } else { +// long long k = (x - 1) / xd; +// x -= xd * k; +// y += yd * k; +// } +// if (y > 0) { +// printf("%lld ", ((y - 1) / yd + 1)); +// printf("%lld ", x); +// printf("%lld ", ((y - 1) % yd + 1)); +// printf("%lld ", (x + (y - 1) / yd * xd)); +// printf("%lld\n", y); +// } else { +// printf("%lld ", x); +// printf("%lld\n", y + yd * ((yd - y) / yd)); +// } +// } else { +// printf("-1\n"); +// } +// } +// return 0; +//} diff --git a/src/class140/Code02.java b/src/class140/Code02.java index 204534745..890beb571 100644 --- a/src/class140/Code02.java +++ b/src/class140/Code02.java @@ -1,6 +1,37 @@ package class140; -// 测试链接 : http://poj.org/problem?id=1265 +// 测试链接 : https://lightoj.com/problem/how-many-points + +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 Code02 { + public static long gcd(long a, long b) { + return b == 0 ? a : gcd(b, a % b); + } + + 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(); + int cases = (int) in.nval; + for (int i = 1; i <= cases; i++) { + in.nextToken(); long x1 = (long) in.nval; + in.nextToken(); long y1 = (long) in.nval; + in.nextToken(); long x2 = (long) in.nval; + in.nextToken(); long y2 = (long) in.nval; + long ans = gcd(Math.abs(x1 - x2), Math.abs(y1 - y2)) + 1; + out.println("Case " + i + ": " + ans); + } + out.flush(); + out.close(); + br.close(); + } + } diff --git a/src/class140/Code03.java b/src/class140/Code03.java index 031673196..678b52bb9 100644 --- a/src/class140/Code03.java +++ b/src/class140/Code03.java @@ -1,6 +1,6 @@ package class140; -// 测试链接 : https://www.luogu.com.cn/problem/P5656 +// 测试链接 : https://www.luogu.com.cn/problem/P1516 public class Code03 { } diff --git a/src/class140/Code04.java b/src/class140/Code04.java index 865842957..f45f77f44 100644 --- a/src/class140/Code04.java +++ b/src/class140/Code04.java @@ -1,6 +1,6 @@ package class140; -// 测试链接 : https://www.luogu.com.cn/problem/P1516 +// 测试链接 : http://poj.org/problem?id=1265 public class Code04 { } From e7fbf1c59a33a5f831fe71cb69cb252390a96ade Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 15 Aug 2024 15:47:20 +0800 Subject: [PATCH 0008/2029] modify code --- src/class140/Code01_1.java | 19 ++++++++++++------- src/class140/Code01_2.java | 2 ++ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/class140/Code01_1.java b/src/class140/Code01_1.java index 7a937e0f0..d2cc088f8 100644 --- a/src/class140/Code01_1.java +++ b/src/class140/Code01_1.java @@ -1,6 +1,12 @@ package class140; // 测试链接 : https://www.luogu.com.cn/problem/P5656 +// 如下实现是正确的,但是洛谷平台对空间卡的很严,只有使用C++能全部通过 +// java的版本就是无法完全通过的,空间会超过限制,主要是IO空间占用大 +// 这是洛谷平台没有照顾各种语言的实现所导致的 +// 在真正笔试、比赛时,一定是兼顾各种语言的,该实现是一定正确的 +// C++版本就是Code01_2文件 +// C++版本和java版本逻辑完全一样,但只有C++版本可以通过所有测试用例 import java.io.BufferedReader; import java.io.IOException; @@ -47,15 +53,15 @@ public static void main(String[] args) throws IOException { long xd = b / d; long yd = a / d; if (x < 0) { - // x要想增长到>=1且最小的值,差几个xd,算出来,应该是(1 - x) / xd,向上取整 - // a/b 向上取整可以写成,(a + b - 1) / b - // 所以(1 - x) / xd,向上取整为,(1 - x + xd - 1) / xd - // 化简为(xd - x) / xd + // x要想增长到>=1且最小的值,差几个xd,算出来就是k的值 + // 那应该是(1-x)/xd,结果向上取整 + // (a/b)向上取整可以写成(a+b-1)/b + // 所以(1-x)/xd,向上取整为(1-x+xd-1)/xd,化简为(xd-x)/xd long k = (xd - x) / xd; x += xd * k; y -= yd * k; } else { - // x要想减少到>=1且最小的值,差几个xd,算出来,自然向下取整 + // x要想减少到>=1且最小的值,差几个xd,算出来就是k的值,向下取整 long k = (x - 1) / xd; x -= xd * k; y += yd * k; @@ -70,8 +76,7 @@ public static void main(String[] args) throws IOException { } else { // 无正整数解 out.print(x + " "); - // (1 - y) / yd,向上取整为 - // ((1 - y) + yd - 1) / yd,化简成,(yd - y) / yd + // (1-y)/yd,向上取整为(1-y+yd-1)/yd,化简为(yd-y)/yd out.println(y + yd * ((yd - y) / yd)); } } else { diff --git a/src/class140/Code01_2.java b/src/class140/Code01_2.java index fd3d7aa74..05bc301ea 100644 --- a/src/class140/Code01_2.java +++ b/src/class140/Code01_2.java @@ -1,6 +1,8 @@ package class140; // 测试链接 : https://www.luogu.com.cn/problem/P5656 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 //#include //#include From fbc8b466f31d8f91b9a9428e4d01460ee0e02c23 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 15 Aug 2024 20:21:57 +0800 Subject: [PATCH 0009/2029] modify code --- src/class139/Exgcd.java | 2 +- src/class140/Code01_1.java | 23 ++++++++-------- src/class140/Code03.java | 55 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+), 13 deletions(-) diff --git a/src/class139/Exgcd.java b/src/class139/Exgcd.java index d0335959f..edff21521 100644 --- a/src/class139/Exgcd.java +++ b/src/class139/Exgcd.java @@ -4,7 +4,7 @@ public class Exgcd { // 扩展欧几里得算法 // 对于方程ax + by = gcd(a,b) - // 当a和b确定,那么gcd(a,b)也确定 + // 当a和b确定,那么gcd(a,b)也确定,需要保证a和b没有负数 // 扩展欧几里得算法可以给出a和b的最大公约数d、以及其中一个特解x、y public static long d, x, y; diff --git a/src/class140/Code01_1.java b/src/class140/Code01_1.java index d2cc088f8..be8da8826 100644 --- a/src/class140/Code01_1.java +++ b/src/class140/Code01_1.java @@ -47,7 +47,7 @@ public static void main(String[] args) throws IOException { in.nextToken(); long c = (long) in.nval; exgcd(a, b); - if (c % d == 0) { + if (c % d == 0) { // 有整数解 x *= c / d; y *= c / d; long xd = b / d; @@ -55,9 +55,7 @@ public static void main(String[] args) throws IOException { if (x < 0) { // x要想增长到>=1且最小的值,差几个xd,算出来就是k的值 // 那应该是(1-x)/xd,结果向上取整 - // (a/b)向上取整可以写成(a+b-1)/b - // 所以(1-x)/xd,向上取整为(1-x+xd-1)/xd,化简为(xd-x)/xd - long k = (xd - x) / xd; + long k = (1 - x + xd - 1) / xd; x += xd * k; y -= yd * k; } else { @@ -66,21 +64,22 @@ public static void main(String[] args) throws IOException { x -= xd * k; y += yd * k; } - if (y > 0) { - // 有正整数解 + if (y > 0) { // 有正整数解 + // y减少到>=1的最小值,能减几次,就是正整数解的个数 out.print(((y - 1) / yd + 1) + " "); + // x的最小正整数 out.print(x + " "); + // y的最小正整数 out.print(((y - 1) % yd + 1) + " "); + // x的最大正整数 out.print((x + (y - 1) / yd * xd) + " "); + // y的最大正整数 out.println(y); - } else { - // 无正整数解 + } else { // 无正整数解 out.print(x + " "); - // (1-y)/yd,向上取整为(1-y+yd-1)/yd,化简为(yd-y)/yd - out.println(y + yd * ((yd - y) / yd)); + out.println(y + yd * ((1 - y + yd - 1) / yd)); } - } else { - // 无整数解 + } else { // 无整数解 out.println(-1); } } diff --git a/src/class140/Code03.java b/src/class140/Code03.java index 678b52bb9..314cddc00 100644 --- a/src/class140/Code03.java +++ b/src/class140/Code03.java @@ -1,6 +1,61 @@ package class140; // 测试链接 : https://www.luogu.com.cn/problem/P1516 + +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 Code03 { + // 扩展欧几里得算法 + public static long d, x, y; + + public static void exgcd(long a, long b) { + if (b == 0) { + d = a; + x = 1; + y = 0; + } else { + exgcd(b, a % b); + long tmp = x; + x = y; + y = tmp - a / b * y; + } + } + + 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(); + long x1 = (long) in.nval; + in.nextToken(); + long x2 = (long) in.nval; + in.nextToken(); + long m = (long) in.nval; + in.nextToken(); + long n = (long) in.nval; + in.nextToken(); + long l = (long) in.nval; + long a = n - m; + long c = x1 - x2; + if (a < 0) { + a = -a; + c = -c + l; + } + exgcd(a, l); + if (c % d == 0) { + out.println(((x * c / d) % (l / d) + (l / d)) % (l / d)); + } else { + out.println("Impossible"); + } + out.flush(); + out.close(); + br.close(); + } + } From dde624a8aa0f13cc4a5d3f09d225ef7c455c0412 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 15 Aug 2024 20:26:32 +0800 Subject: [PATCH 0010/2029] modify code --- src/class139/Exgcd.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/class139/Exgcd.java b/src/class139/Exgcd.java index edff21521..3d415167b 100644 --- a/src/class139/Exgcd.java +++ b/src/class139/Exgcd.java @@ -4,8 +4,9 @@ public class Exgcd { // 扩展欧几里得算法 // 对于方程ax + by = gcd(a,b) - // 当a和b确定,那么gcd(a,b)也确定,需要保证a和b没有负数 + // 当a和b确定,那么gcd(a,b)也确定 // 扩展欧几里得算法可以给出a和b的最大公约数d、以及其中一个特解x、y + // 特别注意要保证入参a和b没有负数 public static long d, x, y; public static void exgcd(long a, long b) { From 3cdcc769b66c32de1342c2dcf8fafeb6726dc1b9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 16 Aug 2024 18:15:33 +0800 Subject: [PATCH 0011/2029] modify code --- src/class140/Code01_1.java | 2 +- src/class140/Code01_2.java | 2 +- src/class140/Code02.java | 46 ++++++++++++++++++++++++++++--------- src/class140/Code03.java | 46 +++++++++---------------------------- src/class140/Code04.java | 47 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 95 insertions(+), 48 deletions(-) diff --git a/src/class140/Code01_1.java b/src/class140/Code01_1.java index be8da8826..d0a5034c3 100644 --- a/src/class140/Code01_1.java +++ b/src/class140/Code01_1.java @@ -39,7 +39,7 @@ public static void main(String[] args) throws IOException { PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); in.nextToken(); int cases = (int) in.nval; - for (int i = 1; i <= cases; i++) { + for (int t = 1; t <= cases; t++) { in.nextToken(); long a = (long) in.nval; in.nextToken(); diff --git a/src/class140/Code01_2.java b/src/class140/Code01_2.java index 05bc301ea..a03c212e2 100644 --- a/src/class140/Code01_2.java +++ b/src/class140/Code01_2.java @@ -27,7 +27,7 @@ //int main() { // int cases; // scanf("%d", &cases); -// for (int i = 1; i <= cases; i++) { +// for (int t = 1; t <= cases; t++) { // long long a, b, c; // scanf("%lld %lld %lld", &a, &b, &c); // exgcd(a, b); diff --git a/src/class140/Code02.java b/src/class140/Code02.java index 890beb571..55962edac 100644 --- a/src/class140/Code02.java +++ b/src/class140/Code02.java @@ -1,6 +1,6 @@ package class140; -// 测试链接 : https://lightoj.com/problem/how-many-points +// 测试链接 : https://www.luogu.com.cn/problem/P1516 import java.io.BufferedReader; import java.io.IOException; @@ -11,8 +11,20 @@ public class Code02 { - public static long gcd(long a, long b) { - return b == 0 ? a : gcd(b, a % b); + // 扩展欧几里得算法 + public static long d, x, y; + + public static void exgcd(long a, long b) { + if (b == 0) { + d = a; + x = 1; + y = 0; + } else { + exgcd(b, a % b); + long tmp = x; + x = y; + y = tmp - a / b * y; + } } public static void main(String[] args) throws IOException { @@ -20,14 +32,26 @@ public static void main(String[] args) throws IOException { StreamTokenizer in = new StreamTokenizer(br); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); in.nextToken(); - int cases = (int) in.nval; - for (int i = 1; i <= cases; i++) { - in.nextToken(); long x1 = (long) in.nval; - in.nextToken(); long y1 = (long) in.nval; - in.nextToken(); long x2 = (long) in.nval; - in.nextToken(); long y2 = (long) in.nval; - long ans = gcd(Math.abs(x1 - x2), Math.abs(y1 - y2)) + 1; - out.println("Case " + i + ": " + ans); + long x1 = (long) in.nval; + in.nextToken(); + long x2 = (long) in.nval; + in.nextToken(); + long m = (long) in.nval; + in.nextToken(); + long n = (long) in.nval; + in.nextToken(); + long l = (long) in.nval; + long a = n - m; + long c = x1 - x2; + if (a < 0) { + a = -a; + c = l - c; + } + exgcd(a, l); + if (c % d == 0) { + out.println(((x * c / d) % (l / d) + (l / d)) % (l / d)); + } else { + out.println("Impossible"); } out.flush(); out.close(); diff --git a/src/class140/Code03.java b/src/class140/Code03.java index 314cddc00..9d828e562 100644 --- a/src/class140/Code03.java +++ b/src/class140/Code03.java @@ -1,6 +1,6 @@ package class140; -// 测试链接 : https://www.luogu.com.cn/problem/P1516 +// 测试链接 : https://lightoj.com/problem/how-many-points import java.io.BufferedReader; import java.io.IOException; @@ -11,20 +11,8 @@ public class Code03 { - // 扩展欧几里得算法 - public static long d, x, y; - - public static void exgcd(long a, long b) { - if (b == 0) { - d = a; - x = 1; - y = 0; - } else { - exgcd(b, a % b); - long tmp = x; - x = y; - y = tmp - a / b * y; - } + public static long gcd(long a, long b) { + return b == 0 ? a : gcd(b, a % b); } public static void main(String[] args) throws IOException { @@ -32,26 +20,14 @@ public static void main(String[] args) throws IOException { StreamTokenizer in = new StreamTokenizer(br); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); in.nextToken(); - long x1 = (long) in.nval; - in.nextToken(); - long x2 = (long) in.nval; - in.nextToken(); - long m = (long) in.nval; - in.nextToken(); - long n = (long) in.nval; - in.nextToken(); - long l = (long) in.nval; - long a = n - m; - long c = x1 - x2; - if (a < 0) { - a = -a; - c = -c + l; - } - exgcd(a, l); - if (c % d == 0) { - out.println(((x * c / d) % (l / d) + (l / d)) % (l / d)); - } else { - out.println("Impossible"); + int cases = (int) in.nval; + for (int t = 1; t <= cases; t++) { + in.nextToken(); long x1 = (long) in.nval; + in.nextToken(); long y1 = (long) in.nval; + in.nextToken(); long x2 = (long) in.nval; + in.nextToken(); long y2 = (long) in.nval; + long ans = gcd(Math.abs(x1 - x2), Math.abs(y1 - y2)) + 1; + out.println("Case " + t + ": " + ans); } out.flush(); out.close(); diff --git a/src/class140/Code04.java b/src/class140/Code04.java index f45f77f44..458361b54 100644 --- a/src/class140/Code04.java +++ b/src/class140/Code04.java @@ -1,6 +1,53 @@ package class140; // 测试链接 : http://poj.org/problem?id=1265 + +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 Code04 { + public static long gcd(long a, long b) { + return b == 0 ? a : gcd(b, a % b); + } + + 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(); + int cases = (int) in.nval; + for (int t = 1; t <= cases; t++) { + in.nextToken(); + int n = (int) in.nval; + int edges = 0; + double area = 0; + for (int i = 1, x = 0, y = 0, xm, ym; i <= n; i++) { + in.nextToken(); + xm = (int) in.nval; + in.nextToken(); + ym = (int) in.nval; + edges += gcd(Math.abs(xm), Math.abs(ym)); + area += x * (y + ym) - (x + xm) * y; + x += xm; + y += ym; + } + // pick定理 + int inners = (int) (area / 2) + 1 - edges / 2; + out.println("Scenario #" + t + ":"); + out.print(inners + " "); + out.print(edges + " "); + out.printf("%.1f", area / 2); + out.println(); + out.println(); + } + out.flush(); + out.close(); + br.close(); + } + } From 0b0fff7d477be595425ec119449e8d5a72a42968 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 16 Aug 2024 18:22:38 +0800 Subject: [PATCH 0012/2029] modify code --- src/class140/Code04.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/class140/Code04.java b/src/class140/Code04.java index 458361b54..d706d4f59 100644 --- a/src/class140/Code04.java +++ b/src/class140/Code04.java @@ -32,12 +32,17 @@ public static void main(String[] args) throws IOException { in.nextToken(); ym = (int) in.nval; edges += gcd(Math.abs(xm), Math.abs(ym)); + // 叉积的结果是两个向量做边的平行四边形面积,最终得到的结果需要除以2 area += x * (y + ym) - (x + xm) * y; x += xm; y += ym; } // pick定理 - int inners = (int) (area / 2) + 1 - edges / 2; + // 如果一个多边形的顶点都是格点(坐标都为整数) + // 多边形面积 = 边界上格点数/2 + 内部格点数 - 1 + // 所以 + // 内部格点数 = 多边形面积 - 边界上格点数/2 + 1 + int inners = (int) (area / 2) - edges / 2 + 1; out.println("Scenario #" + t + ":"); out.print(inners + " "); out.print(edges + " "); From 74daad8919c472af50d2d0094892485d2b06a2cf Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 16 Aug 2024 18:23:31 +0800 Subject: [PATCH 0013/2029] modify code --- src/class140/Code04.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/class140/Code04.java b/src/class140/Code04.java index d706d4f59..eae8488dd 100644 --- a/src/class140/Code04.java +++ b/src/class140/Code04.java @@ -38,10 +38,8 @@ public static void main(String[] args) throws IOException { y += ym; } // pick定理 - // 如果一个多边形的顶点都是格点(坐标都为整数) - // 多边形面积 = 边界上格点数/2 + 内部格点数 - 1 - // 所以 - // 内部格点数 = 多边形面积 - 边界上格点数/2 + 1 + // 如果一个多边形的顶点都是格点(坐标都为整数),多边形面积 = 边界上格点数/2 + 内部格点数 - 1 + // 所以,内部格点数 = 多边形面积 - 边界上格点数/2 + 1 int inners = (int) (area / 2) - edges / 2 + 1; out.println("Scenario #" + t + ":"); out.print(inners + " "); From 272980ca431f6cc00509cd9410a28bd3c8aeddfc Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 17 Aug 2024 11:48:47 +0800 Subject: [PATCH 0014/2029] modify code --- .../{Code01.java => Code01_BezoutLemma.java} | 9 +- .../{Code02.java => Code02_Pagodas.java} | 9 +- ...de03.java => Code03_UniformGenerator.java} | 12 ++- src/class139/Code04.java | 86 ------------------- src/class139/Code04_CongruenceEquation.java | 50 +++++++++++ .../{Code05.java => Code05_ShuffleCards.java} | 12 ++- src/class139/Exgcd.java | 8 +- 7 files changed, 92 insertions(+), 94 deletions(-) rename src/class139/{Code01.java => Code01_BezoutLemma.java} (68%) rename src/class139/{Code02.java => Code02_Pagodas.java} (67%) rename src/class139/{Code03.java => Code03_UniformGenerator.java} (60%) delete mode 100644 src/class139/Code04.java create mode 100644 src/class139/Code04_CongruenceEquation.java rename src/class139/{Code05.java => Code05_ShuffleCards.java} (75%) diff --git a/src/class139/Code01.java b/src/class139/Code01_BezoutLemma.java similarity index 68% rename from src/class139/Code01.java rename to src/class139/Code01_BezoutLemma.java index c98481ea9..22ac65721 100644 --- a/src/class139/Code01.java +++ b/src/class139/Code01_BezoutLemma.java @@ -1,6 +1,13 @@ package class139; +// 裴蜀定理模版题 +// 给定长度为n的一组整数值[a1, a2, a3...],你找到一组数值[x1, x2, x3...] +// 要让a1*x1 + a2*x2 + a3*x3...得到的结果为最小正整数 +// 返回能得到的最小正整数是多少 +// 1 <= n <= 20 +// 1 <= ai <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P4549 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.BufferedReader; import java.io.IOException; @@ -9,7 +16,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code01 { +public class Code01_BezoutLemma { public static int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); diff --git a/src/class139/Code02.java b/src/class139/Code02_Pagodas.java similarity index 67% rename from src/class139/Code02.java rename to src/class139/Code02_Pagodas.java index 3f5b9afde..75f236d2f 100644 --- a/src/class139/Code02.java +++ b/src/class139/Code02_Pagodas.java @@ -1,7 +1,14 @@ package class139; +// 修理宝塔 +// 一共有编号1~n的宝塔,其中a号和b号宝塔已经修好了 +// Yuwgna和Iaka两个人轮流修塔,Yuwgna先手,Iaka后手,谁先修完所有的塔谁赢 +// 每次可以选择j+k号或者j-k号塔进行修理,其中j和k是任意两个已经修好的塔 +// 也就是输入n、a、b,如果先手赢打印"Yuwgna",后手赢打印"Iaka" +// 2 <= n <= 2 * 10^4 // 测试链接 : https://acm.hdu.edu.cn/showproblem.php?pid=5512 // 测试链接 : https://vjudge.net/problem/HDU-5512 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.BufferedReader; import java.io.IOException; @@ -10,7 +17,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code02 { +public class Code02_Pagodas { public static int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); diff --git a/src/class139/Code03.java b/src/class139/Code03_UniformGenerator.java similarity index 60% rename from src/class139/Code03.java rename to src/class139/Code03_UniformGenerator.java index c27a65768..bde7872be 100644 --- a/src/class139/Code03.java +++ b/src/class139/Code03_UniformGenerator.java @@ -1,6 +1,16 @@ package class139; +// 均匀生成器 +// 如果有两个数字step和mod,那么可以由以下方式生成很多数字 +// seed(1) = 0,seed(i+1) = (seed(i) + step) % mod +// 比如,step = 3、mod = 5 +// seed(1) = 0,seed(2) = 3,seed(3) = 1,seed(4) = 4,seed(5) = 2 +// 如果能产生0 ~ mod-1所有数字,step和mod的组合叫 "Good Choice" +// 如果无法产生0 ~ mod-1所有数字,step和mod的组合叫 "Bad Choice" +// 根据step和mod,打印结果 +// 1 <= step、mod <= 10^5 // 测试链接 : http://poj.org/problem?id=1597 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.BufferedReader; import java.io.IOException; @@ -9,7 +19,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code03 { +public class Code03_UniformGenerator { public static int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); diff --git a/src/class139/Code04.java b/src/class139/Code04.java deleted file mode 100644 index 48197e981..000000000 --- a/src/class139/Code04.java +++ /dev/null @@ -1,86 +0,0 @@ -package class139; - -// 测试链接 : https://www.luogu.com.cn/problem/P1082 - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.io.PrintWriter; -import java.util.StringTokenizer; - -public class Code04 { - - // 扩展欧几里得算法 - public static long d, x, y; - - public static void exgcd(long a, long b) { - if (b == 0) { - d = a; - x = 1; - y = 0; - } else { - exgcd(b, a % b); - long tmp = x; - x = y; - y = tmp - a / b * y; - } - } - - public static void main(String[] args) throws IOException { - Kattio io = new Kattio(); - long a = io.nextLong(); - long b = io.nextLong(); - exgcd(a, b); - io.println((x % b + b) % b); - io.flush(); - io.close(); - } - - // Kattio类IO效率很好,但还是不如StreamTokenizer - // 只有StreamTokenizer无法正确处理时,才考虑使用这个类 - // 参考链接 : https://oi-wiki.org/lang/java-pro/ - public static class Kattio extends PrintWriter { - private BufferedReader r; - private StringTokenizer st; - - public Kattio() { - this(System.in, System.out); - } - - public Kattio(InputStream i, OutputStream o) { - super(o); - r = new BufferedReader(new InputStreamReader(i)); - } - - public Kattio(String intput, String output) throws IOException { - super(output); - r = new BufferedReader(new FileReader(intput)); - } - - public String next() { - try { - while (st == null || !st.hasMoreTokens()) - st = new StringTokenizer(r.readLine()); - return st.nextToken(); - } catch (Exception e) { - } - return null; - } - - public int nextInt() { - return Integer.parseInt(next()); - } - - public double nextDouble() { - return Double.parseDouble(next()); - } - - public long nextLong() { - return Long.parseLong(next()); - } - } - -} diff --git a/src/class139/Code04_CongruenceEquation.java b/src/class139/Code04_CongruenceEquation.java new file mode 100644 index 000000000..100596b7d --- /dev/null +++ b/src/class139/Code04_CongruenceEquation.java @@ -0,0 +1,50 @@ +package class139; + +// 同余方程 +// 求关于x的同余方程 ax ≡ 1(mod b) 的最小正整数解 +// 题目保证一定有解,也就是a和b互质 +// 2 <= a、b <= 2 * 10^9 +// 测试链接 : https://www.luogu.com.cn/problem/P1082 +// 提交以下的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 Code04_CongruenceEquation { + + // 扩展欧几里得算法 + public static long d, x, y; + + public static void exgcd(long a, long b) { + if (b == 0) { + d = a; + x = 1; + y = 0; + } else { + exgcd(b, a % b); + long tmp = x; + x = y; + y = tmp - a / b * y; + } + } + + 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(); + long a = (long) in.nval; + in.nextToken(); + long b = (long) in.nval; + exgcd(a, b); + out.println((x % b + b) % b); + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class139/Code05.java b/src/class139/Code05_ShuffleCards.java similarity index 75% rename from src/class139/Code05.java rename to src/class139/Code05_ShuffleCards.java index 16788d4c3..a4f9fe25b 100644 --- a/src/class139/Code05.java +++ b/src/class139/Code05_ShuffleCards.java @@ -1,6 +1,16 @@ package class139; +// 洗牌 +// 一共有n张牌,n一定是偶数,牌的编号从1到n,洗牌规则如下 +// 比如,n = 6,牌的编号为1 2 3 4 5 6 +// 先分成左堆1 2 3,右堆4 5 6 +// 然后按照右堆第i张在前,左堆第i张在后的方式,洗在一起 +// 得到4 1 5 2 6 3,如果再洗一次,就得到2 4 6 1 3 5 +// 想知道一共n张牌,洗m次的情况下,第l张牌在什么位置 +// 1 <= n <= 10^10,n为偶数 +// 0 <= m <= 10^10 // 测试链接 : https://www.luogu.com.cn/problem/P2054 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.BufferedReader; import java.io.IOException; @@ -9,7 +19,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code05 { +public class Code05_ShuffleCards { // 扩展欧几里得算法 public static long d, x, y; diff --git a/src/class139/Exgcd.java b/src/class139/Exgcd.java index 3d415167b..bafd31614 100644 --- a/src/class139/Exgcd.java +++ b/src/class139/Exgcd.java @@ -27,14 +27,14 @@ public static long fermat(long num, long mod) { return power(num, mod - 2, mod); } - public static long power(long num, long p, long mod) { + public static long power(long num, long pow, long mod) { long ans = 1; - while (p > 0) { - if ((p & 1) == 1) { + while (pow > 0) { + if ((pow & 1) == 1) { ans = (ans * num) % mod; } num = (num * num) % mod; - p >>= 1; + pow >>= 1; } return ans; } From d1977253572a07d8ac45f35074e7517e86950af7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 17 Aug 2024 13:44:57 +0800 Subject: [PATCH 0015/2029] modify code --- ....java => Code01_DiophantineEquation1.java} | 11 +++++-- ....java => Code01_DiophantineEquation2.java} | 7 ++++ .../{Code02.java => Code02_FrogsMeeting.java} | 13 +++++++- ...{Code03.java => Code03_HowManyPoints.java} | 20 +++++++++--- .../{Code04.java => Code04_Area.java} | 32 ++++++++++++------- ...5.java => Code05_LargestUnattainable.java} | 8 ++++- 6 files changed, 71 insertions(+), 20 deletions(-) rename src/class140/{Code01_1.java => Code01_DiophantineEquation1.java} (83%) rename src/class140/{Code01_2.java => Code01_DiophantineEquation2.java} (80%) rename src/class140/{Code02.java => Code02_FrogsMeeting.java} (69%) rename src/class140/{Code03.java => Code03_HowManyPoints.java} (59%) rename src/class140/{Code04.java => Code04_Area.java} (52%) rename src/class140/{Code05.java => Code05_LargestUnattainable.java} (63%) diff --git a/src/class140/Code01_1.java b/src/class140/Code01_DiophantineEquation1.java similarity index 83% rename from src/class140/Code01_1.java rename to src/class140/Code01_DiophantineEquation1.java index d0a5034c3..5aa79f9a2 100644 --- a/src/class140/Code01_1.java +++ b/src/class140/Code01_DiophantineEquation1.java @@ -1,11 +1,18 @@ package class140; +// 二元一次不定方程模版 +// 给定a、b、c,求解方程ax + by = c +// 如果方程无解打印-1 +// 如果方程无正整数解,但是有整数解,打印这些整数解中,x的最小值,y的最小值 +// 如果方程有正整数解,打印正整数解的数量,以及所有正整数解中, +// x的最小值,y的最小值,x的最大值,y的最大值 +// 1 <= a、b、c <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P5656 // 如下实现是正确的,但是洛谷平台对空间卡的很严,只有使用C++能全部通过 // java的版本就是无法完全通过的,空间会超过限制,主要是IO空间占用大 // 这是洛谷平台没有照顾各种语言的实现所导致的 // 在真正笔试、比赛时,一定是兼顾各种语言的,该实现是一定正确的 -// C++版本就是Code01_2文件 +// C++版本就是Code01_DiophantineEquation2文件 // C++版本和java版本逻辑完全一样,但只有C++版本可以通过所有测试用例 import java.io.BufferedReader; @@ -15,7 +22,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code01_1 { +public class Code01_DiophantineEquation1 { // 扩展欧几里得算法 public static long d, x, y; diff --git a/src/class140/Code01_2.java b/src/class140/Code01_DiophantineEquation2.java similarity index 80% rename from src/class140/Code01_2.java rename to src/class140/Code01_DiophantineEquation2.java index a03c212e2..ec2c29d6b 100644 --- a/src/class140/Code01_2.java +++ b/src/class140/Code01_DiophantineEquation2.java @@ -1,5 +1,12 @@ package class140; +// 二元一次不定方程模版 +// 给定a、b、c,求解方程ax + by = c +// 如果方程无解打印-1 +// 如果方程无正整数解,但是有整数解,打印这些整数解中,x的最小值,y的最小值 +// 如果方程有正整数解,打印正整数解的数量,以及所有正整数解中, +// x的最小值,y的最小值,x的最大值,y的最大值 +// 1 <= a、b、c <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P5656 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class140/Code02.java b/src/class140/Code02_FrogsMeeting.java similarity index 69% rename from src/class140/Code02.java rename to src/class140/Code02_FrogsMeeting.java index 55962edac..b5cf56390 100644 --- a/src/class140/Code02.java +++ b/src/class140/Code02_FrogsMeeting.java @@ -1,6 +1,14 @@ package class140; +// 青蛙的约会 +// 有一个周长为l的环,从环的0位置开始,规定只能沿着顺时针方向不停转圈 +// 青蛙A在环的x1位置,每秒跳m个位置,青蛙B在x2位置,每秒跳n个位置 +// 只有在某时刻,青蛙A和青蛙B来到环的同一个位置,才算相遇 +// 返回两只青蛙多久才能首次相遇 +// 1 <= l <= 3 * 10^9 +// 1 <= x1、x2、m、n <= 2 * 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P1516 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.BufferedReader; import java.io.IOException; @@ -9,7 +17,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code02 { +public class Code02_FrogsMeeting { // 扩展欧几里得算法 public static long d, x, y; @@ -43,6 +51,9 @@ public static void main(String[] args) throws IOException { long l = (long) in.nval; long a = n - m; long c = x1 - x2; + if (c < 0) { + c += l; + } if (a < 0) { a = -a; c = l - c; diff --git a/src/class140/Code03.java b/src/class140/Code03_HowManyPoints.java similarity index 59% rename from src/class140/Code03.java rename to src/class140/Code03_HowManyPoints.java index 9d828e562..960ff266a 100644 --- a/src/class140/Code03.java +++ b/src/class140/Code03_HowManyPoints.java @@ -1,6 +1,12 @@ package class140; +// 格点连线上一共几个点 +// 二维网格中只有x和y的值都为整数的坐标,才叫格点 +// 给定两个格点,A在(x1, y1),B在(x2, y2) +// 返回A和B的连线上,包括A和B在内,一共有几个格点 +// -10^9 <= x1、y1、x2、y2 <= 10^9 // 测试链接 : https://lightoj.com/problem/how-many-points +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.BufferedReader; import java.io.IOException; @@ -9,7 +15,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code03 { +public class Code03_HowManyPoints { public static long gcd(long a, long b) { return b == 0 ? a : gcd(b, a % b); @@ -22,10 +28,14 @@ public static void main(String[] args) throws IOException { in.nextToken(); int cases = (int) in.nval; for (int t = 1; t <= cases; t++) { - in.nextToken(); long x1 = (long) in.nval; - in.nextToken(); long y1 = (long) in.nval; - in.nextToken(); long x2 = (long) in.nval; - in.nextToken(); long y2 = (long) in.nval; + in.nextToken(); + long x1 = (long) in.nval; + in.nextToken(); + long y1 = (long) in.nval; + in.nextToken(); + long x2 = (long) in.nval; + in.nextToken(); + long y2 = (long) in.nval; long ans = gcd(Math.abs(x1 - x2), Math.abs(y1 - y2)) + 1; out.println("Case " + t + ": " + ans); } diff --git a/src/class140/Code04.java b/src/class140/Code04_Area.java similarity index 52% rename from src/class140/Code04.java rename to src/class140/Code04_Area.java index eae8488dd..c8b5b8732 100644 --- a/src/class140/Code04.java +++ b/src/class140/Code04_Area.java @@ -1,6 +1,15 @@ package class140; +// 机器人的移动区域 +// 二维网格中只有x和y的值都为整数的坐标,才叫格点 +// 某个机器人从格点(0,0)出发,每次机器人都走直线到达(x + dx, y + dy)的格点 +// 一共移动n次,每次的(dx, dy)都给定,输入保证机器人最终回到(0,0)位置 +// 机器人走的路线所围成的区域一定是多边形,从起点出发最终回到起点,途中路线不再相交 +// 返回多边形的内部一共几个格点,多边形的边上一共几个格点,多边形的面积 +// 3 <= n <= 100 +// -100 <= dx、dy <= 100 // 测试链接 : http://poj.org/problem?id=1265 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.BufferedReader; import java.io.IOException; @@ -9,7 +18,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code04 { +public class Code04_Area { public static long gcd(long a, long b) { return b == 0 ? a : gcd(b, a % b); @@ -26,25 +35,26 @@ public static void main(String[] args) throws IOException { int n = (int) in.nval; int edges = 0; double area = 0; - for (int i = 1, x = 0, y = 0, xm, ym; i <= n; i++) { + for (int i = 1, x = 0, y = 0, dx, dy; i <= n; i++) { in.nextToken(); - xm = (int) in.nval; + dx = (int) in.nval; in.nextToken(); - ym = (int) in.nval; - edges += gcd(Math.abs(xm), Math.abs(ym)); - // 叉积的结果是两个向量做边的平行四边形面积,最终得到的结果需要除以2 - area += x * (y + ym) - (x + xm) * y; - x += xm; - y += ym; + dy = (int) in.nval; + edges += gcd(Math.abs(dx), Math.abs(dy)); + area += x * (y + dy) - (x + dx) * y; + x += dx; + y += dy; } + // 叉积的结果是两个向量做边的平行四边形面积,最终得到的结果需要除以2 + area /= 2; // pick定理 // 如果一个多边形的顶点都是格点(坐标都为整数),多边形面积 = 边界上格点数/2 + 内部格点数 - 1 // 所以,内部格点数 = 多边形面积 - 边界上格点数/2 + 1 - int inners = (int) (area / 2) - edges / 2 + 1; + int inners = (int) (area) - edges / 2 + 1; out.println("Scenario #" + t + ":"); out.print(inners + " "); out.print(edges + " "); - out.printf("%.1f", area / 2); + out.printf("%.1f", area); out.println(); out.println(); } diff --git a/src/class140/Code05.java b/src/class140/Code05_LargestUnattainable.java similarity index 63% rename from src/class140/Code05.java rename to src/class140/Code05_LargestUnattainable.java index 28aec2712..fb0165895 100644 --- a/src/class140/Code05.java +++ b/src/class140/Code05_LargestUnattainable.java @@ -1,6 +1,12 @@ package class140; +// 无法组成的最大值 +// 一共有a、b两种面值的硬币,a和b一定互质,每种硬币都有无限个 +// 返回a和b无法组成的钱数中,最大值是多少 +// 题目的输入保证存在最大的无法组成的钱数 +// 1 <= a、b <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P3951 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.BufferedReader; import java.io.IOException; @@ -9,7 +15,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code05 { +public class Code05_LargestUnattainable { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); From a68a34460f0df9fedb190d27414040eee3ecf989 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 17 Aug 2024 16:02:54 +0800 Subject: [PATCH 0016/2029] modify code --- src/class139/Code04_CongruenceEquation.java | 9 ++++--- src/class139/Code05_ShuffleCards.java | 9 ++++--- src/class139/Exgcd.java | 13 +++++----- src/class140/Code01_DiophantineEquation1.java | 25 +++++++++++-------- src/class140/Code01_DiophantineEquation2.java | 20 ++++++++------- src/class140/Code02_FrogsMeeting.java | 9 ++++--- 6 files changed, 47 insertions(+), 38 deletions(-) diff --git a/src/class139/Code04_CongruenceEquation.java b/src/class139/Code04_CongruenceEquation.java index 100596b7d..c4b96292b 100644 --- a/src/class139/Code04_CongruenceEquation.java +++ b/src/class139/Code04_CongruenceEquation.java @@ -17,7 +17,7 @@ public class Code04_CongruenceEquation { // 扩展欧几里得算法 - public static long d, x, y; + public static long d, x, y, px, py; public static void exgcd(long a, long b) { if (b == 0) { @@ -26,9 +26,10 @@ public static void exgcd(long a, long b) { y = 0; } else { exgcd(b, a % b); - long tmp = x; - x = y; - y = tmp - a / b * y; + px = x; + py = y; + x = py; + y = px - a / b * py; } } diff --git a/src/class139/Code05_ShuffleCards.java b/src/class139/Code05_ShuffleCards.java index a4f9fe25b..143565b8e 100644 --- a/src/class139/Code05_ShuffleCards.java +++ b/src/class139/Code05_ShuffleCards.java @@ -22,7 +22,7 @@ public class Code05_ShuffleCards { // 扩展欧几里得算法 - public static long d, x, y; + public static long d, x, y, px, py; public static void exgcd(long a, long b) { if (b == 0) { @@ -31,9 +31,10 @@ public static void exgcd(long a, long b) { y = 0; } else { exgcd(b, a % b); - long tmp = x; - x = y; - y = tmp - a / b * y; + px = x; + py = y; + x = py; + y = px - a / b * py; } } diff --git a/src/class139/Exgcd.java b/src/class139/Exgcd.java index bafd31614..9c99676e7 100644 --- a/src/class139/Exgcd.java +++ b/src/class139/Exgcd.java @@ -7,7 +7,7 @@ public class Exgcd { // 当a和b确定,那么gcd(a,b)也确定 // 扩展欧几里得算法可以给出a和b的最大公约数d、以及其中一个特解x、y // 特别注意要保证入参a和b没有负数 - public static long d, x, y; + public static long d, x, y, px, py; public static void exgcd(long a, long b) { if (b == 0) { @@ -16,9 +16,10 @@ public static void exgcd(long a, long b) { y = 0; } else { exgcd(b, a % b); - long tmp = x; - x = y; - y = tmp - a / b * y; + px = x; + py = y; + x = py; + y = px - a / b * py; } } @@ -41,8 +42,8 @@ public static long power(long num, long pow, long mod) { public static void main(String[] args) { // 扩展欧几里得算法例子 - int a = 6; - int b = 10; + int a = 220; + int b = 170; exgcd(a, b); System.out.println("gcd(" + a + ", " + b + ")" + " = " + d); System.out.println("x = " + x + ", " + " y = " + y); diff --git a/src/class140/Code01_DiophantineEquation1.java b/src/class140/Code01_DiophantineEquation1.java index 5aa79f9a2..20f702441 100644 --- a/src/class140/Code01_DiophantineEquation1.java +++ b/src/class140/Code01_DiophantineEquation1.java @@ -25,7 +25,7 @@ public class Code01_DiophantineEquation1 { // 扩展欧几里得算法 - public static long d, x, y; + public static long d, x, y, px, py; public static void exgcd(long a, long b) { if (b == 0) { @@ -34,12 +34,15 @@ public static void exgcd(long a, long b) { y = 0; } else { exgcd(b, a % b); - long tmp = x; - x = y; - y = tmp - a / b * y; + px = x; + py = y; + x = py; + y = px - a / b * py; } } + public static long a, b, c, xd, yd, k; + public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StreamTokenizer in = new StreamTokenizer(br); @@ -48,26 +51,26 @@ public static void main(String[] args) throws IOException { int cases = (int) in.nval; for (int t = 1; t <= cases; t++) { in.nextToken(); - long a = (long) in.nval; + a = (long) in.nval; in.nextToken(); - long b = (long) in.nval; + b = (long) in.nval; in.nextToken(); - long c = (long) in.nval; + c = (long) in.nval; exgcd(a, b); if (c % d == 0) { // 有整数解 x *= c / d; y *= c / d; - long xd = b / d; - long yd = a / d; + xd = b / d; + yd = a / d; if (x < 0) { // x要想增长到>=1且最小的值,差几个xd,算出来就是k的值 // 那应该是(1-x)/xd,结果向上取整 - long k = (1 - x + xd - 1) / xd; + k = (1 - x + xd - 1) / xd; x += xd * k; y -= yd * k; } else { // x要想减少到>=1且最小的值,差几个xd,算出来就是k的值,向下取整 - long k = (x - 1) / xd; + k = (x - 1) / xd; x -= xd * k; y += yd * k; } diff --git a/src/class140/Code01_DiophantineEquation2.java b/src/class140/Code01_DiophantineEquation2.java index ec2c29d6b..9b19373f5 100644 --- a/src/class140/Code01_DiophantineEquation2.java +++ b/src/class140/Code01_DiophantineEquation2.java @@ -16,7 +16,7 @@ // //using namespace std; // -//long long d, x, y; +//long long d, x, y, px, py; // //void exgcd(long long a, long long b) { // if (b == 0) { @@ -25,30 +25,32 @@ // y = 0; // } else { // exgcd(b, a % b); -// long long tmp = x; -// x = y; -// y = tmp - a / b * y; +// px = x; +// py = y; +// x = py; +// y = px - a / b * py; // } //} // +//long long a, b, c, xd, yd, k; +// //int main() { // int cases; // scanf("%d", &cases); // for (int t = 1; t <= cases; t++) { -// long long a, b, c; // scanf("%lld %lld %lld", &a, &b, &c); // exgcd(a, b); // if (c % d == 0) { // x *= c / d; // y *= c / d; -// long long xd = b / d; -// long long yd = a / d; +// xd = b / d; +// yd = a / d; // if (x < 0) { -// long long k = (xd - x) / xd; +// k = (xd - x) / xd; // x += xd * k; // y -= yd * k; // } else { -// long long k = (x - 1) / xd; +// k = (x - 1) / xd; // x -= xd * k; // y += yd * k; // } diff --git a/src/class140/Code02_FrogsMeeting.java b/src/class140/Code02_FrogsMeeting.java index b5cf56390..6813517f4 100644 --- a/src/class140/Code02_FrogsMeeting.java +++ b/src/class140/Code02_FrogsMeeting.java @@ -20,7 +20,7 @@ public class Code02_FrogsMeeting { // 扩展欧几里得算法 - public static long d, x, y; + public static long d, x, y, px, py; public static void exgcd(long a, long b) { if (b == 0) { @@ -29,9 +29,10 @@ public static void exgcd(long a, long b) { y = 0; } else { exgcd(b, a % b); - long tmp = x; - x = y; - y = tmp - a / b * y; + px = x; + py = y; + x = py; + y = px - a / b * py; } } From 545cde48e61e72e551415c7bc01105e6fdae21fa Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 17 Aug 2024 17:18:22 +0800 Subject: [PATCH 0017/2029] modify code --- src/class140/Code01_DiophantineEquation1.java | 14 +++++++------- src/class140/Code01_DiophantineEquation2.java | 17 +++++++++-------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/class140/Code01_DiophantineEquation1.java b/src/class140/Code01_DiophantineEquation1.java index 20f702441..1213d3916 100644 --- a/src/class140/Code01_DiophantineEquation1.java +++ b/src/class140/Code01_DiophantineEquation1.java @@ -57,7 +57,9 @@ public static void main(String[] args) throws IOException { in.nextToken(); c = (long) in.nval; exgcd(a, b); - if (c % d == 0) { // 有整数解 + if (c % d != 0) { // 无整数解 + out.println(-1); + } else { // 有整数解 x *= c / d; y *= c / d; xd = b / d; @@ -74,7 +76,10 @@ public static void main(String[] args) throws IOException { x -= xd * k; y += yd * k; } - if (y > 0) { // 有正整数解 + if (y <= 0) { // 无正整数解 + out.print(x + " "); + out.println(y + yd * ((1 - y + yd - 1) / yd)); + } else { // 有正整数解 // y减少到>=1的最小值,能减几次,就是正整数解的个数 out.print(((y - 1) / yd + 1) + " "); // x的最小正整数 @@ -85,12 +90,7 @@ public static void main(String[] args) throws IOException { out.print((x + (y - 1) / yd * xd) + " "); // y的最大正整数 out.println(y); - } else { // 无正整数解 - out.print(x + " "); - out.println(y + yd * ((1 - y + yd - 1) / yd)); } - } else { // 无整数解 - out.println(-1); } } out.flush(); diff --git a/src/class140/Code01_DiophantineEquation2.java b/src/class140/Code01_DiophantineEquation2.java index 9b19373f5..44d5cceb9 100644 --- a/src/class140/Code01_DiophantineEquation2.java +++ b/src/class140/Code01_DiophantineEquation2.java @@ -12,6 +12,7 @@ // 提交如下代码,可以通过所有测试用例 //#include +// //#include // //using namespace std; @@ -40,7 +41,9 @@ // for (int t = 1; t <= cases; t++) { // scanf("%lld %lld %lld", &a, &b, &c); // exgcd(a, b); -// if (c % d == 0) { +// if (c % d != 0) { +// printf("-1\n"); +// } else { // x *= c / d; // y *= c / d; // xd = b / d; @@ -54,19 +57,17 @@ // x -= xd * k; // y += yd * k; // } -// if (y > 0) { +// if (y <= 0) { +// printf("%lld ", x); +// printf("%lld\n", y + yd * ((yd - y) / yd)); +// } else { // printf("%lld ", ((y - 1) / yd + 1)); // printf("%lld ", x); // printf("%lld ", ((y - 1) % yd + 1)); // printf("%lld ", (x + (y - 1) / yd * xd)); // printf("%lld\n", y); -// } else { -// printf("%lld ", x); -// printf("%lld\n", y + yd * ((yd - y) / yd)); // } -// } else { -// printf("-1\n"); // } // } // return 0; -//} +//} \ No newline at end of file From c099a40f85f78822c03cf4d8603cac6cc1b7a734 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 20 Aug 2024 14:46:54 +0800 Subject: [PATCH 0018/2029] modify code --- src/class139/Code04_CongruenceEquation.java | 2 +- src/class139/Code05_ShuffleCards.java | 2 +- src/class139/Exgcd.java | 2 +- src/class140/Code01_DiophantineEquation1.java | 2 +- src/class140/Code01_DiophantineEquation2.java | 2 +- src/class140/Code02_FrogsMeeting.java | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/class139/Code04_CongruenceEquation.java b/src/class139/Code04_CongruenceEquation.java index c4b96292b..e163b0755 100644 --- a/src/class139/Code04_CongruenceEquation.java +++ b/src/class139/Code04_CongruenceEquation.java @@ -29,7 +29,7 @@ public static void exgcd(long a, long b) { px = x; py = y; x = py; - y = px - a / b * py; + y = px - py * (a / b); } } diff --git a/src/class139/Code05_ShuffleCards.java b/src/class139/Code05_ShuffleCards.java index 143565b8e..733d34bed 100644 --- a/src/class139/Code05_ShuffleCards.java +++ b/src/class139/Code05_ShuffleCards.java @@ -34,7 +34,7 @@ public static void exgcd(long a, long b) { px = x; py = y; x = py; - y = px - a / b * py; + y = px - py * (a / b); } } diff --git a/src/class139/Exgcd.java b/src/class139/Exgcd.java index 9c99676e7..c6b4f5118 100644 --- a/src/class139/Exgcd.java +++ b/src/class139/Exgcd.java @@ -19,7 +19,7 @@ public static void exgcd(long a, long b) { px = x; py = y; x = py; - y = px - a / b * py; + y = px - py * (a / b); } } diff --git a/src/class140/Code01_DiophantineEquation1.java b/src/class140/Code01_DiophantineEquation1.java index 1213d3916..8b0258c96 100644 --- a/src/class140/Code01_DiophantineEquation1.java +++ b/src/class140/Code01_DiophantineEquation1.java @@ -37,7 +37,7 @@ public static void exgcd(long a, long b) { px = x; py = y; x = py; - y = px - a / b * py; + y = px - py * (a / b); } } diff --git a/src/class140/Code01_DiophantineEquation2.java b/src/class140/Code01_DiophantineEquation2.java index 44d5cceb9..b4296caf3 100644 --- a/src/class140/Code01_DiophantineEquation2.java +++ b/src/class140/Code01_DiophantineEquation2.java @@ -29,7 +29,7 @@ // px = x; // py = y; // x = py; -// y = px - a / b * py; +// y = px - py * (a / b); // } //} // diff --git a/src/class140/Code02_FrogsMeeting.java b/src/class140/Code02_FrogsMeeting.java index 6813517f4..2f093fc6e 100644 --- a/src/class140/Code02_FrogsMeeting.java +++ b/src/class140/Code02_FrogsMeeting.java @@ -32,7 +32,7 @@ public static void exgcd(long a, long b) { px = x; py = y; x = py; - y = px - a / b * py; + y = px - py * (a / b); } } From 80d89d21e9a4e6f28044e047f6f4f3349cd523d4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 20 Aug 2024 17:19:34 +0800 Subject: [PATCH 0019/2029] modify code --- src/class139/Code05_ShuffleCards.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/class139/Code05_ShuffleCards.java b/src/class139/Code05_ShuffleCards.java index 733d34bed..d7c3ac740 100644 --- a/src/class139/Code05_ShuffleCards.java +++ b/src/class139/Code05_ShuffleCards.java @@ -1,12 +1,13 @@ package class139; // 洗牌 -// 一共有n张牌,n一定是偶数,牌的编号从1到n,洗牌规则如下 -// 比如,n = 6,牌的编号为1 2 3 4 5 6 -// 先分成左堆1 2 3,右堆4 5 6 -// 然后按照右堆第i张在前,左堆第i张在后的方式,洗在一起 -// 得到4 1 5 2 6 3,如果再洗一次,就得到2 4 6 1 3 5 -// 想知道一共n张牌,洗m次的情况下,第l张牌在什么位置 +// 一共有n张牌,n一定是偶数,每张牌的牌面从1到n,洗牌规则如下 +// 比如n = 6,牌面最初排列为1 2 3 4 5 6 +// 先分成左堆1 2 3,右堆4 5 6,然后按照右堆第i张在前,左堆第i张在后的方式依次放置 +// 所以洗一次后,得到 4 1 5 2 6 3 +// 如果再洗一次,得到 2 4 6 1 3 5 +// 如果再洗一次,得到 1 2 3 4 5 6 +// 想知道n张牌洗m次的之后,第l张牌,是什么牌面 // 1 <= n <= 10^10,n为偶数 // 0 <= m <= 10^10 // 测试链接 : https://www.luogu.com.cn/problem/P2054 @@ -70,8 +71,8 @@ public static long power(long a, long b, long mod) { public static long compute(long n, long m, long l) { long mod = n + 1; exgcd(power(2, m, mod), mod); - x = (x % mod + mod) % mod; - return multiply(x, l, mod); + long x0 = (x % mod + mod) % mod; + return multiply(x0, l, mod); } public static void main(String[] args) throws IOException { From 320c4707b0fc043f36d81c479ff673e02628fcaf Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 20 Aug 2024 17:20:31 +0800 Subject: [PATCH 0020/2029] modify code --- src/class139/Code05_ShuffleCards.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class139/Code05_ShuffleCards.java b/src/class139/Code05_ShuffleCards.java index d7c3ac740..e922fffbd 100644 --- a/src/class139/Code05_ShuffleCards.java +++ b/src/class139/Code05_ShuffleCards.java @@ -40,7 +40,7 @@ public static void exgcd(long a, long b) { } // 原理来自,讲解033,位运算实现乘法 - // a * b的过程自己实现,每一个中间过程都 % mod + // a * b的过程自己实现,每一个中间过程都%mod // 这么写目的是防止溢出 public static long multiply(long a, long b, long mod) { long ans = 0; From 9f7c45fc47e5b39894e25345346273cbf5f75fed Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 20 Aug 2024 17:21:10 +0800 Subject: [PATCH 0021/2029] modify code --- src/class139/Code05_ShuffleCards.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class139/Code05_ShuffleCards.java b/src/class139/Code05_ShuffleCards.java index e922fffbd..2a1d71210 100644 --- a/src/class139/Code05_ShuffleCards.java +++ b/src/class139/Code05_ShuffleCards.java @@ -71,8 +71,8 @@ public static long power(long a, long b, long mod) { public static long compute(long n, long m, long l) { long mod = n + 1; exgcd(power(2, m, mod), mod); - long x0 = (x % mod + mod) % mod; - return multiply(x0, l, mod); + long gcdx = (x % mod + mod) % mod; + return multiply(gcdx, l, mod); } public static void main(String[] args) throws IOException { From 42ef25a106334689c34c8d50a5402575c75ef9ab Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 20 Aug 2024 17:49:12 +0800 Subject: [PATCH 0022/2029] modify code --- src/class139/Code05_ShuffleCards.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class139/Code05_ShuffleCards.java b/src/class139/Code05_ShuffleCards.java index 2a1d71210..e922fffbd 100644 --- a/src/class139/Code05_ShuffleCards.java +++ b/src/class139/Code05_ShuffleCards.java @@ -71,8 +71,8 @@ public static long power(long a, long b, long mod) { public static long compute(long n, long m, long l) { long mod = n + 1; exgcd(power(2, m, mod), mod); - long gcdx = (x % mod + mod) % mod; - return multiply(gcdx, l, mod); + long x0 = (x % mod + mod) % mod; + return multiply(x0, l, mod); } public static void main(String[] args) throws IOException { From 37c3e7779ca023904bd3070f28cda230f84231df Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 20 Aug 2024 17:50:05 +0800 Subject: [PATCH 0023/2029] modify code --- ...14\345\276\227\347\256\227\346\263\225.pptx" | Bin 0 -> 49214 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "ppt/\347\256\227\346\263\225\350\256\262\350\247\243139\343\200\220\346\211\251\345\261\225\343\200\221\350\243\264\350\234\200\345\256\232\347\220\206\345\222\214\346\211\251\345\261\225\346\254\247\345\207\240\351\207\214\345\276\227\347\256\227\346\263\225.pptx" diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243139\343\200\220\346\211\251\345\261\225\343\200\221\350\243\264\350\234\200\345\256\232\347\220\206\345\222\214\346\211\251\345\261\225\346\254\247\345\207\240\351\207\214\345\276\227\347\256\227\346\263\225.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243139\343\200\220\346\211\251\345\261\225\343\200\221\350\243\264\350\234\200\345\256\232\347\220\206\345\222\214\346\211\251\345\261\225\346\254\247\345\207\240\351\207\214\345\276\227\347\256\227\346\263\225.pptx" new file mode 100644 index 0000000000000000000000000000000000000000..1127f96dab6e07531d6d5be9f43adda7984e03ab GIT binary patch literal 49214 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

6;`!=yhr28pyVPH% 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 Rco%`!5YWq@Qn>r+e*hhR7>WP@ literal 0 HcmV?d00001 From cde72138e4dcdcf49ac866857c8caf4ed940eced Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 21 Aug 2024 15:33:07 +0800 Subject: [PATCH 0024/2029] modify code --- src/class140/Code01_DiophantineEquation1.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class140/Code01_DiophantineEquation1.java b/src/class140/Code01_DiophantineEquation1.java index 8b0258c96..adb415704 100644 --- a/src/class140/Code01_DiophantineEquation1.java +++ b/src/class140/Code01_DiophantineEquation1.java @@ -82,13 +82,13 @@ public static void main(String[] args) throws IOException { } else { // 有正整数解 // y减少到>=1的最小值,能减几次,就是正整数解的个数 out.print(((y - 1) / yd + 1) + " "); - // x的最小正整数 + // x能取得的最小正数值 out.print(x + " "); - // y的最小正整数 + // y能取得的最小正数值 out.print(((y - 1) % yd + 1) + " "); - // x的最大正整数 + // x能取得的最大正数值 out.print((x + (y - 1) / yd * xd) + " "); - // y的最大正整数 + // y能取得的最大正数值 out.println(y); } } From 0929c1b00c6c01f149f6af3a85fc525f3ae536f9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 21 Aug 2024 16:33:35 +0800 Subject: [PATCH 0025/2029] modify code --- src/class140/Code01_DiophantineEquation1.java | 7 ++++--- src/class140/Code01_DiophantineEquation2.java | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/class140/Code01_DiophantineEquation1.java b/src/class140/Code01_DiophantineEquation1.java index adb415704..fb771b558 100644 --- a/src/class140/Code01_DiophantineEquation1.java +++ b/src/class140/Code01_DiophantineEquation1.java @@ -3,9 +3,10 @@ // 二元一次不定方程模版 // 给定a、b、c,求解方程ax + by = c // 如果方程无解打印-1 -// 如果方程无正整数解,但是有整数解,打印这些整数解中,x的最小值,y的最小值 -// 如果方程有正整数解,打印正整数解的数量,以及所有正整数解中, -// x的最小值,y的最小值,x的最大值,y的最大值 +// 如果方程无正整数解,但是有整数解 +// 打印这些整数解中,x的最小正数值,y的最小正数值 +// 如果方程有正整数解,打印正整数解的数量,同时打印所有正整数解中, +// x的最小正数值,y的最小正数值,x的最大正数值,y的最大正数值 // 1 <= a、b、c <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P5656 // 如下实现是正确的,但是洛谷平台对空间卡的很严,只有使用C++能全部通过 diff --git a/src/class140/Code01_DiophantineEquation2.java b/src/class140/Code01_DiophantineEquation2.java index b4296caf3..e2bf4b56f 100644 --- a/src/class140/Code01_DiophantineEquation2.java +++ b/src/class140/Code01_DiophantineEquation2.java @@ -3,9 +3,10 @@ // 二元一次不定方程模版 // 给定a、b、c,求解方程ax + by = c // 如果方程无解打印-1 -// 如果方程无正整数解,但是有整数解,打印这些整数解中,x的最小值,y的最小值 -// 如果方程有正整数解,打印正整数解的数量,以及所有正整数解中, -// x的最小值,y的最小值,x的最大值,y的最大值 +// 如果方程无正整数解,但是有整数解 +// 打印这些整数解中,x的最小正数值,y的最小正数值 +// 如果方程有正整数解,打印正整数解的数量,同时打印所有正整数解中, +// x的最小正数值,y的最小正数值,x的最大正数值,y的最大正数值 // 1 <= a、b、c <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P5656 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 From 65d619dec9392a7ce4347625295f1b2d6defa2a9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 21 Aug 2024 17:14:23 +0800 Subject: [PATCH 0026/2029] modify code --- src/class140/Code01_DiophantineEquation1.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/class140/Code01_DiophantineEquation1.java b/src/class140/Code01_DiophantineEquation1.java index fb771b558..5f88a8fc1 100644 --- a/src/class140/Code01_DiophantineEquation1.java +++ b/src/class140/Code01_DiophantineEquation1.java @@ -78,18 +78,20 @@ public static void main(String[] args) throws IOException { y += yd * k; } if (y <= 0) { // 无正整数解 + // x能取得的最小正数 out.print(x + " "); + // y能取得的最小正数 out.println(y + yd * ((1 - y + yd - 1) / yd)); } else { // 有正整数解 // y减少到>=1的最小值,能减几次,就是正整数解的个数 out.print(((y - 1) / yd + 1) + " "); - // x能取得的最小正数值 + // x能取得的最小正数 out.print(x + " "); - // y能取得的最小正数值 + // y能取得的最小正数 out.print(((y - 1) % yd + 1) + " "); - // x能取得的最大正数值 + // x能取得的最大正数 out.print((x + (y - 1) / yd * xd) + " "); - // y能取得的最大正数值 + // y能取得的最大正数 out.println(y); } } From cb2e311160f615ca48fc8d156fe240bfc99dc2f1 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 21 Aug 2024 17:21:33 +0800 Subject: [PATCH 0027/2029] modify code --- src/class140/Code01_DiophantineEquation1.java | 14 +++++++------- src/class140/Code01_DiophantineEquation2.java | 14 +++++++------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/class140/Code01_DiophantineEquation1.java b/src/class140/Code01_DiophantineEquation1.java index 5f88a8fc1..f9b2c58a9 100644 --- a/src/class140/Code01_DiophantineEquation1.java +++ b/src/class140/Code01_DiophantineEquation1.java @@ -42,7 +42,7 @@ public static void exgcd(long a, long b) { } } - public static long a, b, c, xd, yd, k; + public static long a, b, c, xd, yd, times; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); @@ -68,14 +68,14 @@ public static void main(String[] args) throws IOException { if (x < 0) { // x要想增长到>=1且最小的值,差几个xd,算出来就是k的值 // 那应该是(1-x)/xd,结果向上取整 - k = (1 - x + xd - 1) / xd; - x += xd * k; - y -= yd * k; + times = (1 - x + xd - 1) / xd; + x += xd * times; + y -= yd * times; } else { // x要想减少到>=1且最小的值,差几个xd,算出来就是k的值,向下取整 - k = (x - 1) / xd; - x -= xd * k; - y += yd * k; + times = (x - 1) / xd; + x -= xd * times; + y += yd * times; } if (y <= 0) { // 无正整数解 // x能取得的最小正数 diff --git a/src/class140/Code01_DiophantineEquation2.java b/src/class140/Code01_DiophantineEquation2.java index e2bf4b56f..361ceb6ab 100644 --- a/src/class140/Code01_DiophantineEquation2.java +++ b/src/class140/Code01_DiophantineEquation2.java @@ -34,7 +34,7 @@ // } //} // -//long long a, b, c, xd, yd, k; +//long long a, b, c, xd, yd, times; // //int main() { // int cases; @@ -50,13 +50,13 @@ // xd = b / d; // yd = a / d; // if (x < 0) { -// k = (xd - x) / xd; -// x += xd * k; -// y -= yd * k; +// times = (xd - x) / xd; +// x += xd * times; +// y -= yd * times; // } else { -// k = (x - 1) / xd; -// x -= xd * k; -// y += yd * k; +// times = (x - 1) / xd; +// x -= xd * times; +// y += yd * times; // } // if (y <= 0) { // printf("%lld ", x); From c37a48689da3e1a63a4a8439444f47d35515990f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 21 Aug 2024 17:52:31 +0800 Subject: [PATCH 0028/2029] modify code --- src/class140/Code01_DiophantineEquation1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class140/Code01_DiophantineEquation1.java b/src/class140/Code01_DiophantineEquation1.java index f9b2c58a9..15a5bf8d5 100644 --- a/src/class140/Code01_DiophantineEquation1.java +++ b/src/class140/Code01_DiophantineEquation1.java @@ -83,7 +83,7 @@ public static void main(String[] args) throws IOException { // y能取得的最小正数 out.println(y + yd * ((1 - y + yd - 1) / yd)); } else { // 有正整数解 - // y减少到>=1的最小值,能减几次,就是正整数解的个数 + // y减少到1以下,能减几次,就是正整数解的个数 out.print(((y - 1) / yd + 1) + " "); // x能取得的最小正数 out.print(x + " "); From f6b085270d3c3e4fe15d535dc82a5836ddd65d6d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 21 Aug 2024 18:03:37 +0800 Subject: [PATCH 0029/2029] modify code --- src/class140/Code01_DiophantineEquation1.java | 4 +++- src/class140/Code01_DiophantineEquation2.java | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/class140/Code01_DiophantineEquation1.java b/src/class140/Code01_DiophantineEquation1.java index 15a5bf8d5..a18712a4f 100644 --- a/src/class140/Code01_DiophantineEquation1.java +++ b/src/class140/Code01_DiophantineEquation1.java @@ -77,6 +77,8 @@ public static void main(String[] args) throws IOException { x -= xd * times; y += yd * times; } + // 此时得到的(x, y),是x为最小正整数时的一组解 + // 然后继续讨论 if (y <= 0) { // 无正整数解 // x能取得的最小正数 out.print(x + " "); @@ -88,7 +90,7 @@ public static void main(String[] args) throws IOException { // x能取得的最小正数 out.print(x + " "); // y能取得的最小正数 - out.print(((y - 1) % yd + 1) + " "); + out.print((y - (y - 1) / yd * yd) + " "); // x能取得的最大正数 out.print((x + (y - 1) / yd * xd) + " "); // y能取得的最大正数 diff --git a/src/class140/Code01_DiophantineEquation2.java b/src/class140/Code01_DiophantineEquation2.java index 361ceb6ab..74bad0de5 100644 --- a/src/class140/Code01_DiophantineEquation2.java +++ b/src/class140/Code01_DiophantineEquation2.java @@ -64,7 +64,7 @@ // } else { // printf("%lld ", ((y - 1) / yd + 1)); // printf("%lld ", x); -// printf("%lld ", ((y - 1) % yd + 1)); +// printf("%lld ", (y - (y - 1) / yd * yd)); // printf("%lld ", (x + (y - 1) / yd * xd)); // printf("%lld\n", y); // } From babe24d54289ce9148804e3e62d95cf417f9f975 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 21 Aug 2024 18:32:20 +0800 Subject: [PATCH 0030/2029] modify code --- src/class140/Code02_FrogsMeeting.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/class140/Code02_FrogsMeeting.java b/src/class140/Code02_FrogsMeeting.java index 2f093fc6e..fce8836ac 100644 --- a/src/class140/Code02_FrogsMeeting.java +++ b/src/class140/Code02_FrogsMeeting.java @@ -50,10 +50,13 @@ public static void main(String[] args) throws IOException { long n = (long) in.nval; in.nextToken(); long l = (long) in.nval; - long a = n - m; - long c = x1 - x2; - if (c < 0) { - c += l; + long a, c; + if (x1 > x2) { + a = n - m; + c = x1 - x2; + } else { + a = m - n; + c = x2 - x1; } if (a < 0) { a = -a; From 64e8f563815691e130a2a0b933b195d301ccc753 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 21 Aug 2024 20:11:56 +0800 Subject: [PATCH 0031/2029] modify code --- src/class140/Code02_FrogsMeeting.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/class140/Code02_FrogsMeeting.java b/src/class140/Code02_FrogsMeeting.java index fce8836ac..4b6ad3a35 100644 --- a/src/class140/Code02_FrogsMeeting.java +++ b/src/class140/Code02_FrogsMeeting.java @@ -7,6 +7,7 @@ // 返回两只青蛙多久才能首次相遇 // 1 <= l <= 3 * 10^9 // 1 <= x1、x2、m、n <= 2 * 10^9 +// x1 != x2 // 测试链接 : https://www.luogu.com.cn/problem/P1516 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -63,10 +64,20 @@ public static void main(String[] args) throws IOException { c = l - c; } exgcd(a, l); - if (c % d == 0) { - out.println(((x * c / d) % (l / d) + (l / d)) % (l / d)); - } else { + if (c % d != 0) { out.println("Impossible"); + } else { + // 解出的特解 + long x0 = x * c / d; + // 单次幅度 + long xd = l / d; + // x0调整成>=1的最小正整数,处理办法和上一题一样 + if (x0 < 0) { + x0 += (1 - x0 + xd - 1) / xd * xd; + } else { + x0 -= (x0 - 1) / xd * xd; + } + out.println(x0); } out.flush(); out.close(); From c03fd0db5aaf7d0042538781d3da9cef9b235452 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 21 Aug 2024 20:15:12 +0800 Subject: [PATCH 0032/2029] modify code --- src/class140/Code02_FrogsMeeting.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/class140/Code02_FrogsMeeting.java b/src/class140/Code02_FrogsMeeting.java index 4b6ad3a35..ae5ca649a 100644 --- a/src/class140/Code02_FrogsMeeting.java +++ b/src/class140/Code02_FrogsMeeting.java @@ -2,9 +2,10 @@ // 青蛙的约会 // 有一个周长为l的环,从环的0位置开始,规定只能沿着顺时针方向不停转圈 -// 青蛙A在环的x1位置,每秒跳m个位置,青蛙B在x2位置,每秒跳n个位置 +// 青蛙A在环的x1位置,每秒跳m个单位,青蛙B在x2位置,每秒跳n个单位 // 只有在某时刻,青蛙A和青蛙B来到环的同一个位置,才算相遇 -// 返回两只青蛙多久才能首次相遇 +// 如果两只青蛙相遇不了,打印"Impossible" +// 如果可以相遇,打印两只青蛙至少多久才能相遇 // 1 <= l <= 3 * 10^9 // 1 <= x1、x2、m、n <= 2 * 10^9 // x1 != x2 From 036f9fa64e8707309092140141f10a801ac0f79c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 21 Aug 2024 20:45:04 +0800 Subject: [PATCH 0033/2029] modify code --- src/class140/Code02_FrogsMeeting.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class140/Code02_FrogsMeeting.java b/src/class140/Code02_FrogsMeeting.java index ae5ca649a..7f55ee5a9 100644 --- a/src/class140/Code02_FrogsMeeting.java +++ b/src/class140/Code02_FrogsMeeting.java @@ -53,12 +53,12 @@ public static void main(String[] args) throws IOException { in.nextToken(); long l = (long) in.nval; long a, c; - if (x1 > x2) { - a = n - m; - c = x1 - x2; - } else { + if (x1 < x2) { a = m - n; c = x2 - x1; + } else { + a = n - m; + c = x1 - x2; } if (a < 0) { a = -a; From 3577ff90eca5add530615b1425e5e75a40611ae6 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 21 Aug 2024 21:11:25 +0800 Subject: [PATCH 0034/2029] modify code --- src/class140/Code03_HowManyPoints.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class140/Code03_HowManyPoints.java b/src/class140/Code03_HowManyPoints.java index 960ff266a..a9c381c92 100644 --- a/src/class140/Code03_HowManyPoints.java +++ b/src/class140/Code03_HowManyPoints.java @@ -1,6 +1,6 @@ package class140; -// 格点连线上一共几个点 +// 格点连线上有几个格点 // 二维网格中只有x和y的值都为整数的坐标,才叫格点 // 给定两个格点,A在(x1, y1),B在(x2, y2) // 返回A和B的连线上,包括A和B在内,一共有几个格点 From 535b26df4399d7d01c7f54e7bdb79c4f9ff92e76 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 21 Aug 2024 22:43:05 +0800 Subject: [PATCH 0035/2029] modify code --- src/class140/Code04_Area.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class140/Code04_Area.java b/src/class140/Code04_Area.java index c8b5b8732..11d8192e5 100644 --- a/src/class140/Code04_Area.java +++ b/src/class140/Code04_Area.java @@ -41,11 +41,11 @@ public static void main(String[] args) throws IOException { in.nextToken(); dy = (int) in.nval; edges += gcd(Math.abs(dx), Math.abs(dy)); + // 鞋带公式,最后要除以2 area += x * (y + dy) - (x + dx) * y; x += dx; y += dy; } - // 叉积的结果是两个向量做边的平行四边形面积,最终得到的结果需要除以2 area /= 2; // pick定理 // 如果一个多边形的顶点都是格点(坐标都为整数),多边形面积 = 边界上格点数/2 + 内部格点数 - 1 From eb15243f118ebf2606cdb794f0666dc5eedd6fa6 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 21 Aug 2024 23:36:10 +0800 Subject: [PATCH 0036/2029] modify code --- src/class140/Code04_Area.java | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/class140/Code04_Area.java b/src/class140/Code04_Area.java index 11d8192e5..18431d123 100644 --- a/src/class140/Code04_Area.java +++ b/src/class140/Code04_Area.java @@ -4,7 +4,8 @@ // 二维网格中只有x和y的值都为整数的坐标,才叫格点 // 某个机器人从格点(0,0)出发,每次机器人都走直线到达(x + dx, y + dy)的格点 // 一共移动n次,每次的(dx, dy)都给定,输入保证机器人最终回到(0,0)位置 -// 机器人走的路线所围成的区域一定是多边形,从起点出发最终回到起点,途中路线不再相交 +// 机器人走的路线所围成的区域一定是多边形,并且机器人一定沿着逆时针方向行动 +// 机器人从起点出发最终回到起点,途中路线不会相交 // 返回多边形的内部一共几个格点,多边形的边上一共几个格点,多边形的面积 // 3 <= n <= 100 // -100 <= dx、dy <= 100 @@ -35,21 +36,24 @@ public static void main(String[] args) throws IOException { int n = (int) in.nval; int edges = 0; double area = 0; - for (int i = 1, x = 0, y = 0, dx, dy; i <= n; i++) { + for (int i = 1, x1 = 0, y1 = 0, x2, y2; i <= n; i++) { in.nextToken(); - dx = (int) in.nval; + x2 = x1 + (int) in.nval; in.nextToken(); - dy = (int) in.nval; - edges += gcd(Math.abs(dx), Math.abs(dy)); - // 鞋带公式,最后要除以2 - area += x * (y + dy) - (x + dx) * y; - x += dx; - y += dy; + y2 = y1 + (int) in.nval; + edges += gcd(Math.abs(x1 - x2), Math.abs(y1 - y2)); + // 鞋带公式 + area += x2 * y1 - x1 * y2; + x1 = x2; + y1 = y2; } - area /= 2; + // 课上讲的鞋带公式是顺时针方向移动,本题是逆时针方向 + // 所以求出的面积是负数形式,所以取相反数,最后还要/2 + area = (-area) / 2; // pick定理 - // 如果一个多边形的顶点都是格点(坐标都为整数),多边形面积 = 边界上格点数/2 + 内部格点数 - 1 - // 所以,内部格点数 = 多边形面积 - 边界上格点数/2 + 1 + // 如果一个多边形的顶点都是格点(坐标都为整数) + // 多边形面积 = 边界上格点数/2 + 内部格点数 - 1 + // 内部格点数 = 多边形面积 - 边界上格点数/2 + 1 int inners = (int) (area) - edges / 2 + 1; out.println("Scenario #" + t + ":"); out.print(inners + " "); From eb4a09b92064a85745d5a83bc255b3c0c6938f17 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 22 Aug 2024 09:04:31 +0800 Subject: [PATCH 0037/2029] modify code --- src/class065/Code04_SPFA.java | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/class065/Code04_SPFA.java b/src/class065/Code04_SPFA.java index dbbaf0a38..7173201a6 100644 --- a/src/class065/Code04_SPFA.java +++ b/src/class065/Code04_SPFA.java @@ -73,13 +73,18 @@ public static void main(String[] args) throws IOException { in.nextToken(); int cases = (int) in.nval; for (int i = 0, n, m; i < cases; i++) { - in.nextToken(); n = (int) in.nval; - in.nextToken(); m = (int) in.nval; + in.nextToken(); + n = (int) in.nval; + in.nextToken(); + m = (int) in.nval; build(n); for (int j = 0, u, v, w; j < m; j++) { - in.nextToken(); u = (int) in.nval; - in.nextToken(); v = (int) in.nval; - in.nextToken(); w = (int) in.nval; + in.nextToken(); + u = (int) in.nval; + in.nextToken(); + v = (int) in.nval; + in.nextToken(); + w = (int) in.nval; if (w >= 0) { addEdge(u, v, w); addEdge(v, u, w); @@ -109,7 +114,8 @@ public static boolean spfa(int n) { if (distance[u] + w < distance[v]) { distance[v] = distance[u] + w; if (!enter[v]) { - if (updateCnt[v]++ == n) { + // 松弛次数超过n-1就有负环 + if (++updateCnt[v] >= n) { return true; } queue[r++] = v; From 44d30a0152e2f0f52894aa75f65604961e5a04c9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 22 Aug 2024 09:32:00 +0800 Subject: [PATCH 0038/2029] modify code --- src/class140/Code04_Area.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class140/Code04_Area.java b/src/class140/Code04_Area.java index 18431d123..e0311718a 100644 --- a/src/class140/Code04_Area.java +++ b/src/class140/Code04_Area.java @@ -43,13 +43,13 @@ public static void main(String[] args) throws IOException { y2 = y1 + (int) in.nval; edges += gcd(Math.abs(x1 - x2), Math.abs(y1 - y2)); // 鞋带公式 - area += x2 * y1 - x1 * y2; + // 课上讲的是顺时针方向移动,本题是逆时针方向,所以每一步取相反数即可 + area += x1 * y2 - x2 * y1; x1 = x2; y1 = y2; } - // 课上讲的鞋带公式是顺时针方向移动,本题是逆时针方向 - // 所以求出的面积是负数形式,所以取相反数,最后还要/2 - area = (-area) / 2; + // 鞋带公式最后要/2 + area /= 2; // pick定理 // 如果一个多边形的顶点都是格点(坐标都为整数) // 多边形面积 = 边界上格点数/2 + 内部格点数 - 1 From 9b22e367c0a8a1244fad78af4bc20480a362b7c3 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 22 Aug 2024 09:33:23 +0800 Subject: [PATCH 0039/2029] modify code --- src/class065/Code04_SPFA.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class065/Code04_SPFA.java b/src/class065/Code04_SPFA.java index 7173201a6..1d9b99d2b 100644 --- a/src/class065/Code04_SPFA.java +++ b/src/class065/Code04_SPFA.java @@ -115,7 +115,7 @@ public static boolean spfa(int n) { distance[v] = distance[u] + w; if (!enter[v]) { // 松弛次数超过n-1就有负环 - if (++updateCnt[v] >= n) { + if (++updateCnt[v] > n - 1) { return true; } queue[r++] = v; From 93c374aa644a376a49905bbbb8d8041166e0e985 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 22 Aug 2024 14:41:16 +0800 Subject: [PATCH 0040/2029] modify code --- src/class140/Code04_Area.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/class140/Code04_Area.java b/src/class140/Code04_Area.java index e0311718a..a80368fb9 100644 --- a/src/class140/Code04_Area.java +++ b/src/class140/Code04_Area.java @@ -36,17 +36,17 @@ public static void main(String[] args) throws IOException { int n = (int) in.nval; int edges = 0; double area = 0; - for (int i = 1, x1 = 0, y1 = 0, x2, y2; i <= n; i++) { + for (int i = 1, x = 0, y = 0, dx, dy; i <= n; i++) { in.nextToken(); - x2 = x1 + (int) in.nval; + dx = (int) in.nval; in.nextToken(); - y2 = y1 + (int) in.nval; - edges += gcd(Math.abs(x1 - x2), Math.abs(y1 - y2)); - // 鞋带公式 - // 课上讲的是顺时针方向移动,本题是逆时针方向,所以每一步取相反数即可 - area += x1 * y2 - x2 * y1; - x1 = x2; - y1 = y2; + dy = (int) in.nval; + // 题目3的重要结论 + edges += gcd(Math.abs(dx), Math.abs(dy)); + // 鞋带公式,逆时针方向转动的公式 + area += x * (y + dy) - (x + dx) * y; + x += dx; + y += dy; } // 鞋带公式最后要/2 area /= 2; From 74835fda22a12b26fe2a71f992dc292b1af81cce Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 22 Aug 2024 14:42:22 +0800 Subject: [PATCH 0041/2029] modify code --- src/class140/Code04_Area.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/class140/Code04_Area.java b/src/class140/Code04_Area.java index a80368fb9..b04a90530 100644 --- a/src/class140/Code04_Area.java +++ b/src/class140/Code04_Area.java @@ -43,7 +43,7 @@ public static void main(String[] args) throws IOException { dy = (int) in.nval; // 题目3的重要结论 edges += gcd(Math.abs(dx), Math.abs(dy)); - // 鞋带公式,逆时针方向转动的公式 + // 逆时针方向转动的鞋带公式 area += x * (y + dy) - (x + dx) * y; x += dx; y += dy; @@ -51,7 +51,6 @@ public static void main(String[] args) throws IOException { // 鞋带公式最后要/2 area /= 2; // pick定理 - // 如果一个多边形的顶点都是格点(坐标都为整数) // 多边形面积 = 边界上格点数/2 + 内部格点数 - 1 // 内部格点数 = 多边形面积 - 边界上格点数/2 + 1 int inners = (int) (area) - edges / 2 + 1; From 6ba11625f7a513ccd1d2731eb0ac812ed6dc9d39 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 22 Aug 2024 14:48:34 +0800 Subject: [PATCH 0042/2029] modify code --- src/class140/Code04_Area.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/class140/Code04_Area.java b/src/class140/Code04_Area.java index b04a90530..cb5e60b69 100644 --- a/src/class140/Code04_Area.java +++ b/src/class140/Code04_Area.java @@ -3,9 +3,8 @@ // 机器人的移动区域 // 二维网格中只有x和y的值都为整数的坐标,才叫格点 // 某个机器人从格点(0,0)出发,每次机器人都走直线到达(x + dx, y + dy)的格点 -// 一共移动n次,每次的(dx, dy)都给定,输入保证机器人最终回到(0,0)位置 -// 机器人走的路线所围成的区域一定是多边形,并且机器人一定沿着逆时针方向行动 -// 机器人从起点出发最终回到起点,途中路线不会相交 +// 一共移动n次,每次的(dx, dy)都给定,途中路线不会交叉,输入保证机器人最终回到(0,0) +// 机器人走的路线所围成的区域一定是多边形,输入保证机器人一定沿着逆时针方向行动 // 返回多边形的内部一共几个格点,多边形的边上一共几个格点,多边形的面积 // 3 <= n <= 100 // -100 <= dx、dy <= 100 From 0e394c45a5d4ada40e5a8ab61ea544b80430bb4b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 22 Aug 2024 17:07:22 +0800 Subject: [PATCH 0043/2029] modify code --- ...15\345\256\232\346\226\271\347\250\213.pptx" | Bin 0 -> 47287 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "ppt/\347\256\227\346\263\225\350\256\262\350\247\243140\343\200\220\346\211\251\345\261\225\343\200\221\346\211\251\345\261\225\346\254\247\345\207\240\351\207\214\345\276\227\345\222\214\344\272\214\345\205\203\344\270\200\346\254\241\344\270\215\345\256\232\346\226\271\347\250\213.pptx" diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243140\343\200\220\346\211\251\345\261\225\343\200\221\346\211\251\345\261\225\346\254\247\345\207\240\351\207\214\345\276\227\345\222\214\344\272\214\345\205\203\344\270\200\346\254\241\344\270\215\345\256\232\346\226\271\347\250\213.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243140\343\200\220\346\211\251\345\261\225\343\200\221\346\211\251\345\261\225\346\254\247\345\207\240\351\207\214\345\276\227\345\222\214\344\272\214\345\205\203\344\270\200\346\254\241\344\270\215\345\256\232\346\226\271\347\250\213.pptx" new file mode 100644 index 0000000000000000000000000000000000000000..916949baf8ee82e9c06e55f6887a8903a96f70a7 GIT binary patch literal 47287 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 literal 0 HcmV?d00001 From d2df835bdafe8bdc1fc3470621c43bbaccb47612 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 27 Aug 2024 14:05:30 +0800 Subject: [PATCH 0044/2029] modify code --- src/class141/Code01_CRT.java | 89 ++++++++++++++++++++++++++++++++++ src/class141/Code02_EXCRT.java | 89 ++++++++++++++++++++++++++++++++++ 2 files changed, 178 insertions(+) create mode 100644 src/class141/Code01_CRT.java create mode 100644 src/class141/Code02_EXCRT.java diff --git a/src/class141/Code01_CRT.java b/src/class141/Code01_CRT.java new file mode 100644 index 000000000..f43dfbd40 --- /dev/null +++ b/src/class141/Code01_CRT.java @@ -0,0 +1,89 @@ +package class141; + +// 中国剩余定理模版 +// 测试链接 : https://www.luogu.com.cn/problem/P1495 + +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 Code01_CRT { + + public static int MAXN = 11; + + public static long a[] = new long[MAXN]; + + public static long b[] = new long[MAXN]; + + // 讲解139 - 扩展欧几里得算法 + public static long d, x, y, px, py; + + public static void exgcd(long a, long b) { + if (b == 0) { + d = a; + x = 1; + y = 0; + } else { + exgcd(b, a % b); + px = x; + py = y; + x = py; + y = px - py * (a / b); + } + } + + // 讲解033 - 位运算实现乘法,a*b过程每一步都%mod,这么写是防止溢出 + public static long multiply(long a, long b, long mod) { + long ans = 0; + while (b != 0) { + if ((b & 1) != 0) { + ans = (ans + a) % mod; + } + a = (a + a) % mod; + b >>= 1; + } + return ans; + } + + // 中国剩余定理模版 + public static long crt(int n) { + long m = 1; + for (int i = 1; i <= n; i++) { + m = m * a[i]; + } + long mi, tmp, ans = 0; + for (int i = 1; i <= n; i++) { + mi = m / a[i]; + exgcd(mi, a[i]); + // 扩展欧几里得得到的解可能是负数 + x = (x % m + m) % m; + // 自己实现的乘法确保相乘结果正确取余 + tmp = multiply(multiply(mi, x, m), b[i], m); + // ans = ans + mi * x * b[i] + ans = (ans + tmp) % m; + } + return ans; + } + + 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(); + int n = (int) in.nval; + for (int i = 1; i <= n; i++) { + in.nextToken(); + a[i] = (long) in.nval; + in.nextToken(); + b[i] = (long) in.nval; + } + out.println(crt(n)); + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class141/Code02_EXCRT.java b/src/class141/Code02_EXCRT.java new file mode 100644 index 000000000..16dd7a8a4 --- /dev/null +++ b/src/class141/Code02_EXCRT.java @@ -0,0 +1,89 @@ +package class141; + +// 扩展中国剩余定理模版 +// 测试链接 : https://www.luogu.com.cn/problem/P1495 +// 测试链接 : https://www.luogu.com.cn/problem/P4777 + +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 Code02_EXCRT { + + public static int MAXN = 100001; + + public static long a[] = new long[MAXN]; + + public static long b[] = new long[MAXN]; + + // 讲解139 - 扩展欧几里得算法 + public static long d, x, y, px, py; + + public static void exgcd(long a, long b) { + if (b == 0) { + d = a; + x = 1; + y = 0; + } else { + exgcd(b, a % b); + px = x; + py = y; + x = py; + y = px - py * (a / b); + } + } + + // 讲解033 - 位运算实现乘法,a*b过程每一步都%mod,这么写是防止溢出 + public static long multiply(long a, long b, long mod) { + long ans = 0; + while (b != 0) { + if ((b & 1) != 0) { + ans = (ans + a) % mod; + } + a = (a + a) % mod; + b >>= 1; + } + return ans; + } + + // 扩展中国剩余定理模版 + public static long excrt(int n) { + long a1 = a[1], b1 = b[1], a2, b2, c, tmp; + for (int i = 2; i <= n; i++) { + a2 = a[i]; + b2 = b[i]; + exgcd(a1, a2); + c = (b2 - b1 % a2 + a2) % a2; + if (c % d != 0) { + return -1; + } + x = multiply(x, c / d, a2 / d); + tmp = b1 + x * a1; + a1 = a2 / d * a1; + b1 = (tmp % a1 + a1) % a1; + } + return b1; + } + + 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(); + int n = (int) in.nval; + for (int i = 1; i <= n; i++) { + in.nextToken(); + a[i] = (long) in.nval; + in.nextToken(); + b[i] = (long) in.nval; + } + out.println(excrt(n)); + out.flush(); + out.close(); + br.close(); + } + +} From 15fe08711994a2b27279cb6d06027f744c075f42 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 27 Aug 2024 14:29:06 +0800 Subject: [PATCH 0045/2029] modify code --- src/class141/Code03_GuessNumber1.java | 95 +++++++++++++++++++++++++++ src/class141/Code03_GuessNumber2.java | 94 ++++++++++++++++++++++++++ 2 files changed, 189 insertions(+) create mode 100644 src/class141/Code03_GuessNumber1.java create mode 100644 src/class141/Code03_GuessNumber2.java diff --git a/src/class141/Code03_GuessNumber1.java b/src/class141/Code03_GuessNumber1.java new file mode 100644 index 000000000..37279253d --- /dev/null +++ b/src/class141/Code03_GuessNumber1.java @@ -0,0 +1,95 @@ +package class141; + +// 猜数字(中国剩余定理解决) +// 测试链接 : https://www.luogu.com.cn/problem/P3868 + +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 Code03_GuessNumber1 { + + public static int MAXN = 11; + + public static long a[] = new long[MAXN]; + + public static long b[] = new long[MAXN]; + + // 讲解139 - 扩展欧几里得算法 + public static long d, x, y, px, py; + + public static void exgcd(long a, long b) { + if (b == 0) { + d = a; + x = 1; + y = 0; + } else { + exgcd(b, a % b); + px = x; + py = y; + x = py; + y = px - py * (a / b); + } + } + + // 讲解033 - 位运算实现乘法,a*b过程每一步都%mod,这么写是防止溢出 + public static long multiply(long a, long b, long mod) { + long ans = 0; + while (b != 0) { + if ((b & 1) != 0) { + ans = (ans + a) % mod; + } + a = (a + a) % mod; + b >>= 1; + } + return ans; + } + + // 中国剩余定理模版 + public static long crt(int n) { + long m = 1; + for (int i = 1; i <= n; i++) { + m = m * a[i]; + } + long mi, tmp, ans = 0; + for (int i = 1; i <= n; i++) { + mi = m / a[i]; + exgcd(mi, a[i]); + // 扩展欧几里得得到的解可能是负数 + x = (x % m + m) % m; + // 自己实现的乘法确保相乘结果正确取余 + tmp = multiply(multiply(mi, x, m), b[i], m); + // ans = ans + mi * x * b[i] + ans = (ans + tmp) % m; + } + return ans; + } + + 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(); + int n = (int) in.nval; + for (int i = 1; i <= n; i++) { + in.nextToken(); + b[i] = (long) in.nval; + } + for (int i = 1; i <= n; i++) { + in.nextToken(); + a[i] = (long) in.nval; + } + // 题目输入负数要转化成正数 + for (int i = 1; i <= n; i++) { + b[i] = (b[i] % a[i] + a[i]) % a[i]; + } + out.println(crt(n)); + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class141/Code03_GuessNumber2.java b/src/class141/Code03_GuessNumber2.java new file mode 100644 index 000000000..39a3ae4f2 --- /dev/null +++ b/src/class141/Code03_GuessNumber2.java @@ -0,0 +1,94 @@ +package class141; + +// 猜数字(扩展中国剩余定理解决) +// 测试链接 : https://www.luogu.com.cn/problem/P3868 + +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 Code03_GuessNumber2 { + + public static int MAXN = 11; + + public static long a[] = new long[MAXN]; + + public static long b[] = new long[MAXN]; + + // 讲解139 - 扩展欧几里得算法 + public static long d, x, y, px, py; + + public static void exgcd(long a, long b) { + if (b == 0) { + d = a; + x = 1; + y = 0; + } else { + exgcd(b, a % b); + px = x; + py = y; + x = py; + y = px - py * (a / b); + } + } + + // 讲解033 - 位运算实现乘法,a*b过程每一步都%mod,这么写是防止溢出 + public static long multiply(long a, long b, long mod) { + long ans = 0; + while (b != 0) { + if ((b & 1) != 0) { + ans = (ans + a) % mod; + } + a = (a + a) % mod; + b >>= 1; + } + return ans; + } + + // 扩展中国剩余定理模版 + public static long excrt(int n) { + long a1 = a[1], b1 = b[1], a2, b2, c, tmp; + for (int i = 2; i <= n; i++) { + a2 = a[i]; + b2 = b[i]; + exgcd(a1, a2); + c = (b2 - b1 % a2 + a2) % a2; + if (c % d != 0) { + return -1; + } + x = multiply(x, c / d, a2 / d); + tmp = b1 + x * a1; + a1 = a2 / d * a1; + b1 = (tmp % a1 + a1) % a1; + } + return b1; + } + + 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(); + int n = (int) in.nval; + for (int i = 1; i <= n; i++) { + in.nextToken(); + b[i] = (long) in.nval; + } + for (int i = 1; i <= n; i++) { + in.nextToken(); + a[i] = (long) in.nval; + } + // 题目输入负数要转化成正数 + for (int i = 1; i <= n; i++) { + b[i] = (b[i] % a[i] + a[i]) % a[i]; + } + out.println(excrt(n)); + out.flush(); + out.close(); + br.close(); + } + +} From 2067f799bcff74e933e5cac3e784baf399256176 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 27 Aug 2024 14:34:53 +0800 Subject: [PATCH 0046/2029] modify code --- src/class141/Code03_GuessNumber1.java | 5 ----- src/class141/Code03_GuessNumber2.java | 2 -- src/class141/Code04_DragonSlayer.java | 7 +++++++ 3 files changed, 7 insertions(+), 7 deletions(-) create mode 100644 src/class141/Code04_DragonSlayer.java diff --git a/src/class141/Code03_GuessNumber1.java b/src/class141/Code03_GuessNumber1.java index 37279253d..b5cc05a88 100644 --- a/src/class141/Code03_GuessNumber1.java +++ b/src/class141/Code03_GuessNumber1.java @@ -18,7 +18,6 @@ public class Code03_GuessNumber1 { public static long b[] = new long[MAXN]; - // 讲解139 - 扩展欧几里得算法 public static long d, x, y, px, py; public static void exgcd(long a, long b) { @@ -35,7 +34,6 @@ public static void exgcd(long a, long b) { } } - // 讲解033 - 位运算实现乘法,a*b过程每一步都%mod,这么写是防止溢出 public static long multiply(long a, long b, long mod) { long ans = 0; while (b != 0) { @@ -58,11 +56,8 @@ public static long crt(int n) { for (int i = 1; i <= n; i++) { mi = m / a[i]; exgcd(mi, a[i]); - // 扩展欧几里得得到的解可能是负数 x = (x % m + m) % m; - // 自己实现的乘法确保相乘结果正确取余 tmp = multiply(multiply(mi, x, m), b[i], m); - // ans = ans + mi * x * b[i] ans = (ans + tmp) % m; } return ans; diff --git a/src/class141/Code03_GuessNumber2.java b/src/class141/Code03_GuessNumber2.java index 39a3ae4f2..a400d5517 100644 --- a/src/class141/Code03_GuessNumber2.java +++ b/src/class141/Code03_GuessNumber2.java @@ -18,7 +18,6 @@ public class Code03_GuessNumber2 { public static long b[] = new long[MAXN]; - // 讲解139 - 扩展欧几里得算法 public static long d, x, y, px, py; public static void exgcd(long a, long b) { @@ -35,7 +34,6 @@ public static void exgcd(long a, long b) { } } - // 讲解033 - 位运算实现乘法,a*b过程每一步都%mod,这么写是防止溢出 public static long multiply(long a, long b, long mod) { long ans = 0; while (b != 0) { diff --git a/src/class141/Code04_DragonSlayer.java b/src/class141/Code04_DragonSlayer.java new file mode 100644 index 000000000..4b55d0c45 --- /dev/null +++ b/src/class141/Code04_DragonSlayer.java @@ -0,0 +1,7 @@ +package class141; + +// 屠龙勇士 +// 测试链接 : https://www.luogu.com.cn/problem/P4774 +public class Code04_DragonSlayer { + +} From 004b802f76a90858ffbabf63f2765fc37824ae77 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 27 Aug 2024 14:42:46 +0800 Subject: [PATCH 0047/2029] modify code --- src/class033/BitOperationAddMinusMultiplyDivide.java | 1 + src/class139/Code05_ShuffleCards.java | 2 +- src/class141/Code01_CRT.java | 3 ++- src/class141/Code02_EXCRT.java | 3 ++- src/class141/Code03_GuessNumber1.java | 2 ++ src/class141/Code03_GuessNumber2.java | 2 ++ 6 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/class033/BitOperationAddMinusMultiplyDivide.java b/src/class033/BitOperationAddMinusMultiplyDivide.java index e1e00b742..3f2c60d3f 100644 --- a/src/class033/BitOperationAddMinusMultiplyDivide.java +++ b/src/class033/BitOperationAddMinusMultiplyDivide.java @@ -65,6 +65,7 @@ public static int neg(int n) { return add(~n, 1); } + // 这种乘法后面有大用处,尤其是求(a的b次方 % m)的结果,也叫龟速乘 public static int multiply(int a, int b) { int ans = 0; while (b != 0) { diff --git a/src/class139/Code05_ShuffleCards.java b/src/class139/Code05_ShuffleCards.java index e922fffbd..11def16c2 100644 --- a/src/class139/Code05_ShuffleCards.java +++ b/src/class139/Code05_ShuffleCards.java @@ -41,7 +41,7 @@ public static void exgcd(long a, long b) { // 原理来自,讲解033,位运算实现乘法 // a * b的过程自己实现,每一个中间过程都%mod - // 这么写目的是防止溢出 + // 这么写目的是防止溢出,也叫龟速乘 public static long multiply(long a, long b, long mod) { long ans = 0; while (b != 0) { diff --git a/src/class141/Code01_CRT.java b/src/class141/Code01_CRT.java index f43dfbd40..390981c1b 100644 --- a/src/class141/Code01_CRT.java +++ b/src/class141/Code01_CRT.java @@ -35,7 +35,8 @@ public static void exgcd(long a, long b) { } } - // 讲解033 - 位运算实现乘法,a*b过程每一步都%mod,这么写是防止溢出 + // 讲解033 - 位运算实现乘法 + // a*b过程每一步都%mod,这么写是防止溢出,也叫龟速乘 public static long multiply(long a, long b, long mod) { long ans = 0; while (b != 0) { diff --git a/src/class141/Code02_EXCRT.java b/src/class141/Code02_EXCRT.java index 16dd7a8a4..95d83608a 100644 --- a/src/class141/Code02_EXCRT.java +++ b/src/class141/Code02_EXCRT.java @@ -36,7 +36,8 @@ public static void exgcd(long a, long b) { } } - // 讲解033 - 位运算实现乘法,a*b过程每一步都%mod,这么写是防止溢出 + // 讲解033 - 位运算实现乘法 + // a*b过程每一步都%mod,这么写是防止溢出,也叫龟速乘 public static long multiply(long a, long b, long mod) { long ans = 0; while (b != 0) { diff --git a/src/class141/Code03_GuessNumber1.java b/src/class141/Code03_GuessNumber1.java index b5cc05a88..2382dd2c7 100644 --- a/src/class141/Code03_GuessNumber1.java +++ b/src/class141/Code03_GuessNumber1.java @@ -34,6 +34,8 @@ public static void exgcd(long a, long b) { } } + // 讲解033 - 位运算实现乘法 + // a*b过程每一步都%mod,这么写是防止溢出,也叫龟速乘 public static long multiply(long a, long b, long mod) { long ans = 0; while (b != 0) { diff --git a/src/class141/Code03_GuessNumber2.java b/src/class141/Code03_GuessNumber2.java index a400d5517..d966552ca 100644 --- a/src/class141/Code03_GuessNumber2.java +++ b/src/class141/Code03_GuessNumber2.java @@ -34,6 +34,8 @@ public static void exgcd(long a, long b) { } } + // 讲解033 - 位运算实现乘法 + // a*b过程每一步都%mod,这么写是防止溢出,也叫龟速乘 public static long multiply(long a, long b, long mod) { long ans = 0; while (b != 0) { From 985091b62434b04c4f02666767e1385400b1d7b6 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 27 Aug 2024 14:45:07 +0800 Subject: [PATCH 0048/2029] modify code --- src/class141/Code03_GuessNumber1.java | 1 + src/class141/Code03_GuessNumber2.java | 1 + 2 files changed, 2 insertions(+) diff --git a/src/class141/Code03_GuessNumber1.java b/src/class141/Code03_GuessNumber1.java index 2382dd2c7..18e817fa9 100644 --- a/src/class141/Code03_GuessNumber1.java +++ b/src/class141/Code03_GuessNumber1.java @@ -18,6 +18,7 @@ public class Code03_GuessNumber1 { public static long b[] = new long[MAXN]; + // 讲解139 - 扩展欧几里得算法 public static long d, x, y, px, py; public static void exgcd(long a, long b) { diff --git a/src/class141/Code03_GuessNumber2.java b/src/class141/Code03_GuessNumber2.java index d966552ca..55978e2c1 100644 --- a/src/class141/Code03_GuessNumber2.java +++ b/src/class141/Code03_GuessNumber2.java @@ -18,6 +18,7 @@ public class Code03_GuessNumber2 { public static long b[] = new long[MAXN]; + // 讲解139 - 扩展欧几里得算法 public static long d, x, y, px, py; public static void exgcd(long a, long b) { From dd7cd27b54e7350cb5a090eb2f2fc005838747ca Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 27 Aug 2024 15:05:27 +0800 Subject: [PATCH 0049/2029] modify code --- src/class141/Code01_CRT.java | 20 ++++++++++---------- src/class141/Code03_GuessNumber1.java | 16 ++++++++-------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/class141/Code01_CRT.java b/src/class141/Code01_CRT.java index 390981c1b..8cacc49e5 100644 --- a/src/class141/Code01_CRT.java +++ b/src/class141/Code01_CRT.java @@ -51,20 +51,20 @@ public static long multiply(long a, long b, long mod) { // 中国剩余定理模版 public static long crt(int n) { - long m = 1; + long all = 1; for (int i = 1; i <= n; i++) { - m = m * a[i]; + all = all * a[i]; } - long mi, tmp, ans = 0; + long ai, ci, ans = 0; for (int i = 1; i <= n; i++) { - mi = m / a[i]; - exgcd(mi, a[i]); + ai = all / a[i]; + exgcd(ai, a[i]); // 扩展欧几里得得到的解可能是负数 - x = (x % m + m) % m; - // 自己实现的乘法确保相乘结果正确取余 - tmp = multiply(multiply(mi, x, m), b[i], m); - // ans = ans + mi * x * b[i] - ans = (ans + tmp) % m; + x = (x % all + all) % all; + // ci = (ai * ai逆元) % all + ci = multiply(ai, x, all); + // ans = (ans + (ci * bi) % all ) % all + ans = (ans + multiply(ci, b[i], all)) % all; } return ans; } diff --git a/src/class141/Code03_GuessNumber1.java b/src/class141/Code03_GuessNumber1.java index 18e817fa9..8e025a82c 100644 --- a/src/class141/Code03_GuessNumber1.java +++ b/src/class141/Code03_GuessNumber1.java @@ -51,17 +51,17 @@ public static long multiply(long a, long b, long mod) { // 中国剩余定理模版 public static long crt(int n) { - long m = 1; + long all = 1; for (int i = 1; i <= n; i++) { - m = m * a[i]; + all = all * a[i]; } - long mi, tmp, ans = 0; + long ai, ci, ans = 0; for (int i = 1; i <= n; i++) { - mi = m / a[i]; - exgcd(mi, a[i]); - x = (x % m + m) % m; - tmp = multiply(multiply(mi, x, m), b[i], m); - ans = (ans + tmp) % m; + ai = all / a[i]; + exgcd(ai, a[i]); + x = (x % all + all) % all; + ci = multiply(ai, x, all); + ans = (ans + multiply(ci, b[i], all)) % all; } return ans; } From 9d9cd4ac9ed422ba5ede93dc90991ad1c291fe5b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 27 Aug 2024 16:39:10 +0800 Subject: [PATCH 0050/2029] modify code --- src/class141/Code01_CRT.java | 23 ++++++++++++----------- src/class141/Code02_EXCRT.java | 2 +- src/class141/Code03_GuessNumber1.java | 16 ++++++++-------- src/class141/Code03_GuessNumber2.java | 2 +- 4 files changed, 22 insertions(+), 21 deletions(-) diff --git a/src/class141/Code01_CRT.java b/src/class141/Code01_CRT.java index 8cacc49e5..eda53fe9e 100644 --- a/src/class141/Code01_CRT.java +++ b/src/class141/Code01_CRT.java @@ -51,20 +51,21 @@ public static long multiply(long a, long b, long mod) { // 中国剩余定理模版 public static long crt(int n) { - long all = 1; + long m = 1; for (int i = 1; i <= n; i++) { - all = all * a[i]; + m = m * a[i]; } - long ai, ci, ans = 0; + long mi, ci, ans = 0; for (int i = 1; i <= n; i++) { - ai = all / a[i]; - exgcd(ai, a[i]); - // 扩展欧几里得得到的解可能是负数 - x = (x % all + all) % all; - // ci = (ai * ai逆元) % all - ci = multiply(ai, x, all); - // ans = (ans + (ci * bi) % all ) % all - ans = (ans + multiply(ci, b[i], all)) % all; + mi = m / a[i]; + // 扩展欧几里得算法得到的x是%a[i]意义下的逆元 + exgcd(mi, a[i]); + // 扩展欧几里得算法得到的解可能是负数,变成正的 + x = (x % m + m) % m; + // ci = (bi * mi * mi逆元) % m + ci = multiply(b[i], multiply(mi, x, m), m); + // ans = (ans + ci ) % all + ans = (ans + ci) % m; } return ans; } diff --git a/src/class141/Code02_EXCRT.java b/src/class141/Code02_EXCRT.java index 95d83608a..015d5b635 100644 --- a/src/class141/Code02_EXCRT.java +++ b/src/class141/Code02_EXCRT.java @@ -57,7 +57,7 @@ public static long excrt(int n) { a2 = a[i]; b2 = b[i]; exgcd(a1, a2); - c = (b2 - b1 % a2 + a2) % a2; + c = ((b2 - b1) % a2 + a2) % a2; if (c % d != 0) { return -1; } diff --git a/src/class141/Code03_GuessNumber1.java b/src/class141/Code03_GuessNumber1.java index 8e025a82c..cffe35032 100644 --- a/src/class141/Code03_GuessNumber1.java +++ b/src/class141/Code03_GuessNumber1.java @@ -51,17 +51,17 @@ public static long multiply(long a, long b, long mod) { // 中国剩余定理模版 public static long crt(int n) { - long all = 1; + long m = 1; for (int i = 1; i <= n; i++) { - all = all * a[i]; + m = m * a[i]; } - long ai, ci, ans = 0; + long mi, ci, ans = 0; for (int i = 1; i <= n; i++) { - ai = all / a[i]; - exgcd(ai, a[i]); - x = (x % all + all) % all; - ci = multiply(ai, x, all); - ans = (ans + multiply(ci, b[i], all)) % all; + mi = m / a[i]; + exgcd(mi, a[i]); + x = (x % m + m) % m; + ci = multiply(b[i], multiply(mi, x, m), m); + ans = (ans + ci) % m; } return ans; } diff --git a/src/class141/Code03_GuessNumber2.java b/src/class141/Code03_GuessNumber2.java index 55978e2c1..e3291a455 100644 --- a/src/class141/Code03_GuessNumber2.java +++ b/src/class141/Code03_GuessNumber2.java @@ -56,7 +56,7 @@ public static long excrt(int n) { a2 = a[i]; b2 = b[i]; exgcd(a1, a2); - c = (b2 - b1 % a2 + a2) % a2; + c = ((b2 - b1) % a2 + a2) % a2; if (c % d != 0) { return -1; } From ebcfd70976b8f58db0a45a132357b35b35d4ae55 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 27 Aug 2024 16:57:59 +0800 Subject: [PATCH 0051/2029] modify code --- src/class141/Code01_CRT.java | 31 +++++++++++++------------- src/class141/Code02_EXCRT.java | 28 +++++++++++------------ src/class141/Code03_GuessNumber1.java | 28 +++++++++++------------ src/class141/Code03_GuessNumber2.java | 32 +++++++++++++-------------- 4 files changed, 60 insertions(+), 59 deletions(-) diff --git a/src/class141/Code01_CRT.java b/src/class141/Code01_CRT.java index eda53fe9e..537474f1e 100644 --- a/src/class141/Code01_CRT.java +++ b/src/class141/Code01_CRT.java @@ -14,9 +14,9 @@ public class Code01_CRT { public static int MAXN = 11; - public static long a[] = new long[MAXN]; + public static long m[] = new long[MAXN]; - public static long b[] = new long[MAXN]; + public static long r[] = new long[MAXN]; // 讲解139 - 扩展欧几里得算法 public static long d, x, y, px, py; @@ -51,21 +51,22 @@ public static long multiply(long a, long b, long mod) { // 中国剩余定理模版 public static long crt(int n) { - long m = 1; + long all = 1; for (int i = 1; i <= n; i++) { - m = m * a[i]; + all = all * m[i]; } - long mi, ci, ans = 0; + long ai, ci, ans = 0; for (int i = 1; i <= n; i++) { - mi = m / a[i]; - // 扩展欧几里得算法得到的x是%a[i]意义下的逆元 - exgcd(mi, a[i]); - // 扩展欧几里得算法得到的解可能是负数,变成正的 - x = (x % m + m) % m; - // ci = (bi * mi * mi逆元) % m - ci = multiply(b[i], multiply(mi, x, m), m); + // 所有模数的乘积 / 当前的模数,得到ai + ai = all / m[i]; + // 扩展欧几里得算法得到的x是%m[i]意义下的逆元,可能是负数 + exgcd(ai, m[i]); + // 既然得到的解可能是负数,那么变成正的,就是ai的逆元 + x = (x % all + all) % all; + // ci = (ri * ai * ai逆元) % all + ci = multiply(r[i], multiply(ai, x, all), all); // ans = (ans + ci ) % all - ans = (ans + ci) % m; + ans = (ans + ci) % all; } return ans; } @@ -78,9 +79,9 @@ public static void main(String[] args) throws IOException { int n = (int) in.nval; for (int i = 1; i <= n; i++) { in.nextToken(); - a[i] = (long) in.nval; + m[i] = (long) in.nval; in.nextToken(); - b[i] = (long) in.nval; + r[i] = (long) in.nval; } out.println(crt(n)); out.flush(); diff --git a/src/class141/Code02_EXCRT.java b/src/class141/Code02_EXCRT.java index 015d5b635..c2582ac96 100644 --- a/src/class141/Code02_EXCRT.java +++ b/src/class141/Code02_EXCRT.java @@ -15,9 +15,9 @@ public class Code02_EXCRT { public static int MAXN = 100001; - public static long a[] = new long[MAXN]; + public static long m[] = new long[MAXN]; - public static long b[] = new long[MAXN]; + public static long r[] = new long[MAXN]; // 讲解139 - 扩展欧几里得算法 public static long d, x, y, px, py; @@ -52,21 +52,21 @@ public static long multiply(long a, long b, long mod) { // 扩展中国剩余定理模版 public static long excrt(int n) { - long a1 = a[1], b1 = b[1], a2, b2, c, tmp; + long m1 = m[1], r1 = r[1], m2, r2, c, tmp; for (int i = 2; i <= n; i++) { - a2 = a[i]; - b2 = b[i]; - exgcd(a1, a2); - c = ((b2 - b1) % a2 + a2) % a2; + m2 = m[i]; + r2 = r[i]; + exgcd(m1, m2); + c = ((r2 - r1) % m2 + m2) % m2; if (c % d != 0) { return -1; } - x = multiply(x, c / d, a2 / d); - tmp = b1 + x * a1; - a1 = a2 / d * a1; - b1 = (tmp % a1 + a1) % a1; + x = multiply(x, c / d, m2 / d); + tmp = r1 + x * m1; + m1 = m2 / d * m1; + r1 = (tmp % m1 + m1) % m1; } - return b1; + return r1; } public static void main(String[] args) throws IOException { @@ -77,9 +77,9 @@ public static void main(String[] args) throws IOException { int n = (int) in.nval; for (int i = 1; i <= n; i++) { in.nextToken(); - a[i] = (long) in.nval; + m[i] = (long) in.nval; in.nextToken(); - b[i] = (long) in.nval; + r[i] = (long) in.nval; } out.println(excrt(n)); out.flush(); diff --git a/src/class141/Code03_GuessNumber1.java b/src/class141/Code03_GuessNumber1.java index cffe35032..e152b73fe 100644 --- a/src/class141/Code03_GuessNumber1.java +++ b/src/class141/Code03_GuessNumber1.java @@ -14,9 +14,9 @@ public class Code03_GuessNumber1 { public static int MAXN = 11; - public static long a[] = new long[MAXN]; + public static long m[] = new long[MAXN]; - public static long b[] = new long[MAXN]; + public static long r[] = new long[MAXN]; // 讲解139 - 扩展欧几里得算法 public static long d, x, y, px, py; @@ -51,17 +51,17 @@ public static long multiply(long a, long b, long mod) { // 中国剩余定理模版 public static long crt(int n) { - long m = 1; + long all = 1; for (int i = 1; i <= n; i++) { - m = m * a[i]; + all = all * m[i]; } - long mi, ci, ans = 0; + long ai, ci, ans = 0; for (int i = 1; i <= n; i++) { - mi = m / a[i]; - exgcd(mi, a[i]); - x = (x % m + m) % m; - ci = multiply(b[i], multiply(mi, x, m), m); - ans = (ans + ci) % m; + ai = all / m[i]; + exgcd(ai, m[i]); + x = (x % all + all) % all; + ci = multiply(r[i], multiply(ai, x, all), all); + ans = (ans + ci) % all; } return ans; } @@ -74,15 +74,15 @@ public static void main(String[] args) throws IOException { int n = (int) in.nval; for (int i = 1; i <= n; i++) { in.nextToken(); - b[i] = (long) in.nval; + r[i] = (long) in.nval; } for (int i = 1; i <= n; i++) { in.nextToken(); - a[i] = (long) in.nval; + m[i] = (long) in.nval; } - // 题目输入负数要转化成正数 + // 题目输入的余数可能为负所以转化成正数 for (int i = 1; i <= n; i++) { - b[i] = (b[i] % a[i] + a[i]) % a[i]; + r[i] = (r[i] % m[i] + m[i]) % m[i]; } out.println(crt(n)); out.flush(); diff --git a/src/class141/Code03_GuessNumber2.java b/src/class141/Code03_GuessNumber2.java index e3291a455..e2ec75fc1 100644 --- a/src/class141/Code03_GuessNumber2.java +++ b/src/class141/Code03_GuessNumber2.java @@ -14,9 +14,9 @@ public class Code03_GuessNumber2 { public static int MAXN = 11; - public static long a[] = new long[MAXN]; + public static long m[] = new long[MAXN]; - public static long b[] = new long[MAXN]; + public static long r[] = new long[MAXN]; // 讲解139 - 扩展欧几里得算法 public static long d, x, y, px, py; @@ -51,21 +51,21 @@ public static long multiply(long a, long b, long mod) { // 扩展中国剩余定理模版 public static long excrt(int n) { - long a1 = a[1], b1 = b[1], a2, b2, c, tmp; + long m1 = m[1], r1 = r[1], m2, r2, c, tmp; for (int i = 2; i <= n; i++) { - a2 = a[i]; - b2 = b[i]; - exgcd(a1, a2); - c = ((b2 - b1) % a2 + a2) % a2; + m2 = m[i]; + r2 = r[i]; + exgcd(m1, m2); + c = ((r2 - r1) % m2 + m2) % m2; if (c % d != 0) { return -1; } - x = multiply(x, c / d, a2 / d); - tmp = b1 + x * a1; - a1 = a2 / d * a1; - b1 = (tmp % a1 + a1) % a1; + x = multiply(x, c / d, m2 / d); + tmp = r1 + x * m1; + m1 = m2 / d * m1; + r1 = (tmp % m1 + m1) % m1; } - return b1; + return r1; } public static void main(String[] args) throws IOException { @@ -76,15 +76,15 @@ public static void main(String[] args) throws IOException { int n = (int) in.nval; for (int i = 1; i <= n; i++) { in.nextToken(); - b[i] = (long) in.nval; + r[i] = (long) in.nval; } for (int i = 1; i <= n; i++) { in.nextToken(); - a[i] = (long) in.nval; + m[i] = (long) in.nval; } - // 题目输入负数要转化成正数 + // 题目输入的余数可能为负所以转化成正数 for (int i = 1; i <= n; i++) { - b[i] = (b[i] % a[i] + a[i]) % a[i]; + r[i] = (r[i] % m[i] + m[i]) % m[i]; } out.println(excrt(n)); out.flush(); From b445051285a2b9c7a0dedafac418c26657cc7270 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 27 Aug 2024 17:02:25 +0800 Subject: [PATCH 0052/2029] modify code --- src/class141/Code01_CRT.java | 16 ++++++++-------- src/class141/Code02_EXCRT.java | 14 +++++++------- src/class141/Code03_GuessNumber1.java | 18 +++++++++--------- src/class141/Code03_GuessNumber2.java | 16 ++++++++-------- 4 files changed, 32 insertions(+), 32 deletions(-) diff --git a/src/class141/Code01_CRT.java b/src/class141/Code01_CRT.java index 537474f1e..d1232b042 100644 --- a/src/class141/Code01_CRT.java +++ b/src/class141/Code01_CRT.java @@ -14,9 +14,9 @@ public class Code01_CRT { public static int MAXN = 11; - public static long m[] = new long[MAXN]; + public static long modular[] = new long[MAXN]; - public static long r[] = new long[MAXN]; + public static long remainder[] = new long[MAXN]; // 讲解139 - 扩展欧几里得算法 public static long d, x, y, px, py; @@ -53,18 +53,18 @@ public static long multiply(long a, long b, long mod) { public static long crt(int n) { long all = 1; for (int i = 1; i <= n; i++) { - all = all * m[i]; + all = all * modular[i]; } long ai, ci, ans = 0; for (int i = 1; i <= n; i++) { // 所有模数的乘积 / 当前的模数,得到ai - ai = all / m[i]; + ai = all / modular[i]; // 扩展欧几里得算法得到的x是%m[i]意义下的逆元,可能是负数 - exgcd(ai, m[i]); + exgcd(ai, modular[i]); // 既然得到的解可能是负数,那么变成正的,就是ai的逆元 x = (x % all + all) % all; // ci = (ri * ai * ai逆元) % all - ci = multiply(r[i], multiply(ai, x, all), all); + ci = multiply(remainder[i], multiply(ai, x, all), all); // ans = (ans + ci ) % all ans = (ans + ci) % all; } @@ -79,9 +79,9 @@ public static void main(String[] args) throws IOException { int n = (int) in.nval; for (int i = 1; i <= n; i++) { in.nextToken(); - m[i] = (long) in.nval; + modular[i] = (long) in.nval; in.nextToken(); - r[i] = (long) in.nval; + remainder[i] = (long) in.nval; } out.println(crt(n)); out.flush(); diff --git a/src/class141/Code02_EXCRT.java b/src/class141/Code02_EXCRT.java index c2582ac96..5371c49c8 100644 --- a/src/class141/Code02_EXCRT.java +++ b/src/class141/Code02_EXCRT.java @@ -15,9 +15,9 @@ public class Code02_EXCRT { public static int MAXN = 100001; - public static long m[] = new long[MAXN]; + public static long modular[] = new long[MAXN]; - public static long r[] = new long[MAXN]; + public static long remainder[] = new long[MAXN]; // 讲解139 - 扩展欧几里得算法 public static long d, x, y, px, py; @@ -52,10 +52,10 @@ public static long multiply(long a, long b, long mod) { // 扩展中国剩余定理模版 public static long excrt(int n) { - long m1 = m[1], r1 = r[1], m2, r2, c, tmp; + long m1 = modular[1], r1 = remainder[1], m2, r2, c, tmp; for (int i = 2; i <= n; i++) { - m2 = m[i]; - r2 = r[i]; + m2 = modular[i]; + r2 = remainder[i]; exgcd(m1, m2); c = ((r2 - r1) % m2 + m2) % m2; if (c % d != 0) { @@ -77,9 +77,9 @@ public static void main(String[] args) throws IOException { int n = (int) in.nval; for (int i = 1; i <= n; i++) { in.nextToken(); - m[i] = (long) in.nval; + modular[i] = (long) in.nval; in.nextToken(); - r[i] = (long) in.nval; + remainder[i] = (long) in.nval; } out.println(excrt(n)); out.flush(); diff --git a/src/class141/Code03_GuessNumber1.java b/src/class141/Code03_GuessNumber1.java index e152b73fe..15244d1e2 100644 --- a/src/class141/Code03_GuessNumber1.java +++ b/src/class141/Code03_GuessNumber1.java @@ -14,9 +14,9 @@ public class Code03_GuessNumber1 { public static int MAXN = 11; - public static long m[] = new long[MAXN]; + public static long modular[] = new long[MAXN]; - public static long r[] = new long[MAXN]; + public static long remainder[] = new long[MAXN]; // 讲解139 - 扩展欧几里得算法 public static long d, x, y, px, py; @@ -53,14 +53,14 @@ public static long multiply(long a, long b, long mod) { public static long crt(int n) { long all = 1; for (int i = 1; i <= n; i++) { - all = all * m[i]; + all = all * modular[i]; } long ai, ci, ans = 0; for (int i = 1; i <= n; i++) { - ai = all / m[i]; - exgcd(ai, m[i]); + ai = all / modular[i]; + exgcd(ai, modular[i]); x = (x % all + all) % all; - ci = multiply(r[i], multiply(ai, x, all), all); + ci = multiply(remainder[i], multiply(ai, x, all), all); ans = (ans + ci) % all; } return ans; @@ -74,15 +74,15 @@ public static void main(String[] args) throws IOException { int n = (int) in.nval; for (int i = 1; i <= n; i++) { in.nextToken(); - r[i] = (long) in.nval; + remainder[i] = (long) in.nval; } for (int i = 1; i <= n; i++) { in.nextToken(); - m[i] = (long) in.nval; + modular[i] = (long) in.nval; } // 题目输入的余数可能为负所以转化成正数 for (int i = 1; i <= n; i++) { - r[i] = (r[i] % m[i] + m[i]) % m[i]; + remainder[i] = (remainder[i] % modular[i] + modular[i]) % modular[i]; } out.println(crt(n)); out.flush(); diff --git a/src/class141/Code03_GuessNumber2.java b/src/class141/Code03_GuessNumber2.java index e2ec75fc1..4315c0721 100644 --- a/src/class141/Code03_GuessNumber2.java +++ b/src/class141/Code03_GuessNumber2.java @@ -14,9 +14,9 @@ public class Code03_GuessNumber2 { public static int MAXN = 11; - public static long m[] = new long[MAXN]; + public static long modular[] = new long[MAXN]; - public static long r[] = new long[MAXN]; + public static long remainder[] = new long[MAXN]; // 讲解139 - 扩展欧几里得算法 public static long d, x, y, px, py; @@ -51,10 +51,10 @@ public static long multiply(long a, long b, long mod) { // 扩展中国剩余定理模版 public static long excrt(int n) { - long m1 = m[1], r1 = r[1], m2, r2, c, tmp; + long m1 = modular[1], r1 = remainder[1], m2, r2, c, tmp; for (int i = 2; i <= n; i++) { - m2 = m[i]; - r2 = r[i]; + m2 = modular[i]; + r2 = remainder[i]; exgcd(m1, m2); c = ((r2 - r1) % m2 + m2) % m2; if (c % d != 0) { @@ -76,15 +76,15 @@ public static void main(String[] args) throws IOException { int n = (int) in.nval; for (int i = 1; i <= n; i++) { in.nextToken(); - r[i] = (long) in.nval; + remainder[i] = (long) in.nval; } for (int i = 1; i <= n; i++) { in.nextToken(); - m[i] = (long) in.nval; + modular[i] = (long) in.nval; } // 题目输入的余数可能为负所以转化成正数 for (int i = 1; i <= n; i++) { - r[i] = (r[i] % m[i] + m[i]) % m[i]; + remainder[i] = (remainder[i] % modular[i] + modular[i]) % modular[i]; } out.println(excrt(n)); out.flush(); From 0c50b657b98e33be22fa94b5c7494e8576fa1799 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 27 Aug 2024 17:04:44 +0800 Subject: [PATCH 0053/2029] modify code --- src/class141/Code01_CRT.java | 44 +++++++++++++-------------- src/class141/Code02_EXCRT.java | 38 +++++++++++------------ src/class141/Code03_GuessNumber1.java | 34 ++++++++++----------- src/class141/Code03_GuessNumber2.java | 38 +++++++++++------------ 4 files changed, 77 insertions(+), 77 deletions(-) diff --git a/src/class141/Code01_CRT.java b/src/class141/Code01_CRT.java index d1232b042..ad86ace49 100644 --- a/src/class141/Code01_CRT.java +++ b/src/class141/Code01_CRT.java @@ -18,6 +18,28 @@ public class Code01_CRT { public static long remainder[] = new long[MAXN]; + // 中国剩余定理模版 + public static long crt(int n) { + long all = 1; + for (int i = 1; i <= n; i++) { + all = all * modular[i]; + } + long ai, ci, ans = 0; + for (int i = 1; i <= n; i++) { + // 所有模数的乘积 / 当前的模数,得到ai + ai = all / modular[i]; + // 扩展欧几里得算法得到的x是%m[i]意义下的逆元,可能是负数 + exgcd(ai, modular[i]); + // 既然得到的解可能是负数,那么变成正的,就是ai的逆元 + x = (x % all + all) % all; + // ci = (ri * ai * ai逆元) % all + ci = multiply(remainder[i], multiply(ai, x, all), all); + // ans = (ans + ci ) % all + ans = (ans + ci) % all; + } + return ans; + } + // 讲解139 - 扩展欧几里得算法 public static long d, x, y, px, py; @@ -49,28 +71,6 @@ public static long multiply(long a, long b, long mod) { return ans; } - // 中国剩余定理模版 - public static long crt(int n) { - long all = 1; - for (int i = 1; i <= n; i++) { - all = all * modular[i]; - } - long ai, ci, ans = 0; - for (int i = 1; i <= n; i++) { - // 所有模数的乘积 / 当前的模数,得到ai - ai = all / modular[i]; - // 扩展欧几里得算法得到的x是%m[i]意义下的逆元,可能是负数 - exgcd(ai, modular[i]); - // 既然得到的解可能是负数,那么变成正的,就是ai的逆元 - x = (x % all + all) % all; - // ci = (ri * ai * ai逆元) % all - ci = multiply(remainder[i], multiply(ai, x, all), all); - // ans = (ans + ci ) % all - ans = (ans + ci) % all; - } - return ans; - } - public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StreamTokenizer in = new StreamTokenizer(br); diff --git a/src/class141/Code02_EXCRT.java b/src/class141/Code02_EXCRT.java index 5371c49c8..d261f9c55 100644 --- a/src/class141/Code02_EXCRT.java +++ b/src/class141/Code02_EXCRT.java @@ -19,6 +19,25 @@ public class Code02_EXCRT { public static long remainder[] = new long[MAXN]; + // 扩展中国剩余定理模版 + public static long excrt(int n) { + long m1 = modular[1], r1 = remainder[1], m2, r2, c, tmp; + for (int i = 2; i <= n; i++) { + m2 = modular[i]; + r2 = remainder[i]; + exgcd(m1, m2); + c = ((r2 - r1) % m2 + m2) % m2; + if (c % d != 0) { + return -1; + } + x = multiply(x, c / d, m2 / d); + tmp = r1 + x * m1; + m1 = m2 / d * m1; + r1 = (tmp % m1 + m1) % m1; + } + return r1; + } + // 讲解139 - 扩展欧几里得算法 public static long d, x, y, px, py; @@ -50,25 +69,6 @@ public static long multiply(long a, long b, long mod) { return ans; } - // 扩展中国剩余定理模版 - public static long excrt(int n) { - long m1 = modular[1], r1 = remainder[1], m2, r2, c, tmp; - for (int i = 2; i <= n; i++) { - m2 = modular[i]; - r2 = remainder[i]; - exgcd(m1, m2); - c = ((r2 - r1) % m2 + m2) % m2; - if (c % d != 0) { - return -1; - } - x = multiply(x, c / d, m2 / d); - tmp = r1 + x * m1; - m1 = m2 / d * m1; - r1 = (tmp % m1 + m1) % m1; - } - return r1; - } - public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StreamTokenizer in = new StreamTokenizer(br); diff --git a/src/class141/Code03_GuessNumber1.java b/src/class141/Code03_GuessNumber1.java index 15244d1e2..de6888983 100644 --- a/src/class141/Code03_GuessNumber1.java +++ b/src/class141/Code03_GuessNumber1.java @@ -18,6 +18,23 @@ public class Code03_GuessNumber1 { public static long remainder[] = new long[MAXN]; + // 中国剩余定理模版 + public static long crt(int n) { + long all = 1; + for (int i = 1; i <= n; i++) { + all = all * modular[i]; + } + long ai, ci, ans = 0; + for (int i = 1; i <= n; i++) { + ai = all / modular[i]; + exgcd(ai, modular[i]); + x = (x % all + all) % all; + ci = multiply(remainder[i], multiply(ai, x, all), all); + ans = (ans + ci) % all; + } + return ans; + } + // 讲解139 - 扩展欧几里得算法 public static long d, x, y, px, py; @@ -49,23 +66,6 @@ public static long multiply(long a, long b, long mod) { return ans; } - // 中国剩余定理模版 - public static long crt(int n) { - long all = 1; - for (int i = 1; i <= n; i++) { - all = all * modular[i]; - } - long ai, ci, ans = 0; - for (int i = 1; i <= n; i++) { - ai = all / modular[i]; - exgcd(ai, modular[i]); - x = (x % all + all) % all; - ci = multiply(remainder[i], multiply(ai, x, all), all); - ans = (ans + ci) % all; - } - return ans; - } - public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StreamTokenizer in = new StreamTokenizer(br); diff --git a/src/class141/Code03_GuessNumber2.java b/src/class141/Code03_GuessNumber2.java index 4315c0721..dbe4c15e2 100644 --- a/src/class141/Code03_GuessNumber2.java +++ b/src/class141/Code03_GuessNumber2.java @@ -18,6 +18,25 @@ public class Code03_GuessNumber2 { public static long remainder[] = new long[MAXN]; + // 扩展中国剩余定理模版 + public static long excrt(int n) { + long m1 = modular[1], r1 = remainder[1], m2, r2, c, tmp; + for (int i = 2; i <= n; i++) { + m2 = modular[i]; + r2 = remainder[i]; + exgcd(m1, m2); + c = ((r2 - r1) % m2 + m2) % m2; + if (c % d != 0) { + return -1; + } + x = multiply(x, c / d, m2 / d); + tmp = r1 + x * m1; + m1 = m2 / d * m1; + r1 = (tmp % m1 + m1) % m1; + } + return r1; + } + // 讲解139 - 扩展欧几里得算法 public static long d, x, y, px, py; @@ -49,25 +68,6 @@ public static long multiply(long a, long b, long mod) { return ans; } - // 扩展中国剩余定理模版 - public static long excrt(int n) { - long m1 = modular[1], r1 = remainder[1], m2, r2, c, tmp; - for (int i = 2; i <= n; i++) { - m2 = modular[i]; - r2 = remainder[i]; - exgcd(m1, m2); - c = ((r2 - r1) % m2 + m2) % m2; - if (c % d != 0) { - return -1; - } - x = multiply(x, c / d, m2 / d); - tmp = r1 + x * m1; - m1 = m2 / d * m1; - r1 = (tmp % m1 + m1) % m1; - } - return r1; - } - public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StreamTokenizer in = new StreamTokenizer(br); From 4107bac4efa102ee9a81314243823b602f366daf Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 27 Aug 2024 17:06:59 +0800 Subject: [PATCH 0054/2029] modify code --- src/class141/Code01_CRT.java | 1 + src/class141/Code02_EXCRT.java | 1 + src/class141/Code03_GuessNumber1.java | 1 + src/class141/Code03_GuessNumber2.java | 1 + src/class141/Code04_DragonSlayer.java | 3 ++- 5 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/class141/Code01_CRT.java b/src/class141/Code01_CRT.java index ad86ace49..eefae26b6 100644 --- a/src/class141/Code01_CRT.java +++ b/src/class141/Code01_CRT.java @@ -2,6 +2,7 @@ // 中国剩余定理模版 // 测试链接 : https://www.luogu.com.cn/problem/P1495 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.BufferedReader; import java.io.IOException; diff --git a/src/class141/Code02_EXCRT.java b/src/class141/Code02_EXCRT.java index d261f9c55..a53bbaf3b 100644 --- a/src/class141/Code02_EXCRT.java +++ b/src/class141/Code02_EXCRT.java @@ -3,6 +3,7 @@ // 扩展中国剩余定理模版 // 测试链接 : https://www.luogu.com.cn/problem/P1495 // 测试链接 : https://www.luogu.com.cn/problem/P4777 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.BufferedReader; import java.io.IOException; diff --git a/src/class141/Code03_GuessNumber1.java b/src/class141/Code03_GuessNumber1.java index de6888983..f9afba756 100644 --- a/src/class141/Code03_GuessNumber1.java +++ b/src/class141/Code03_GuessNumber1.java @@ -2,6 +2,7 @@ // 猜数字(中国剩余定理解决) // 测试链接 : https://www.luogu.com.cn/problem/P3868 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.BufferedReader; import java.io.IOException; diff --git a/src/class141/Code03_GuessNumber2.java b/src/class141/Code03_GuessNumber2.java index dbe4c15e2..26d3b0716 100644 --- a/src/class141/Code03_GuessNumber2.java +++ b/src/class141/Code03_GuessNumber2.java @@ -2,6 +2,7 @@ // 猜数字(扩展中国剩余定理解决) // 测试链接 : https://www.luogu.com.cn/problem/P3868 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.BufferedReader; import java.io.IOException; diff --git a/src/class141/Code04_DragonSlayer.java b/src/class141/Code04_DragonSlayer.java index 4b55d0c45..ea15d45fe 100644 --- a/src/class141/Code04_DragonSlayer.java +++ b/src/class141/Code04_DragonSlayer.java @@ -1,7 +1,8 @@ package class141; -// 屠龙勇士 +// 屠龙勇士(扩展中国剩余定理解决) // 测试链接 : https://www.luogu.com.cn/problem/P4774 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 public class Code04_DragonSlayer { } From ee6e34a960d401813951e3103499755b386d8589 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 27 Aug 2024 17:11:21 +0800 Subject: [PATCH 0055/2029] modify code --- src/class141/Code01_CRT.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/class141/Code01_CRT.java b/src/class141/Code01_CRT.java index eefae26b6..9db097761 100644 --- a/src/class141/Code01_CRT.java +++ b/src/class141/Code01_CRT.java @@ -35,7 +35,6 @@ public static long crt(int n) { x = (x % all + all) % all; // ci = (ri * ai * ai逆元) % all ci = multiply(remainder[i], multiply(ai, x, all), all); - // ans = (ans + ci ) % all ans = (ans + ci) % all; } return ans; From 334b1a690b9d34d6797d521362235dd21a962654 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 27 Aug 2024 17:17:52 +0800 Subject: [PATCH 0056/2029] modify code --- src/class141/Code04_DragonSlayer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class141/Code04_DragonSlayer.java b/src/class141/Code04_DragonSlayer.java index ea15d45fe..c5d82f246 100644 --- a/src/class141/Code04_DragonSlayer.java +++ b/src/class141/Code04_DragonSlayer.java @@ -1,6 +1,6 @@ package class141; -// 屠龙勇士(扩展中国剩余定理解决) +// 屠龙勇士 // 测试链接 : https://www.luogu.com.cn/problem/P4774 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 public class Code04_DragonSlayer { From f8fc14f413dc481c6c7ea98ed656087234639257 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 28 Aug 2024 12:04:30 +0800 Subject: [PATCH 0057/2029] modify code --- src/class139/Code05_ShuffleCards.java | 4 + src/class141/Code01_CRT.java | 6 +- src/class141/Code02_EXCRT.java | 2 + src/class141/Code03_GuessNumber1.java | 3 +- src/class141/Code03_GuessNumber2.java | 2 + src/class141/Code04_DragonSlayer.java | 134 ++++++++++++++++++++++++++ 6 files changed, 147 insertions(+), 4 deletions(-) diff --git a/src/class139/Code05_ShuffleCards.java b/src/class139/Code05_ShuffleCards.java index 11def16c2..7ddb38c7a 100644 --- a/src/class139/Code05_ShuffleCards.java +++ b/src/class139/Code05_ShuffleCards.java @@ -43,6 +43,10 @@ public static void exgcd(long a, long b) { // a * b的过程自己实现,每一个中间过程都%mod // 这么写目的是防止溢出,也叫龟速乘 public static long multiply(long a, long b, long mod) { + // 既然是在%mod的意义下,那么a和b可以都转化成非负的 + // 本题转化或者不转化都无所谓,但是其他题目可能需要转化 + a = (a % mod + mod) % mod; + b = (b % mod + mod) % mod; long ans = 0; while (b != 0) { if ((b & 1) != 0) { diff --git a/src/class141/Code01_CRT.java b/src/class141/Code01_CRT.java index 9db097761..5d7452f87 100644 --- a/src/class141/Code01_CRT.java +++ b/src/class141/Code01_CRT.java @@ -29,10 +29,8 @@ public static long crt(int n) { for (int i = 1; i <= n; i++) { // 所有模数的乘积 / 当前的模数,得到ai ai = all / modular[i]; - // 扩展欧几里得算法得到的x是%m[i]意义下的逆元,可能是负数 + // 扩展欧几里得算法得到的x是%m[i]意义下的逆元 exgcd(ai, modular[i]); - // 既然得到的解可能是负数,那么变成正的,就是ai的逆元 - x = (x % all + all) % all; // ci = (ri * ai * ai逆元) % all ci = multiply(remainder[i], multiply(ai, x, all), all); ans = (ans + ci) % all; @@ -60,6 +58,8 @@ public static void exgcd(long a, long b) { // 讲解033 - 位运算实现乘法 // a*b过程每一步都%mod,这么写是防止溢出,也叫龟速乘 public static long multiply(long a, long b, long mod) { + a = (a % mod + mod) % mod; + b = (b % mod + mod) % mod; long ans = 0; while (b != 0) { if ((b & 1) != 0) { diff --git a/src/class141/Code02_EXCRT.java b/src/class141/Code02_EXCRT.java index a53bbaf3b..8e4a48347 100644 --- a/src/class141/Code02_EXCRT.java +++ b/src/class141/Code02_EXCRT.java @@ -59,6 +59,8 @@ public static void exgcd(long a, long b) { // 讲解033 - 位运算实现乘法 // a*b过程每一步都%mod,这么写是防止溢出,也叫龟速乘 public static long multiply(long a, long b, long mod) { + a = (a % mod + mod) % mod; + b = (b % mod + mod) % mod; long ans = 0; while (b != 0) { if ((b & 1) != 0) { diff --git a/src/class141/Code03_GuessNumber1.java b/src/class141/Code03_GuessNumber1.java index f9afba756..3800468d3 100644 --- a/src/class141/Code03_GuessNumber1.java +++ b/src/class141/Code03_GuessNumber1.java @@ -29,7 +29,6 @@ public static long crt(int n) { for (int i = 1; i <= n; i++) { ai = all / modular[i]; exgcd(ai, modular[i]); - x = (x % all + all) % all; ci = multiply(remainder[i], multiply(ai, x, all), all); ans = (ans + ci) % all; } @@ -56,6 +55,8 @@ public static void exgcd(long a, long b) { // 讲解033 - 位运算实现乘法 // a*b过程每一步都%mod,这么写是防止溢出,也叫龟速乘 public static long multiply(long a, long b, long mod) { + a = (a % mod + mod) % mod; + b = (b % mod + mod) % mod; long ans = 0; while (b != 0) { if ((b & 1) != 0) { diff --git a/src/class141/Code03_GuessNumber2.java b/src/class141/Code03_GuessNumber2.java index 26d3b0716..dd53c2a3b 100644 --- a/src/class141/Code03_GuessNumber2.java +++ b/src/class141/Code03_GuessNumber2.java @@ -58,6 +58,8 @@ public static void exgcd(long a, long b) { // 讲解033 - 位运算实现乘法 // a*b过程每一步都%mod,这么写是防止溢出,也叫龟速乘 public static long multiply(long a, long b, long mod) { + a = (a % mod + mod) % mod; + b = (b % mod + mod) % mod; long ans = 0; while (b != 0) { if ((b & 1) != 0) { diff --git a/src/class141/Code04_DragonSlayer.java b/src/class141/Code04_DragonSlayer.java index c5d82f246..6ad5b2b12 100644 --- a/src/class141/Code04_DragonSlayer.java +++ b/src/class141/Code04_DragonSlayer.java @@ -3,6 +3,140 @@ // 屠龙勇士 // 测试链接 : https://www.luogu.com.cn/problem/P4774 // 提交以下的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.TreeMap; + public class Code04_DragonSlayer { + public static int MAXN = 100001; + + public static long[] hp = new long[MAXN]; + + public static long[] recovery = new long[MAXN]; + + public static long[] reward = new long[MAXN]; + + public static long[] attack = new long[MAXN]; + + public static long[] choose = new long[MAXN]; + + public static TreeMap sorted = new TreeMap<>(); + + public static long d, x, y, px, py; + + public static void exgcd(long a, long b) { + if (b == 0) { + d = a; + x = 1; + y = 0; + } else { + exgcd(b, a % b); + px = x; + py = y; + x = py; + y = px - py * (a / b); + } + } + + public static long multiply(long a, long b, long mod) { + a = (a % mod + mod) % mod; + b = (b % mod + mod) % mod; + long ans = 0; + while (b != 0) { + if ((b & 1) != 0) { + ans = (ans + a) % mod; + } + a = (a + a) % mod; + b >>= 1; + } + return ans; + } + + // 给每个怪物分配剑 + public static void allocate(int n, int m) { + sorted.clear(); + for (int i = 1; i <= m; i++) { + sorted.put(attack[i], sorted.getOrDefault(attack[i], 0) + 1); + } + for (int i = 1; i <= n; i++) { + Long sword = sorted.floorKey(hp[i]); + if (sword == null) { + sword = sorted.firstKey(); + } + choose[i] = sword; + sorted.put(sword, sorted.get(sword) - 1); + if (sorted.get(sword) == 0) { + sorted.remove(sword); + } + sorted.put(reward[i], sorted.getOrDefault(reward[i], 0) + 1); + } + } + + public static long compute(int n, int m) { + allocate(n, m); + long ans = 0, all = 1, a, b, c; + for (int i = 1; i <= n; i++) { + if (recovery[i] == 1) { + if (hp[i] % choose[i] == 0) { + ans = Math.max(ans, hp[i] / choose[i]); + } else { + ans = Math.max(ans, hp[i] / choose[i] + 1); + } + } else { + a = multiply(choose[i], all, recovery[i]); + b = recovery[i]; + c = (hp[i] - multiply(choose[i], ans, recovery[i]) + recovery[i]) % recovery[i]; + exgcd(a, b); + if (c % d != 0) { + return -1; + } + b /= d; + x = multiply(x, c / d, b); + ans = (ans + multiply(x, all, all * b)) % (all * b); + all *= b; + } + } + return (ans != 0 ? ans : all); + } + + 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(); + int cases = (int) in.nval; + for (int t = 1; t <= cases; t++) { + in.nextToken(); + int n = (int) in.nval; + in.nextToken(); + int m = (int) in.nval; + for (int i = 1; i <= n; i++) { + in.nextToken(); + hp[i] = (long) in.nval; + } + for (int i = 1; i <= n; i++) { + in.nextToken(); + recovery[i] = (long) in.nval; + } + for (int i = 1; i <= n; i++) { + in.nextToken(); + reward[i] = (long) in.nval; + } + for (int i = 1; i <= m; i++) { + in.nextToken(); + attack[i] = (long) in.nval; + } + out.println(compute(n, m)); + } + out.flush(); + out.close(); + br.close(); + } + } From dc20bd24ed2d19859d6f5e4f6b1f5c747f493c47 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 28 Aug 2024 12:06:47 +0800 Subject: [PATCH 0058/2029] modify code --- src/class139/Code05_ShuffleCards.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/class139/Code05_ShuffleCards.java b/src/class139/Code05_ShuffleCards.java index 7ddb38c7a..aaa11fceb 100644 --- a/src/class139/Code05_ShuffleCards.java +++ b/src/class139/Code05_ShuffleCards.java @@ -44,7 +44,8 @@ public static void exgcd(long a, long b) { // 这么写目的是防止溢出,也叫龟速乘 public static long multiply(long a, long b, long mod) { // 既然是在%mod的意义下,那么a和b可以都转化成非负的 - // 本题转化或者不转化都无所谓,但是其他题目可能需要转化 + // 本题不转化无所谓,但是其他题目可能需要转化 + // 尤其是b需要转化,否则while循环会跑不完 a = (a % mod + mod) % mod; b = (b % mod + mod) % mod; long ans = 0; From bc29beb03cbabf19ded6c0f0aff2d9f43af63f72 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 28 Aug 2024 12:08:30 +0800 Subject: [PATCH 0059/2029] modify code --- src/class141/Code04_DragonSlayer.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/class141/Code04_DragonSlayer.java b/src/class141/Code04_DragonSlayer.java index 6ad5b2b12..590af749d 100644 --- a/src/class141/Code04_DragonSlayer.java +++ b/src/class141/Code04_DragonSlayer.java @@ -28,6 +28,7 @@ public class Code04_DragonSlayer { public static TreeMap sorted = new TreeMap<>(); + // 讲解139 - 扩展欧几里得算法 public static long d, x, y, px, py; public static void exgcd(long a, long b) { @@ -44,6 +45,8 @@ public static void exgcd(long a, long b) { } } + // 讲解033 - 位运算实现乘法 + // a*b过程每一步都%mod,这么写是防止溢出,也叫龟速乘 public static long multiply(long a, long b, long mod) { a = (a % mod + mod) % mod; b = (b % mod + mod) % mod; From 101ee259668c3c177d5f111906cce1f0a7a64051 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 28 Aug 2024 15:39:34 +0800 Subject: [PATCH 0060/2029] modify code --- src/class141/Code02_EXCRT.java | 17 +++++++++-------- src/class141/Code03_GuessNumber2.java | 17 +++++++++-------- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/class141/Code02_EXCRT.java b/src/class141/Code02_EXCRT.java index 8e4a48347..fe004f70a 100644 --- a/src/class141/Code02_EXCRT.java +++ b/src/class141/Code02_EXCRT.java @@ -22,19 +22,20 @@ public class Code02_EXCRT { // 扩展中国剩余定理模版 public static long excrt(int n) { - long m1 = modular[1], r1 = remainder[1], m2, r2, c, tmp; + long a = modular[1], r1 = remainder[1], b, r2, c, tmp; for (int i = 2; i <= n; i++) { - m2 = modular[i]; + b = modular[i]; r2 = remainder[i]; - exgcd(m1, m2); - c = ((r2 - r1) % m2 + m2) % m2; + exgcd(a, b); + c = ((r2 - r1) % b + b) % b; if (c % d != 0) { return -1; } - x = multiply(x, c / d, m2 / d); - tmp = r1 + x * m1; - m1 = m2 / d * m1; - r1 = (tmp % m1 + m1) % m1; + // 特解转化为>=1的最小正数 + x = multiply(x, c / d, b / d); + tmp = r1 + x * a; + a = b / d * a; + r1 = (tmp % a + a) % a; } return r1; } diff --git a/src/class141/Code03_GuessNumber2.java b/src/class141/Code03_GuessNumber2.java index dd53c2a3b..d07521353 100644 --- a/src/class141/Code03_GuessNumber2.java +++ b/src/class141/Code03_GuessNumber2.java @@ -21,19 +21,20 @@ public class Code03_GuessNumber2 { // 扩展中国剩余定理模版 public static long excrt(int n) { - long m1 = modular[1], r1 = remainder[1], m2, r2, c, tmp; + long a = modular[1], r1 = remainder[1], b, r2, c, tmp; for (int i = 2; i <= n; i++) { - m2 = modular[i]; + b = modular[i]; r2 = remainder[i]; - exgcd(m1, m2); - c = ((r2 - r1) % m2 + m2) % m2; + exgcd(a, b); + c = ((r2 - r1) % b + b) % b; if (c % d != 0) { return -1; } - x = multiply(x, c / d, m2 / d); - tmp = r1 + x * m1; - m1 = m2 / d * m1; - r1 = (tmp % m1 + m1) % m1; + // 特解转化为>=1的最小正数 + x = multiply(x, c / d, b / d); + tmp = r1 + x * a; + a = b / d * a; + r1 = (tmp % a + a) % a; } return r1; } From e6d0fe6ed98ad46f89ece134be1cc0953925352f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 28 Aug 2024 15:45:30 +0800 Subject: [PATCH 0061/2029] modify code --- src/class141/Code04_DragonSlayer.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/class141/Code04_DragonSlayer.java b/src/class141/Code04_DragonSlayer.java index 590af749d..b2eafba09 100644 --- a/src/class141/Code04_DragonSlayer.java +++ b/src/class141/Code04_DragonSlayer.java @@ -86,11 +86,7 @@ public static long compute(int n, int m) { long ans = 0, all = 1, a, b, c; for (int i = 1; i <= n; i++) { if (recovery[i] == 1) { - if (hp[i] % choose[i] == 0) { - ans = Math.max(ans, hp[i] / choose[i]); - } else { - ans = Math.max(ans, hp[i] / choose[i] + 1); - } + ans = Math.max(ans, hp[i] / choose[i] + (hp[i] % choose[i] == 0 ? 0 : 1)); } else { a = multiply(choose[i], all, recovery[i]); b = recovery[i]; From c209ddd6cf322a910475f3cf584ac6739fecb488 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 28 Aug 2024 17:13:51 +0800 Subject: [PATCH 0062/2029] modify code --- src/class141/Code02_EXCRT.java | 20 +++++++------- src/class141/Code03_GuessNumber2.java | 20 +++++++------- src/class141/Code04_DragonSlayer.java | 38 ++++++++++++++------------- 3 files changed, 38 insertions(+), 40 deletions(-) diff --git a/src/class141/Code02_EXCRT.java b/src/class141/Code02_EXCRT.java index fe004f70a..6e8eb2f9c 100644 --- a/src/class141/Code02_EXCRT.java +++ b/src/class141/Code02_EXCRT.java @@ -22,22 +22,20 @@ public class Code02_EXCRT { // 扩展中国剩余定理模版 public static long excrt(int n) { - long a = modular[1], r1 = remainder[1], b, r2, c, tmp; - for (int i = 2; i <= n; i++) { + long ans = 0, lcm = 1, tmp, b, c; + for (int i = 1; i <= n; i++) { b = modular[i]; - r2 = remainder[i]; - exgcd(a, b); - c = ((r2 - r1) % b + b) % b; + c = ((remainder[i] - ans) % b + b) % b; + exgcd(lcm, b); if (c % d != 0) { return -1; } - // 特解转化为>=1的最小正数 - x = multiply(x, c / d, b / d); - tmp = r1 + x * a; - a = b / d * a; - r1 = (tmp % a + a) % a; + x = multiply(x, c / d, b); + tmp = lcm * (b / d); + ans = (ans + multiply(x, lcm, tmp)) % tmp; + lcm = tmp; } - return r1; + return ans; } // 讲解139 - 扩展欧几里得算法 diff --git a/src/class141/Code03_GuessNumber2.java b/src/class141/Code03_GuessNumber2.java index d07521353..6bf2a11b6 100644 --- a/src/class141/Code03_GuessNumber2.java +++ b/src/class141/Code03_GuessNumber2.java @@ -21,22 +21,20 @@ public class Code03_GuessNumber2 { // 扩展中国剩余定理模版 public static long excrt(int n) { - long a = modular[1], r1 = remainder[1], b, r2, c, tmp; - for (int i = 2; i <= n; i++) { + long ans = 0, lcm = 1, tmp, b, c; + for (int i = 1; i <= n; i++) { b = modular[i]; - r2 = remainder[i]; - exgcd(a, b); - c = ((r2 - r1) % b + b) % b; + c = ((remainder[i] - ans) % b + b) % b; + exgcd(lcm, b); if (c % d != 0) { return -1; } - // 特解转化为>=1的最小正数 - x = multiply(x, c / d, b / d); - tmp = r1 + x * a; - a = b / d * a; - r1 = (tmp % a + a) % a; + x = multiply(x, c / d, b); + tmp = lcm * (b / d); + ans = (ans + multiply(x, lcm, tmp)) % tmp; + lcm = tmp; } - return r1; + return ans; } // 讲解139 - 扩展欧几里得算法 diff --git a/src/class141/Code04_DragonSlayer.java b/src/class141/Code04_DragonSlayer.java index b2eafba09..482e4cd03 100644 --- a/src/class141/Code04_DragonSlayer.java +++ b/src/class141/Code04_DragonSlayer.java @@ -62,11 +62,12 @@ public static long multiply(long a, long b, long mod) { } // 给每个怪物分配剑 - public static void allocate(int n, int m) { + public static long allocate(int n, int m) { sorted.clear(); for (int i = 1; i <= m; i++) { sorted.put(attack[i], sorted.getOrDefault(attack[i], 0) + 1); } + long max = 0; for (int i = 1; i <= n; i++) { Long sword = sorted.floorKey(hp[i]); if (sword == null) { @@ -78,30 +79,31 @@ public static void allocate(int n, int m) { sorted.remove(sword); } sorted.put(reward[i], sorted.getOrDefault(reward[i], 0) + 1); + max = Math.max(max, (hp[i] - 1) / choose[i] + 1); } + return max; } public static long compute(int n, int m) { - allocate(n, m); - long ans = 0, all = 1, a, b, c; + long max = allocate(n, m); + long ans = 0, lcm = 1, tmp, a, b, c; for (int i = 1; i <= n; i++) { - if (recovery[i] == 1) { - ans = Math.max(ans, hp[i] / choose[i] + (hp[i] % choose[i] == 0 ? 0 : 1)); - } else { - a = multiply(choose[i], all, recovery[i]); - b = recovery[i]; - c = (hp[i] - multiply(choose[i], ans, recovery[i]) + recovery[i]) % recovery[i]; - exgcd(a, b); - if (c % d != 0) { - return -1; - } - b /= d; - x = multiply(x, c / d, b); - ans = (ans + multiply(x, all, all * b)) % (all * b); - all *= b; + a = multiply(choose[i], lcm, recovery[i]); + b = recovery[i]; + c = ((hp[i] - choose[i] * ans) % b + b) % b; + exgcd(a, b); + if (c % d != 0) { + return -1; } + x = multiply(x, c / d, b); + tmp = lcm * (b / d); + ans = (ans + multiply(x, lcm, tmp)) % tmp; + lcm = tmp; } - return (ans != 0 ? ans : all); + if (ans < max) { + ans += ((max - ans - 1) / lcm + 1) * lcm; + } + return ans; } public static void main(String[] args) throws IOException { From f40db475f40a3c72cb372ac3df6886573ff7cc3f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 28 Aug 2024 17:28:43 +0800 Subject: [PATCH 0063/2029] modify code --- src/class141/Code04_DragonSlayer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class141/Code04_DragonSlayer.java b/src/class141/Code04_DragonSlayer.java index 482e4cd03..454e4ccbb 100644 --- a/src/class141/Code04_DragonSlayer.java +++ b/src/class141/Code04_DragonSlayer.java @@ -61,7 +61,7 @@ public static long multiply(long a, long b, long mod) { return ans; } - // 给每个怪物分配剑 + // 每个怪物根据血量找到攻击的剑 public static long allocate(int n, int m) { sorted.clear(); for (int i = 1; i <= m; i++) { From 00d969df42389aacaf52647343edad690870e568 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 28 Aug 2024 19:55:10 +0800 Subject: [PATCH 0064/2029] modify code --- src/class141/Code02_EXCRT.java | 5 ++++- src/class141/Code03_GuessNumber2.java | 2 +- src/class141/Code04_DragonSlayer.java | 7 ++++--- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/class141/Code02_EXCRT.java b/src/class141/Code02_EXCRT.java index 6e8eb2f9c..0ca33cebb 100644 --- a/src/class141/Code02_EXCRT.java +++ b/src/class141/Code02_EXCRT.java @@ -30,7 +30,10 @@ public static long excrt(int n) { if (c % d != 0) { return -1; } - x = multiply(x, c / d, b); + // 通解 x = x0 * (c/d) + (b/d) * n + // 想得到>=1的最小正数的特解 + // 最小正数的特解x = (x0 * (c/d)) % (b/d) 取余数 + x = multiply(x, c / d, b / d); tmp = lcm * (b / d); ans = (ans + multiply(x, lcm, tmp)) % tmp; lcm = tmp; diff --git a/src/class141/Code03_GuessNumber2.java b/src/class141/Code03_GuessNumber2.java index 6bf2a11b6..69475d7df 100644 --- a/src/class141/Code03_GuessNumber2.java +++ b/src/class141/Code03_GuessNumber2.java @@ -29,7 +29,7 @@ public static long excrt(int n) { if (c % d != 0) { return -1; } - x = multiply(x, c / d, b); + x = multiply(x, c / d, b / d); tmp = lcm * (b / d); ans = (ans + multiply(x, lcm, tmp)) % tmp; lcm = tmp; diff --git a/src/class141/Code04_DragonSlayer.java b/src/class141/Code04_DragonSlayer.java index 454e4ccbb..1cb36c10b 100644 --- a/src/class141/Code04_DragonSlayer.java +++ b/src/class141/Code04_DragonSlayer.java @@ -84,7 +84,8 @@ public static long allocate(int n, int m) { return max; } - public static long compute(int n, int m) { + // 扩展中国剩余定理再扩展 + public static long excrt(int n, int m) { long max = allocate(n, m); long ans = 0, lcm = 1, tmp, a, b, c; for (int i = 1; i <= n; i++) { @@ -95,7 +96,7 @@ public static long compute(int n, int m) { if (c % d != 0) { return -1; } - x = multiply(x, c / d, b); + x = multiply(x, c / d, b / d); tmp = lcm * (b / d); ans = (ans + multiply(x, lcm, tmp)) % tmp; lcm = tmp; @@ -133,7 +134,7 @@ public static void main(String[] args) throws IOException { in.nextToken(); attack[i] = (long) in.nval; } - out.println(compute(n, m)); + out.println(excrt(n, m)); } out.flush(); out.close(); From 249bc95c4b301e44caaac06dd7250c7ab89c3bf8 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 29 Aug 2024 12:08:39 +0800 Subject: [PATCH 0065/2029] modify code --- src/class141/Code02_EXCRT.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class141/Code02_EXCRT.java b/src/class141/Code02_EXCRT.java index 0ca33cebb..12f4141dc 100644 --- a/src/class141/Code02_EXCRT.java +++ b/src/class141/Code02_EXCRT.java @@ -31,8 +31,8 @@ public static long excrt(int n) { return -1; } // 通解 x = x0 * (c/d) + (b/d) * n - // 想得到>=1的最小正数的特解 - // 最小正数的特解x = (x0 * (c/d)) % (b/d) 取余数 + // 想得到最小非负数的特解 + // 最小非负数的特解x = (x0 * (c/d)) % (b/d) 取余数 x = multiply(x, c / d, b / d); tmp = lcm * (b / d); ans = (ans + multiply(x, lcm, tmp)) % tmp; From 4a1483657611d0bf1dbf57639502817b09ead522 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 29 Aug 2024 12:10:23 +0800 Subject: [PATCH 0066/2029] modify code --- src/class141/Code02_EXCRT.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/class141/Code02_EXCRT.java b/src/class141/Code02_EXCRT.java index 12f4141dc..f0abc77ee 100644 --- a/src/class141/Code02_EXCRT.java +++ b/src/class141/Code02_EXCRT.java @@ -31,8 +31,7 @@ public static long excrt(int n) { return -1; } // 通解 x = x0 * (c/d) + (b/d) * n - // 想得到最小非负数的特解 - // 最小非负数的特解x = (x0 * (c/d)) % (b/d) 取余数 + // 最小非负数的特解x = (x0 * (c/d)) % (b/d) 取非负余数 x = multiply(x, c / d, b / d); tmp = lcm * (b / d); ans = (ans + multiply(x, lcm, tmp)) % tmp; From adc07ccbc44f786852a128d95c8607ed74b9e2a9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 29 Aug 2024 13:16:15 +0800 Subject: [PATCH 0067/2029] modify code --- src/class141/Code01_CRT.java | 16 +++++++++++----- src/class141/Code02_EXCRT.java | 8 +++++++- src/class141/Code03_GuessNumber1.java | 17 ++++++++++++----- src/class141/Code03_GuessNumber2.java | 7 +++++++ src/class141/Code04_DragonSlayer.java | 11 +++++++++++ 5 files changed, 48 insertions(+), 11 deletions(-) diff --git a/src/class141/Code01_CRT.java b/src/class141/Code01_CRT.java index 5d7452f87..2b87ed75d 100644 --- a/src/class141/Code01_CRT.java +++ b/src/class141/Code01_CRT.java @@ -1,6 +1,12 @@ package class141; // 中国剩余定理模版 +// 给出n个同余方程,求满足同余方程的最小正数解x +// 一共n个同余方程,x ≡ ri(% mi) +// 1 <= n <= 10 +// 0 <= ri、mi <= 10^5 +// 所有mi一定互质 +// 所有mi整体乘积 <= 10^18 // 测试链接 : https://www.luogu.com.cn/problem/P1495 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -21,19 +27,19 @@ public class Code01_CRT { // 中国剩余定理模版 public static long crt(int n) { - long all = 1; + long lcm = 1; for (int i = 1; i <= n; i++) { - all = all * modular[i]; + lcm = lcm * modular[i]; } long ai, ci, ans = 0; for (int i = 1; i <= n; i++) { // 所有模数的乘积 / 当前的模数,得到ai - ai = all / modular[i]; + ai = lcm / modular[i]; // 扩展欧几里得算法得到的x是%m[i]意义下的逆元 exgcd(ai, modular[i]); // ci = (ri * ai * ai逆元) % all - ci = multiply(remainder[i], multiply(ai, x, all), all); - ans = (ans + ci) % all; + ci = multiply(remainder[i], multiply(ai, x, lcm), lcm); + ans = (ans + ci) % lcm; } return ans; } diff --git a/src/class141/Code02_EXCRT.java b/src/class141/Code02_EXCRT.java index f0abc77ee..e37069157 100644 --- a/src/class141/Code02_EXCRT.java +++ b/src/class141/Code02_EXCRT.java @@ -1,8 +1,14 @@ package class141; // 扩展中国剩余定理模版 -// 测试链接 : https://www.luogu.com.cn/problem/P1495 +// 给出n个同余方程,求满足同余方程的最小正数解x +// 一共n个同余方程,x ≡ ri(% mi) +// 1 <= n <= 10^5 +// 0 <= ri、mi <= 10^12 +// 所有mi不一定互质 +// 所有mi的最小公倍数 <= 10^18 // 测试链接 : https://www.luogu.com.cn/problem/P4777 +// 测试链接 : https://www.luogu.com.cn/problem/P1495 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.BufferedReader; diff --git a/src/class141/Code03_GuessNumber1.java b/src/class141/Code03_GuessNumber1.java index 3800468d3..4afab9040 100644 --- a/src/class141/Code03_GuessNumber1.java +++ b/src/class141/Code03_GuessNumber1.java @@ -1,6 +1,13 @@ package class141; // 猜数字(中国剩余定理解决) +// 给定两个长度为n数组,一组为r1,r2,r3...,另一组为m1,m2,m3... +// 其中第二组数字两两互质,求最小正数解x +// 要求x满足,mi | (x - ri),即(x - ri)是mi的整数倍 +// 1 <= n <= 10 +// -10^9 <= ri <= +10^9 +// 1 <= mi <= 6 * 10^3 +// 所有mi的乘积 <= 10^18 // 测试链接 : https://www.luogu.com.cn/problem/P3868 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -21,16 +28,16 @@ public class Code03_GuessNumber1 { // 中国剩余定理模版 public static long crt(int n) { - long all = 1; + long lcm = 1; for (int i = 1; i <= n; i++) { - all = all * modular[i]; + lcm = lcm * modular[i]; } long ai, ci, ans = 0; for (int i = 1; i <= n; i++) { - ai = all / modular[i]; + ai = lcm / modular[i]; exgcd(ai, modular[i]); - ci = multiply(remainder[i], multiply(ai, x, all), all); - ans = (ans + ci) % all; + ci = multiply(remainder[i], multiply(ai, x, lcm), lcm); + ans = (ans + ci) % lcm; } return ans; } diff --git a/src/class141/Code03_GuessNumber2.java b/src/class141/Code03_GuessNumber2.java index 69475d7df..0251debfa 100644 --- a/src/class141/Code03_GuessNumber2.java +++ b/src/class141/Code03_GuessNumber2.java @@ -1,6 +1,13 @@ package class141; // 猜数字(扩展中国剩余定理解决) +// 给定两个长度为n数组,一组为r1,r2,r3...,另一组为m1,m2,m3... +// 其中第二组数字两两互质,求最小正数解x +// 要求x满足,mi | (x - ri),即(x - ri)是mi的整数倍 +// 1 <= n <= 10 +// -10^9 <= ri <= +10^9 +// 1 <= mi <= 6 * 10^3 +// 所有mi的乘积 <= 10^18 // 测试链接 : https://www.luogu.com.cn/problem/P3868 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class141/Code04_DragonSlayer.java b/src/class141/Code04_DragonSlayer.java index 1cb36c10b..caa89c783 100644 --- a/src/class141/Code04_DragonSlayer.java +++ b/src/class141/Code04_DragonSlayer.java @@ -1,6 +1,17 @@ package class141; // 屠龙勇士 +// 一共有n只巨龙,每只巨龙都有初始血量hp[i],每只巨龙都有恢复能力recovery[i] +// 每只巨龙都会在攻击结束后开始恢复,初始时一共有m把剑,每把剑都有攻击力attack[i] +// 需要按顺序杀死每只巨龙,巨龙被杀后,攻击的剑会消失,同时获得攻击力为reward[i]的剑 +// 选择哪把剑去攻击当前的巨龙有如下的规定,并且一旦确定了剑就不能更换,直到杀死当前巨龙 +// 当前的剑里去选择,攻击力不高于当前巨龙的血量,并且攻击力最大的一把剑 +// 如果没有这样的剑,就选择攻击力最低的一把剑。巨龙只有当血量恰好为0时,才能被杀死 +// 勇士制定的攻击策略如下,不管面对什么巨龙,攻击过程只打击x下,让巨龙的血量不再大于0 +// 然后在巨龙恢复的过程中,如果血量恰好为0,那么当前巨龙被杀死,勇士继续讨伐下一只巨龙 +// 你的任务是算出最小的x,让勇士可以在该策略下杀死所有巨龙 +// 如果在固定打击次数的策略下,就是无法杀死所有的巨龙,返回-1 +// 查看数据范围可以打开测试链接 // 测试链接 : https://www.luogu.com.cn/problem/P4774 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 From f02db57c0f5ebbc14d7b43674bd10b75512046e0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 29 Aug 2024 13:21:56 +0800 Subject: [PATCH 0068/2029] modify code --- src/class141/Code04_DragonSlayer.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/class141/Code04_DragonSlayer.java b/src/class141/Code04_DragonSlayer.java index caa89c783..d0f94d7b5 100644 --- a/src/class141/Code04_DragonSlayer.java +++ b/src/class141/Code04_DragonSlayer.java @@ -3,14 +3,15 @@ // 屠龙勇士 // 一共有n只巨龙,每只巨龙都有初始血量hp[i],每只巨龙都有恢复能力recovery[i] // 每只巨龙都会在攻击结束后开始恢复,初始时一共有m把剑,每把剑都有攻击力attack[i] -// 需要按顺序杀死每只巨龙,巨龙被杀后,攻击的剑会消失,同时获得攻击力为reward[i]的剑 -// 选择哪把剑去攻击当前的巨龙有如下的规定,并且一旦确定了剑就不能更换,直到杀死当前巨龙 -// 当前的剑里去选择,攻击力不高于当前巨龙的血量,并且攻击力最大的一把剑 -// 如果没有这样的剑,就选择攻击力最低的一把剑。巨龙只有当血量恰好为0时,才能被杀死 -// 勇士制定的攻击策略如下,不管面对什么巨龙,攻击过程只打击x下,让巨龙的血量不再大于0 +// 需要按顺序杀死每只巨龙,i号巨龙被杀后,攻击的剑会消失,但奖励攻击力为reward[i]的剑 +// 巨龙只有当血量恰好为0时,才能被杀死 +// 选择哪把剑去攻击当前的巨龙有如下的规定,一旦确定不能更换,直到杀死当前巨龙 +// 当前所有的剑里去选择,攻击力不高于当前巨龙的血量,并且攻击力最大的一把剑 +// 如果没有这样的剑,就选择攻击力最低的一把剑 +// 勇士制定的策略如下,不管面对什么巨龙,攻击过程只打击x下,让巨龙的血量不再大于0 // 然后在巨龙恢复的过程中,如果血量恰好为0,那么当前巨龙被杀死,勇士继续讨伐下一只巨龙 // 你的任务是算出最小的x,让勇士可以在该策略下杀死所有巨龙 -// 如果在固定打击次数的策略下,就是无法杀死所有的巨龙,返回-1 +// 如果在固定打击次数的策略下,就是无法杀死所有巨龙,返回-1 // 查看数据范围可以打开测试链接 // 测试链接 : https://www.luogu.com.cn/problem/P4774 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 From 8b36a3c72b101fbd080b4b5bf8820dc4fbe519cb Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 29 Aug 2024 16:17:54 +0800 Subject: [PATCH 0069/2029] modify code --- src/class141/Code01_CRT.java | 22 +++++++++++----------- src/class141/Code02_EXCRT.java | 20 ++++++++++---------- src/class141/Code03_GuessNumber1.java | 18 +++++++++--------- src/class141/Code03_GuessNumber2.java | 20 ++++++++++---------- src/class141/Code04_DragonSlayer.java | 12 ++++++------ 5 files changed, 46 insertions(+), 46 deletions(-) diff --git a/src/class141/Code01_CRT.java b/src/class141/Code01_CRT.java index 2b87ed75d..1e1ddd952 100644 --- a/src/class141/Code01_CRT.java +++ b/src/class141/Code01_CRT.java @@ -21,24 +21,24 @@ public class Code01_CRT { public static int MAXN = 11; - public static long modular[] = new long[MAXN]; + public static long m[] = new long[MAXN]; - public static long remainder[] = new long[MAXN]; + public static long r[] = new long[MAXN]; // 中国剩余定理模版 public static long crt(int n) { long lcm = 1; for (int i = 1; i <= n; i++) { - lcm = lcm * modular[i]; + lcm = lcm * m[i]; } long ai, ci, ans = 0; for (int i = 1; i <= n; i++) { - // 所有模数的乘积 / 当前的模数,得到ai - ai = lcm / modular[i]; - // 扩展欧几里得算法得到的x是%m[i]意义下的逆元 - exgcd(ai, modular[i]); - // ci = (ri * ai * ai逆元) % all - ci = multiply(remainder[i], multiply(ai, x, lcm), lcm); + // ai = lcm / m[i] + ai = lcm / m[i]; + // ai逆元 = ai在%m[i]意义下的逆元 + exgcd(ai, m[i]); + // ci = (ri * ai * ai逆元) % lcm + ci = multiply(r[i], multiply(ai, x, lcm), lcm); ans = (ans + ci) % lcm; } return ans; @@ -85,9 +85,9 @@ public static void main(String[] args) throws IOException { int n = (int) in.nval; for (int i = 1; i <= n; i++) { in.nextToken(); - modular[i] = (long) in.nval; + m[i] = (long) in.nval; in.nextToken(); - remainder[i] = (long) in.nval; + r[i] = (long) in.nval; } out.println(crt(n)); out.flush(); diff --git a/src/class141/Code02_EXCRT.java b/src/class141/Code02_EXCRT.java index e37069157..069b012d5 100644 --- a/src/class141/Code02_EXCRT.java +++ b/src/class141/Code02_EXCRT.java @@ -22,28 +22,28 @@ public class Code02_EXCRT { public static int MAXN = 100001; - public static long modular[] = new long[MAXN]; + public static long m[] = new long[MAXN]; - public static long remainder[] = new long[MAXN]; + public static long r[] = new long[MAXN]; // 扩展中国剩余定理模版 public static long excrt(int n) { - long ans = 0, lcm = 1, tmp, b, c; + long tail = 0, lcm = 1, tmp, b, c; for (int i = 1; i <= n; i++) { - b = modular[i]; - c = ((remainder[i] - ans) % b + b) % b; + b = m[i]; + c = ((r[i] - tail) % b + b) % b; exgcd(lcm, b); if (c % d != 0) { return -1; } + // 最小非负特解x = (x0 * (c/d)) % (b/d) 取非负余数 // 通解 x = x0 * (c/d) + (b/d) * n - // 最小非负数的特解x = (x0 * (c/d)) % (b/d) 取非负余数 x = multiply(x, c / d, b / d); tmp = lcm * (b / d); - ans = (ans + multiply(x, lcm, tmp)) % tmp; + tail = (tail + multiply(x, lcm, tmp)) % tmp; lcm = tmp; } - return ans; + return tail; } // 讲解139 - 扩展欧几里得算法 @@ -87,9 +87,9 @@ public static void main(String[] args) throws IOException { int n = (int) in.nval; for (int i = 1; i <= n; i++) { in.nextToken(); - modular[i] = (long) in.nval; + m[i] = (long) in.nval; in.nextToken(); - remainder[i] = (long) in.nval; + r[i] = (long) in.nval; } out.println(excrt(n)); out.flush(); diff --git a/src/class141/Code03_GuessNumber1.java b/src/class141/Code03_GuessNumber1.java index 4afab9040..7c3a2910e 100644 --- a/src/class141/Code03_GuessNumber1.java +++ b/src/class141/Code03_GuessNumber1.java @@ -22,21 +22,21 @@ public class Code03_GuessNumber1 { public static int MAXN = 11; - public static long modular[] = new long[MAXN]; + public static long m[] = new long[MAXN]; - public static long remainder[] = new long[MAXN]; + public static long r[] = new long[MAXN]; // 中国剩余定理模版 public static long crt(int n) { long lcm = 1; for (int i = 1; i <= n; i++) { - lcm = lcm * modular[i]; + lcm = lcm * m[i]; } long ai, ci, ans = 0; for (int i = 1; i <= n; i++) { - ai = lcm / modular[i]; - exgcd(ai, modular[i]); - ci = multiply(remainder[i], multiply(ai, x, lcm), lcm); + ai = lcm / m[i]; + exgcd(ai, m[i]); + ci = multiply(r[i], multiply(ai, x, lcm), lcm); ans = (ans + ci) % lcm; } return ans; @@ -83,15 +83,15 @@ public static void main(String[] args) throws IOException { int n = (int) in.nval; for (int i = 1; i <= n; i++) { in.nextToken(); - remainder[i] = (long) in.nval; + r[i] = (long) in.nval; } for (int i = 1; i <= n; i++) { in.nextToken(); - modular[i] = (long) in.nval; + m[i] = (long) in.nval; } // 题目输入的余数可能为负所以转化成正数 for (int i = 1; i <= n; i++) { - remainder[i] = (remainder[i] % modular[i] + modular[i]) % modular[i]; + r[i] = (r[i] % m[i] + m[i]) % m[i]; } out.println(crt(n)); out.flush(); diff --git a/src/class141/Code03_GuessNumber2.java b/src/class141/Code03_GuessNumber2.java index 0251debfa..ae4cffe35 100644 --- a/src/class141/Code03_GuessNumber2.java +++ b/src/class141/Code03_GuessNumber2.java @@ -22,26 +22,26 @@ public class Code03_GuessNumber2 { public static int MAXN = 11; - public static long modular[] = new long[MAXN]; + public static long m[] = new long[MAXN]; - public static long remainder[] = new long[MAXN]; + public static long r[] = new long[MAXN]; // 扩展中国剩余定理模版 public static long excrt(int n) { - long ans = 0, lcm = 1, tmp, b, c; + long tail = 0, lcm = 1, tmp, b, c; for (int i = 1; i <= n; i++) { - b = modular[i]; - c = ((remainder[i] - ans) % b + b) % b; + b = m[i]; + c = ((r[i] - tail) % b + b) % b; exgcd(lcm, b); if (c % d != 0) { return -1; } x = multiply(x, c / d, b / d); tmp = lcm * (b / d); - ans = (ans + multiply(x, lcm, tmp)) % tmp; + tail = (tail + multiply(x, lcm, tmp)) % tmp; lcm = tmp; } - return ans; + return tail; } // 讲解139 - 扩展欧几里得算法 @@ -85,15 +85,15 @@ public static void main(String[] args) throws IOException { int n = (int) in.nval; for (int i = 1; i <= n; i++) { in.nextToken(); - remainder[i] = (long) in.nval; + r[i] = (long) in.nval; } for (int i = 1; i <= n; i++) { in.nextToken(); - modular[i] = (long) in.nval; + m[i] = (long) in.nval; } // 题目输入的余数可能为负所以转化成正数 for (int i = 1; i <= n; i++) { - remainder[i] = (remainder[i] % modular[i] + modular[i]) % modular[i]; + r[i] = (r[i] % m[i] + m[i]) % m[i]; } out.println(excrt(n)); out.flush(); diff --git a/src/class141/Code04_DragonSlayer.java b/src/class141/Code04_DragonSlayer.java index d0f94d7b5..e06e98cc3 100644 --- a/src/class141/Code04_DragonSlayer.java +++ b/src/class141/Code04_DragonSlayer.java @@ -99,24 +99,24 @@ public static long allocate(int n, int m) { // 扩展中国剩余定理再扩展 public static long excrt(int n, int m) { long max = allocate(n, m); - long ans = 0, lcm = 1, tmp, a, b, c; + long tail = 0, lcm = 1, tmp, a, b, c; for (int i = 1; i <= n; i++) { a = multiply(choose[i], lcm, recovery[i]); b = recovery[i]; - c = ((hp[i] - choose[i] * ans) % b + b) % b; + c = ((hp[i] - choose[i] * tail) % b + b) % b; exgcd(a, b); if (c % d != 0) { return -1; } x = multiply(x, c / d, b / d); tmp = lcm * (b / d); - ans = (ans + multiply(x, lcm, tmp)) % tmp; + tail = (tail + multiply(x, lcm, tmp)) % tmp; lcm = tmp; } - if (ans < max) { - ans += ((max - ans - 1) / lcm + 1) * lcm; + if (tail < max) { + tail += ((max - tail - 1) / lcm + 1) * lcm; } - return ans; + return tail; } public static void main(String[] args) throws IOException { From 1f1856275e95c00d48454120e7433d4f937dcc5e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 29 Aug 2024 16:36:40 +0800 Subject: [PATCH 0070/2029] modify code --- src/class141/Code02_EXCRT.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class141/Code02_EXCRT.java b/src/class141/Code02_EXCRT.java index 069b012d5..0627c78f0 100644 --- a/src/class141/Code02_EXCRT.java +++ b/src/class141/Code02_EXCRT.java @@ -37,7 +37,7 @@ public static long excrt(int n) { return -1; } // 最小非负特解x = (x0 * (c/d)) % (b/d) 取非负余数 - // 通解 x = x0 * (c/d) + (b/d) * n + // 通解x = x0 * (c/d) + (b/d) * n x = multiply(x, c / d, b / d); tmp = lcm * (b / d); tail = (tail + multiply(x, lcm, tmp)) % tmp; From 5683ab2259808cdde5152b5984eced7f63dd4ae1 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 29 Aug 2024 16:39:53 +0800 Subject: [PATCH 0071/2029] modify code --- ...ssNumber2.java => Code03_GuessNumber.java} | 23 +++- src/class141/Code03_GuessNumber1.java | 102 ------------------ 2 files changed, 20 insertions(+), 105 deletions(-) rename src/class141/{Code03_GuessNumber2.java => Code03_GuessNumber.java} (83%) delete mode 100644 src/class141/Code03_GuessNumber1.java diff --git a/src/class141/Code03_GuessNumber2.java b/src/class141/Code03_GuessNumber.java similarity index 83% rename from src/class141/Code03_GuessNumber2.java rename to src/class141/Code03_GuessNumber.java index ae4cffe35..de53cb95b 100644 --- a/src/class141/Code03_GuessNumber2.java +++ b/src/class141/Code03_GuessNumber.java @@ -1,6 +1,6 @@ package class141; -// 猜数字(扩展中国剩余定理解决) +// 猜数字 // 给定两个长度为n数组,一组为r1,r2,r3...,另一组为m1,m2,m3... // 其中第二组数字两两互质,求最小正数解x // 要求x满足,mi | (x - ri),即(x - ri)是mi的整数倍 @@ -18,7 +18,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code03_GuessNumber2 { +public class Code03_GuessNumber { public static int MAXN = 11; @@ -26,6 +26,22 @@ public class Code03_GuessNumber2 { public static long r[] = new long[MAXN]; + // 中国剩余定理模版 + public static long crt(int n) { + long lcm = 1; + for (int i = 1; i <= n; i++) { + lcm = lcm * m[i]; + } + long ai, ci, ans = 0; + for (int i = 1; i <= n; i++) { + ai = lcm / m[i]; + exgcd(ai, m[i]); + ci = multiply(r[i], multiply(ai, x, lcm), lcm); + ans = (ans + ci) % lcm; + } + return ans; + } + // 扩展中国剩余定理模版 public static long excrt(int n) { long tail = 0, lcm = 1, tmp, b, c; @@ -95,7 +111,8 @@ public static void main(String[] args) throws IOException { for (int i = 1; i <= n; i++) { r[i] = (r[i] % m[i] + m[i]) % m[i]; } - out.println(excrt(n)); +// out.println(crt(n)); // 中国剩余定理解决 + out.println(excrt(n)); // 扩展中国剩余定理解决 out.flush(); out.close(); br.close(); diff --git a/src/class141/Code03_GuessNumber1.java b/src/class141/Code03_GuessNumber1.java deleted file mode 100644 index 7c3a2910e..000000000 --- a/src/class141/Code03_GuessNumber1.java +++ /dev/null @@ -1,102 +0,0 @@ -package class141; - -// 猜数字(中国剩余定理解决) -// 给定两个长度为n数组,一组为r1,r2,r3...,另一组为m1,m2,m3... -// 其中第二组数字两两互质,求最小正数解x -// 要求x满足,mi | (x - ri),即(x - ri)是mi的整数倍 -// 1 <= n <= 10 -// -10^9 <= ri <= +10^9 -// 1 <= mi <= 6 * 10^3 -// 所有mi的乘积 <= 10^18 -// 测试链接 : https://www.luogu.com.cn/problem/P3868 -// 提交以下的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 Code03_GuessNumber1 { - - public static int MAXN = 11; - - public static long m[] = new long[MAXN]; - - public static long r[] = new long[MAXN]; - - // 中国剩余定理模版 - public static long crt(int n) { - long lcm = 1; - for (int i = 1; i <= n; i++) { - lcm = lcm * m[i]; - } - long ai, ci, ans = 0; - for (int i = 1; i <= n; i++) { - ai = lcm / m[i]; - exgcd(ai, m[i]); - ci = multiply(r[i], multiply(ai, x, lcm), lcm); - ans = (ans + ci) % lcm; - } - return ans; - } - - // 讲解139 - 扩展欧几里得算法 - public static long d, x, y, px, py; - - public static void exgcd(long a, long b) { - if (b == 0) { - d = a; - x = 1; - y = 0; - } else { - exgcd(b, a % b); - px = x; - py = y; - x = py; - y = px - py * (a / b); - } - } - - // 讲解033 - 位运算实现乘法 - // a*b过程每一步都%mod,这么写是防止溢出,也叫龟速乘 - public static long multiply(long a, long b, long mod) { - a = (a % mod + mod) % mod; - b = (b % mod + mod) % mod; - long ans = 0; - while (b != 0) { - if ((b & 1) != 0) { - ans = (ans + a) % mod; - } - a = (a + a) % mod; - b >>= 1; - } - return ans; - } - - 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(); - int n = (int) in.nval; - for (int i = 1; i <= n; i++) { - in.nextToken(); - r[i] = (long) in.nval; - } - for (int i = 1; i <= n; i++) { - in.nextToken(); - m[i] = (long) in.nval; - } - // 题目输入的余数可能为负所以转化成正数 - for (int i = 1; i <= n; i++) { - r[i] = (r[i] % m[i] + m[i]) % m[i]; - } - out.println(crt(n)); - out.flush(); - out.close(); - br.close(); - } - -} From ebee1929eaaed52cd048e3daf6e6973b6518b6a9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 30 Aug 2024 12:38:59 +0800 Subject: [PATCH 0072/2029] modify code --- src/class141/Code04_DragonSlayer.java | 58 ++++++++++++++++++--------- 1 file changed, 39 insertions(+), 19 deletions(-) diff --git a/src/class141/Code04_DragonSlayer.java b/src/class141/Code04_DragonSlayer.java index e06e98cc3..665e6e33e 100644 --- a/src/class141/Code04_DragonSlayer.java +++ b/src/class141/Code04_DragonSlayer.java @@ -1,16 +1,16 @@ package class141; // 屠龙勇士 -// 一共有n只巨龙,每只巨龙都有初始血量hp[i],每只巨龙都有恢复能力recovery[i] -// 每只巨龙都会在攻击结束后开始恢复,初始时一共有m把剑,每把剑都有攻击力attack[i] +// 一共n只巨龙,每只巨龙都有初始血量hp[i],每只巨龙都有恢复能力recovery[i] +// 每只巨龙都会在攻击结束后开始恢复,初始一共m把剑,每把剑攻击力init[i] // 需要按顺序杀死每只巨龙,i号巨龙被杀后,攻击的剑会消失,但奖励攻击力为reward[i]的剑 // 巨龙只有当血量恰好为0时,才能被杀死 // 选择哪把剑去攻击当前的巨龙有如下的规定,一旦确定不能更换,直到杀死当前巨龙 // 当前所有的剑里去选择,攻击力不高于当前巨龙的血量,并且攻击力最大的一把剑 // 如果没有这样的剑,就选择攻击力最低的一把剑 -// 勇士制定的策略如下,不管面对什么巨龙,攻击过程只打击x下,让巨龙的血量不再大于0 +// 勇士制定的策略如下,不管面对什么巨龙,攻击过程只打击ans下,让巨龙的血量<=0 // 然后在巨龙恢复的过程中,如果血量恰好为0,那么当前巨龙被杀死,勇士继续讨伐下一只巨龙 -// 你的任务是算出最小的x,让勇士可以在该策略下杀死所有巨龙 +// 你的任务是算出最小的ans,让勇士可以在该策略下杀死所有巨龙 // 如果在固定打击次数的策略下,就是无法杀死所有巨龙,返回-1 // 查看数据范围可以打开测试链接 // 测试链接 : https://www.luogu.com.cn/problem/P4774 @@ -34,9 +34,9 @@ public class Code04_DragonSlayer { public static long[] reward = new long[MAXN]; - public static long[] attack = new long[MAXN]; + public static long[] init = new long[MAXN]; - public static long[] choose = new long[MAXN]; + public static long[] attack = new long[MAXN]; public static TreeMap sorted = new TreeMap<>(); @@ -73,11 +73,12 @@ public static long multiply(long a, long b, long mod) { return ans; } - // 每个怪物根据血量找到攻击的剑 + // 每只怪物根据血量找到攻击的剑 + // 哪只怪兽需要砍最多次,才能让其血量<=0,返回最多的次数 public static long allocate(int n, int m) { sorted.clear(); for (int i = 1; i <= m; i++) { - sorted.put(attack[i], sorted.getOrDefault(attack[i], 0) + 1); + sorted.put(init[i], sorted.getOrDefault(init[i], 0) + 1); } long max = 0; for (int i = 1; i <= n; i++) { @@ -85,25 +86,28 @@ public static long allocate(int n, int m) { if (sword == null) { sword = sorted.firstKey(); } - choose[i] = sword; + attack[i] = sword; sorted.put(sword, sorted.get(sword) - 1); if (sorted.get(sword) == 0) { sorted.remove(sword); } sorted.put(reward[i], sorted.getOrDefault(reward[i], 0) + 1); - max = Math.max(max, (hp[i] - 1) / choose[i] + 1); + max = Math.max(max, (hp[i] - 1) / attack[i] + 1); + hp[i] %= recovery[i]; } return max; } - // 扩展中国剩余定理再扩展 - public static long excrt(int n, int m) { + // bi * ans ≡ ri(% mi)方程组求解 + 本题对解的特殊处理 + public static long compute(int n, int m) { + // max变量很关键,最后的逻辑需要用到 + // 哪只怪兽需要砍最多次,才能让其血量<=0,这个最多的次数就是max long max = allocate(n, m); long tail = 0, lcm = 1, tmp, a, b, c; for (int i = 1; i <= n; i++) { - a = multiply(choose[i], lcm, recovery[i]); + a = multiply(attack[i], lcm, recovery[i]); b = recovery[i]; - c = ((hp[i] - choose[i] * tail) % b + b) % b; + c = ((hp[i] - attack[i] * tail) % b + b) % b; exgcd(a, b); if (c % d != 0) { return -1; @@ -113,10 +117,26 @@ public static long excrt(int n, int m) { tail = (tail + multiply(x, lcm, tmp)) % tmp; lcm = tmp; } - if (tail < max) { - tail += ((max - tail - 1) / lcm + 1) * lcm; + // 下面属于本题的特殊处理,注意max变量的含义 + // 上面的大思路是,对每只怪兽,根据如下的公式,整理出同余式 + // ans * attack[i] = hp[i] + 每只怪兽若干恢复次数 * recovery[i] + // 同余式为,ans * attack[i] ≡ hp[i] (% recovery[i]) + // 注意!能建立起的同余式,需要默认"每只怪兽若干恢复次数"的范围是整数 + // 最终解出,ans = k * lcm + tail,tail是最小正数解 + // 但实际情况是,"每只怪兽若干恢复次数"毫无疑问是非负的,并不是整个整数域 + // 也就是说,需要确保把每只怪兽的血量砍到<=0,然后才能保证,每只怪兽若干恢复次数>=0 + // 也就是说,ans = k * lcm + tail,需要确保,ans >= max,注意max变量的含义! + // 如果tail >= max,那么答案就是tail,此时k==0 + // 如果tail < max,想保证ans >= max,其实就是tail + k * lcm >= max + // k = (max - tail) / lcm,向上取整,也就是k = (max - tail + lcm - 1) / lcm + // 所以,ans = (max - tail + lcm - 1) / lcm * lcm + tail + long ans; + if (tail >= max) { + ans = tail; + } else { + ans = (max - tail + lcm - 1) / lcm * lcm + tail; } - return tail; + return ans; } public static void main(String[] args) throws IOException { @@ -144,9 +164,9 @@ public static void main(String[] args) throws IOException { } for (int i = 1; i <= m; i++) { in.nextToken(); - attack[i] = (long) in.nval; + init[i] = (long) in.nval; } - out.println(excrt(n, m)); + out.println(compute(n, m)); } out.flush(); out.close(); From 39c88fab1a3a6c34e6c82dad80d7f2b371830ffa Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 30 Aug 2024 12:48:06 +0800 Subject: [PATCH 0073/2029] modify code --- src/class141/Code04_DragonSlayer.java | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/class141/Code04_DragonSlayer.java b/src/class141/Code04_DragonSlayer.java index 665e6e33e..22ba6fca2 100644 --- a/src/class141/Code04_DragonSlayer.java +++ b/src/class141/Code04_DragonSlayer.java @@ -3,17 +3,14 @@ // 屠龙勇士 // 一共n只巨龙,每只巨龙都有初始血量hp[i],每只巨龙都有恢复能力recovery[i] // 每只巨龙都会在攻击结束后开始恢复,初始一共m把剑,每把剑攻击力init[i] -// 需要按顺序杀死每只巨龙,i号巨龙被杀后,攻击的剑会消失,但奖励攻击力为reward[i]的剑 -// 巨龙只有当血量恰好为0时,才能被杀死 -// 选择哪把剑去攻击当前的巨龙有如下的规定,一旦确定不能更换,直到杀死当前巨龙 -// 当前所有的剑里去选择,攻击力不高于当前巨龙的血量,并且攻击力最大的一把剑 -// 如果没有这样的剑,就选择攻击力最低的一把剑 -// 勇士制定的策略如下,不管面对什么巨龙,攻击过程只打击ans下,让巨龙的血量<=0 -// 然后在巨龙恢复的过程中,如果血量恰好为0,那么当前巨龙被杀死,勇士继续讨伐下一只巨龙 +// 每只巨龙只有当血量恰好为0时,才能被杀死。面对某只具体的龙,只能用固定的剑来攻击,规定如下: +// 攻击力不高于当前巨龙的血量,并且攻击力最大的一把剑,如果没有这样的剑,就选择攻击力最低的一把剑 +// 需要按1~n的顺序依次讨伐巨龙,i号巨龙被杀后,那把攻击的剑会消失,同时奖励攻击力reward[i]的剑 +// 勇士制定的策略如下,不管面对什么巨龙,攻击过程只打击ans下,让当前巨龙的血量<=0 +// 然后在当前巨龙恢复的过程中,如果血量恰好为0,那么当前巨龙被杀死,勇士继续讨伐下一只 // 你的任务是算出最小的ans,让勇士可以在该策略下杀死所有巨龙 // 如果在固定打击次数的策略下,就是无法杀死所有巨龙,返回-1 -// 查看数据范围可以打开测试链接 -// 测试链接 : https://www.luogu.com.cn/problem/P4774 +// 查看数据范围可以打开测试链接 : https://www.luogu.com.cn/problem/P4774 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.BufferedReader; From 10fce1aaba8cf4cc44bf8138c1ba95312de85bda Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 30 Aug 2024 13:57:38 +0800 Subject: [PATCH 0074/2029] modify code --- src/class141/Code01_CRT.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class141/Code01_CRT.java b/src/class141/Code01_CRT.java index 1e1ddd952..581f2a0fb 100644 --- a/src/class141/Code01_CRT.java +++ b/src/class141/Code01_CRT.java @@ -35,7 +35,7 @@ public static long crt(int n) { for (int i = 1; i <= n; i++) { // ai = lcm / m[i] ai = lcm / m[i]; - // ai逆元 = ai在%m[i]意义下的逆元 + // ai逆元,在%m[i]意义下的逆元 exgcd(ai, m[i]); // ci = (ri * ai * ai逆元) % lcm ci = multiply(r[i], multiply(ai, x, lcm), lcm); From b8238db9f3ceee230635e83b9bc615ad9646902a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 30 Aug 2024 16:04:11 +0800 Subject: [PATCH 0075/2029] modify code --- src/class141/Code02_EXCRT.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class141/Code02_EXCRT.java b/src/class141/Code02_EXCRT.java index 0627c78f0..9e45eacbc 100644 --- a/src/class141/Code02_EXCRT.java +++ b/src/class141/Code02_EXCRT.java @@ -36,8 +36,8 @@ public static long excrt(int n) { if (c % d != 0) { return -1; } - // 最小非负特解x = (x0 * (c/d)) % (b/d) 取非负余数 - // 通解x = x0 * (c/d) + (b/d) * n + // 最小非负特解 = (x0 * (c/d)) % (b/d) 取非负余数 + // 所以通解x = 最小非负特解 + (b/d) * n x = multiply(x, c / d, b / d); tmp = lcm * (b / d); tail = (tail + multiply(x, lcm, tmp)) % tmp; From c241d485e3d036224a8e939ff188bdebce8be1e1 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 30 Aug 2024 16:29:41 +0800 Subject: [PATCH 0076/2029] modify code --- src/class141/Code02_EXCRT.java | 12 +++++++----- src/class141/Code03_GuessNumber.java | 6 +++--- src/class141/Code04_DragonSlayer.java | 6 +++--- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/class141/Code02_EXCRT.java b/src/class141/Code02_EXCRT.java index 9e45eacbc..dd2561b28 100644 --- a/src/class141/Code02_EXCRT.java +++ b/src/class141/Code02_EXCRT.java @@ -28,7 +28,7 @@ public class Code02_EXCRT { // 扩展中国剩余定理模版 public static long excrt(int n) { - long tail = 0, lcm = 1, tmp, b, c; + long tail = 0, lcm = 1, tmp, b, c, x0; for (int i = 1; i <= n; i++) { b = m[i]; c = ((r[i] - tail) % b + b) % b; @@ -36,11 +36,13 @@ public static long excrt(int n) { if (c % d != 0) { return -1; } - // 最小非负特解 = (x0 * (c/d)) % (b/d) 取非负余数 - // 所以通解x = 最小非负特解 + (b/d) * n - x = multiply(x, c / d, b / d); + // x是ax + by = gcd(a,b)的特解 + // (x * (c/d))是ax + by = c的特解 + // 最小非负特解x0 = (x * (c/d)) % (b/d) 取非负余数 + // 通解x = x0 + (b/d) * n + x0 = multiply(x, c / d, b / d); tmp = lcm * (b / d); - tail = (tail + multiply(x, lcm, tmp)) % tmp; + tail = (tail + multiply(x0, lcm, tmp)) % tmp; lcm = tmp; } return tail; diff --git a/src/class141/Code03_GuessNumber.java b/src/class141/Code03_GuessNumber.java index de53cb95b..d4900bd60 100644 --- a/src/class141/Code03_GuessNumber.java +++ b/src/class141/Code03_GuessNumber.java @@ -44,7 +44,7 @@ public static long crt(int n) { // 扩展中国剩余定理模版 public static long excrt(int n) { - long tail = 0, lcm = 1, tmp, b, c; + long tail = 0, lcm = 1, tmp, b, c, x0; for (int i = 1; i <= n; i++) { b = m[i]; c = ((r[i] - tail) % b + b) % b; @@ -52,9 +52,9 @@ public static long excrt(int n) { if (c % d != 0) { return -1; } - x = multiply(x, c / d, b / d); + x0 = multiply(x, c / d, b / d); tmp = lcm * (b / d); - tail = (tail + multiply(x, lcm, tmp)) % tmp; + tail = (tail + multiply(x0, lcm, tmp)) % tmp; lcm = tmp; } return tail; diff --git a/src/class141/Code04_DragonSlayer.java b/src/class141/Code04_DragonSlayer.java index 22ba6fca2..8417fb1b4 100644 --- a/src/class141/Code04_DragonSlayer.java +++ b/src/class141/Code04_DragonSlayer.java @@ -100,7 +100,7 @@ public static long compute(int n, int m) { // max变量很关键,最后的逻辑需要用到 // 哪只怪兽需要砍最多次,才能让其血量<=0,这个最多的次数就是max long max = allocate(n, m); - long tail = 0, lcm = 1, tmp, a, b, c; + long tail = 0, lcm = 1, tmp, a, b, c, x0; for (int i = 1; i <= n; i++) { a = multiply(attack[i], lcm, recovery[i]); b = recovery[i]; @@ -109,9 +109,9 @@ public static long compute(int n, int m) { if (c % d != 0) { return -1; } - x = multiply(x, c / d, b / d); + x0 = multiply(x, c / d, b / d); tmp = lcm * (b / d); - tail = (tail + multiply(x, lcm, tmp)) % tmp; + tail = (tail + multiply(x0, lcm, tmp)) % tmp; lcm = tmp; } // 下面属于本题的特殊处理,注意max变量的含义 From 6e559bc5910ab894ac6f9307e1e1b65df6cc422a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 30 Aug 2024 17:33:32 +0800 Subject: [PATCH 0077/2029] modify code --- src/class141/Code02_EXCRT.java | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/class141/Code02_EXCRT.java b/src/class141/Code02_EXCRT.java index dd2561b28..cf20d25c1 100644 --- a/src/class141/Code02_EXCRT.java +++ b/src/class141/Code02_EXCRT.java @@ -29,18 +29,28 @@ public class Code02_EXCRT { // 扩展中国剩余定理模版 public static long excrt(int n) { long tail = 0, lcm = 1, tmp, b, c, x0; + // ans = lcm * x + tail for (int i = 1; i <= n; i++) { + // ans = m[i] * y + ri + // lcm * x + m[i] * y = ri - tail + // a = lcm + // b = m[i] + // c = ri - tail b = m[i]; c = ((r[i] - tail) % b + b) % b; exgcd(lcm, b); if (c % d != 0) { return -1; } - // x是ax + by = gcd(a,b)的特解 - // (x * (c/d))是ax + by = c的特解 - // 最小非负特解x0 = (x * (c/d)) % (b/d) 取非负余数 - // 通解x = x0 + (b/d) * n + // ax + by = gcd(a,b),特解是,x变量 + // ax + by = c,特解是,x变量 * (c/d) + // ax + by = c,最小非负特解x0 = (x * (c/d)) % (b/d) 取非负余数 + // 通解 = x0 + (b/d) * n x0 = multiply(x, c / d, b / d); + // ans = lcm * x + tail,带入通解 + // ans = lcm * (x0 + (b/d) * n) + tail + // ans = lcm * (b/d) * n + lcm * x0 + tail + // tail' = tail' % lcm' tmp = lcm * (b / d); tail = (tail + multiply(x0, lcm, tmp)) % tmp; lcm = tmp; From 6053c7c902ff7b9cf966f0c0d8a0a943961275e0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 30 Aug 2024 17:34:20 +0800 Subject: [PATCH 0078/2029] modify code --- src/class141/Code03_GuessNumber.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class141/Code03_GuessNumber.java b/src/class141/Code03_GuessNumber.java index d4900bd60..1e4ad5fb8 100644 --- a/src/class141/Code03_GuessNumber.java +++ b/src/class141/Code03_GuessNumber.java @@ -107,7 +107,7 @@ public static void main(String[] args) throws IOException { in.nextToken(); m[i] = (long) in.nval; } - // 题目输入的余数可能为负所以转化成正数 + // 题目输入的余数可能为负所以转化成非负数 for (int i = 1; i <= n; i++) { r[i] = (r[i] % m[i] + m[i]) % m[i]; } From 528047fb5ee75e02fdb9feeea450bc311fb2ca71 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 30 Aug 2024 17:41:35 +0800 Subject: [PATCH 0079/2029] modify code --- src/class141/Code03_GuessNumber.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class141/Code03_GuessNumber.java b/src/class141/Code03_GuessNumber.java index 1e4ad5fb8..dbb779693 100644 --- a/src/class141/Code03_GuessNumber.java +++ b/src/class141/Code03_GuessNumber.java @@ -111,7 +111,7 @@ public static void main(String[] args) throws IOException { for (int i = 1; i <= n; i++) { r[i] = (r[i] % m[i] + m[i]) % m[i]; } -// out.println(crt(n)); // 中国剩余定理解决 + // out.println(crt(n)); // 中国剩余定理解决 out.println(excrt(n)); // 扩展中国剩余定理解决 out.flush(); out.close(); From 4e7da25aeab7559568bbe6d746f6cde8bb3f5ee2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 30 Aug 2024 19:42:41 +0800 Subject: [PATCH 0080/2029] modify code --- ...12\345\205\266\346\211\251\345\261\225.pptx" | Bin 0 -> 49932 bytes src/class141/Code04_DragonSlayer.java | 16 +++++++++++----- 2 files changed, 11 insertions(+), 5 deletions(-) create mode 100644 "ppt/\347\256\227\346\263\225\350\256\262\350\247\243141\343\200\220\346\211\251\345\261\225\343\200\221\344\270\255\345\233\275\345\211\251\344\275\231\345\256\232\347\220\206\345\217\212\345\205\266\346\211\251\345\261\225.pptx" diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243141\343\200\220\346\211\251\345\261\225\343\200\221\344\270\255\345\233\275\345\211\251\344\275\231\345\256\232\347\220\206\345\217\212\345\205\266\346\211\251\345\261\225.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243141\343\200\220\346\211\251\345\261\225\343\200\221\344\270\255\345\233\275\345\211\251\344\275\231\345\256\232\347\220\206\345\217\212\345\205\266\346\211\251\345\261\225.pptx" new file mode 100644 index 0000000000000000000000000000000000000000..e82b89b47711fe9166b2b45699201357aaaa74da GIT binary patch literal 49932 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 B(q8}o literal 0 HcmV?d00001 diff --git a/src/class141/Code04_DragonSlayer.java b/src/class141/Code04_DragonSlayer.java index 8417fb1b4..d4246e3e2 100644 --- a/src/class141/Code04_DragonSlayer.java +++ b/src/class141/Code04_DragonSlayer.java @@ -71,7 +71,7 @@ public static long multiply(long a, long b, long mod) { } // 每只怪物根据血量找到攻击的剑 - // 哪只怪兽需要砍最多次,才能让其血量<=0,返回最多的次数 + // 哪只龙需要砍最多次,才能让其血量<=0,返回最多的次数 public static long allocate(int n, int m) { sorted.clear(); for (int i = 1; i <= m; i++) { @@ -89,7 +89,8 @@ public static long allocate(int n, int m) { sorted.remove(sword); } sorted.put(reward[i], sorted.getOrDefault(reward[i], 0) + 1); - max = Math.max(max, (hp[i] - 1) / attack[i] + 1); + max = Math.max(max, (hp[i] + attack[i] - 1) / attack[i]); + // 血量 = 血量 % 恢复力,变成余数形式 hp[i] %= recovery[i]; } return max; @@ -98,10 +99,14 @@ public static long allocate(int n, int m) { // bi * ans ≡ ri(% mi)方程组求解 + 本题对解的特殊处理 public static long compute(int n, int m) { // max变量很关键,最后的逻辑需要用到 - // 哪只怪兽需要砍最多次,才能让其血量<=0,这个最多的次数就是max + // 哪只龙需要砍最多次,才能让其血量<=0,这个最多的次数就是max long max = allocate(n, m); long tail = 0, lcm = 1, tmp, a, b, c, x0; + // ans = lcm * x + tail for (int i = 1; i <= n; i++) { + // ai * ans = ai * lcm * x + tail * ai 1号方程 + // ai * ans = ri * y + hi 2号方程 + // ai * lcm * x + ri * y = hi - tail * ai a = multiply(attack[i], lcm, recovery[i]); b = recovery[i]; c = ((hp[i] - attack[i] * tail) % b + b) % b; @@ -114,10 +119,11 @@ public static long compute(int n, int m) { tail = (tail + multiply(x0, lcm, tmp)) % tmp; lcm = tmp; } + // 通解 ans = ? * lcm + tail // 下面属于本题的特殊处理,注意max变量的含义 // 上面的大思路是,对每只怪兽,根据如下的公式,整理出同余式 - // ans * attack[i] = hp[i] + 每只怪兽若干恢复次数 * recovery[i] - // 同余式为,ans * attack[i] ≡ hp[i] (% recovery[i]) + // ans * a[i] = h[i] + 每只怪兽若干恢复次数 * r[i] + // 同余式为,ans * a[i] ≡ h[i] (% r[i]) // 注意!能建立起的同余式,需要默认"每只怪兽若干恢复次数"的范围是整数 // 最终解出,ans = k * lcm + tail,tail是最小正数解 // 但实际情况是,"每只怪兽若干恢复次数"毫无疑问是非负的,并不是整个整数域 From f76aa26e69a5c49f5404bbc553b8e96f2bba811c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 2 Sep 2024 16:23:19 +0800 Subject: [PATCH 0081/2029] modify code --- .../Code01_DifferenceConstraints.java | 132 ++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 src/class142/Code01_DifferenceConstraints.java diff --git a/src/class142/Code01_DifferenceConstraints.java b/src/class142/Code01_DifferenceConstraints.java new file mode 100644 index 000000000..ccbc4d001 --- /dev/null +++ b/src/class142/Code01_DifferenceConstraints.java @@ -0,0 +1,132 @@ +package class142; + +// 负环和差分约束模版题 +// 测试链接 : https://www.luogu.com.cn/problem/P5960 + +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 Code01_DifferenceConstraints { + + public static int MAXN = 5001; + + public static int MAXM = 10001; + + // 链式前向星 + public static int[] head = new int[MAXN]; + + public static int[] next = new int[MAXM]; + + public static int[] to = new int[MAXM]; + + public static int[] weight = new int[MAXM]; + + public static int cnt; + + // SPFA需要 + // 源点出发到每个节点的距离表 + public static int[] dist = new int[MAXN]; + + // 节点被松弛的次数 + public static int[] update = new int[MAXN]; + + // 队列的大小 + public static int MAXQ = 5000001; + + // 哪些节点被松弛了放入队列 + public static int[] queue = new int[MAXQ]; + + // 队列的头和尾 + public static int h, t; + + // 节点是否在队列中 + public static boolean[] enter = new boolean[MAXN]; + + public static int n, m; + + public static void prepare() { + cnt = 1; + Arrays.fill(head, 0, n + 1, 0); + h = t = 0; + Arrays.fill(dist, 0, n + 1, Integer.MAX_VALUE); + Arrays.fill(update, 0, n + 1, 0); + Arrays.fill(enter, 0, n + 1, false); + } + + public static void addEdge(int u, int v, int w) { + next[cnt] = head[u]; + to[cnt] = v; + weight[cnt] = w; + head[u] = cnt++; + } + + // 来自讲解065,spfa判断负环,s是超级源点 + public static boolean spfa(int s) { + dist[s] = 0; + update[s] = 1; + queue[t++] = s; + enter[s] = true; + while (h < t) { + int u = queue[h++]; + enter[u] = false; + for (int ei = head[u], v, w; ei > 0; ei = next[ei]) { + v = to[ei]; + w = weight[ei]; + if (dist[v] > dist[u] + w) { + dist[v] = dist[u] + w; + if (!enter[v]) { + // 注意判断负环的逻辑和讲解065的代码不一样 + // 因为节点0是额外增加的超级源点 + // 所以节点数量增加了1个,所以这么判断 + if (++update[v] > n) { + return true; + } + queue[t++] = v; + enter[v] = true; + } + } + } + } + return false; + } + + 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; + prepare(); + for (int i = 1, u, v, w; i <= m; i++) { + in.nextToken(); + u = (int) in.nval; + in.nextToken(); + v = (int) in.nval; + in.nextToken(); + w = (int) in.nval; + addEdge(v, u, w); + } + for (int i = 1; i <= n; i++) { + addEdge(0, i, 0); + } + if (spfa(0)) { + out.println("NO"); + } else { + for (int i = 1; i <= n; i++) { + out.print(dist[i] + " "); + } + out.println(); + } + out.flush(); + out.close(); + br.close(); + } + +} \ No newline at end of file From ffcdfcf680276a478aee583705994aed3e586e0a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 2 Sep 2024 16:25:35 +0800 Subject: [PATCH 0082/2029] modify code --- src/class142/Code01_DifferenceConstraints.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class142/Code01_DifferenceConstraints.java b/src/class142/Code01_DifferenceConstraints.java index ccbc4d001..38c124cbd 100644 --- a/src/class142/Code01_DifferenceConstraints.java +++ b/src/class142/Code01_DifferenceConstraints.java @@ -51,8 +51,8 @@ public class Code01_DifferenceConstraints { public static void prepare() { cnt = 1; - Arrays.fill(head, 0, n + 1, 0); h = t = 0; + Arrays.fill(head, 0, n + 1, 0); Arrays.fill(dist, 0, n + 1, Integer.MAX_VALUE); Arrays.fill(update, 0, n + 1, 0); Arrays.fill(enter, 0, n + 1, false); From 7be38143e549b5911108b0d58be326e670fb55cd Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 2 Sep 2024 16:27:11 +0800 Subject: [PATCH 0083/2029] modify code --- src/class142/Code01_DifferenceConstraints.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class142/Code01_DifferenceConstraints.java b/src/class142/Code01_DifferenceConstraints.java index 38c124cbd..282be53e9 100644 --- a/src/class142/Code01_DifferenceConstraints.java +++ b/src/class142/Code01_DifferenceConstraints.java @@ -28,7 +28,7 @@ public class Code01_DifferenceConstraints { public static int cnt; - // SPFA需要 + // spfa需要 // 源点出发到每个节点的距离表 public static int[] dist = new int[MAXN]; From ab65f8708b7f5f036e54c21ba9e4a1091fefec6d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 2 Sep 2024 16:28:22 +0800 Subject: [PATCH 0084/2029] modify code --- src/class142/Code01_DifferenceConstraints.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class142/Code01_DifferenceConstraints.java b/src/class142/Code01_DifferenceConstraints.java index 282be53e9..fcd5ec3c9 100644 --- a/src/class142/Code01_DifferenceConstraints.java +++ b/src/class142/Code01_DifferenceConstraints.java @@ -80,7 +80,7 @@ public static boolean spfa(int s) { if (dist[v] > dist[u] + w) { dist[v] = dist[u] + w; if (!enter[v]) { - // 注意判断负环的逻辑和讲解065的代码不一样 + // 注意判断逻辑和讲解065的代码不一样 // 因为节点0是额外增加的超级源点 // 所以节点数量增加了1个,所以这么判断 if (++update[v] > n) { From 1f021e996b1e8af21158f5eb8406439c886f0c87 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 2 Sep 2024 20:04:13 +0800 Subject: [PATCH 0085/2029] modify code --- src/class142/Code02_KsFarm.java | 140 ++++++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 src/class142/Code02_KsFarm.java diff --git a/src/class142/Code02_KsFarm.java b/src/class142/Code02_KsFarm.java new file mode 100644 index 000000000..f77bcc470 --- /dev/null +++ b/src/class142/Code02_KsFarm.java @@ -0,0 +1,140 @@ +package class142; + +// 小K的农场 +// 测试链接 : https://www.luogu.com.cn/problem/P1993 + +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 Code02_KsFarm { + + public static int MAXN = 5001; + + public static int MAXM = 20001; + + // 链式前向星 + public static int[] head = new int[MAXN]; + + public static int[] next = new int[MAXM]; + + public static int[] to = new int[MAXM]; + + public static int[] weight = new int[MAXM]; + + public static int cnt; + + // spfa需要 + // 源点出发到每个节点的距离表 + public static int[] dist = new int[MAXN]; + + // 节点被松弛的次数 + public static int[] update = new int[MAXN]; + + // 队列的大小 + public static int MAXQ = 20000001; + + // 哪些节点被松弛了放入队列 + public static int[] queue = new int[MAXQ]; + + // 队列的头和尾 + public static int h, t; + + // 节点是否在队列中 + public static boolean[] enter = new boolean[MAXN]; + + public static int n, m; + + public static void prepare() { + cnt = 1; + h = t = 0; + Arrays.fill(head, 0, n + 1, 0); + Arrays.fill(dist, 0, n + 1, Integer.MAX_VALUE); + Arrays.fill(update, 0, n + 1, 0); + Arrays.fill(enter, 0, n + 1, false); + } + + public static void addEdge(int u, int v, int w) { + next[cnt] = head[u]; + to[cnt] = v; + weight[cnt] = w; + head[u] = cnt++; + } + + // 来自讲解065,spfa判断负环,s是超级源点 + public static boolean spfa(int s) { + dist[s] = 0; + update[s] = 1; + queue[t++] = s; + enter[s] = true; + while (h < t) { + int u = queue[h++]; + enter[u] = false; + for (int ei = head[u], v, w; ei > 0; ei = next[ei]) { + v = to[ei]; + w = weight[ei]; + if (dist[v] > dist[u] + w) { + dist[v] = dist[u] + w; + if (!enter[v]) { + // 注意判断逻辑和讲解065的代码不一样 + // 因为节点0是额外增加的超级源点 + // 所以节点数量增加了1个,所以这么判断 + if (++update[v] > n) { + return true; + } + queue[t++] = v; + enter[v] = true; + } + } + } + } + return false; + } + + 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; + prepare(); + for (int i = 1, type, u, v, w; i <= m; i++) { + in.nextToken(); + type = (int) in.nval; + in.nextToken(); + u = (int) in.nval; + in.nextToken(); + v = (int) in.nval; + if (type == 1) { + in.nextToken(); + w = (int) in.nval; + addEdge(u, v, -w); + } else if (type == 2) { + in.nextToken(); + w = (int) in.nval; + addEdge(v, u, w); + } else { + addEdge(u, v, 0); + addEdge(v, u, 0); + } + } + for (int i = 1; i <= n; i++) { + addEdge(0, i, 0); + } + if (spfa(0)) { + out.println("No"); + } else { + out.println("Yes"); + } + out.flush(); + out.close(); + br.close(); + } + +} From 1f2a7fcc6eec505e00e2a4eb63453acb3d38e20a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 2 Sep 2024 20:35:41 +0800 Subject: [PATCH 0086/2029] modify code --- src/class142/Code03_Wormholes.java | 145 +++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 src/class142/Code03_Wormholes.java diff --git a/src/class142/Code03_Wormholes.java b/src/class142/Code03_Wormholes.java new file mode 100644 index 000000000..64bee9124 --- /dev/null +++ b/src/class142/Code03_Wormholes.java @@ -0,0 +1,145 @@ +package class142; + +// 虫洞 +// 测试链接 : https://www.luogu.com.cn/problem/P2850 + +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_Wormholes { + + public static int MAXN = 501; + + public static int MAXM = 10001; + + // 链式前向星 + public static int[] head = new int[MAXN]; + + public static int[] next = new int[MAXM]; + + public static int[] to = new int[MAXM]; + + public static int[] weight = new int[MAXM]; + + public static int cnt; + + // spfa需要 + // 源点出发到每个节点的距离表 + public static int[] dist = new int[MAXN]; + + // 节点被松弛的次数 + public static int[] update = new int[MAXN]; + + // 队列的大小 + public static int MAXQ = 300001; + + // 哪些节点被松弛了放入队列 + public static int[] queue = new int[MAXQ]; + + // 队列的头和尾 + public static int h, t; + + // 节点是否在队列中 + public static boolean[] enter = new boolean[MAXN]; + + public static int n, m1, m2; + + public static void prepare() { + cnt = 1; + h = t = 0; + Arrays.fill(head, 0, n + 1, 0); + Arrays.fill(dist, 0, n + 1, Integer.MAX_VALUE); + Arrays.fill(update, 0, n + 1, 0); + Arrays.fill(enter, 0, n + 1, false); + } + + public static void addEdge(int u, int v, int w) { + next[cnt] = head[u]; + to[cnt] = v; + weight[cnt] = w; + head[u] = cnt++; + } + + // 来自讲解065,spfa判断负环,s是超级源点 + public static boolean spfa(int s) { + dist[s] = 0; + update[s] = 1; + queue[t++] = s; + enter[s] = true; + while (h < t) { + int u = queue[h++]; + enter[u] = false; + for (int ei = head[u], v, w; ei > 0; ei = next[ei]) { + v = to[ei]; + w = weight[ei]; + if (dist[v] > dist[u] + w) { + dist[v] = dist[u] + w; + if (!enter[v]) { + // 注意判断逻辑和讲解065的代码不一样 + // 因为节点0是额外增加的超级源点 + // 所以节点数量增加了1个,所以这么判断 + if (++update[v] > n) { + return true; + } + queue[t++] = v; + enter[v] = true; + } + } + } + } + return false; + } + + 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(); + int cases = (int) in.nval; + for (int t = 1; t <= cases; t++) { + in.nextToken(); + n = (int) in.nval; + in.nextToken(); + m1 = (int) in.nval; + in.nextToken(); + m2 = (int) in.nval; + prepare(); + for (int i = 1, u, v, w; i <= m1; i++) { + in.nextToken(); + u = (int) in.nval; + in.nextToken(); + v = (int) in.nval; + in.nextToken(); + w = (int) in.nval; + addEdge(u, v, w); + addEdge(v, u, w); + } + for (int i = 1, u, v, w; i <= m2; i++) { + in.nextToken(); + u = (int) in.nval; + in.nextToken(); + v = (int) in.nval; + in.nextToken(); + w = (int) in.nval; + addEdge(u, v, -w); + } + for (int i = 1; i <= n; i++) { + addEdge(0, i, 0); + } + if (spfa(0)) { + out.println("YES"); + } else { + out.println("NO"); + } + } + out.flush(); + out.close(); + br.close(); + } + +} From 18a889a5b46e92860f9d622cdd2dd1ac73cacca5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 2 Sep 2024 21:37:32 +0800 Subject: [PATCH 0087/2029] modify code --- src/class142/Code04_Balance.java | 96 ++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 src/class142/Code04_Balance.java diff --git a/src/class142/Code04_Balance.java b/src/class142/Code04_Balance.java new file mode 100644 index 000000000..b92e7b197 --- /dev/null +++ b/src/class142/Code04_Balance.java @@ -0,0 +1,96 @@ +package class142; + +// 天平 +// 测试链接 : https://www.luogu.com.cn/problem/P2474 + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + +public class Code04_Balance { + + public static int MAXN = 51; + + public static int[][] dmax = new int[MAXN][MAXN]; + + public static int[][] dmin = new int[MAXN][MAXN]; + + public static char[][] s = new char[MAXN][MAXN]; + + public static int n, a, b; + + public static int c1, c2, c3; + + public static void compute() { + for (int i = 1; i <= n; i++) { + dmax[i][i] = dmin[i][i] = 0; + } + // 讲解065,Floyd算法 + for (int jump = 1; jump <= n; jump++) { + for (int i = 1; i <= n; i++) { + for (int j = 1; j <= n; j++) { + dmax[i][j] = Math.min(dmax[i][jump] + dmax[jump][j], dmax[i][j]); + dmin[i][j] = Math.max(dmin[i][jump] + dmin[jump][j], dmin[i][j]); + } + } + } + c1 = c2 = c3 = 0; + for (int i = 1; i <= n; i++) { + for (int j = i + 1; j <= n; j++) { + if (i != a && i != b && j != a && j != b) { + if (dmin[a][i] + dmin[b][j] > 0 || dmin[a][j] + dmin[b][i] > 0) { + c1++; + } + if (dmax[a][i] + dmax[b][j] < 0 || dmax[a][j] + dmax[b][i] < 0) { + c3++; + } + if (dmin[a][i] == dmax[a][i] && dmin[j][b] == dmax[j][b] && dmin[a][i] + dmin[b][j] == 0) { + c2++; + } else if (dmin[a][j] == dmax[a][j] && dmin[i][b] == dmax[i][b] && dmin[a][j] + dmin[b][i] == 0) { + c2++; + } + } + } + } + } + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + String[] numbers = br.readLine().split(" "); + n = Integer.valueOf(numbers[0]); + a = Integer.valueOf(numbers[1]); + b = Integer.valueOf(numbers[2]); + char[] line; + for (int i = 1; i <= n; i++) { + line = br.readLine().toCharArray(); + for (int j = 1; j <= n; j++) { + s[i][j] = line[j - 1]; + } + } + for (int i = 1; i <= n; i++) { + for (int j = 1; j <= n; j++) { + if (s[i][j] == '=') { + dmax[i][j] = dmin[i][j] = 0; + } else if (s[i][j] == '+') { + dmax[i][j] = 2; + dmin[i][j] = 1; + } else if (s[i][j] == '-') { + dmax[i][j] = -1; + dmin[i][j] = -2; + } else { + dmax[i][j] = 2; + dmin[i][j] = -2; + } + } + } + compute(); + out.printf("%d %d %d\n", c1, c2, c3); + out.flush(); + out.close(); + br.close(); + } + +} From 5a1a38d4e9ed80690941a9d5095ac8428cc813a2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 2 Sep 2024 21:40:04 +0800 Subject: [PATCH 0088/2029] modify code --- src/class142/Code04_Balance.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class142/Code04_Balance.java b/src/class142/Code04_Balance.java index b92e7b197..c4bdfc378 100644 --- a/src/class142/Code04_Balance.java +++ b/src/class142/Code04_Balance.java @@ -87,7 +87,7 @@ public static void main(String[] args) throws IOException { } } compute(); - out.printf("%d %d %d\n", c1, c2, c3); + out.println(c1 + " " + c2 + " " + c3); out.flush(); out.close(); br.close(); From 1bb73367f680d6a79e4a6f419ff7f87123c9230c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 3 Sep 2024 14:30:33 +0800 Subject: [PATCH 0089/2029] modify code --- src/class142/Code02_KsFarm.java | 12 +- src/class142/Code03_Wormholes.java | 12 +- src/class142/Code04_Balance.java | 14 +- src/class142/Code05_DoubleKillMeasurer.java | 171 ++++++++++++++++++++ 4 files changed, 180 insertions(+), 29 deletions(-) create mode 100644 src/class142/Code05_DoubleKillMeasurer.java diff --git a/src/class142/Code02_KsFarm.java b/src/class142/Code02_KsFarm.java index f77bcc470..c2f1b7e70 100644 --- a/src/class142/Code02_KsFarm.java +++ b/src/class142/Code02_KsFarm.java @@ -28,23 +28,17 @@ public class Code02_KsFarm { public static int cnt; - // spfa需要 - // 源点出发到每个节点的距离表 + // spfa public static int[] dist = new int[MAXN]; - // 节点被松弛的次数 public static int[] update = new int[MAXN]; - // 队列的大小 public static int MAXQ = 20000001; - // 哪些节点被松弛了放入队列 public static int[] queue = new int[MAXQ]; - // 队列的头和尾 public static int h, t; - // 节点是否在队列中 public static boolean[] enter = new boolean[MAXN]; public static int n, m; @@ -65,7 +59,6 @@ public static void addEdge(int u, int v, int w) { head[u] = cnt++; } - // 来自讲解065,spfa判断负环,s是超级源点 public static boolean spfa(int s) { dist[s] = 0; update[s] = 1; @@ -80,9 +73,6 @@ public static boolean spfa(int s) { if (dist[v] > dist[u] + w) { dist[v] = dist[u] + w; if (!enter[v]) { - // 注意判断逻辑和讲解065的代码不一样 - // 因为节点0是额外增加的超级源点 - // 所以节点数量增加了1个,所以这么判断 if (++update[v] > n) { return true; } diff --git a/src/class142/Code03_Wormholes.java b/src/class142/Code03_Wormholes.java index 64bee9124..d3793219f 100644 --- a/src/class142/Code03_Wormholes.java +++ b/src/class142/Code03_Wormholes.java @@ -28,23 +28,17 @@ public class Code03_Wormholes { public static int cnt; - // spfa需要 - // 源点出发到每个节点的距离表 + // spfa public static int[] dist = new int[MAXN]; - // 节点被松弛的次数 public static int[] update = new int[MAXN]; - // 队列的大小 public static int MAXQ = 300001; - // 哪些节点被松弛了放入队列 public static int[] queue = new int[MAXQ]; - // 队列的头和尾 public static int h, t; - // 节点是否在队列中 public static boolean[] enter = new boolean[MAXN]; public static int n, m1, m2; @@ -65,7 +59,6 @@ public static void addEdge(int u, int v, int w) { head[u] = cnt++; } - // 来自讲解065,spfa判断负环,s是超级源点 public static boolean spfa(int s) { dist[s] = 0; update[s] = 1; @@ -80,9 +73,6 @@ public static boolean spfa(int s) { if (dist[v] > dist[u] + w) { dist[v] = dist[u] + w; if (!enter[v]) { - // 注意判断逻辑和讲解065的代码不一样 - // 因为节点0是额外增加的超级源点 - // 所以节点数量增加了1个,所以这么判断 if (++update[v] > n) { return true; } diff --git a/src/class142/Code04_Balance.java b/src/class142/Code04_Balance.java index c4bdfc378..4b9a23967 100644 --- a/src/class142/Code04_Balance.java +++ b/src/class142/Code04_Balance.java @@ -21,7 +21,7 @@ public class Code04_Balance { public static int n, a, b; - public static int c1, c2, c3; + public static int ans1, ans2, ans3; public static void compute() { for (int i = 1; i <= n; i++) { @@ -36,20 +36,20 @@ public static void compute() { } } } - c1 = c2 = c3 = 0; + ans1 = ans2 = ans3 = 0; for (int i = 1; i <= n; i++) { for (int j = i + 1; j <= n; j++) { if (i != a && i != b && j != a && j != b) { if (dmin[a][i] + dmin[b][j] > 0 || dmin[a][j] + dmin[b][i] > 0) { - c1++; + ans1++; } if (dmax[a][i] + dmax[b][j] < 0 || dmax[a][j] + dmax[b][i] < 0) { - c3++; + ans3++; } if (dmin[a][i] == dmax[a][i] && dmin[j][b] == dmax[j][b] && dmin[a][i] + dmin[b][j] == 0) { - c2++; + ans2++; } else if (dmin[a][j] == dmax[a][j] && dmin[i][b] == dmax[i][b] && dmin[a][j] + dmin[b][i] == 0) { - c2++; + ans2++; } } } @@ -87,7 +87,7 @@ public static void main(String[] args) throws IOException { } } compute(); - out.println(c1 + " " + c2 + " " + c3); + out.println(ans1 + " " + ans2 + " " + ans3); out.flush(); out.close(); br.close(); diff --git a/src/class142/Code05_DoubleKillMeasurer.java b/src/class142/Code05_DoubleKillMeasurer.java new file mode 100644 index 000000000..f3a01333d --- /dev/null +++ b/src/class142/Code05_DoubleKillMeasurer.java @@ -0,0 +1,171 @@ +package class142; + +// 倍杀测量者 +// 测试链接 : https://www.luogu.com.cn/problem/P4926 + +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 Code05_DoubleKillMeasurer { + + public static int MAXN = 1001; + + public static int MAXM = 5001; + + public static int MAXK = 10; + + public static double sml = 1e-6; + + // 链式前向星 + public static int[] head = new int[MAXN]; + + public static int[] next = new int[MAXM]; + + public static int[] to = new int[MAXM]; + + public static int[] op = new int[MAXM]; + + public static double[] weight = new double[MAXM]; + + public static double[] ktimes = new double[MAXM]; + + public static int cnt; + + // spfa + public static double[] dist = new double[MAXN]; + + public static int[] update = new int[MAXN]; + + public static int MAXQ = 1000001; + + public static int[] queue = new int[MAXQ]; + + public static int h, t; + + public static boolean[] enter = new boolean[MAXN]; + + public static int n, m1, m2; + + public static void prepare() { + cnt = 1; + Arrays.fill(head, 0, n + 1, 0); + } + + public static void clear() { + h = t = 0; + Arrays.fill(dist, 0, n + 1, -1e9); + Arrays.fill(update, 0, n + 1, 0); + Arrays.fill(enter, 0, n + 1, false); + } + + public static void addEdge(int u, int v, int o, double w, double k) { + next[cnt] = head[u]; + to[cnt] = v; + op[cnt] = o; + weight[cnt] = w; + ktimes[cnt] = k; + head[u] = cnt++; + } + + public static boolean spfa(int s, double limit) { + clear(); + dist[s] = 0; + update[s] = 1; + queue[t++] = s; + enter[s] = true; + while (h < t) { + int u = queue[h++]; + enter[u] = false; + int v, o; + double w, k; + for (int ei = head[u]; ei > 0; ei = next[ei]) { + v = to[ei]; + o = op[ei]; + k = ktimes[ei]; + if (o == 1) { + w = Math.log(k - limit); + } else if (o == 2) { + w = -Math.log(k + limit); + } else { + w = weight[ei]; + } + // 注意这里,变大才更新 + if (dist[v] < dist[u] + w) { + dist[v] = dist[u] + w; + if (!enter[v]) { + if (++update[v] > n) { + return true; + } + queue[t++] = v; + enter[v] = true; + } + } + } + } + return false; + } + + public static double compute() { + double ans = 0, l = 0, r = MAXK, mid; + while (r - l >= sml) { + mid = (l + r) / 2; + if (spfa(0, mid)) { + ans = mid; + l = mid + sml; + } else { + r = mid - sml; + } + } + return ans; + } + + 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; + prepare(); + for (int i = 1, op, u, v, k; i <= m1; i++) { + in.nextToken(); + op = (int) in.nval; + in.nextToken(); + u = (int) in.nval; + in.nextToken(); + v = (int) in.nval; + in.nextToken(); + k = (int) in.nval; + addEdge(v, u, op, 0, k); + } + for (int i = 1, u, w; i <= m2; i++) { + in.nextToken(); + u = (int) in.nval; + in.nextToken(); + w = (int) in.nval; + addEdge(0, u, 0, Math.log(w), 0); + addEdge(u, 0, 0, -Math.log(w), 0); + } + for (int i = 1; i <= n; i++) { + addEdge(0, i, 0, 0, 0); + } + double ans = compute(); + if (ans == 0) { + out.println("-1"); + } else { + out.println(ans); + } + out.flush(); + out.close(); + br.close(); + } + +} From d761fda7061a742b6f40741e4d2a759d9acd32ea Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 3 Sep 2024 14:36:54 +0800 Subject: [PATCH 0090/2029] modify code --- src/class142/Code05_DoubleKillMeasurer.java | 40 ++++++++------------- 1 file changed, 14 insertions(+), 26 deletions(-) diff --git a/src/class142/Code05_DoubleKillMeasurer.java b/src/class142/Code05_DoubleKillMeasurer.java index f3a01333d..266a1cb38 100644 --- a/src/class142/Code05_DoubleKillMeasurer.java +++ b/src/class142/Code05_DoubleKillMeasurer.java @@ -56,13 +56,6 @@ public static void prepare() { Arrays.fill(head, 0, n + 1, 0); } - public static void clear() { - h = t = 0; - Arrays.fill(dist, 0, n + 1, -1e9); - Arrays.fill(update, 0, n + 1, 0); - Arrays.fill(enter, 0, n + 1, false); - } - public static void addEdge(int u, int v, int o, double w, double k) { next[cnt] = head[u]; to[cnt] = v; @@ -73,7 +66,10 @@ public static void addEdge(int u, int v, int o, double w, double k) { } public static boolean spfa(int s, double limit) { - clear(); + h = t = 0; + Arrays.fill(dist, 0, n + 1, -1e9); + Arrays.fill(update, 0, n + 1, 0); + Arrays.fill(enter, 0, n + 1, false); dist[s] = 0; update[s] = 1; queue[t++] = s; @@ -95,6 +91,7 @@ public static boolean spfa(int s, double limit) { w = weight[ei]; } // 注意这里,变大才更新 + // 看看是否能发现无限增长的环,其实本质和发现负环一样 if (dist[v] < dist[u] + w) { dist[v] = dist[u] + w; if (!enter[v]) { @@ -128,29 +125,20 @@ 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; prepare(); for (int i = 1, op, u, v, k; i <= m1; i++) { - in.nextToken(); - op = (int) in.nval; - in.nextToken(); - u = (int) in.nval; - in.nextToken(); - v = (int) in.nval; - in.nextToken(); - k = (int) in.nval; + in.nextToken(); op = (int) in.nval; + in.nextToken(); u = (int) in.nval; + in.nextToken(); v = (int) in.nval; + in.nextToken(); k = (int) in.nval; addEdge(v, u, op, 0, k); } for (int i = 1, u, w; i <= m2; i++) { - in.nextToken(); - u = (int) in.nval; - in.nextToken(); - w = (int) in.nval; + in.nextToken(); u = (int) in.nval; + in.nextToken(); w = (int) in.nval; addEdge(0, u, 0, Math.log(w), 0); addEdge(u, 0, 0, -Math.log(w), 0); } From 8a1c4272eec363ad2b42fbb5afe794891e8a40b3 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 3 Sep 2024 14:39:00 +0800 Subject: [PATCH 0091/2029] modify code --- src/class142/Code05_DoubleKillMeasurer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class142/Code05_DoubleKillMeasurer.java b/src/class142/Code05_DoubleKillMeasurer.java index 266a1cb38..f936e4153 100644 --- a/src/class142/Code05_DoubleKillMeasurer.java +++ b/src/class142/Code05_DoubleKillMeasurer.java @@ -91,7 +91,7 @@ public static boolean spfa(int s, double limit) { w = weight[ei]; } // 注意这里,变大才更新 - // 看看是否能发现无限增长的环,其实本质和发现负环一样 + // 是否能发现无限增长的环,与是否发现负环,本质是一样的 if (dist[v] < dist[u] + w) { dist[v] = dist[u] + w; if (!enter[v]) { From b8c6aaf5bb82a0f49b199fe09ba18b7244f09203 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 3 Sep 2024 15:11:36 +0800 Subject: [PATCH 0092/2029] modify code --- src/class142/Code04_CowLayout.java | 7 +++++++ src/class142/{Code04_Balance.java => Code05_Balance.java} | 2 +- ...bleKillMeasurer.java => Code06_DoubleKillMeasurer.java} | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 src/class142/Code04_CowLayout.java rename src/class142/{Code04_Balance.java => Code05_Balance.java} (98%) rename src/class142/{Code05_DoubleKillMeasurer.java => Code06_DoubleKillMeasurer.java} (98%) diff --git a/src/class142/Code04_CowLayout.java b/src/class142/Code04_CowLayout.java new file mode 100644 index 000000000..6527f4fc1 --- /dev/null +++ b/src/class142/Code04_CowLayout.java @@ -0,0 +1,7 @@ +package class142; + +// 奶牛的布局 +// 测试链接 : https://www.luogu.com.cn/problem/P4878 +public class Code04_CowLayout { + +} diff --git a/src/class142/Code04_Balance.java b/src/class142/Code05_Balance.java similarity index 98% rename from src/class142/Code04_Balance.java rename to src/class142/Code05_Balance.java index 4b9a23967..e53f3777e 100644 --- a/src/class142/Code04_Balance.java +++ b/src/class142/Code05_Balance.java @@ -9,7 +9,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code04_Balance { +public class Code05_Balance { public static int MAXN = 51; diff --git a/src/class142/Code05_DoubleKillMeasurer.java b/src/class142/Code06_DoubleKillMeasurer.java similarity index 98% rename from src/class142/Code05_DoubleKillMeasurer.java rename to src/class142/Code06_DoubleKillMeasurer.java index f936e4153..abcbed1cd 100644 --- a/src/class142/Code05_DoubleKillMeasurer.java +++ b/src/class142/Code06_DoubleKillMeasurer.java @@ -11,7 +11,7 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class Code05_DoubleKillMeasurer { +public class Code06_DoubleKillMeasurer { public static int MAXN = 1001; From 6953a1b5defe3de7fa0a3c2fe16017324a8ed448 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 3 Sep 2024 15:12:03 +0800 Subject: [PATCH 0093/2029] modify code --- src/class142/Code04_CowLayout.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class142/Code04_CowLayout.java b/src/class142/Code04_CowLayout.java index 6527f4fc1..e3d14df63 100644 --- a/src/class142/Code04_CowLayout.java +++ b/src/class142/Code04_CowLayout.java @@ -1,6 +1,6 @@ package class142; -// 奶牛的布局 +// 奶牛布局 // 测试链接 : https://www.luogu.com.cn/problem/P4878 public class Code04_CowLayout { From 15e7860c1fd8c1a1a3f486b3b2d762caa3f308e9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 3 Sep 2024 17:45:09 +0800 Subject: [PATCH 0094/2029] modify code --- src/class142/Code04_CowLayout.java | 131 +++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) diff --git a/src/class142/Code04_CowLayout.java b/src/class142/Code04_CowLayout.java index e3d14df63..4b4a41113 100644 --- a/src/class142/Code04_CowLayout.java +++ b/src/class142/Code04_CowLayout.java @@ -2,6 +2,137 @@ // 奶牛布局 // 测试链接 : https://www.luogu.com.cn/problem/P4878 + +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 Code04_CowLayout { + public static int MAXN = 1001; + + public static int MAXM = 20001; + + // 链式前向星 + public static int[] head = new int[MAXN]; + + public static int[] next = new int[MAXM]; + + public static int[] to = new int[MAXM]; + + public static int[] weight = new int[MAXM]; + + public static int cnt; + + // spfa + public static int[] dist = new int[MAXN]; + + public static int[] update = new int[MAXN]; + + public static int MAXQ = 1000001; + + public static int[] queue = new int[MAXQ]; + + public static int h, t; + + public static boolean[] enter = new boolean[MAXN]; + + public static int n, m1, m2; + + public static void prepare() { + cnt = 1; + Arrays.fill(head, 0, n + 1, 0); + } + + public static void addEdge(int u, int v, int w) { + next[cnt] = head[u]; + to[cnt] = v; + weight[cnt] = w; + head[u] = cnt++; + } + + public static int spfa(int s) { + h = t = 0; + Arrays.fill(dist, 0, n + 1, Integer.MAX_VALUE); + Arrays.fill(update, 0, n + 1, 0); + Arrays.fill(enter, 0, n + 1, false); + dist[s] = 0; + update[s] = 1; + queue[t++] = s; + enter[s] = true; + while (h < t) { + int u = queue[h++]; + enter[u] = false; + for (int ei = head[u], v, w; ei > 0; ei = next[ei]) { + v = to[ei]; + w = weight[ei]; + if (dist[v] > dist[u] + w) { + dist[v] = dist[u] + w; + if (!enter[v]) { + if (++update[v] > n) { + return -1; + } + queue[t++] = v; + enter[v] = true; + } + } + } + } + if (dist[n] == Integer.MAX_VALUE) { + return -2; + } + return dist[n]; + } + + 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; + prepare(); + for (int i = 1, u, v, w; i <= m1; i++) { + in.nextToken(); + u = (int) in.nval; + in.nextToken(); + v = (int) in.nval; + in.nextToken(); + w = (int) in.nval; + addEdge(u, v, w); + } + for (int i = 1, u, v, w; i <= m2; i++) { + in.nextToken(); + u = (int) in.nval; + in.nextToken(); + v = (int) in.nval; + in.nextToken(); + w = (int) in.nval; + addEdge(v, u, -w); + } + for (int i = 1; i < n; i++) { + addEdge(i + 1, i, 0); + } + for (int i = 1; i <= n; i++) { + addEdge(0, i, 0); + } + int ans = spfa(0); + if (ans == -2 || ans == -1) { + out.println(ans); + } else { + ans = spfa(1); + out.println(ans); + } + out.flush(); + out.close(); + br.close(); + } + } From 4f4359423cd4989cf50de1806f006762f70c5c61 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 4 Sep 2024 11:33:04 +0800 Subject: [PATCH 0095/2029] modify code --- src/class142/Code05_Balance.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class142/Code05_Balance.java b/src/class142/Code05_Balance.java index e53f3777e..2e1eb2125 100644 --- a/src/class142/Code05_Balance.java +++ b/src/class142/Code05_Balance.java @@ -27,7 +27,7 @@ public static void compute() { for (int i = 1; i <= n; i++) { dmax[i][i] = dmin[i][i] = 0; } - // 讲解065,Floyd算法 + // 来自讲解065,Floyd算法 for (int jump = 1; jump <= n; jump++) { for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { From 4466980d663d22a3c2d182a495816ab9b240b624 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 4 Sep 2024 11:42:14 +0800 Subject: [PATCH 0096/2029] modify code --- src/class142/Code05_Balance.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/class142/Code05_Balance.java b/src/class142/Code05_Balance.java index 2e1eb2125..6beb785ff 100644 --- a/src/class142/Code05_Balance.java +++ b/src/class142/Code05_Balance.java @@ -28,11 +28,11 @@ public static void compute() { dmax[i][i] = dmin[i][i] = 0; } // 来自讲解065,Floyd算法 - for (int jump = 1; jump <= n; jump++) { + for (int bridge = 1; bridge <= n; bridge++) { for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { - dmax[i][j] = Math.min(dmax[i][jump] + dmax[jump][j], dmax[i][j]); - dmin[i][j] = Math.max(dmin[i][jump] + dmin[jump][j], dmin[i][j]); + dmax[i][j] = Math.min(dmax[i][bridge] + dmax[bridge][j], dmax[i][j]); + dmin[i][j] = Math.max(dmin[i][bridge] + dmin[bridge][j], dmin[i][j]); } } } From 411d96803b979f07eac0fcec4a7ef320ceaf76be Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 4 Sep 2024 13:43:37 +0800 Subject: [PATCH 0097/2029] modify code --- ...ava => Code01_DifferenceConstraints1.java} | 16 +-- .../Code01_DifferenceConstraints2.java | 128 ++++++++++++++++++ src/class142/Code02_KsFarm.java | 4 +- src/class142/Code03_Wormholes.java | 4 +- src/class142/Code04_CowLayout.java | 4 +- src/class142/Code06_DoubleKillMeasurer.java | 34 +++-- 6 files changed, 161 insertions(+), 29 deletions(-) rename src/class142/{Code01_DifferenceConstraints.java => Code01_DifferenceConstraints1.java} (89%) create mode 100644 src/class142/Code01_DifferenceConstraints2.java diff --git a/src/class142/Code01_DifferenceConstraints.java b/src/class142/Code01_DifferenceConstraints1.java similarity index 89% rename from src/class142/Code01_DifferenceConstraints.java rename to src/class142/Code01_DifferenceConstraints1.java index fcd5ec3c9..52ab4690f 100644 --- a/src/class142/Code01_DifferenceConstraints.java +++ b/src/class142/Code01_DifferenceConstraints1.java @@ -1,6 +1,6 @@ package class142; -// 负环和差分约束模版题 +// 负环和差分约束模版题(转化成形式1,进而转化成判断负环) // 测试链接 : https://www.luogu.com.cn/problem/P5960 import java.io.BufferedReader; @@ -11,13 +11,13 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class Code01_DifferenceConstraints { +public class Code01_DifferenceConstraints1 { public static int MAXN = 5001; public static int MAXM = 10001; - // 链式前向星 + // 链式前向星需要 public static int[] head = new int[MAXN]; public static int[] next = new int[MAXM]; @@ -29,22 +29,16 @@ public class Code01_DifferenceConstraints { public static int cnt; // spfa需要 - // 源点出发到每个节点的距离表 public static int[] dist = new int[MAXN]; - // 节点被松弛的次数 public static int[] update = new int[MAXN]; - // 队列的大小 public static int MAXQ = 5000001; - // 哪些节点被松弛了放入队列 public static int[] queue = new int[MAXQ]; - // 队列的头和尾 public static int h, t; - // 节点是否在队列中 public static boolean[] enter = new boolean[MAXN]; public static int n, m; @@ -53,6 +47,7 @@ public static void prepare() { cnt = 1; h = t = 0; Arrays.fill(head, 0, n + 1, 0); + // 所有距离先设置成最大值 Arrays.fill(dist, 0, n + 1, Integer.MAX_VALUE); Arrays.fill(update, 0, n + 1, 0); Arrays.fill(enter, 0, n + 1, false); @@ -77,7 +72,7 @@ public static boolean spfa(int s) { for (int ei = head[u], v, w; ei > 0; ei = next[ei]) { v = to[ei]; w = weight[ei]; - if (dist[v] > dist[u] + w) { + if (dist[v] > dist[u] + w) { // 变小才更新 dist[v] = dist[u] + w; if (!enter[v]) { // 注意判断逻辑和讲解065的代码不一样 @@ -111,6 +106,7 @@ public static void main(String[] args) throws IOException { v = (int) in.nval; in.nextToken(); w = (int) in.nval; + // 形式1的连边方式 addEdge(v, u, w); } for (int i = 1; i <= n; i++) { diff --git a/src/class142/Code01_DifferenceConstraints2.java b/src/class142/Code01_DifferenceConstraints2.java new file mode 100644 index 000000000..648463194 --- /dev/null +++ b/src/class142/Code01_DifferenceConstraints2.java @@ -0,0 +1,128 @@ +package class142; + +// 负环和差分约束模版题(转化成形式2,进而转化成判断无限增加的环) +// 测试链接 : https://www.luogu.com.cn/problem/P5960 + +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 Code01_DifferenceConstraints2 { + + public static int MAXN = 5001; + + public static int MAXM = 10001; + + // 链式前向星需要 + public static int[] head = new int[MAXN]; + + public static int[] next = new int[MAXM]; + + public static int[] to = new int[MAXM]; + + public static int[] weight = new int[MAXM]; + + public static int cnt; + + // spfa需要 + public static int[] dist = new int[MAXN]; + + public static int[] update = new int[MAXN]; + + public static int MAXQ = 5000001; + + public static int[] queue = new int[MAXQ]; + + public static int h, t; + + public static boolean[] enter = new boolean[MAXN]; + + public static int n, m; + + public static void prepare() { + cnt = 1; + h = t = 0; + Arrays.fill(head, 0, n + 1, 0); + // 所有距离先设置成最小值 + Arrays.fill(dist, 0, n + 1, Integer.MIN_VALUE); + Arrays.fill(update, 0, n + 1, 0); + Arrays.fill(enter, 0, n + 1, false); + } + + public static void addEdge(int u, int v, int w) { + next[cnt] = head[u]; + to[cnt] = v; + weight[cnt] = w; + head[u] = cnt++; + } + + // 来自讲解065,spfa判断无限增加环,s是超级源点 + public static boolean spfa(int s) { + dist[s] = 0; + update[s] = 1; + queue[t++] = s; + enter[s] = true; + while (h < t) { + int u = queue[h++]; + enter[u] = false; + for (int ei = head[u], v, w; ei > 0; ei = next[ei]) { + v = to[ei]; + w = weight[ei]; + if (dist[v] < dist[u] + w) { // 变大才更新 + dist[v] = dist[u] + w; + if (!enter[v]) { + // 注意判断逻辑和讲解065的代码不一样 + // 因为节点0是额外增加的超级源点 + // 所以节点数量增加了1个,所以这么判断 + if (++update[v] > n) { + return true; + } + queue[t++] = v; + enter[v] = true; + } + } + } + } + return false; + } + + 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; + prepare(); + for (int i = 1, u, v, w; i <= m; i++) { + in.nextToken(); + u = (int) in.nval; + in.nextToken(); + v = (int) in.nval; + in.nextToken(); + w = (int) in.nval; + // 形式2的连边方式 + addEdge(u, v, -w); + } + for (int i = 1; i <= n; i++) { + addEdge(0, i, 0); + } + if (spfa(0)) { + out.println("NO"); + } else { + for (int i = 1; i <= n; i++) { + out.print(dist[i] + " "); + } + out.println(); + } + out.flush(); + out.close(); + br.close(); + } + +} \ No newline at end of file diff --git a/src/class142/Code02_KsFarm.java b/src/class142/Code02_KsFarm.java index c2f1b7e70..f237880e4 100644 --- a/src/class142/Code02_KsFarm.java +++ b/src/class142/Code02_KsFarm.java @@ -17,7 +17,7 @@ public class Code02_KsFarm { public static int MAXM = 20001; - // 链式前向星 + // 链式前向星需要 public static int[] head = new int[MAXN]; public static int[] next = new int[MAXM]; @@ -28,7 +28,7 @@ public class Code02_KsFarm { public static int cnt; - // spfa + // spfa需要 public static int[] dist = new int[MAXN]; public static int[] update = new int[MAXN]; diff --git a/src/class142/Code03_Wormholes.java b/src/class142/Code03_Wormholes.java index d3793219f..6d32f6a63 100644 --- a/src/class142/Code03_Wormholes.java +++ b/src/class142/Code03_Wormholes.java @@ -17,7 +17,7 @@ public class Code03_Wormholes { public static int MAXM = 10001; - // 链式前向星 + // 链式前向星需要 public static int[] head = new int[MAXN]; public static int[] next = new int[MAXM]; @@ -28,7 +28,7 @@ public class Code03_Wormholes { public static int cnt; - // spfa + // spfa需要 public static int[] dist = new int[MAXN]; public static int[] update = new int[MAXN]; diff --git a/src/class142/Code04_CowLayout.java b/src/class142/Code04_CowLayout.java index 4b4a41113..bc2a8abc2 100644 --- a/src/class142/Code04_CowLayout.java +++ b/src/class142/Code04_CowLayout.java @@ -17,7 +17,7 @@ public class Code04_CowLayout { public static int MAXM = 20001; - // 链式前向星 + // 链式前向星需要 public static int[] head = new int[MAXN]; public static int[] next = new int[MAXM]; @@ -28,7 +28,7 @@ public class Code04_CowLayout { public static int cnt; - // spfa + // spfa需要 public static int[] dist = new int[MAXN]; public static int[] update = new int[MAXN]; diff --git a/src/class142/Code06_DoubleKillMeasurer.java b/src/class142/Code06_DoubleKillMeasurer.java index abcbed1cd..f4d0b5119 100644 --- a/src/class142/Code06_DoubleKillMeasurer.java +++ b/src/class142/Code06_DoubleKillMeasurer.java @@ -21,7 +21,7 @@ public class Code06_DoubleKillMeasurer { public static double sml = 1e-6; - // 链式前向星 + // 链式前向星需要 public static int[] head = new int[MAXN]; public static int[] next = new int[MAXM]; @@ -36,7 +36,7 @@ public class Code06_DoubleKillMeasurer { public static int cnt; - // spfa + // spfa需要 public static double[] dist = new double[MAXN]; public static int[] update = new int[MAXN]; @@ -90,8 +90,7 @@ public static boolean spfa(int s, double limit) { } else { w = weight[ei]; } - // 注意这里,变大才更新 - // 是否能发现无限增长的环,与是否发现负环,本质是一样的 + // 注意这里是变大才更新,是否能发现无限增加的环,与是否发现负环,本质是一样的 if (dist[v] < dist[u] + w) { dist[v] = dist[u] + w; if (!enter[v]) { @@ -125,20 +124,29 @@ 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; prepare(); for (int i = 1, op, u, v, k; i <= m1; i++) { - in.nextToken(); op = (int) in.nval; - in.nextToken(); u = (int) in.nval; - in.nextToken(); v = (int) in.nval; - in.nextToken(); k = (int) in.nval; + in.nextToken(); + op = (int) in.nval; + in.nextToken(); + u = (int) in.nval; + in.nextToken(); + v = (int) in.nval; + in.nextToken(); + k = (int) in.nval; addEdge(v, u, op, 0, k); } for (int i = 1, u, w; i <= m2; i++) { - in.nextToken(); u = (int) in.nval; - in.nextToken(); w = (int) in.nval; + in.nextToken(); + u = (int) in.nval; + in.nextToken(); + w = (int) in.nval; addEdge(0, u, 0, Math.log(w), 0); addEdge(u, 0, 0, -Math.log(w), 0); } From f23cd67ca98fbd84937b5dfea20c4fac9dcfd504 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 4 Sep 2024 13:46:34 +0800 Subject: [PATCH 0098/2029] modify code --- src/class142/Code01_DifferenceConstraints1.java | 3 ++- src/class142/Code01_DifferenceConstraints2.java | 3 ++- src/class142/Code02_KsFarm.java | 1 + src/class142/Code03_Wormholes.java | 1 + src/class142/Code04_CowLayout.java | 1 + src/class142/Code05_Balance.java | 1 + src/class142/Code06_DoubleKillMeasurer.java | 1 + 7 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/class142/Code01_DifferenceConstraints1.java b/src/class142/Code01_DifferenceConstraints1.java index 52ab4690f..7d2f53258 100644 --- a/src/class142/Code01_DifferenceConstraints1.java +++ b/src/class142/Code01_DifferenceConstraints1.java @@ -1,7 +1,8 @@ package class142; -// 负环和差分约束模版题(转化成形式1,进而转化成判断负环) +// 负环和差分约束模版题,转化成形式1,进而转化成判断负环 // 测试链接 : https://www.luogu.com.cn/problem/P5960 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.BufferedReader; import java.io.IOException; diff --git a/src/class142/Code01_DifferenceConstraints2.java b/src/class142/Code01_DifferenceConstraints2.java index 648463194..fb0033c02 100644 --- a/src/class142/Code01_DifferenceConstraints2.java +++ b/src/class142/Code01_DifferenceConstraints2.java @@ -1,7 +1,8 @@ package class142; -// 负环和差分约束模版题(转化成形式2,进而转化成判断无限增加的环) +// 负环和差分约束模版题,转化成形式2,进而转化成判断无限增加的环 // 测试链接 : https://www.luogu.com.cn/problem/P5960 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.BufferedReader; import java.io.IOException; diff --git a/src/class142/Code02_KsFarm.java b/src/class142/Code02_KsFarm.java index f237880e4..3807287cb 100644 --- a/src/class142/Code02_KsFarm.java +++ b/src/class142/Code02_KsFarm.java @@ -2,6 +2,7 @@ // 小K的农场 // 测试链接 : https://www.luogu.com.cn/problem/P1993 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.BufferedReader; import java.io.IOException; diff --git a/src/class142/Code03_Wormholes.java b/src/class142/Code03_Wormholes.java index 6d32f6a63..1ddbfc907 100644 --- a/src/class142/Code03_Wormholes.java +++ b/src/class142/Code03_Wormholes.java @@ -2,6 +2,7 @@ // 虫洞 // 测试链接 : https://www.luogu.com.cn/problem/P2850 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.BufferedReader; import java.io.IOException; diff --git a/src/class142/Code04_CowLayout.java b/src/class142/Code04_CowLayout.java index bc2a8abc2..891e63a25 100644 --- a/src/class142/Code04_CowLayout.java +++ b/src/class142/Code04_CowLayout.java @@ -2,6 +2,7 @@ // 奶牛布局 // 测试链接 : https://www.luogu.com.cn/problem/P4878 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.BufferedReader; import java.io.IOException; diff --git a/src/class142/Code05_Balance.java b/src/class142/Code05_Balance.java index 6beb785ff..399dea2d0 100644 --- a/src/class142/Code05_Balance.java +++ b/src/class142/Code05_Balance.java @@ -2,6 +2,7 @@ // 天平 // 测试链接 : https://www.luogu.com.cn/problem/P2474 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.BufferedReader; import java.io.IOException; diff --git a/src/class142/Code06_DoubleKillMeasurer.java b/src/class142/Code06_DoubleKillMeasurer.java index f4d0b5119..ebdc4f81b 100644 --- a/src/class142/Code06_DoubleKillMeasurer.java +++ b/src/class142/Code06_DoubleKillMeasurer.java @@ -2,6 +2,7 @@ // 倍杀测量者 // 测试链接 : https://www.luogu.com.cn/problem/P4926 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.BufferedReader; import java.io.IOException; From 2d643456b83fa6b1bb9dfced038130db0399d5fa Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 4 Sep 2024 15:41:43 +0800 Subject: [PATCH 0099/2029] modify code --- src/class142/Code01_DifferenceConstraints1.java | 8 +++++++- src/class142/Code01_DifferenceConstraints2.java | 8 +++++++- src/class142/Code02_KsFarm.java | 7 +++++++ src/class142/Code03_Wormholes.java | 9 +++++++++ ...ode04_CowLayout.java => Code04_LayoutCow.java} | 12 ++++++++++-- src/class142/Code05_Balance.java | 12 ++++++++++++ src/class142/Code06_DoubleKillMeasurer.java | 15 +++++++++++++++ 7 files changed, 67 insertions(+), 4 deletions(-) rename src/class142/{Code04_CowLayout.java => Code04_LayoutCow.java} (81%) diff --git a/src/class142/Code01_DifferenceConstraints1.java b/src/class142/Code01_DifferenceConstraints1.java index 7d2f53258..e4eceff3c 100644 --- a/src/class142/Code01_DifferenceConstraints1.java +++ b/src/class142/Code01_DifferenceConstraints1.java @@ -1,6 +1,12 @@ package class142; -// 负环和差分约束模版题,转化成形式1,进而转化成判断负环 +// 负环和差分约束模版题(转化成形式1进而转化成判断负环) +// 一共有n个变量,编号1~n,给定m个不等式,每个不等式的形式为 +// Xi - Xj <= Ci,其中Xi和Xj为变量,Ci为常量 +// 如果不等式存在矛盾导致无解,打印"NO" +// 如果有解,打印满足所有不等式的其中一组解(X1, X2...) +// 1 <= n、m <= 5 * 10^3 +// -10^4 <= Ci <= +10^4 // 测试链接 : https://www.luogu.com.cn/problem/P5960 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class142/Code01_DifferenceConstraints2.java b/src/class142/Code01_DifferenceConstraints2.java index fb0033c02..cd4b4a57e 100644 --- a/src/class142/Code01_DifferenceConstraints2.java +++ b/src/class142/Code01_DifferenceConstraints2.java @@ -1,6 +1,12 @@ package class142; -// 负环和差分约束模版题,转化成形式2,进而转化成判断无限增加的环 +// 负环和差分约束模版题(转化成形式2进而转化成判断无限增加的环) +// 一共有n个变量,编号1~n,给定m个不等式,每个不等式的形式为 +// Xi - Xj <= Ci,其中Xi和Xj为变量,Ci为常量 +// 如果不等式存在矛盾导致无解,打印"NO" +// 如果有解,打印满足所有不等式的其中一组解(X1, X2...) +// 1 <= n、m <= 5 * 10^3 +// -10^4 <= Ci <= +10^4 // 测试链接 : https://www.luogu.com.cn/problem/P5960 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class142/Code02_KsFarm.java b/src/class142/Code02_KsFarm.java index 3807287cb..e0572792f 100644 --- a/src/class142/Code02_KsFarm.java +++ b/src/class142/Code02_KsFarm.java @@ -1,6 +1,13 @@ package class142; // 小K的农场 +// 一共有n个农场,编号1~n,给定m条关系,每条关系是如下三种形式中的一种 +// 形式 1 a b c : 表示农场a比农场b至少多种植了c个作物 +// 形式 2 a b c : 表示农场a比农场b至多多种植了c个作物 +// 形式 3 a b : 表示农场a和农场b种植了一样多的作物 +// 如果关系之间能推出矛盾,打印"No",不存在矛盾,打印"Yes" +// 1 <= n、m <= 5 * 10^3 +// 1 <= c <= 5 * 10^3 // 测试链接 : https://www.luogu.com.cn/problem/P1993 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class142/Code03_Wormholes.java b/src/class142/Code03_Wormholes.java index 1ddbfc907..fa8bceca8 100644 --- a/src/class142/Code03_Wormholes.java +++ b/src/class142/Code03_Wormholes.java @@ -1,6 +1,15 @@ package class142; // 虫洞 +// 农田有n块,编号1~n,有m1条路,m2个虫洞,路是无向的,虫洞是有向的 +// 每条边的信息为: u v w,表示从u走到v,用时w秒 +// 每个虫洞信息为: u v w,表示从u走到v,用时-w秒 +// 你在某个时刻,从某点出发最终回到该点,时间上还想回到出发时刻之前 +// 返回能不能做到这一点,能做到打印"Yes",不能做到打印"No" +// 1 <= n <= 500 +// 1 <= m1 <= 2500 +// 1 <= m2 <= 500 +// 1 <= p <= 10^4 // 测试链接 : https://www.luogu.com.cn/problem/P2850 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class142/Code04_CowLayout.java b/src/class142/Code04_LayoutCow.java similarity index 81% rename from src/class142/Code04_CowLayout.java rename to src/class142/Code04_LayoutCow.java index 891e63a25..9237f7116 100644 --- a/src/class142/Code04_CowLayout.java +++ b/src/class142/Code04_LayoutCow.java @@ -1,6 +1,14 @@ package class142; -// 奶牛布局 +// 布局奶牛 +// 一共有n只奶牛,编号1~n,有m1条好友信息,有m2条情敌信息 +// 所有奶牛需要排队,但是好友之间希望距离更近,情敌之间希望距离更远 +// 每条好友信息为 : u v w,表示u和v是好友,希望相隔的距离 <= w +// 每条好友信息为 : u v w,表示u和v是情敌,希望相隔的距离 >= w +// 你需要安排奶牛的布局,满足所有的好友信息和情敌信息 +// 如果不存在合法方案,返回-1 +// 如果存在合法方案,但是1号奶牛和n号奶牛相隔无穷远,返回-2 +// 否则,返回1号奶牛和n号奶牛之间的最大距离 // 测试链接 : https://www.luogu.com.cn/problem/P4878 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -12,7 +20,7 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class Code04_CowLayout { +public class Code04_LayoutCow { public static int MAXN = 1001; diff --git a/src/class142/Code05_Balance.java b/src/class142/Code05_Balance.java index 399dea2d0..306e8257b 100644 --- a/src/class142/Code05_Balance.java +++ b/src/class142/Code05_Balance.java @@ -1,6 +1,18 @@ package class142; // 天平 +// 一共有n个砝码,编号1~n,每个砝码的重量均为1克,或者2克,或者3克 +// 砝码与砝码之间的关系是一个n * n的二维数组s +// s[i][j] == '+',表示砝码i比砝码j重 +// s[i][j] == '-',表示砝码i比砝码j轻 +// s[i][j] == '=',表示砝码i和砝码j重量一样 +// s[i][j] == '?',表示砝码i和砝码j关系未知 +// 数据保证至少存在一种情况符合该矩阵 +// 给定编号为a和b的砝码,这两个砝码一定会放在天平的左边,你要另选两个砝码放在天平右边 +// 返回有多少种方法可以让天平左边重(ans1) +// 返回有多少种方法可以让天平一样重(ans2) +// 返回有多少种方法可以让天平右边重(ans3) +// 1 <= n <= 50 // 测试链接 : https://www.luogu.com.cn/problem/P2474 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class142/Code06_DoubleKillMeasurer.java b/src/class142/Code06_DoubleKillMeasurer.java index ebdc4f81b..5088c303a 100644 --- a/src/class142/Code06_DoubleKillMeasurer.java +++ b/src/class142/Code06_DoubleKillMeasurer.java @@ -1,6 +1,21 @@ package class142; // 倍杀测量者 +// 如果选手A的分数 不小于 选手B的分数的k倍(k是非负实数) +// 我们就称选手A k倍杀 选手B,也可以称选手B被选手A k倍杀 +// 一共有n个选手,编号1~n,有m1条誓言,有m2条真实得分 +// 每条誓言的形式为两种,具体为 +// 誓言 1 u v k : 选手u如果没有 k倍杀 选手v,选手u就穿女装 +// 誓言 2 u v k : 选手u如果被选手v k倍杀,选手u就穿女装 +// 真实得分的形式为 u w : 选手u得了w分 +// 这种誓言太过残酷,你不想看到很多人比赛后穿女装,于是想规定一个非负实数ans,效果如下 +// 对于 誓言 1 u v k : 选手u如果没有 (k-ans)倍杀 选手v,选手u才用穿女装 +// 对于 誓言 2 u v k : 选手u如果被选手v (k+ans)倍杀,选手u才用穿女装 +// 相当于ans提高了穿女装的条件,但是你也不想看到完全没女装出现的情况 +// 请问ans最大到多少,能保证比赛后一定有人穿女装,精度到小数点后5位即可 +// 1 <= n, m1, m2 <= 1000 +// 1 <= k <= 10 +// 1 <= w <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P4926 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 From fad3fc11899639500cddae232598bb6a63f4bd54 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 4 Sep 2024 15:50:53 +0800 Subject: [PATCH 0100/2029] modify code --- src/class142/Code02_KsFarm.java | 6 +++--- src/class142/Code05_Balance.java | 10 +++------- src/class142/Code06_DoubleKillMeasurer.java | 4 +--- 3 files changed, 7 insertions(+), 13 deletions(-) diff --git a/src/class142/Code02_KsFarm.java b/src/class142/Code02_KsFarm.java index e0572792f..5b2b7e80c 100644 --- a/src/class142/Code02_KsFarm.java +++ b/src/class142/Code02_KsFarm.java @@ -2,9 +2,9 @@ // 小K的农场 // 一共有n个农场,编号1~n,给定m条关系,每条关系是如下三种形式中的一种 -// 形式 1 a b c : 表示农场a比农场b至少多种植了c个作物 -// 形式 2 a b c : 表示农场a比农场b至多多种植了c个作物 -// 形式 3 a b : 表示农场a和农场b种植了一样多的作物 +// 关系 1 a b c : 表示农场a比农场b至少多种植了c个作物 +// 关系 2 a b c : 表示农场a比农场b至多多种植了c个作物 +// 关系 3 a b : 表示农场a和农场b种植了一样多的作物 // 如果关系之间能推出矛盾,打印"No",不存在矛盾,打印"Yes" // 1 <= n、m <= 5 * 10^3 // 1 <= c <= 5 * 10^3 diff --git a/src/class142/Code05_Balance.java b/src/class142/Code05_Balance.java index 306e8257b..6b33d7593 100644 --- a/src/class142/Code05_Balance.java +++ b/src/class142/Code05_Balance.java @@ -3,15 +3,11 @@ // 天平 // 一共有n个砝码,编号1~n,每个砝码的重量均为1克,或者2克,或者3克 // 砝码与砝码之间的关系是一个n * n的二维数组s -// s[i][j] == '+',表示砝码i比砝码j重 -// s[i][j] == '-',表示砝码i比砝码j轻 -// s[i][j] == '=',表示砝码i和砝码j重量一样 -// s[i][j] == '?',表示砝码i和砝码j关系未知 +// s[i][j] == '+',表示砝码i比砝码j重 s[i][j] == '-',表示砝码i比砝码j轻 +// s[i][j] == '=',表示砝码i和砝码j重量一样 s[i][j] == '?',表示砝码i和砝码j关系未知 // 数据保证至少存在一种情况符合该矩阵 // 给定编号为a和b的砝码,这两个砝码一定会放在天平的左边,你要另选两个砝码放在天平右边 -// 返回有多少种方法可以让天平左边重(ans1) -// 返回有多少种方法可以让天平一样重(ans2) -// 返回有多少种方法可以让天平右边重(ans3) +// 返回有多少种方法可以让天平左边重(ans1),可以让天平一样重(ans2),可以让天平右边重(ans3) // 1 <= n <= 50 // 测试链接 : https://www.luogu.com.cn/problem/P2474 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class142/Code06_DoubleKillMeasurer.java b/src/class142/Code06_DoubleKillMeasurer.java index 5088c303a..8a99ce658 100644 --- a/src/class142/Code06_DoubleKillMeasurer.java +++ b/src/class142/Code06_DoubleKillMeasurer.java @@ -13,9 +13,7 @@ // 对于 誓言 2 u v k : 选手u如果被选手v (k+ans)倍杀,选手u才用穿女装 // 相当于ans提高了穿女装的条件,但是你也不想看到完全没女装出现的情况 // 请问ans最大到多少,能保证比赛后一定有人穿女装,精度到小数点后5位即可 -// 1 <= n, m1, m2 <= 1000 -// 1 <= k <= 10 -// 1 <= w <= 10^9 +// 1 <= n, m1, m2 <= 1000 1 <= k <= 10 1 <= w <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P4926 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 From fd73e83ff9d78e83bee42986ab8d04260b16694b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 4 Sep 2024 16:07:13 +0800 Subject: [PATCH 0101/2029] modify code --- src/class142/Code06_DoubleKillMeasurer.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/class142/Code06_DoubleKillMeasurer.java b/src/class142/Code06_DoubleKillMeasurer.java index 8a99ce658..5088c303a 100644 --- a/src/class142/Code06_DoubleKillMeasurer.java +++ b/src/class142/Code06_DoubleKillMeasurer.java @@ -13,7 +13,9 @@ // 对于 誓言 2 u v k : 选手u如果被选手v (k+ans)倍杀,选手u才用穿女装 // 相当于ans提高了穿女装的条件,但是你也不想看到完全没女装出现的情况 // 请问ans最大到多少,能保证比赛后一定有人穿女装,精度到小数点后5位即可 -// 1 <= n, m1, m2 <= 1000 1 <= k <= 10 1 <= w <= 10^9 +// 1 <= n, m1, m2 <= 1000 +// 1 <= k <= 10 +// 1 <= w <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P4926 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 From 34d87ed6a5d62516e854a559fcb207937e9da9b2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 4 Sep 2024 17:53:46 +0800 Subject: [PATCH 0102/2029] modify code --- src/class142/Code06_DoubleKillMeasurer.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/class142/Code06_DoubleKillMeasurer.java b/src/class142/Code06_DoubleKillMeasurer.java index 5088c303a..b5cee675f 100644 --- a/src/class142/Code06_DoubleKillMeasurer.java +++ b/src/class142/Code06_DoubleKillMeasurer.java @@ -1,18 +1,18 @@ package class142; // 倍杀测量者 -// 如果选手A的分数 不小于 选手B的分数的k倍(k是非负实数) +// 如果选手A的分数 不小于 选手B的分数的k倍,k是非负实数 // 我们就称选手A k倍杀 选手B,也可以称选手B被选手A k倍杀 -// 一共有n个选手,编号1~n,有m1条誓言,有m2条真实得分 -// 每条誓言的形式为两种,具体为 -// 誓言 1 u v k : 选手u如果没有 k倍杀 选手v,选手u就穿女装 -// 誓言 2 u v k : 选手u如果被选手v k倍杀,选手u就穿女装 -// 真实得分的形式为 u w : 选手u得了w分 -// 这种誓言太过残酷,你不想看到很多人比赛后穿女装,于是想规定一个非负实数ans,效果如下 -// 对于 誓言 1 u v k : 选手u如果没有 (k-ans)倍杀 选手v,选手u才用穿女装 -// 对于 誓言 2 u v k : 选手u如果被选手v (k+ans)倍杀,选手u才用穿女装 +// 一共有n个选手,编号1~n,有m1条誓言记录,有m2条得分记录 +// 誓言记录 1 u v k : 选手u如果没有 k倍杀 选手v,选手u就穿女装 +// 誓言记录 2 u v k : 选手u如果被选手v k倍杀,选手u就穿女装 +// 得分记录 u w : 选手u得了w分,如果某选手没有得分记录,按照尽量不穿女装的情况确定其得分 +// 这种誓言太过残酷,你不想看到很多人比赛后穿女装,于是想规定非负实数ans,效果如下 +// 誓言记录 1 u v k : 选手u如果没有 (k-ans)倍杀 选手v,选手u才用穿女装 +// 誓言记录 1 u v k : 选手u如果被选手v (k+ans)倍杀,选手u才用穿女装 // 相当于ans提高了穿女装的条件,但是你也不想看到完全没女装出现的情况 // 请问ans最大到多少,能保证比赛后一定有人穿女装,精度到小数点后5位即可 +// 如果在你不干预的情况下,本来也没有人穿女装,那么返回-1 // 1 <= n, m1, m2 <= 1000 // 1 <= k <= 10 // 1 <= w <= 10^9 From 22b7665212ec6bb74c522279768469c63e644ea2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 4 Sep 2024 17:55:30 +0800 Subject: [PATCH 0103/2029] modify code --- src/class142/Code06_DoubleKillMeasurer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class142/Code06_DoubleKillMeasurer.java b/src/class142/Code06_DoubleKillMeasurer.java index b5cee675f..e8d1a1218 100644 --- a/src/class142/Code06_DoubleKillMeasurer.java +++ b/src/class142/Code06_DoubleKillMeasurer.java @@ -11,7 +11,7 @@ // 誓言记录 1 u v k : 选手u如果没有 (k-ans)倍杀 选手v,选手u才用穿女装 // 誓言记录 1 u v k : 选手u如果被选手v (k+ans)倍杀,选手u才用穿女装 // 相当于ans提高了穿女装的条件,但是你也不想看到完全没女装出现的情况 -// 请问ans最大到多少,能保证比赛后一定有人穿女装,精度到小数点后5位即可 +// 请问ans最大到多少,能保证比赛后一定有人穿女装,精度到小数点后4位即可 // 如果在你不干预的情况下,本来也没有人穿女装,那么返回-1 // 1 <= n, m1, m2 <= 1000 // 1 <= k <= 10 From c08e2e8cffa60870809166453abbd306cc9a4f3e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 5 Sep 2024 13:56:22 +0800 Subject: [PATCH 0104/2029] modify code --- ...4_LayoutCow.java => Code03_LayoutCow.java} | 2 +- src/class142/Code03_Wormholes.java | 145 ------------------ ...ode05_Balance.java => Code04_Balance.java} | 2 +- ...er.java => Code05_DoubleKillMeasurer.java} | 2 +- 4 files changed, 3 insertions(+), 148 deletions(-) rename src/class142/{Code04_LayoutCow.java => Code03_LayoutCow.java} (99%) delete mode 100644 src/class142/Code03_Wormholes.java rename src/class142/{Code05_Balance.java => Code04_Balance.java} (99%) rename src/class142/{Code06_DoubleKillMeasurer.java => Code05_DoubleKillMeasurer.java} (99%) diff --git a/src/class142/Code04_LayoutCow.java b/src/class142/Code03_LayoutCow.java similarity index 99% rename from src/class142/Code04_LayoutCow.java rename to src/class142/Code03_LayoutCow.java index 9237f7116..5988c0fc4 100644 --- a/src/class142/Code04_LayoutCow.java +++ b/src/class142/Code03_LayoutCow.java @@ -20,7 +20,7 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class Code04_LayoutCow { +public class Code03_LayoutCow { public static int MAXN = 1001; diff --git a/src/class142/Code03_Wormholes.java b/src/class142/Code03_Wormholes.java deleted file mode 100644 index fa8bceca8..000000000 --- a/src/class142/Code03_Wormholes.java +++ /dev/null @@ -1,145 +0,0 @@ -package class142; - -// 虫洞 -// 农田有n块,编号1~n,有m1条路,m2个虫洞,路是无向的,虫洞是有向的 -// 每条边的信息为: u v w,表示从u走到v,用时w秒 -// 每个虫洞信息为: u v w,表示从u走到v,用时-w秒 -// 你在某个时刻,从某点出发最终回到该点,时间上还想回到出发时刻之前 -// 返回能不能做到这一点,能做到打印"Yes",不能做到打印"No" -// 1 <= n <= 500 -// 1 <= m1 <= 2500 -// 1 <= m2 <= 500 -// 1 <= p <= 10^4 -// 测试链接 : https://www.luogu.com.cn/problem/P2850 -// 提交以下的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_Wormholes { - - public static int MAXN = 501; - - public static int MAXM = 10001; - - // 链式前向星需要 - public static int[] head = new int[MAXN]; - - public static int[] next = new int[MAXM]; - - public static int[] to = new int[MAXM]; - - public static int[] weight = new int[MAXM]; - - public static int cnt; - - // spfa需要 - public static int[] dist = new int[MAXN]; - - public static int[] update = new int[MAXN]; - - public static int MAXQ = 300001; - - public static int[] queue = new int[MAXQ]; - - public static int h, t; - - public static boolean[] enter = new boolean[MAXN]; - - public static int n, m1, m2; - - public static void prepare() { - cnt = 1; - h = t = 0; - Arrays.fill(head, 0, n + 1, 0); - Arrays.fill(dist, 0, n + 1, Integer.MAX_VALUE); - Arrays.fill(update, 0, n + 1, 0); - Arrays.fill(enter, 0, n + 1, false); - } - - public static void addEdge(int u, int v, int w) { - next[cnt] = head[u]; - to[cnt] = v; - weight[cnt] = w; - head[u] = cnt++; - } - - public static boolean spfa(int s) { - dist[s] = 0; - update[s] = 1; - queue[t++] = s; - enter[s] = true; - while (h < t) { - int u = queue[h++]; - enter[u] = false; - for (int ei = head[u], v, w; ei > 0; ei = next[ei]) { - v = to[ei]; - w = weight[ei]; - if (dist[v] > dist[u] + w) { - dist[v] = dist[u] + w; - if (!enter[v]) { - if (++update[v] > n) { - return true; - } - queue[t++] = v; - enter[v] = true; - } - } - } - } - return false; - } - - 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(); - int cases = (int) in.nval; - for (int t = 1; t <= cases; t++) { - in.nextToken(); - n = (int) in.nval; - in.nextToken(); - m1 = (int) in.nval; - in.nextToken(); - m2 = (int) in.nval; - prepare(); - for (int i = 1, u, v, w; i <= m1; i++) { - in.nextToken(); - u = (int) in.nval; - in.nextToken(); - v = (int) in.nval; - in.nextToken(); - w = (int) in.nval; - addEdge(u, v, w); - addEdge(v, u, w); - } - for (int i = 1, u, v, w; i <= m2; i++) { - in.nextToken(); - u = (int) in.nval; - in.nextToken(); - v = (int) in.nval; - in.nextToken(); - w = (int) in.nval; - addEdge(u, v, -w); - } - for (int i = 1; i <= n; i++) { - addEdge(0, i, 0); - } - if (spfa(0)) { - out.println("YES"); - } else { - out.println("NO"); - } - } - out.flush(); - out.close(); - br.close(); - } - -} diff --git a/src/class142/Code05_Balance.java b/src/class142/Code04_Balance.java similarity index 99% rename from src/class142/Code05_Balance.java rename to src/class142/Code04_Balance.java index 6b33d7593..3c79fd4fe 100644 --- a/src/class142/Code05_Balance.java +++ b/src/class142/Code04_Balance.java @@ -18,7 +18,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code05_Balance { +public class Code04_Balance { public static int MAXN = 51; diff --git a/src/class142/Code06_DoubleKillMeasurer.java b/src/class142/Code05_DoubleKillMeasurer.java similarity index 99% rename from src/class142/Code06_DoubleKillMeasurer.java rename to src/class142/Code05_DoubleKillMeasurer.java index e8d1a1218..229689edd 100644 --- a/src/class142/Code06_DoubleKillMeasurer.java +++ b/src/class142/Code05_DoubleKillMeasurer.java @@ -27,7 +27,7 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class Code06_DoubleKillMeasurer { +public class Code05_DoubleKillMeasurer { public static int MAXN = 1001; From f849e2485bb00caeea22c22e40c011b62a36b952 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 5 Sep 2024 16:28:07 +0800 Subject: [PATCH 0105/2029] modify code --- src/class142/Code05_DoubleKillMeasurer.java | 153 ++++++++++---------- 1 file changed, 78 insertions(+), 75 deletions(-) diff --git a/src/class142/Code05_DoubleKillMeasurer.java b/src/class142/Code05_DoubleKillMeasurer.java index 229689edd..63295f50c 100644 --- a/src/class142/Code05_DoubleKillMeasurer.java +++ b/src/class142/Code05_DoubleKillMeasurer.java @@ -1,20 +1,15 @@ package class142; // 倍杀测量者 -// 如果选手A的分数 不小于 选手B的分数的k倍,k是非负实数 -// 我们就称选手A k倍杀 选手B,也可以称选手B被选手A k倍杀 -// 一共有n个选手,编号1~n,有m1条誓言记录,有m2条得分记录 -// 誓言记录 1 u v k : 选手u如果没有 k倍杀 选手v,选手u就穿女装 -// 誓言记录 2 u v k : 选手u如果被选手v k倍杀,选手u就穿女装 -// 得分记录 u w : 选手u得了w分,如果某选手没有得分记录,按照尽量不穿女装的情况确定其得分 -// 这种誓言太过残酷,你不想看到很多人比赛后穿女装,于是想规定非负实数ans,效果如下 -// 誓言记录 1 u v k : 选手u如果没有 (k-ans)倍杀 选手v,选手u才用穿女装 -// 誓言记录 1 u v k : 选手u如果被选手v (k+ans)倍杀,选手u才用穿女装 -// 相当于ans提高了穿女装的条件,但是你也不想看到完全没女装出现的情况 -// 请问ans最大到多少,能保证比赛后一定有人穿女装,精度到小数点后4位即可 -// 如果在你不干预的情况下,本来也没有人穿女装,那么返回-1 +// 如果 A的分数 >= B的分数 * k,k是正实数,就称 A k倍杀 B,或称 B被A k倍杀了 +// 一场比赛中,一共有n个选手,有m1条誓言记录,有m2条得分记录 +// 誓言记录 1 u v k : 选手u 没有k倍杀 选手v,那么选手u就穿女装 +// 誓言记录 2 u v k : 选手u 被选手v k倍杀了,那么选手u就穿女装 +// 得分记录 u w : 选手u得了w分,如果某选手没有得分记录,按照尽量不穿女装的情况推测得分 +// 你希望看到比赛后有人穿女装,但不想看到很多人穿女装,于是想制定正实数ans,效果如下 +// 对于所有誓言1,倍杀比例调整成(k-ans),对于所有誓言2,倍杀比例调整成(k+ans) +// 相当于提高了穿女装的条件。计算ans最大多少,保留小数点后4位,如果不用干预也没人穿女装,返回-1 // 1 <= n, m1, m2 <= 1000 -// 1 <= k <= 10 // 1 <= w <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P4926 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -29,14 +24,22 @@ public class Code05_DoubleKillMeasurer { - public static int MAXN = 1001; + public static int MAXN = 1002; - public static int MAXM = 5001; + public static int MAXM = 3001; - public static int MAXK = 10; + public static double INF = 1e10; public static double sml = 1e-6; + public static int n, m1, m2; + + // 誓言记录(op, u, v, k) + public static int[][] vow = new int[MAXN][4]; + + // 得分记录(u, w) + public static int[][] score = new int[MAXN][2]; + // 链式前向星需要 public static int[] head = new int[MAXN]; @@ -44,12 +47,8 @@ public class Code05_DoubleKillMeasurer { public static int[] to = new int[MAXM]; - public static int[] op = new int[MAXM]; - public static double[] weight = new double[MAXM]; - public static double[] ktimes = new double[MAXM]; - public static int cnt; // spfa需要 @@ -65,27 +64,62 @@ public class Code05_DoubleKillMeasurer { public static boolean[] enter = new boolean[MAXN]; - public static int n, m1, m2; - public static void prepare() { cnt = 1; - Arrays.fill(head, 0, n + 1, 0); + h = t = 0; + Arrays.fill(head, 0, n + 2, 0); + Arrays.fill(dist, 0, n + 2, INF); + Arrays.fill(update, 0, n + 2, 0); + Arrays.fill(enter, 0, n + 2, false); } - public static void addEdge(int u, int v, int o, double w, double k) { + public static void addEdge(int u, int v, double w) { next[cnt] = head[u]; to[cnt] = v; - op[cnt] = o; weight[cnt] = w; - ktimes[cnt] = k; head[u] = cnt++; } - public static boolean spfa(int s, double limit) { - h = t = 0; - Arrays.fill(dist, 0, n + 1, -1e9); - Arrays.fill(update, 0, n + 1, 0); - Arrays.fill(enter, 0, n + 1, false); + public static double compute() { + double l = 0, r = INF, m, ans = 0; + while (r - l >= sml) { + m = (l + r) / 2; + if (check(m)) { + ans = m; + l = m + sml; + } else { + r = m - sml; + } + } + return ans; + } + + public static boolean check(double limit) { + prepare(); + // 0号点做其中一个超级源点,保证图的联通性 + for (int i = 1; i <= n; i++) { + addEdge(0, i, 0); + } + // 倍杀关系的边 + 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])); + } else { + addEdge(vow[i][1], vow[i][2], Math.log(limit + vow[i][3])); + } + } + // n+1号点做另一个超级源点,保证确定得分的选手之间的关系 + // 0号点和n+1号点,一定要是两个分开的点,不然会误判 + // 虽然本题不会出错,但是一定要分开 + // 课上进行了重点说明 + for (int i = 1; i <= m2; i++) { + addEdge(n + 1, score[i][0], Math.log(score[i][1])); + addEdge(score[i][0], n + 1, -Math.log(score[i][1])); + } + return spfa(0); + } + + public static boolean spfa(int s) { dist[s] = 0; update[s] = 1; queue[t++] = s; @@ -93,24 +127,14 @@ public static boolean spfa(int s, double limit) { while (h < t) { int u = queue[h++]; enter[u] = false; - int v, o; - double w, k; for (int ei = head[u]; ei > 0; ei = next[ei]) { - v = to[ei]; - o = op[ei]; - k = ktimes[ei]; - if (o == 1) { - w = Math.log(k - limit); - } else if (o == 2) { - w = -Math.log(k + limit); - } else { - w = weight[ei]; - } - // 注意这里是变大才更新,是否能发现无限增加的环,与是否发现负环,本质是一样的 - if (dist[v] < dist[u] + w) { + int v = to[ei]; + double w = weight[ei]; + if (dist[v] > dist[u] + w) { dist[v] = dist[u] + w; if (!enter[v]) { - if (++update[v] > n) { + // 0...n+1号点,一共n+2个点,所以这里判断 > n + 1 + if (++update[v] > n + 1) { return true; } queue[t++] = v; @@ -122,20 +146,6 @@ public static boolean spfa(int s, double limit) { return false; } - public static double compute() { - double ans = 0, l = 0, r = MAXK, mid; - while (r - l >= sml) { - mid = (l + r) / 2; - if (spfa(0, mid)) { - ans = mid; - l = mid + sml; - } else { - r = mid - sml; - } - } - return ans; - } - public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StreamTokenizer in = new StreamTokenizer(br); @@ -146,28 +156,21 @@ public static void main(String[] args) throws IOException { m1 = (int) in.nval; in.nextToken(); m2 = (int) in.nval; - prepare(); - for (int i = 1, op, u, v, k; i <= m1; i++) { + for (int i = 1; i <= m1; i++) { in.nextToken(); - op = (int) in.nval; + vow[i][0] = (int) in.nval; in.nextToken(); - u = (int) in.nval; + vow[i][1] = (int) in.nval; in.nextToken(); - v = (int) in.nval; + vow[i][2] = (int) in.nval; in.nextToken(); - k = (int) in.nval; - addEdge(v, u, op, 0, k); + vow[i][3] = (int) in.nval; } - for (int i = 1, u, w; i <= m2; i++) { + for (int i = 1; i <= m2; i++) { in.nextToken(); - u = (int) in.nval; + score[i][0] = (int) in.nval; in.nextToken(); - w = (int) in.nval; - addEdge(0, u, 0, Math.log(w), 0); - addEdge(u, 0, 0, -Math.log(w), 0); - } - for (int i = 1; i <= n; i++) { - addEdge(0, i, 0, 0, 0); + score[i][1] = (int) in.nval; } double ans = compute(); if (ans == 0) { From 8548e024acad7617f6d1c080aa6dbd179568aa2a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 5 Sep 2024 16:45:30 +0800 Subject: [PATCH 0106/2029] modify code --- src/class142/Code05_DoubleKillMeasurer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class142/Code05_DoubleKillMeasurer.java b/src/class142/Code05_DoubleKillMeasurer.java index 63295f50c..af0bf3798 100644 --- a/src/class142/Code05_DoubleKillMeasurer.java +++ b/src/class142/Code05_DoubleKillMeasurer.java @@ -10,6 +10,7 @@ // 对于所有誓言1,倍杀比例调整成(k-ans),对于所有誓言2,倍杀比例调整成(k+ans) // 相当于提高了穿女装的条件。计算ans最大多少,保留小数点后4位,如果不用干预也没人穿女装,返回-1 // 1 <= n, m1, m2 <= 1000 +// 1 <= k <= 10 // 1 <= w <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P4926 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -110,8 +111,7 @@ public static boolean check(double limit) { } // n+1号点做另一个超级源点,保证确定得分的选手之间的关系 // 0号点和n+1号点,一定要是两个分开的点,不然会误判 - // 虽然本题不会出错,但是一定要分开 - // 课上进行了重点说明 + // 虽然本题不会出错,但是一定要分开,课上进行了重点说明 for (int i = 1; i <= m2; i++) { addEdge(n + 1, score[i][0], Math.log(score[i][1])); addEdge(score[i][0], n + 1, -Math.log(score[i][1])); From 117894e06f5a9a3cb1aea78e08d174b98a633bd9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 5 Sep 2024 16:50:02 +0800 Subject: [PATCH 0107/2029] modify code --- src/class142/Code02_KsFarm.java | 2 +- src/class142/Code04_Balance.java | 36 ++++++++++++++++---------------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/class142/Code02_KsFarm.java b/src/class142/Code02_KsFarm.java index 5b2b7e80c..712fba514 100644 --- a/src/class142/Code02_KsFarm.java +++ b/src/class142/Code02_KsFarm.java @@ -1,6 +1,6 @@ package class142; -// 小K的农场 +// 小k的农场 // 一共有n个农场,编号1~n,给定m条关系,每条关系是如下三种形式中的一种 // 关系 1 a b c : 表示农场a比农场b至少多种植了c个作物 // 关系 2 a b c : 表示农场a比农场b至多多种植了c个作物 diff --git a/src/class142/Code04_Balance.java b/src/class142/Code04_Balance.java index 3c79fd4fe..4cabb9628 100644 --- a/src/class142/Code04_Balance.java +++ b/src/class142/Code04_Balance.java @@ -3,8 +3,8 @@ // 天平 // 一共有n个砝码,编号1~n,每个砝码的重量均为1克,或者2克,或者3克 // 砝码与砝码之间的关系是一个n * n的二维数组s -// s[i][j] == '+',表示砝码i比砝码j重 s[i][j] == '-',表示砝码i比砝码j轻 -// s[i][j] == '=',表示砝码i和砝码j重量一样 s[i][j] == '?',表示砝码i和砝码j关系未知 +// s[i][j] == '+',砝码i比砝码j重 s[i][j] == '-',砝码i比砝码j轻 +// s[i][j] == '=',砝码i和砝码j重量一样 s[i][j] == '?',砝码i和砝码j关系未知 // 数据保证至少存在一种情况符合该矩阵 // 给定编号为a和b的砝码,这两个砝码一定会放在天平的左边,你要另选两个砝码放在天平右边 // 返回有多少种方法可以让天平左边重(ans1),可以让天平一样重(ans2),可以让天平右边重(ans3) @@ -33,6 +33,22 @@ public class Code04_Balance { public static int ans1, ans2, ans3; public static void compute() { + for (int i = 1; i <= n; i++) { + for (int j = 1; j <= n; j++) { + if (s[i][j] == '=') { + dmax[i][j] = dmin[i][j] = 0; + } else if (s[i][j] == '+') { + dmax[i][j] = 2; + dmin[i][j] = 1; + } else if (s[i][j] == '-') { + dmax[i][j] = -1; + dmin[i][j] = -2; + } else { + dmax[i][j] = 2; + dmin[i][j] = -2; + } + } + } for (int i = 1; i <= n; i++) { dmax[i][i] = dmin[i][i] = 0; } @@ -79,22 +95,6 @@ public static void main(String[] args) throws IOException { s[i][j] = line[j - 1]; } } - for (int i = 1; i <= n; i++) { - for (int j = 1; j <= n; j++) { - if (s[i][j] == '=') { - dmax[i][j] = dmin[i][j] = 0; - } else if (s[i][j] == '+') { - dmax[i][j] = 2; - dmin[i][j] = 1; - } else if (s[i][j] == '-') { - dmax[i][j] = -1; - dmin[i][j] = -2; - } else { - dmax[i][j] = 2; - dmin[i][j] = -2; - } - } - } compute(); out.println(ans1 + " " + ans2 + " " + ans3); out.flush(); From 8886eea5b82c3cdea7173eb21d71cd5037c4c9c5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 5 Sep 2024 21:11:14 +0800 Subject: [PATCH 0108/2029] modify code --- src/class142/Code05_DoubleKillMeasurer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class142/Code05_DoubleKillMeasurer.java b/src/class142/Code05_DoubleKillMeasurer.java index af0bf3798..d4388923b 100644 --- a/src/class142/Code05_DoubleKillMeasurer.java +++ b/src/class142/Code05_DoubleKillMeasurer.java @@ -2,7 +2,7 @@ // 倍杀测量者 // 如果 A的分数 >= B的分数 * k,k是正实数,就称 A k倍杀 B,或称 B被A k倍杀了 -// 一场比赛中,一共有n个选手,有m1条誓言记录,有m2条得分记录 +// 一场比赛中,一共有n个选手,有m1条誓言记录,有m2条得分记录,得分只可能是正实数 // 誓言记录 1 u v k : 选手u 没有k倍杀 选手v,那么选手u就穿女装 // 誓言记录 2 u v k : 选手u 被选手v k倍杀了,那么选手u就穿女装 // 得分记录 u w : 选手u得了w分,如果某选手没有得分记录,按照尽量不穿女装的情况推测得分 From e311e49b77efa5d447792ba253e442b5e27ff64b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 5 Sep 2024 21:13:09 +0800 Subject: [PATCH 0109/2029] modify code --- src/class142/Code05_DoubleKillMeasurer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class142/Code05_DoubleKillMeasurer.java b/src/class142/Code05_DoubleKillMeasurer.java index d4388923b..d972f5084 100644 --- a/src/class142/Code05_DoubleKillMeasurer.java +++ b/src/class142/Code05_DoubleKillMeasurer.java @@ -8,7 +8,7 @@ // 得分记录 u w : 选手u得了w分,如果某选手没有得分记录,按照尽量不穿女装的情况推测得分 // 你希望看到比赛后有人穿女装,但不想看到很多人穿女装,于是想制定正实数ans,效果如下 // 对于所有誓言1,倍杀比例调整成(k-ans),对于所有誓言2,倍杀比例调整成(k+ans) -// 相当于提高了穿女装的条件。计算ans最大多少,保留小数点后4位,如果不用干预也没人穿女装,返回-1 +// 相当于提高了穿女装的条件。计算ans最大多少,保留小数点后4位,如果不干预也没人穿女装,返回-1 // 1 <= n, m1, m2 <= 1000 // 1 <= k <= 10 // 1 <= w <= 10^9 From ccf071256069baf04a4edea828d449e60878033a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 6 Sep 2024 10:45:17 +0800 Subject: [PATCH 0110/2029] modify code --- src/class142/Code04_Balance.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/class142/Code04_Balance.java b/src/class142/Code04_Balance.java index 4cabb9628..fbf39955f 100644 --- a/src/class142/Code04_Balance.java +++ b/src/class142/Code04_Balance.java @@ -63,17 +63,17 @@ public static void compute() { } ans1 = ans2 = ans3 = 0; for (int i = 1; i <= n; i++) { - for (int j = i + 1; j <= n; j++) { + for (int j = 1; j < i; j++) { if (i != a && i != b && j != a && j != b) { - if (dmin[a][i] + dmin[b][j] > 0 || dmin[a][j] + dmin[b][i] > 0) { + if (dmin[a][i] > dmax[j][b] || dmin[a][j] > dmax[i][b]) { ans1++; } - if (dmax[a][i] + dmax[b][j] < 0 || dmax[a][j] + dmax[b][i] < 0) { + if (dmax[a][i] < dmin[j][b] || dmax[a][j] < dmin[i][b]) { ans3++; } - if (dmin[a][i] == dmax[a][i] && dmin[j][b] == dmax[j][b] && dmin[a][i] + dmin[b][j] == 0) { + if (dmin[a][i] == dmax[a][i] && dmin[j][b] == dmax[j][b] && dmin[a][i] == dmin[j][b]) { ans2++; - } else if (dmin[a][j] == dmax[a][j] && dmin[i][b] == dmax[i][b] && dmin[a][j] + dmin[b][i] == 0) { + } else if (dmin[b][i] == dmax[b][i] && dmin[j][a] == dmax[j][a] && dmin[b][i] == dmin[j][a]) { ans2++; } } From ca6ad2984f7be51f20a0c1816c86dd6d21013ce0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 6 Sep 2024 11:03:58 +0800 Subject: [PATCH 0111/2029] modify code --- ...\347\232\204\351\207\215\345\277\203.pptx" | Bin 45348 -> 45348 bytes ...\347\232\204\347\233\264\345\276\204.pptx" | Bin 47122 -> 47122 bytes ...\344\270\212\345\267\256\345\210\206.pptx" | Bin 49275 -> 49272 bytes ...\242\2306-\346\215\242\346\240\271dp.pptx" | Bin 51016 -> 51016 bytes ...346\200\247\345\237\272-\344\270\213.pptx" | Bin 43989 -> 43987 bytes ...\346\225\260\350\247\204\345\210\222.pptx" | Bin 49785 -> 49786 bytes src/class120/Code03_GreatCowGathering1.java | 2 +- src/class120/Code03_GreatCowGathering2.java | 2 +- src/class121/Code03_BuildPark.java | 8 ++++---- src/class122/Code04_Network.java | 4 ++-- src/class123/Code02_TreePainting.java | 2 +- src/class137/Code04_MaximumXorOfPath1.java | 2 +- src/class137/Code04_MaximumXorOfPath2.java | 2 +- src/class138/Code03_DesertKing.java | 2 +- ...er.java => Code04_DoubleKillMeasurer.java} | 12 ++++++------ ...ode04_Balance.java => Code05_Balance.java} | 2 +- 16 files changed, 19 insertions(+), 19 deletions(-) rename src/class142/{Code05_DoubleKillMeasurer.java => Code04_DoubleKillMeasurer.java} (92%) rename src/class142/{Code04_Balance.java => Code05_Balance.java} (99%) diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243120\343\200\220\346\211\251\345\261\225\343\200\221\346\240\221\344\270\212\351\227\256\351\242\230\344\270\223\351\242\2303-\346\240\221\347\232\204\351\207\215\345\277\203.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243120\343\200\220\346\211\251\345\261\225\343\200\221\346\240\221\344\270\212\351\227\256\351\242\230\344\270\223\351\242\2303-\346\240\221\347\232\204\351\207\215\345\277\203.pptx" index 7f8765319f8d70a691a232d8aad36fe1b1654790..207d0351b0159727cde6b77bac19a1ec72339554 100644 GIT binary patch delta 2873 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 DoM^0M delta 2873 zcmY+Gc|4TcAIHZGW8WesTagi6W#9KgmKaM{Mi^84qSV#MlI}HVF=ef15{3*7Lo>F< za0|E4A{xsiVM3JbMRMJ)(oN5!=J(&{d4E6O<(%`pUgyxp;k0qMl$Sd~P#y+@iNH?Y zD)+CIk`oYI7XVt|6DTy`9p43O0Un6}RS5DN=weL@i$Q8x1P*1cimrjSFJf3>Pz7uv zK(-#aFeJzO67+{s40AP04Nv+S+^14Y4DF}mcqySkx z4VDI42P%Nk*(iYBNd;&8UO;bmAJ{=y?+qMO?+rGrpA3CA(#1hOryY+paUPhRkSBikah9rSS%yyQHdpnf) z(o+~({v^f{TK;;X{;eO&2WQv+wS=!O?^`%c2byjSyPGfM90X0L790((8(1&c9s*%1 z-UsUacPMmftj}Rbpo2LQX$C6b24NNKTo`@q2hsv;tJVkW1VdtH$wHFrr}MxlW_je> zkHiHGa#VrtZ=N(AdEjl*6zJn7XMn!k3D=>YzL07$z+$&NKu?_#S+63lCL;%2C)p4u z4~Bod;c{Db6q#yJjL+3UpKFu$(j4rk@|dQvTu&=40fKs<4^=<2ElM(ij>ZoeOKFbX zJFPpIIIj0`u8M5_%D!x(_}PGTe{h#t;nMu4*sNI0jeLE{Dw_JihDr&&6NfyU$m`Xe>g2VP4GwracwGrZ zs+OrcIvVWGy?t`ACH^#dG1j*Fm!U0(wwRfS8=+l{LM3AFIt`!Nd!oy`&cY?yK~i;? zqq$U+FIf1{>yqw6Tc0B{Vz+~=vQ{_qB#h4wBq3cTo<^m`erlRKEIDysy@G`&(sJ3S z0b{9FV{MDQXv~W(PWjGme$%=HLYGL%@F>|?hR!&UilziyoV-BYE+aRvEkMQ=6)ciQ zNYKdI|3Q#)=aPiu}+#el>eMDpGO&KoVH25q#%VUsNW%?ayAj5`@UJAAv)yK zons=yee9>nWjqg6c`uPsN}kUSjS(3;-q2K4P3eZE|Q7ZY{o0)O{o zd1T5PT65)}0Sz5ixYpEr|yu<$Z;oLbSyZ?{#<#-;=)$;>+*JKi6P4hMWY8{agHCv=XgNUqM`!_RcI}96yw!UEnyz!t-Ev^ z9)F`@7q%9m{bsMF{7SY|9CvPL`}s2crQA5?%Q5!euW<9Jg0YrvA@Sbi3azs4V*6B> zINl|3r#^rWNud0~c}`T$FiR^+vmcvMcaG9h*K!*7)=|oelQg^}goXe6khu9s=*%6% zGlw*CalWZ&l2JQc-U_9WtV%`Kg{w?&S!*m#cGRSxT$UfQ5I(s5n}9zCnW$+iqk_$> z!;$gYo2|asOqt@F_g}v4e?lioW`UG(fyYmUZqpU~CIhnX3IDUTbKYo$aG8i@nh9pIt87IuY}9;)M95{9w=D z^(L9`!WB(o0$YrGB?VSS z0iOGdvm}|X%FCDI=Giz3OKBMwu;k0Bs9fQRbLNYhcoZU6T7mq9&Fc}G-{!c$2wr|) z-Ej2e%7PUMSM)~DE@J-Vr=_K}zzazx?B{n0)j<{Yrlwye6i2#ziGNGAuXdYm!-TaX z_a2L0`%rgq@EzXGXmxsY#eo@ofx3k2hD9_F?Y#e3qmQBY54*JgQNrx7gy@qFUjJJ{ z^h70&5kE_89-x`mj|?y6sQm%U_!`AI8@$}Fcox;`&-=4CpmFrC#@W$?meM;2>Um^FP!qe-$qh>7Bx^W$+V*R_XS1X zbj^?2ybRagC2#QD?cRM8cMf(YQ9-UrS^Dbvrx((h#K7Gv%CBSb1)+z(Tt=I>s~H*l zqAt;{E*`O=+Yqxvk2e1+=DIJ3{-pJ5eD9&WV{+Ijkc;CQiF3e708&25Ws`dTV zK9yG5`HVO}t?GjMJbJ^SOZvgFzTZr7Hu#_sHs?`S&^-d9)?}6wyfSnCjBdn{QQ7Q* zGpt$FDB&}tmDjDs*rCU%4y|h$q#B}Y32LfoE>PQ>=aE1$bfmP8A+6p`%LtUZ)CU&M zamFUN-WUs&MyC4X{^{nPwaQEcrLLl)<~5@<1htxzLP09-w_Y^+{}&4DRi-g?U81rj z_--Z7oaf+8v*Y>`Ay9oRI0;>U|0^>2j)0;fD^QFSS%N}^Y72^Bsw*fMRLC>4A#{rE z!O)3fcThAH`+-8C1WNZWfkIw4m4KEKYcMQu^9O|zZv7-mfE*3-`O<#)lz^rU`k9}G zl|tUqQa-O#8ALtH_-MlhUE!x8bjVAk^La(fA?jMb9~^ptp#-qXZNQI@{4}@%qD2*a zUeQ|+b-Tq!>o({zKgBU1FO~7bdl2m8&V;7QXF_}RkqK?CX{8# D28%ZK diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243121\343\200\220\346\211\251\345\261\225\343\200\221\346\240\221\344\270\212\351\227\256\351\242\230\344\270\223\351\242\2304-\346\240\221\347\232\204\347\233\264\345\276\204.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243121\343\200\220\346\211\251\345\261\225\343\200\221\346\240\221\344\270\212\351\227\256\351\242\230\344\270\223\351\242\2304-\346\240\221\347\232\204\347\233\264\345\276\204.pptx" index 78519deca07ecd4d999f1083215a791f4c642eed..855bd9d95e8eaacefb49d286e4e36dff1212a239 100644 GIT binary patch delta 2975 zcmY+Gc|25Y8^_1k2g6vJkFh4%>YZfGSdxmAWX+mvqe$5zq=spsY?EW;$x9T*I+(FU z#A9DlBPvToAwtMjgtwd%^Zxfc-}`qh_jUhqorF1f!W>lw*H!BQA;|EG~WavJaWiUCwudf26NcL=*;G2_pWi}Yh9kpe8EM>{Im2k^6 zlZycC&wfg1I@K=D%yyAhyEem98??IGn!|PDdRWh3{nErvk?J-r*}? z{aqfoLpkUqGupHe+CCN_QxGti~zi?phv@5KY{8F+j2s6r|hsy zSo;r{b{W9rUHyMd2F82Vn1V;tZeFMDf& z3dr+c15s{3(>9U=Qc4j(zkdgK1Qmn&f?W9vvEF<1emE@(h^}o;uP$)ur_@ZFYL5wJXol z7tdE&br~PxsXwaKY2j^Mao=uZy7z=^la$2jrzpUWk9?~M z+pzDXNvgz6mzqg^asS@E>Wo@e}%?-4Q=jS1n&G|6{0b-B}iGuHw)__WYsm1cBl z_pb=XlBKJNB{fp(p8G`-Va3qxQug{n=-S3i^E;htH!3WDf2LqDd6#@mIKfu}Z}qREokpGb1D%MQsk<1PyiuZ* zTb!MJ=*AfyR#Q9S4q^c;jpBXk>@*DVQ&;5vS{kClW4QojV4WQL5|{Li)}K)XL*hJw zC){2cxH~J|YYR|d?5;DINRaY>X*H2NH14%9Pj2oIlOinWkIZ2WedVxn$AxaaahB=o zZj&8%H_kzClH(s_d{G+pX>$%cEny&VfdmuQo{))~YtGl!tBWN0ZbY=W-Z?L7O&Vq*DKc(S49!I8&Zn=A)ezaVqa z#hIM*dPd4$uhm4?21lP+^A%VVa|oRMq?%u{l&P-T_umgU7edQ_uFCsdv0NP@me#6W zUhP=1e@+-EtP$Dl-=pvwg=O4uX{oK*y>ujViZO|UHNh6gHSEzr)v0S6V^c#7?C|NK zlh0oacfODfzVb5gq1tkigV-0A6Ev?I>a#^AODtL8*wdQjk{a)+8jowfpQY9jhaT7V z_u74ZdbBIU)>qJG>=3r0Z23xP^ge4}1D{F1mNEh^C4IS2cXrH6suDZ;B;1jYv~X5_ zot%}o^4Ys{AZ#d1y@kP=RxU54R(|06b?r`v_*DjKt@2wW%lqD{)m_dTi}q7P`}euq z0?C@H4bm_4-c~KL{SvJ1ejX56=2g?X_;5{NB|La7zWH6}yRRV{Mr_r{Y_dAXh=cgb z!>>bxqJSIw6}!(ndS3qE^?J7c348KQSmIn0E|GT-r|CV>u7$+6ZV0AYxm>3>I6tMP z9d}lE-S+Q0;ul|3ymZiVyUTz^@i&sY@wJjzud8V5H__6iw)Iv@x@WuhtNY}xIRL{S zgQKQtj=dh%N@NzddaNmF=54quH#Q<8)wA@$|G$ z;bEUbU4hT{YQKJIxS9}6Ix+b%q{rzOOZ&*oxk%58L$%j)e_nmKU;M(?p>d4KQFjXc z1&rnG^WeT(jj7jz+C9dJ#RQ2x(;pcM9JsyOlnyI(z-f%PTgIPO|LRfIqi{1>2db&- ziC|TFVDFw?E!2yxC4r%eWrVCzedUAdA~JwIvOY%GG2mJHCp3Ze|9@}jdU0yd5)6u; z1J@7WMTVA@XOalhvhuB9T2>LMZP2nZed-5o$%ZWTt^Ec3%F+gfb~X+aA=!GMc%E$x z3N8xdG5Ra+QuM*2cFHMGh~}IHML-S|UX}wLnHOLH$y^=q*eREZw)~}>dD~PB@XLeB z74J|CAes+lu*=`}Vu1R;6kf1Rp+@p|2nG-?grcnqw|y9(<}Y1mrXEztn@u$Vo6ac0 z00Kq2;D>q9HnjoCuN{H`Jc=P7rFh$i0Z=6nwJ2et)qm+aGrd5Ayg4+e*A*IcCv!S9 zT!4NUtgTal0p{q+;D>A}6OAZ^XxU%-qx2-`Gc05BJuOq-`8OFTgJzE@hrAcdnY>Nq SP|lw_6!P7#fV%FeF!~?EJn)kM delta 2975 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 G!2bd81-nuJ delta 2822 zcmY+Gc|26>AIE25#JFRbX=0|VA(bUtwz6fIv4)W?RJLSGCE11)GKxAyijqvX6k^as zV=2imYT}A0DvJCRSBlZ3`=j%8o8SC%KIi>>zMu0w&oi&*Is8<#AQg>sbwG;{5D3Hy z#Mj~~uWB3~DY7geHRJ*;R8Wt93ijWqI5e!nF{fY``@5I~P!i%OP$@0(1GdRxy~SV^ zEgK7L@A1JHm^qVFM1Cp=xmFLlrqB!H6h#J%*~qmRP=r;Z3t9KoNI)f;psA?!C2&(e zQ?_Y?l+`-#P`|^uYzfFx4^-gv-GsvOH-m~OVB0iJQzhm>dl^J!mU%${);18@1=#S}EQY>o8j z{rU6{`A72ImYyCYamGiL9ZNqX6sO<~;^w@yg|P2VxHOKR5v__sARdY=mj?P%z?3Y< z4+VnKx?OId6KpV8LAFfD9qZIarYr&CrQLxStNH+4XjnJlIgG^< zQ~t#Q7-b(d5QP_HIp{+saJFU*iLO|lWG1G}2U09kVRxLuf%zEB6~HCzfpa!U@nu)5 z2SLUeQY)Y^@LE@xc^71>--}jFRz^@^Xbox%Wr0X8f}SP z^rUYw+sQlIJ5#Ot=ss=RM$w?f>qpDWA9#6n*RC+DXJnRMwF(pH_DNpPlrz}tz+QI& zy+)zCrosQ2`MYo7dY2V~Ql3RLyx1!9#+x@+=wTgsRPKemNt7IG@P2w2_Qskt(x$|- z)Zy2L;+SF&alNko-gxb6Rs@5A?W^NYWDv;D0zaIPKaKBlD$N?GMdIYs*SI@BIlN`q z1oJYL+&01pCOEsl95ZZAK9g}WCOi9W?x4HJeyuAH>@Mx3)3xO7+YC&o9<|Mm(JZ=0 zVYFLrK_FW%fUc}fWZau!iil)m&onv`_3{mDlhg-+`@gT+4Rn|{FuRRjZZD^@vL$; zvi`aGt8Dx&D0bSV$lyvUnu zc;?LbPRTl=CNV<@p^;@`?8aSo2LzzTE+Y-~ch6e-<(EVS$j3Zhc{WC|-wJ6W!oaAos;^5Q`sL59lrlMXBHlHKYyzSBY zDGNdK6X%{*^}k-3HrQ&DGuma-)j^D4i2K%08~v0gn5Yq- zLj}^^B^8C@)@rfe-WdIHV)5nO!Es)qQt&1<}Pj@P*1;?U)S#!j9TQnqlcSZDERdoH(gRh&*l)3;Cmo$9NIPi8#f z$qhA1B{0X8uNxm*#hCc?YBJ?3r}2wZ=$>l9BG#T_W!!Yo>2adc(9R>coYF>t(rMUWamYwvf9jphiIWyz;-Xq{k{Ozro>^A+=F~=u znTb;M4L5mwT-ilDBav>T_AS$k2{B^ELy`o;%H5eKevHtj2R;v4?dxq#u64dDhT)-4$lA zkgha^g>&UrSmaewVKGz*JgcjK@U60hhb~t+z+$S(6BhQjL3#FVFr-{hf@W`KlYXMEI74lB}qMCI=^h_P__WY*cRTAqR z;ii>2B1nPw9D&msiWTBHoQG)uxU0ZXvI7y-=`6SZ6&kf^PQ-=C=t1+o{%mOfeskqCs+ s()IUGx@;*Xb`{juOoU_pZYCk^A#95Ze7mWIgj@+Zwy0y670Xrs15#2k*Z=?k diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243123\343\200\220\346\211\251\345\261\225\343\200\221\346\240\221\344\270\212\351\227\256\351\242\230\344\270\223\351\242\2306-\346\215\242\346\240\271dp.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243123\343\200\220\346\211\251\345\261\225\343\200\221\346\240\221\344\270\212\351\227\256\351\242\230\344\270\223\351\242\2306-\346\215\242\346\240\271dp.pptx" index 19c0cc0f267e68f32e86440abd0bf86cd39e07bb..d77e3af4660f2e354c01a38bb24cb1a9ec9a747f 100644 GIT binary patch delta 2833 zcmY+Gc|26>8^C9bWv(?51`XLMMnv|gkR^ufTcPnowg{JK2ytMclyllzvq14@AI7JIcGlSna&hcX9|iFZ-QdvMIaDp1iPJ-eHkYY zl5sbHB$1nNAjZ(W7m$}3B2aJ?zbE0GYz9JFtdjvuA;$tNR0iw!%YT zhM9w)7$Y1-VVS{cq6iUYP!v`PIw3I#3;dGSKn;+kso`?Da5sA@UIC~wxPKYoq zRZ!WImVTVZ!qrsi(#`5vp=C`lXQS3dx+6PXP+3uL9*i%lPpcwl&;!)(X3EeJW1upc ztO51A84DN$f$CbNAL9%N1d0XXG!ZA`9FTM( z&VdQ?aqfpFJ>e1r&kXIB{&WG9rnp*yF8B%H-H;D@xHIonF9;uLA7Mfunnj?}AU<+| z&koaGG3e$aDG1xV+Xf#rA6N}Mej0tV=sxRBU1%&?fLLJBb1H70Wyz^8TYdV@YL2$1VQTNYGY^D@s+@{t z(i3%DmzH&y)1ay_Mn|M^$t6(!`Y`UioHQM7q6a zRV!fUG$l!Plz)29C>&#>rxCd|eoU2pIB>T3Z`+k3#XCFYI&n-U|I-kDt(ur8qtBD} zS1W(njW6S$9Y(F#f~-)aX_D#kQBCs8#wBof)*4R+{(`i3rTqFaaUMOzD?*1 z>W*b;_2pBeT@vo`&Al0BbKd^GB^&Q;iYr-vkjj>~Vggnx7Z=n`RL~a}t2GVp53Q1P zw9kpIVr5>U?><8-wF>;Ef#XO7SQ@F-2*X^k~{AT)DqF!<&0373KN&y4ff6 zoX=yHyIk#TtT~poCN&;?G{8R)ArYzHQcb_Eu2V6xs&RKZ8YUNzrP}NK6iQ#RsW7k1 z6>V3CYK7Ej;h4j1_kYLh7EMI4yJ*kq*w5D6Zx+u$oFXo~?t(7HVvtoj=>-*W?)NBy ztILl0ihioICv~iR;N37^0TwyX3Jr^3(+=iJKJ(;r)L)tFx}s{)U9{>>B3e3NOk@N7 z9$TgJxJ!3S)<_h0Lz{yuNx368wCp`Eyj~S$F>49eeV9Dxz?*bcc9Z&P(55o7R7n4W zQHBt^P^-DeXQb7Bs#iz+*UTW^2&ExPOb&^XGV58CWUs`nUS>>gm3QQBcUtXGdz2?w zA6%xE{g@jiJDpDQd=Z*fNW3i{Ysd1|LyG%jXID%|h57uCzE|2i5e$|^?v@NAb#sn? zoVb&!bLjB7O)YnV*uCDV{h#rcQfjiRU8aI+if&WVZUng;>(58I!{WQu@VOSv*79Oj z&hb{q4q&d99*b`1?Za$6Hn58pLaiT?FQm*QC;Xvv%FTds&;sYywQquWkeyjrcY=%( z|K=JTx)Qe0R~V3w`SwMvezUypS}-HWTGL45L7%Zt6j3i;KI2YiaYSE~~y8jP!`iJp85_~0V)Z&jBerf$Y<#&^9o|4DBcBI{sK!h! zm~Fe3)(9wkAN8tgG3kjS^0&H{HYlC^bBk++@t<*Y)oqq&wsGghG5?^!>$d%M3j|I~ ztOVDK#qg3UYSF^_q~G>&9TRSUmAbhm7Tdck_^Hng{vjbE-&mC>Zz{QGj&Lhg%PJgq zVe)?~Goe{RnF!|O=}i-!`q|NVWN7KzdY)0|m|GYvM~}-516~anVqw2dZrzd}^V~+% zyfAgc0y(~Ii-QfYI5I1sJ`jw3C|s?>###w$(WK>nEx z9K=5Z>0Qsj5v58HQmWE|j{~cIQIH^1{fh`fvDLt9rKj>WfcnEcua=GyYk}KD zPi5)=^{k_F2WXVLo{oms1Gl!`6mHt}xgaFbpbcLT8t7<0jqYotqv4Ift)r)sO@Mkd z(YaI_<$nH)+QN6Le-650qkv~cpn!*4OgRBN>@9*2W3wWBq1FuO)n;RubkPWVi}Bu% zZ}%SqO=bNyyfWeK!n4 zML(g!*iwX2DDhTr+-LgC@4s`u&-a{r&b{-wXS#{(-9&bjjRiZ05DNgE^aZFib~I2B5OC;Q|xm65GEtZ8O+Be$}h89Aq;5!tAlHp^LdxRPo=vL$#rW6CppOmfoFQWZ$xxecl z72d25rNtT|EexeNOb2W@O?{!U*j)s(yo~F}*ZlOlds?B-HQsAST_j4}CEc{qsKC`( z+1gWmY?Z~H4Js5m3iVmv?h2WzjF&cPic1M&#fZ1$2pd5H<$KJUvFPd#DGk|^t!{&z z)#f>g0cpfR#B9aQ^wgOoOi6~c@%(46p@zZYg5CSwf`-(^+HZNX7jZ1Coa`kmdk4|I z$PurW4EbDjpYGcj&*Ffvk54$*Nj|Dn;A?1hm6^^8FhQRUG`K8ff?az!qM5he(YiC( zbhp?Y6$_%zKpT%HqBJgSeWl4Sa2I*zrL|Z2)JZS(9}&?=-i+sAn#DmvMz#sEQitP} z&hpJQ%~aJE3BN0T_0YP)`OcvPf`G{Kibt+DRZLJ#@6oEsk>v#e=Vv-vCtMOVQW5F} zXD&=%tA)&{sH>vA_lK(JAF!X=7Oes}f2w*~j8><(6`{Mo?@-jJ zBd^3)+5t)x=Nq|%SN%6ky9U?K=}qQVa;x^FSmx@@E!&46vKNE~*}j-veJXvqYToq0 z^LgWNm-|I{TcObSFqe$Xi*N09lGX9ncmH?8=Coj~^neFuyo}?qK9@iCRa>kkA+Ekz zWdfp9JT690L{P)+pC#wme9I*C{~Im)Z$#8=lF;4uXVdi0Ut@+PHWDX1&l$_2kV5s@ z$_j3`y9|hJx29}#2>(a^B3=I1sTH&9{7MOj`IKaCnjNHBVtr!{=(Ijj zR{B-AmfNMMHhcc{Y+w+tT}q7al-VL*N;j&1yQ^AaY3|w#=IC8HpMmd{mV^VPNd-b$ z8jc5P@s&Gf(%jNc&Cu{4){Odtj%UlOReXp@WiRy7&9OK3S4ij_OUKWK`Io%O9!}0( z%J1R3#y7QJ^*hT!o>}traeS{9Qg8RdMBDSHo+jaH1D*1jH|{wVI8SAia(kCW=o5<{ zA#m>UsQm#Q20e8cS@g0yW{%*)yLYIqD%0$WR>+r$!;69&Ez4oI^(AA|=kBDpe*O3c zJJt6tFQvQ3Ua!w7v-@0V-4&hmbRMf7yb6RsB{_Y+>6B@H?iSwi1pR>uO2{`o*ddYI zVR-M(lSb5!hfaFpNTJvCN(3Dzs4>x|7JkY{rO)PCr{1v*HhG!oq;lmi0@r0$uGF=+ zt=t5s*Uo>@o1(Pba0q=}6s~EZ%w5#*_>WK3pE&Mb(k{iWP4gBGtQSPh9qIJ*{$8$M z#&!A=XNm}A@b=^}RX2}Ubr*TCmk(LDkGPI$kMv6zcJINjr%!!b`MWkGkJN-}4X@US zD=4+v@G7qpQ2aUSS3~Kwh#`n{c$GKl97|s3pXC@I-By!)|LI4Ul1oJ=M;5!rzT)s1Qgr`|!+-Oa=}kZAnThhiebQOmiHUnQFWv7fg$X|8 zcD@-&FSF~YIURRZR7^HYTC3+$^@FD6!O}C!=Yw%O?XXLM@tv!Yg{xRXy52_2$Hs=8 zkE8i9?_-+3CGa$hcZ#Pph$L#ej;}h>uW3jkIlcJhK1+IdO7+$$$ICCq#qg59bQOln zH7ao7$t%md#I9PC9?f3H)u9h~|1ByjFl^NE#dm;=pPGtr9M5v(OCPdqCqL;$QC=J( z(v{G8O*D>DLbP0rXfl3Qn(jy zy!w3THBr5R`yS>vS?|4vJiAnmPze!dOPG#&K@t9tJ)&Ik-etj@MA$nQJ6-*NJt0yz z?nJy|4_^6m_xS&>_GW$`+U)N|Kg!C&vWG>8P(@?Y+m?2F~~Sz+U&yJHooP0vZ=b!XN%#0ouE^RtzPd_Ge#g zz-uL?1R#=I%l=E*$fWEs(|Cl2(qdS;3ImK1so_; zJHo;BYLHH=21ji*Xh@|-2R;s|`9nd1Xzd?@hOX2CuY;K?)Bze)$K(z%sBk?KCDa4A zg_+7V0P5So?R}0k{P0#iYQ9DHPRG9lI<~)ea+aF>?M&> zT4bHFWp1`4Yp#;vc}w0HS9AA?UE5gHsF!gYm%B4lB9c z6BLDWZU#UR{v8Z*h?iTTdLD6t156}jC}>p=a-*O$&4YkO&hfH9Z2{%R4JLc^IY@gd zdK?Kdb&MS6Rst5(wSnt0y&(3$QrR$C0m7dZoY`~n`Gz#N*7im z1LS{6?VMYZ$q_5)q&Al`Il={8M@#na-`Zmr z7*vV0I-MZA#}WUZ&gA8wW&@pS>v(}ul#a6Oq5hhP__fga$5v_;xA1<|Kn@5-GVH%bXzsY?+& zm*-N zQ4S#Xmdl$<;4iylm1+lWDHKx^kIhHJc$eAieS5z9jotyD+S;uDg2uem2(zfj zaJWVlmd6Bpb6$G;d9~#rhq#5cFJerj_JXagt7MYxYJ$Sw*y8O-s@A=pz8N!`wg)Ym zI4#m$jdg7FH*?3GMa3(lUkjwhp5Hyb+c8|aGxtVPoxi$Ypb$U z<0x^#_RTL&g|q4dyLPvEtl`7?Th6EIFmmV=pZi(Wp|8gCvO3)Y`gg@Ey=;F^4borv z$g(h1WIbJLgYOjH;Fr}O0}lq=ScV%?2RV~XCv zl0=(58_h+i+US_z2tc-3z9Z;eoOjaFKN(ZD=WI0?Jv;bhHpIP4t3;ngC3s0xb$)wt z(X`lF*9*!8$(v5l@z(FM&z3$jFL<&2>V``xmz~(e>tyWZL^K1Dfn(h$Fz*wK_B?>wI=aT zJD=~?>}fueZG@ZoX~60D4DZ-~<*|p`5D)8)r-_9N@)+(VfvSeS^`jxBVA-f3maA3v zqiH%V>gh`_<<{qTIjSL7w{^I@gsi*OGdrt+K!TW9u}qr;ruhwF8ZOc!U&hT?d*Ge^ zs7LYcA{V+R_{?pJ#(t9U+`nEeh}Fk?v`PX{F4IYmlIvvf4=!kYa6LmB_-n9Bc&(Fs zX=YI;WV*yA|>;^iBn-w%O}bgM=Etm2hLA>X&0xHAKoA!cJD8V{?JtOYnS?e=>;4uigHXY1xq;#rgx&}K^M)z&>7l0f z;Q?_qDTQ=^Se7qB$?kaJCY<*As4A^l$(CeTSSS^B{+}~LmS3fm-1kIAMjF!K#zv+Z zn9RIq7@Ik&s{(CSU{RJ;dZfp^?)K1ZL1TNEG65s_?n(pv27bKzM;zURM;~WRhUrFgoDqt8RmU&g??tYwh<(3H$DwSzlH4>f zD;3BLC5<$1_fOahpuWb%koM#+L<8q_Kryk zGn`Ze4r&`uMdC-+yS>9=tXatae_vVs7uo}mDRR~1L_z3sJe~9cyhE!EQ%^xxF+FWJ zc&(158G&JEx*-^jr0)eoPP#1^X44@@EdvUE8Kz)YWyXFmurgf0a5xhho|Xx9;qoy6 zM;0FJHqT5_bx=4?9{FZqPL2m zI){p&iuCBv;a;ShfU7jo31HwYHsRTP$9XZ<7l5(iZNQ0QEwCr87;=Y;A$L~^M9!2D zcsB=aJ&b@SCD1RhQG(%6OoRar=e7gnL=<3L$`4LOEXBY*0H0Dhuo?HOsR|UADj`$S Je!cKv{{wV82`c~q delta 3088 zcmY+Gc|25mAIE3LGK?)tqed7@S;{0!mU5-COLp;)##XMS8oM5Mlx?zPIVKFo*w+*j zDJg}UrKDmA*OX+*(zS(bPn=WD^WW#Zzn|}NzURDNzu&t)L~kF0-@=rQT?7V$alyhb zZ=I{=7lyNM3t&Hd6%^8ljvYb&7vaeUDo4(6&_y3aq98TNg@7`@a&LmRIg|quROUhi z$krn4!3i=Yj5Pa>0_K!dfM|&x5Iai}S#UQM1?-cB2KXXt%MuDyfHKY~(xAEKlsKU_ zYq(Lw@8X>_6dk{n6N~S10SY**4>jJPJ_16!6hRhHhya$WnLXT+fcF{*lVoFaic+LvEXZ zE5#giq~kiYl01}rAs^Bh35(B9vBNW)t}(|&P>J~;hf z4>#zW+WU-gfNR$ytbvO=;V%sR1omNS(CZ~#H{A3Bi_+ zRLz?UE^)!Wx=V)_Urtxeh@2`oYQ(iqfx4FI|3r(Ko%#NgT#QY0yGdJGpwjH8K`luc zuY77+ZNN})-rW+Vkz;Q{r|Sh($+B$W>Z%7?!uKX5?&+ks5)G_4=*}9ld;?b6Rvf(g zX`X=59`?QE&%bNoTFP%!t`5yjD1TbAF+mquKhmU`V1lBs#)8TdUY_pFi-mh*Q#`Tl z>_-9uRLMPCDV+})-G$a?55_p(+dvKa(~Me+2nTTu4v81uSDwI zDtNnF2~Q%*x?x=Jk}@l45nB6J{g*11BId^R%ygXf{-sPF(PDMc$dAErNVa*Gp`s(loAE zv3cydyt_B|zD1-$G{t$BomNnVIop9+AhBDbQWXEP$SnPo-cIOP0I5MhbY*t$_(Mt zR4Lp<{#W{3EA`b87@mzp4n1L2?fiz=*LbTw7~`6|sGH$@tdWAe7pbDHFFObKnX6s< zq+d?iK|+n8orvR!$xS~Ft+uO)odLALar2iL;;o1@%cQhk=GQb)4FqwFk(5lnekrZy ztt6kJ^j}p93LE?i1>$+wE40=Q8CMVNp0NU=gkTP0vf!Cu!YS&v@O77cd&mz$D?(b&cQ^=0 zIy9uuct5Dj5>~oI+9x7K21C&<9!@&<&>2=~m0ep^MgEq4aMhII`sN96*NIXw zhVJ08r}a`g>M9Phj#!JqFqaR(^NKIngg=tmnW)yh0$uaNVYB5H$*yo(G zj?IilZD++pHy$7W_!c^K@m{UQ)N}hGV%=?tWBuehs)Jkf{HSM{@}D|R_i_a4sEfuecVBkMxbE9nf5Ose#(WbzSnq$d;@8JFZ^p_a%G7h-aKZ)V$Y6 zA&$r>8BJDw4||-Nd$$WMbx!rj7)*XRNflerHqh#)k3Os-Z{X)RVJ3vruHih|(ayug z8(nelT3bwmKV}&_9-i{-QPqX_*!KxOuHt;})=nFkM|KBrT9+-V8^2BER&vlSZ1DeN zPGBm3e11ezv%iXWViHbxb4gU4K|B%mRJzRPa)iLV%MwN6VdJQuT<;T4}suLcj#0tJhmIrClROFrWKF?=#cmx>AP z-G&0w=?kODsx|ghiD*}E9o_w{Un(pHoFnKH4MX>JEK6}B%+H?X!NdJxciZzv<3GRn zL{1bXZ@fCyC{VNX+QnxhKEtk*M!#_tXF6^-Swi=7)E{oh7Hx{bVMVwp3P8wMxbgAn z=JY%PleTV;?}GO>xnD;#6`L57Qrj!V=0lcE0d7T!HL?G{aTzR!zXSdgCQWxp;fIb# z@6>ki6s2os{0SY##T0e$U}aK{fkGln8x&4ie}ICTWekd`EXbpn4GFL86JY30wkasq zv+Y1(mjk6|Msf!z66?epaj~LS}C;Lpi*7X^RUze6v#4NuI=00h5n5>0A7Ix z+{=`~NCp)7o#GtY49=O$KxTOq~ZW)2Ia^7AND`EW3AW# diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243138\343\200\220\346\211\251\345\261\225\343\200\22101\345\210\206\346\225\260\350\247\204\345\210\222.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243138\343\200\220\346\211\251\345\261\225\343\200\22101\345\210\206\346\225\260\350\247\204\345\210\222.pptx" index 7aafb8c6dc275ed1970da429c98fa069512f3841..d2e640e39f974ffca59e9914e5d6e4483759d204 100644 GIT binary patch delta 2917 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 Opr8jbqUS1B`2PSgaQAZn diff --git a/src/class120/Code03_GreatCowGathering1.java b/src/class120/Code03_GreatCowGathering1.java index 88e3d819e..1ccc12692 100644 --- a/src/class120/Code03_GreatCowGathering1.java +++ b/src/class120/Code03_GreatCowGathering1.java @@ -2,7 +2,7 @@ // 牛群聚集(递归版) // 一共有n个节点,编号1~n,每个点有牛的数量 -// 一共有n-1条边把所有点联通起来形成一棵树,每条边有权值 +// 一共有n-1条边把所有点连通起来形成一棵树,每条边有权值 // 想把所有的牛汇聚在一点,希望走过的总距离最小 // 返回总距离最小是多少 // 利用重心的性质: diff --git a/src/class120/Code03_GreatCowGathering2.java b/src/class120/Code03_GreatCowGathering2.java index 20a678fba..c0f4e7cdc 100644 --- a/src/class120/Code03_GreatCowGathering2.java +++ b/src/class120/Code03_GreatCowGathering2.java @@ -2,7 +2,7 @@ // 牛群聚集(迭代版) // 一共有n个节点,编号1~n,每个点有牛的数量 -// 一共有n-1条边把所有点联通起来形成一棵树,每条边有权值 +// 一共有n-1条边把所有点连通起来形成一棵树,每条边有权值 // 想把所有的牛汇聚在一点,希望走过的总距离最小 // 返回总距离最小是多少 // 利用重心的性质: diff --git a/src/class121/Code03_BuildPark.java b/src/class121/Code03_BuildPark.java index dbb1a9983..45bfbf8d2 100644 --- a/src/class121/Code03_BuildPark.java +++ b/src/class121/Code03_BuildPark.java @@ -2,12 +2,12 @@ // 造公园 // 一共n个节点,编号1~n,有m条边连接,边权都是1 -// 所有节点可能形成多个联通区,每个联通区保证是树结构 +// 所有节点可能形成多个连通区,每个连通区保证是树结构 // 有两种类型的操作 // 操作 1 x : 返回x到离它最远的点的距离 -// 操作 2 x y : 如果x和y已经联通,那么忽略 -// 如果不联通,那么执行联通操作,把x和y各自的区域联通起来 -// 并且要保证联通成的大区域的直径长度最小 +// 操作 2 x y : 如果x和y已经连通,那么忽略 +// 如果不连通,那么执行连通操作,把x和y各自的区域连通起来 +// 并且要保证连通成的大区域的直径长度最小 // 测试链接 : https://www.luogu.com.cn/problem/P2195 // 提交以下的code,提交时请把类名改成"Main",可以通过所有用例 diff --git a/src/class122/Code04_Network.java b/src/class122/Code04_Network.java index 7a7ff9443..c2d1639a1 100644 --- a/src/class122/Code04_Network.java +++ b/src/class122/Code04_Network.java @@ -1,9 +1,9 @@ package class122; // 边差分实战 -// 使图不联通的方法数 +// 使图不连通的方法数 // 有n个节点,给定n-1条老边使其连接成一棵树,再给定m条新边额外加在树上 -// 你可以切断两条边让这个图不联通,切断的两条边必须是一条老边和一条新边 +// 你可以切断两条边让这个图不连通,切断的两条边必须是一条老边和一条新边 // 返回方法数 // 测试链接 : http://poj.org/problem?id=3417 // 提交以下的code,提交时请把类名改成"Main",可以通过所有用例 diff --git a/src/class123/Code02_TreePainting.java b/src/class123/Code02_TreePainting.java index 079fe278b..5510a6c78 100644 --- a/src/class123/Code02_TreePainting.java +++ b/src/class123/Code02_TreePainting.java @@ -4,7 +4,7 @@ // 给定一棵n个点的树,初始时所有节点全是白点 // 第一次操作,你可以选择任意点染黑 // 以后每次操作,必须选择已经染黑的点的相邻点继续染黑,一直到所有的点都被染完 -// 每次都获得,当前被染色点的白色联通块大小,作为收益 +// 每次都获得,当前被染色点的白色连通块大小,作为收益 // 返回可获得的最大收益和 // 测试链接 : https://www.luogu.com.cn/problem/CF1187E // 提交以下的code,提交时请把类名改成"Main",可以通过所有用例 diff --git a/src/class137/Code04_MaximumXorOfPath1.java b/src/class137/Code04_MaximumXorOfPath1.java index e5c743275..6ec92db75 100644 --- a/src/class137/Code04_MaximumXorOfPath1.java +++ b/src/class137/Code04_MaximumXorOfPath1.java @@ -2,7 +2,7 @@ // 路径最大异或和(递归版) // 一共有n个点,编号1~n,由m条无向边连接 -// 每条边有权值,输入保证图是联通的,可能有环 +// 每条边有权值,输入保证图是连通的,可能有环 // 找到1到n的一条路径,路径可以重复经过某些点或边 // 当一条边在路径中出现了多次时,异或的时候也要算多次 // 希望找到一条从1到n的路径,所有边权异或和尽量大,返回这个最大异或和 diff --git a/src/class137/Code04_MaximumXorOfPath2.java b/src/class137/Code04_MaximumXorOfPath2.java index 28de05d2e..e31a9d5ac 100644 --- a/src/class137/Code04_MaximumXorOfPath2.java +++ b/src/class137/Code04_MaximumXorOfPath2.java @@ -2,7 +2,7 @@ // 路径最大异或和(迭代版) // 一共有n个点,编号1~n,由m条无向边连接 -// 每条边有权值,输入保证图是联通的,可能有环 +// 每条边有权值,输入保证图是连通的,可能有环 // 找到1到n的一条路径,路径可以重复经过某些点或边 // 当一条边在路径中出现了多次时,异或的时候也要算多次 // 希望找到一条从1到n的路径,所有边权异或和尽量大,返回这个最大异或和 diff --git a/src/class138/Code03_DesertKing.java b/src/class138/Code03_DesertKing.java index dc35e86a8..40d643c6f 100644 --- a/src/class138/Code03_DesertKing.java +++ b/src/class138/Code03_DesertKing.java @@ -5,7 +5,7 @@ // 其中(x,y)代表村庄在二维地图中的位置,z代表其海拔高度 // 任意两个村庄之间的距离就是二维地图中的欧式距离 // 任意两个村庄之间的修路花费就是海拔差值的绝对值 -// 现在想把所有村庄联通起来,希望修路的条数尽量少,同时希望让 +// 现在想把所有村庄连通起来,希望修路的条数尽量少,同时希望让 // 总花费 / 总距离,这个比值尽量小,返回最小的比值是多少,结果保留小数点后3位其余部分舍弃 // 2 <= n <= 10^3 // 0 <= x、y <= 10^4 diff --git a/src/class142/Code05_DoubleKillMeasurer.java b/src/class142/Code04_DoubleKillMeasurer.java similarity index 92% rename from src/class142/Code05_DoubleKillMeasurer.java rename to src/class142/Code04_DoubleKillMeasurer.java index d972f5084..ed231644d 100644 --- a/src/class142/Code05_DoubleKillMeasurer.java +++ b/src/class142/Code04_DoubleKillMeasurer.java @@ -23,7 +23,7 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class Code05_DoubleKillMeasurer { +public class Code04_DoubleKillMeasurer { public static int MAXN = 1002; @@ -97,11 +97,11 @@ public static double compute() { public static boolean check(double limit) { prepare(); - // 0号点做其中一个超级源点,保证图的联通性 + // 0号点是连通超级源点,保证图的连通 for (int i = 1; i <= n; i++) { addEdge(0, i, 0); } - // 倍杀关系的边 + // 倍杀关系的建边 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])); @@ -109,9 +109,9 @@ public static boolean check(double limit) { addEdge(vow[i][1], vow[i][2], Math.log(limit + vow[i][3])); } } - // n+1号点做另一个超级源点,保证确定得分的选手之间的关系 - // 0号点和n+1号点,一定要是两个分开的点,不然会误判 - // 虽然本题不会出错,但是一定要分开,课上进行了重点说明 + // n+1号点是限制超级源点,保证确定得分的选手之间的关系 + // 虽然本题测试数据有限,两个超级源点合并居然也能正确 + // 原理上说一定要分开,课上进行了重点说明 for (int i = 1; i <= m2; i++) { addEdge(n + 1, score[i][0], Math.log(score[i][1])); addEdge(score[i][0], n + 1, -Math.log(score[i][1])); diff --git a/src/class142/Code04_Balance.java b/src/class142/Code05_Balance.java similarity index 99% rename from src/class142/Code04_Balance.java rename to src/class142/Code05_Balance.java index fbf39955f..45591eb3b 100644 --- a/src/class142/Code04_Balance.java +++ b/src/class142/Code05_Balance.java @@ -18,7 +18,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code04_Balance { +public class Code05_Balance { public static int MAXN = 51; From 5bf8503cc31ed502b4eb42295f0d7e20a99fbb0b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 6 Sep 2024 11:12:07 +0800 Subject: [PATCH 0112/2029] modify code --- ...\347\224\237\346\210\220\346\240\221.pptx" | Bin 51322 -> 51322 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243061\343\200\220\345\277\205\345\244\207\343\200\221\346\234\200\345\260\217\347\224\237\346\210\220\346\240\221.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243061\343\200\220\345\277\205\345\244\207\343\200\221\346\234\200\345\260\217\347\224\237\346\210\220\346\240\221.pptx" index 92525a85145d33291ef2d5c92105fa1071e7eccd..99f0e60f78523cbfcbe4b3c932fa45c8c244e056 100644 GIT binary patch delta 2924 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 Date: Fri, 6 Sep 2024 12:53:49 +0800 Subject: [PATCH 0113/2029] modify code --- ...{Code04_DoubleKillMeasurer.java => Code04_Measurer.java} | 6 +++--- src/class142/Code05_Balance.java | 4 +++- 2 files changed, 6 insertions(+), 4 deletions(-) rename src/class142/{Code04_DoubleKillMeasurer.java => Code04_Measurer.java} (96%) diff --git a/src/class142/Code04_DoubleKillMeasurer.java b/src/class142/Code04_Measurer.java similarity index 96% rename from src/class142/Code04_DoubleKillMeasurer.java rename to src/class142/Code04_Measurer.java index ed231644d..e724cd5c3 100644 --- a/src/class142/Code04_DoubleKillMeasurer.java +++ b/src/class142/Code04_Measurer.java @@ -23,7 +23,7 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class Code04_DoubleKillMeasurer { +public class Code04_Measurer { public static int MAXN = 1002; @@ -110,8 +110,8 @@ public static boolean check(double limit) { } } // n+1号点是限制超级源点,保证确定得分的选手之间的关系 - // 虽然本题测试数据有限,两个超级源点合并居然也能正确 - // 原理上说一定要分开,课上进行了重点说明 + // 本题测试数据有限,两个超级源点合并居然也能通过 + // 原理上两个超级源点一定要分开,课上进行了重点讲解 for (int i = 1; i <= m2; i++) { addEdge(n + 1, score[i][0], Math.log(score[i][1])); addEdge(score[i][0], n + 1, -Math.log(score[i][1])); diff --git a/src/class142/Code05_Balance.java b/src/class142/Code05_Balance.java index 45591eb3b..391c57a53 100644 --- a/src/class142/Code05_Balance.java +++ b/src/class142/Code05_Balance.java @@ -7,7 +7,7 @@ // s[i][j] == '=',砝码i和砝码j重量一样 s[i][j] == '?',砝码i和砝码j关系未知 // 数据保证至少存在一种情况符合该矩阵 // 给定编号为a和b的砝码,这两个砝码一定会放在天平的左边,你要另选两个砝码放在天平右边 -// 返回有多少种方法可以让天平左边重(ans1),可以让天平一样重(ans2),可以让天平右边重(ans3) +// 返回有多少种方法,一定让天平左边重(ans1),一定让天平一样重(ans2),一定让天平右边重(ans3) // 1 <= n <= 50 // 测试链接 : https://www.luogu.com.cn/problem/P2474 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -33,6 +33,7 @@ public class Code05_Balance { public static int ans1, ans2, ans3; public static void compute() { + // 设置初始关系 for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { if (s[i][j] == '=') { @@ -61,6 +62,7 @@ public static void compute() { } } } + // 统计答案 ans1 = ans2 = ans3 = 0; for (int i = 1; i <= n; i++) { for (int j = 1; j < i; j++) { From 2d2f6e281b6e96e4974b0a976266da06942ab06c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 6 Sep 2024 13:06:55 +0800 Subject: [PATCH 0114/2029] modify code --- src/class142/Code04_Measurer.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/class142/Code04_Measurer.java b/src/class142/Code04_Measurer.java index e724cd5c3..28b7f2588 100644 --- a/src/class142/Code04_Measurer.java +++ b/src/class142/Code04_Measurer.java @@ -2,13 +2,13 @@ // 倍杀测量者 // 如果 A的分数 >= B的分数 * k,k是正实数,就称 A k倍杀 B,或称 B被A k倍杀了 -// 一场比赛中,一共有n个选手,有m1条誓言记录,有m2条得分记录,得分只可能是正实数 -// 誓言记录 1 u v k : 选手u 没有k倍杀 选手v,那么选手u就穿女装 -// 誓言记录 2 u v k : 选手u 被选手v k倍杀了,那么选手u就穿女装 -// 得分记录 u w : 选手u得了w分,如果某选手没有得分记录,按照尽量不穿女装的情况推测得分 +// 一场比赛中,一共有n个选手,有m1条誓言记录,有m2条选手得分记录,得分只可能是正实数 +// 类型1的誓言 u v k : 选手u 没有k倍杀 选手v,那么选手u就穿女装 +// 类型2的誓言 u v k : 选手u 被选手v k倍杀了,那么选手u就穿女装 +// 选手的得分 u w : 选手u得了w分,如果某选手没有得分记录,按照尽量不穿女装的情况推测 // 你希望看到比赛后有人穿女装,但不想看到很多人穿女装,于是想制定正实数ans,效果如下 -// 对于所有誓言1,倍杀比例调整成(k-ans),对于所有誓言2,倍杀比例调整成(k+ans) -// 相当于提高了穿女装的条件。计算ans最大多少,保留小数点后4位,如果不干预也没人穿女装,返回-1 +// 类型1的誓言,比例调整成(k-ans),类型2的誓言,比例调整成(k+ans),即提高了穿女装的条件 +// 计算ans最大多少,依然有人穿女装,保留小数点后4位,如果不干预也没人穿女装,返回-1 // 1 <= n, m1, m2 <= 1000 // 1 <= k <= 10 // 1 <= w <= 10^9 @@ -35,7 +35,7 @@ public class Code04_Measurer { public static int n, m1, m2; - // 誓言记录(op, u, v, k) + // 誓言记录(誓言类型, u, v, k) public static int[][] vow = new int[MAXN][4]; // 得分记录(u, w) From e26f343f30ed50e6516433c4508a5e6c132466f7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 6 Sep 2024 13:11:55 +0800 Subject: [PATCH 0115/2029] modify code --- src/class142/Code04_Measurer.java | 27 +++++++++------------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/src/class142/Code04_Measurer.java b/src/class142/Code04_Measurer.java index 28b7f2588..537e0ceb6 100644 --- a/src/class142/Code04_Measurer.java +++ b/src/class142/Code04_Measurer.java @@ -150,27 +150,18 @@ 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) { From 395781884d1da534815647b7fbb018e36d802463 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 6 Sep 2024 13:53:29 +0800 Subject: [PATCH 0116/2029] modify code --- .../Code01_DifferenceConstraints1.java | 16 +++--- .../Code01_DifferenceConstraints2.java | 22 ++++---- src/class142/Code02_KsFarm.java | 21 ++++---- src/class142/Code03_LayoutCow.java | 51 +++++++++---------- 4 files changed, 48 insertions(+), 62 deletions(-) diff --git a/src/class142/Code01_DifferenceConstraints1.java b/src/class142/Code01_DifferenceConstraints1.java index e4eceff3c..ca6eb29fd 100644 --- a/src/class142/Code01_DifferenceConstraints1.java +++ b/src/class142/Code01_DifferenceConstraints1.java @@ -106,19 +106,17 @@ public static void main(String[] args) throws IOException { in.nextToken(); m = (int) in.nval; prepare(); + // 0号点是连通超级源点,保证图的连通性 + for (int i = 1; i <= n; i++) { + addEdge(0, i, 0); + } for (int i = 1, u, v, w; i <= m; i++) { - in.nextToken(); - u = (int) in.nval; - in.nextToken(); - v = (int) in.nval; - in.nextToken(); - w = (int) in.nval; + in.nextToken(); u = (int) in.nval; + in.nextToken(); v = (int) in.nval; + in.nextToken(); w = (int) in.nval; // 形式1的连边方式 addEdge(v, u, w); } - for (int i = 1; i <= n; i++) { - addEdge(0, i, 0); - } if (spfa(0)) { out.println("NO"); } else { diff --git a/src/class142/Code01_DifferenceConstraints2.java b/src/class142/Code01_DifferenceConstraints2.java index cd4b4a57e..15aee0dcc 100644 --- a/src/class142/Code01_DifferenceConstraints2.java +++ b/src/class142/Code01_DifferenceConstraints2.java @@ -101,24 +101,20 @@ 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; + in.nextToken(); n = (int) in.nval; + in.nextToken(); m = (int) in.nval; prepare(); + // 0号点是连通超级源点,保证图的连通性 + for (int i = 1; i <= n; i++) { + addEdge(0, i, 0); + } for (int i = 1, u, v, w; i <= m; i++) { - in.nextToken(); - u = (int) in.nval; - in.nextToken(); - v = (int) in.nval; - in.nextToken(); - w = (int) in.nval; + in.nextToken(); u = (int) in.nval; + in.nextToken(); v = (int) in.nval; + in.nextToken(); w = (int) in.nval; // 形式2的连边方式 addEdge(u, v, -w); } - for (int i = 1; i <= n; i++) { - addEdge(0, i, 0); - } if (spfa(0)) { out.println("NO"); } else { diff --git a/src/class142/Code02_KsFarm.java b/src/class142/Code02_KsFarm.java index 712fba514..2a22e40ce 100644 --- a/src/class142/Code02_KsFarm.java +++ b/src/class142/Code02_KsFarm.java @@ -2,9 +2,9 @@ // 小k的农场 // 一共有n个农场,编号1~n,给定m条关系,每条关系是如下三种形式中的一种 -// 关系 1 a b c : 表示农场a比农场b至少多种植了c个作物 -// 关系 2 a b c : 表示农场a比农场b至多多种植了c个作物 -// 关系 3 a b : 表示农场a和农场b种植了一样多的作物 +// 关系1 a b c : 表示农场a比农场b至少多种植了c个作物 +// 关系2 a b c : 表示农场a比农场b至多多种植了c个作物 +// 关系3 a b : 表示农场a和农场b种植了一样多的作物 // 如果关系之间能推出矛盾,打印"No",不存在矛盾,打印"Yes" // 1 <= n、m <= 5 * 10^3 // 1 <= c <= 5 * 10^3 @@ -102,13 +102,13 @@ public static void main(String[] args) throws IOException { in.nextToken(); m = (int) in.nval; prepare(); + for (int i = 1; i <= n; i++) { + addEdge(0, i, 0); + } for (int i = 1, type, u, v, w; i <= m; i++) { - in.nextToken(); - type = (int) in.nval; - in.nextToken(); - u = (int) in.nval; - in.nextToken(); - v = (int) in.nval; + in.nextToken(); type = (int) in.nval; + in.nextToken(); u = (int) in.nval; + in.nextToken(); v = (int) in.nval; if (type == 1) { in.nextToken(); w = (int) in.nval; @@ -122,9 +122,6 @@ public static void main(String[] args) throws IOException { addEdge(v, u, 0); } } - for (int i = 1; i <= n; i++) { - addEdge(0, i, 0); - } if (spfa(0)) { out.println("No"); } else { diff --git a/src/class142/Code03_LayoutCow.java b/src/class142/Code03_LayoutCow.java index 5988c0fc4..be50d2a50 100644 --- a/src/class142/Code03_LayoutCow.java +++ b/src/class142/Code03_LayoutCow.java @@ -1,14 +1,14 @@ package class142; // 布局奶牛 -// 一共有n只奶牛,编号1~n,有m1条好友信息,有m2条情敌信息 -// 所有奶牛需要排队,但是好友之间希望距离更近,情敌之间希望距离更远 -// 每条好友信息为 : u v w,表示u和v是好友,希望相隔的距离 <= w -// 每条好友信息为 : u v w,表示u和v是情敌,希望相隔的距离 >= w +// 编号1到编号n的奶牛从左往右站成一排,你可以决定任意相邻奶牛之间的距离 +// 有m1条好友信息,有m2条情敌信息,好友间希望距离更近,情敌间希望距离更远 +// 每条好友信息为 : u v w,表示希望u和v之间的距离 <= w,输入保证u < v +// 每条情敌信息为 : u v w,表示希望u和v之间的距离 >= w,输入保证u < v // 你需要安排奶牛的布局,满足所有的好友信息和情敌信息 // 如果不存在合法方案,返回-1 -// 如果存在合法方案,但是1号奶牛和n号奶牛相隔无穷远,返回-2 -// 否则,返回1号奶牛和n号奶牛之间的最大距离 +// 如果存在合法方案,返回1号奶牛和n号奶牛之间的最大距离 +// 如果存在合法方案,并且1号奶牛和n号奶牛之间的距离可以无穷远,返回-2 // 测试链接 : https://www.luogu.com.cn/problem/P4878 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -101,39 +101,34 @@ 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; prepare(); + // 0号点是连通超级源点,保证图的连通性 + for (int i = 1; i <= n; i++) { + addEdge(0, i, 0); + } + // 好友关系连边 for (int i = 1, u, v, w; i <= m1; i++) { - in.nextToken(); - u = (int) in.nval; - in.nextToken(); - v = (int) in.nval; - in.nextToken(); - w = (int) in.nval; + in.nextToken(); u = (int) in.nval; + in.nextToken(); v = (int) in.nval; + in.nextToken(); w = (int) in.nval; addEdge(u, v, w); } + // 情敌关系连边 for (int i = 1, u, v, w; i <= m2; i++) { - in.nextToken(); - u = (int) in.nval; - in.nextToken(); - v = (int) in.nval; - in.nextToken(); - w = (int) in.nval; + in.nextToken(); u = (int) in.nval; + in.nextToken(); v = (int) in.nval; + in.nextToken(); w = (int) in.nval; addEdge(v, u, -w); } + // 根据本题的模型,一定要增加如下的边,不然会出错 for (int i = 1; i < n; i++) { addEdge(i + 1, i, 0); } - for (int i = 1; i <= n; i++) { - addEdge(0, i, 0); - } int ans = spfa(0); - if (ans == -2 || ans == -1) { + if (ans == -1) { out.println(ans); } else { ans = spfa(1); From 8379c74ef2878959731955043ee96abd5b6dc4ec Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 6 Sep 2024 20:13:26 +0800 Subject: [PATCH 0117/2029] modify code --- src/class142/Code04_Measurer.java | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/src/class142/Code04_Measurer.java b/src/class142/Code04_Measurer.java index 537e0ceb6..9336b5255 100644 --- a/src/class142/Code04_Measurer.java +++ b/src/class142/Code04_Measurer.java @@ -106,7 +106,8 @@ public static boolean check(double limit) { if (vow[i][0] == 1) { 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])); + // 因为类型2的誓言是<关系,所以减去最小精度后,就可以认为是<=关系 + addEdge(vow[i][1], vow[i][2], Math.log(limit + vow[i][3] - sml)); } } // n+1号点是限制超级源点,保证确定得分的选手之间的关系 @@ -150,18 +151,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) { From 4dc154a028529986bdfec540a29e217f76c65844 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 6 Sep 2024 20:14:24 +0800 Subject: [PATCH 0118/2029] modify code --- src/class142/Code04_Measurer.java | 27 +++++++++------------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/src/class142/Code04_Measurer.java b/src/class142/Code04_Measurer.java index 9336b5255..8ab84269c 100644 --- a/src/class142/Code04_Measurer.java +++ b/src/class142/Code04_Measurer.java @@ -151,27 +151,18 @@ 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) { From 576f7a2ebb9c7580daf1148f1fb370ae9a059ac1 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 6 Sep 2024 21:22:05 +0800 Subject: [PATCH 0119/2029] modify code --- src/class142/Code04_Measurer.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/class142/Code04_Measurer.java b/src/class142/Code04_Measurer.java index 8ab84269c..521367652 100644 --- a/src/class142/Code04_Measurer.java +++ b/src/class142/Code04_Measurer.java @@ -95,6 +95,7 @@ public static double compute() { return ans; } + // 是否有人穿女装 public static boolean check(double limit) { prepare(); // 0号点是连通超级源点,保证图的连通 From 956582ec4bc4bf97219831bca8c3022f9ee168df Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 6 Sep 2024 22:29:32 +0800 Subject: [PATCH 0120/2029] modify code --- ...\345\210\206\347\272\246\346\235\237.pptx" | Bin 0 -> 49702 bytes src/class142/Code05_Balance.java | 20 ++++++++++-------- 2 files changed, 11 insertions(+), 9 deletions(-) create mode 100644 "ppt/\347\256\227\346\263\225\350\256\262\350\247\243142\343\200\220\346\211\251\345\261\225\343\200\221\350\264\237\347\216\257\345\222\214\345\267\256\345\210\206\347\272\246\346\235\237.pptx" diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243142\343\200\220\346\211\251\345\261\225\343\200\221\350\264\237\347\216\257\345\222\214\345\267\256\345\210\206\347\272\246\346\235\237.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243142\343\200\220\346\211\251\345\261\225\343\200\221\350\264\237\347\216\257\345\222\214\345\267\256\345\210\206\347\272\246\346\235\237.pptx" new file mode 100644 index 0000000000000000000000000000000000000000..ef62f0f47163672cb89e7c6f3cb0a6bf222e3c3e GIT binary patch literal 49702 zcmdqJRd8HevaTy;wiqmy#SA5828$UjW@ZM9u|yVH%*@QpY%w#V#nM%;?j5IB-@SI9 z6Z@?zqH4@J^)xbOewq1?Ovy`wL!g6zfWUy{)>3Fx1X^$`f7}Uxfq=k+po8c+7+X0q z(Esfh6a?kt4}boY14k{unGi(pAK`Mn#p2PWV6Tjn;Fc1BK7Q3~$ha#)s?tyQZ2mJy zK`3U)EiGK>-y2$$cv6vp%zH)#^L6@^kN5?w>TbL|bcFi9=o%QDoHS{S)0=*H#D{-Z zNaP6Zk3rWlXI3gn=YO%gh@L|bHV;bjEkM&mf=k#KJjf#q!gDgby z#?-8tvz!i-`p%6bK^JuT(^7jPssISe0AFs4HR8?h?lJbpt2iUA>!c{<-{VX^=rw+L z&L6cOMTlb}ib>7J)7bgl?l;WZHoW|w%mP8YfYI`?bv#fI5Y!K|7}*-iJJ{MeG8o!A z7}L91Tm5&&v5uCt3=%*Qxp;$1X>G6}g3!22Qo;n2)UOm?nKsBkF5t%T^`WTwAssE+ z?lI@SdaCK8WVEAGx!j^a&UqVe?^wyV{VONfYK~a0Qq!0CSqp~HNKd$nw%SDubQ@NcaQ*$hC|QP z0^Lis(DZd@U_0kf)VN@N!trgD#9__j6+BcgkeFUZ z!dawN-%!MF4nY|_%Jt}esgb?;@r_4{nR`=MXKadoLrB0OaG4D46yaRu8JY)9mF9s} z^>Ckk{GFU3%|ZjR*IU1`XlHN5DwZrzrC>tJ&Tq9>okhg2kICn=G)7rg>63VmuS+WweiQO*&V{iI`k8vkAx53+a_;s>u&8I=jT)trN0zd7Y3&lYFzjE*W9p}i-m6g!KYZoV5^2kpfwgayUw7PUJ2onaeK^5>ATUdbPfW?Tp zk)`q0s|cV%jU%3?LDP+9Ji3Z9{cx@J5SEk)mc-fk!RiQVXWB9f#6TcBa|6^%UDzSi zgsz3wW}8T9zhxR$c(QV99%Q`QGNMXN6`eCwHMh$+VYc$hGD!m{`T<5SS3VcBaReHT zaDrQO{#_7J;z5gS^F+rWo1~T=mBq$__1AW(J=9Jy9Th!FJwERGcDJ<@j;R3~dp*V+ z*)Y{hYruHZXMJs&wOcq?Ar`S)Fw!OwMi~F;BSe7qE0z0iiG+qJ%+oHAc9Ez`3*pbD zJfjhM&SXkz;HmAv6&uy#3=9sO{4*=3G|2G<3nhjJ6G(41*?Z{b1F@L|{UvtgV(Yb< zS(jg_j>bK4nMGm@>m zzI^5t?QPE`e4Z)Ok%=6pmx-K!)<4sbw#o)&Ut1Z?k!zv-qKiWR=m>amXfkMiI$b^l zk#eMR07e?3`BNJAi)O?(j_-^Il!Z@ULu#5>h1s}Ol6s0Arn3&*x+Wag_(vaAp9(H! zWGEA`xD;C~*IsAL3(NvC7507;^=FyZRXF47aP8- zIa+mB1Bjtgo`MdO)Gqt#K<}XKdjv%Ts!enc3?~CvQf9BYMGzf-LJ=b#j!px%vcQb# z+Bz5ewO;cmx7krh`cWkDCE~Kf$zs0+P|pa2QcHqf z{FksMrQVf2`a$*9e}uLFV&NaL?XN(X5hok*f%f2ww{T#qEOm{9`H3ix=i)0UaRJ5D za8Sy_)s3q>{AdgGlHrdwC50JO0#R$?LV`5}gqM1%J;x%gB-Fa#QUS?HH#ip6-!#e=6 z1J}a|A~0l_$0M5_Vv|hsM}p-^-Z#a7cj{rrF_e`uJw_A);vIF1kV~?$HJEHBm$enA@ z>1h05(Eil|>3N>swGn1EjOH~n&#@gge|JLj3Uo?R76&*1_0382r&qP9OFT1RS$5Wn zuI0yA`hn>+E5dXy_aluEHFA)FlW3__s0Jn-f37i!MrTO70=u!i@g41bP~3wPx^e@k_MA6CHphnE`KT3dg_M?q&N zGg}A8zkD&KWd9cPAve9hD%3QZi;9Go!)%Y_e(Z{TB&r92?uVTC*d!edREW&B~M`84VCR@({wgr`j7I-*3 z!a!k}I2gvPWZ0QWO;%zkk zKP=#AWo~3FYvAZ)?BK}oPd7||WsI}*6`K_RionJ*Mu09>g-BS-Vv!QysD&<8SKgH0 zFUedB##tlWB?A-kiSD_IaDicon0(p6QDK`6b1~JuO1u|GcQO{ecej63cA$)HPepTA z7?0Q0I$~dvN&2RL>TSnjHR3GUbW%4VFnoMHPD9 z73=Om+~;=yLP^LFW}~ahLWcWua#D6a4ti#B2<(oT!?tEW>v5I^W};r4@}g~m z66Z#Y3T2ZB&#PpUIyVf?4#Cn@vujkG_iQ)@XU9_n3gu6zF(PfWD8}ikIT_e%)>fcK zE*#9m($HRluB(#rTGUl?hWM^YXhaP!%%BT(Je*zCh$a!i8*RuOayt_4Tl$4xVVZ4b zb%VSKzrX304rlEqy2(b20ehzQSy3D2;_r;fEtITD=4l)GMuDV5DtxBJkvd6WyNikZ zvcG9N<5H;yA(sd>HT{i$db??!`!dowVb|tj0wQVtISLAzn{_Ja(JP zjiA|efcYNIGm%E%%GX6zh>MGf0ozl+v$^<=;e^Ywav zmTVebUWv_S=48KH?6u$A4k?OhCvu82Eqb3X{#k*Y+k-Zhz`eNPu4y%nd)~mw)6?x) z68NqRy}EZ<_t5_gKmV-4p8q154e!ZvSyO&II`!r#3Sit2sd1Hgl4bVrKca_);&hiuP~Yj1WSid6a=lu191M+38pA)`c7IUga|p8C93d)P8~ z7i9eKC0ypq)VpA0djUb#3xv6Yax7BKv#WzmYw=k|`b5!rU`v;#jfxS&>b_OM&=YP5 z*1-dQ=dmajY3DCjrt^LUxAh3acb={tKxB^E#wnespB@rE=e^_U>F>A+o7z;yx9Efg zC;wpfPmK3rh!VAyu?6s7k9mr3@{q`YWL3^k5n@xgUo9KhI~E=^1M8tIWwY4)7lJfD z^>7W$yx>ykKN|Pe4Xn?>(aobmf;vgsgeSUjE7hK47OcyX;BPG=GeJNRN+9}j-`Kcc zEJ4|fE?iWJ(rK+4oYY$dB58FR*#p^+7MRBuI2Pbz;op@5?L+Eo_kxR>`q>EYX zkvPwgqpBhlhm#>FGQNOCD_hYR5wlptS*TdE+PR(z&(gy%---wGGa+`Lu^NUPt--Gy zyjF{)AmnxNeor2*z-sr|+b8Acjpd_yB}&zO(U-klLy}`ymUS&$7pMcL3R%(lv2qVh z>%!>$ZO~Q<=avB2CySlA>)laR{9YvU=gZFv_~dZR<;hKFr~E2u-BiVtG8}b2g==(5 z#fk#|)vkXldfwy@Yfh zkwzi{pwgl6eW8(ju<>`rDOq>19dI2kqtmkj(-$KQg`XAr_DSbT$-5NFn~s&}AqXUskS-v~WXE4qL<|#A;}I_jYu@QThzL zTk&;dH*>ao>Ws$ECVPICN?fG$-L1}U^K(pvHDv5T>(j{K*D@Vi*haJm>}CFrcjJwi zjAzQzb7Q2zFZKbUJahL5>QH5dKN)TG&Jh20l_?-4QUyBd=X?q-wULO(rjJtnd`+)o+Z zu)2Tn@PFz29KA97!z=qHkS!l1B^*N5I<4C&{{hg+hq0|*j&uPyMrnNT`QeQ=iLDpT z7xbt>rFRc7XE=+b;4?2za|&&&P^zuqcMhSJp4D!C#>vqflaZ69S}g{RORr>kGj6b6 z$sWMc(xYJA>ZVZ+HDyAYtLT-7qq3!Gq!|KyEgFnG<;U^C$Mu?3^Mr*TTYLKUiAu|H zgjuR#E1{ffDM_gz+laH!N_yBOy(S%qkzPYUzT!9nCj~|I#ro@v-cKU=;8*F_Dd#wr#J$lr*poXoZDLmX^b@TjJV{`W&o1zZp~Jo6KjP&GN}^<=UcoGYI%$U)_~4JzaEcoLi=w*)HI&m7$;EZjgLrekg(6C+tJ)%mj$%YY~LB*$PO(vL|y$(>?UCiK=k`EFO=iYH#O?lyIWedDe+;)$&LXNaT zRQr_unr_d+Vd{_fLo77B8Alq6I9`MJdB@2bH?(Z;Mu2hz^jtRrS&RqIG|}*RrEL9^ z0wcW~%GVLqmXdWO^U_YdhY_Sn7Lb!-O*f?j{<$6xKs_MZp0XjKPD4Y@g<13YMc-1U zcHZL(p4XeCo~_AOB1|F2+=w6Xt%zPC5DmXRa}Q4pPn7IR?RGNoeOR(l~AYB#H#T9h8sfw zn#^C zEQs4Z^(oWd+Ot<%NF6{_^0@Kk2sM}`@>Q%T&@cH?lxDCtR+5&Tb}B4aN217`QTCgV zB6MPeEGIib&4zoRK>vsfb)1VbnnP&0^m=+PwBFnOWQY`>A)kP`Z^9{r*}mcvRn#tP zvQTQqc8D4L_?bHg;a)Mp<}?h0 zV)G^hXk=Ga!mADn)h6_|9QpA~n=^ab&)q8ZrBSG>7)y0iR;6Mqk|?$Kk{1SbkMAmL-{pqU%mpS@_E+X)E7&zs_w+`S zlp)0>JYx788jhzsw;q4r&BLqQ>c7@kEA-FD67uun{=AKg}OO}ExwvW z`q>Twz&wCjxfhCz4;me5-)GB-1|sf9YKRZ387<>S+7-tXEu$HY|MzE{W}M8B(IDaj z0A_1WX7ImX(HuK{VH`Vw$UXqD&m1-|+qs`zR+XW%3rMkW7%zh)W{!VUjRpdTfoXwq zMZTj1mr97Wd#QJ>ZHlp@vuX2ca6WdMW5+b#OHAg=A1i1enVRIYnp@;Uf1U_|zKp#O zPYM)$rUc9O*n|l>_9sOtfsX!o0Ql1b5OE@9WcR@|O`T3OW8?Ed8FB%G7Sb*T{hq_*a{4ce$ zjDfqYv(rCn=fB_lWz?Bh)A?KN>~lc{(a!x;?-R)-dTJE`In!6v4xL5Lg{DfEK3J_hV-qt~?oKtdB58N6k|sj(jwMNWEbwuU;6VuScab*i_Fj zn4`P`U93^%#O2q@-mm#}rfoKI^@z(`hRwz0Hm*$(6z3R5UA*SO;G>8NFV<<;goFDL zNx?iQT)-@ojp0ch`4hwU7klukX#RW?1JKnV7GFU{i8iqgzq6m)w}$L=kiF zy&RJyhw4Frv~5HS);rd-FxnNRfar7d_5$Oc=yJhR6o@Fp7JlAHmO9y^ z;l>$$fYnXu+-sN6H*J+b)@_CFBa;K@c$wv64va!rSih^je~o< zdcko)n}LZfA7@?;GSWdrqI^ zbB2I*zm{?YzRm{Tkr5~Y&-#|F(kTRvp(98R@WwfA;?VEjdV}Z9Wb;ehSnMyu4v3a_ z+lo?G!fsB+2NjOJ0N(eykt#acK<}G@t})=zK=2q1rA7amp+4K zJeJfZTwk+kAKU2Vg|RnnsCATX!40;>S!tU07X-raB#X`2PQEIR^~-3k&U;WOsHh*% zt=qTyPmEa$Hf-_vZTyyHUZ*8zQOo+y{s|hw$@EQUR-6NO&)T%(WPJ1lbfxXZyleT4 zaPypZuF4{iJ8#GKF}>Vf4z2>l98Os+vV^YJ^L9)nLFZaDk$cnBkl?N_DysDzz&7R` zWRFg+D{UF{N(0{3s}e3QEVf@5Rr(lNc^}R8Dq<%zs6UQzL9f6z&j<|34Z`Qd(9{e| zN}t_h#8n~uuATEO9{FOwp!(U6VL;G9{t*y0zWt4w5ZXS;sFK^VHH?eVvNi2hO05IQq#<?~f-JSPIlW zSL7oy*R;Jc6$;pqHABAS#cw~2O@-ZvxL0nWVY_&0SAM6NY+a~B1k&pFB5&|S=nsd3qVT)!f{)C^R6CQ(}S^ccVB3+ zjdii3XUH<6XIOuTZ4I)@0VDV`=vX8q!B;LG zI#$@ox>9T^1I1KSGuPAt3p3{---Yrw6L~LfV@{+%G{oSc?%rwp4D|uyaio6_W0t>y@wnQDWFm&*J*h_fFjY9z7LkC}#E?fxUT28Iwu$Ayz*6hDPiqReSii7?WDku1 z0>gIn+>ivwa@{4*zfAlbMGl;E_kG+az>A>n^!L=1&SDM4?hR9t7#^sgsR1*fq^A@X zIV-0clrN#`bag~(96_sC?Yar34<@(A^?pP5ZqZG~X(`Z%LXBI15ywav(Nai|sasf7 zDr1TcVm7RM*6x{fmbAt!M?Dnh|IuwcP@HAy9;dLXZf2NE`=GlMyvo9AzdHe%leO|y zUZM{RF4eb~1?hhg?gUlL&>T-I$67!pHx|E8IS0BD%K93=C|;F3b_?lGm

6;`!=yhr28pyVPH% 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

w*TE3lz7WQ0j(rQ|MnDiCA?!69I#3NPloJV| z?F(V7%-Dq%Vju{R5cc{DjrIo%&BsD$`$8C7me_@6lOPC?5cbw2Gy)SW^fMVk+ZV#v zg2XO_mkB|Dgs`_7p}`+up(9xk+P)CRmLl{q92ilR2SI>@u(uAO52wJi<@^I0+M_D; lvk>%#C>T(W!ok6CdsJ5gALuRN;G6|sgTP$|@#lM={sUCZMz{a~ literal 0 HcmV?d00001 diff --git a/src/class142/Code05_Balance.java b/src/class142/Code05_Balance.java index 391c57a53..0dd828a5f 100644 --- a/src/class142/Code05_Balance.java +++ b/src/class142/Code05_Balance.java @@ -22,10 +22,10 @@ public class Code05_Balance { public static int MAXN = 51; - public static int[][] dmax = new int[MAXN][MAXN]; - public static int[][] dmin = new int[MAXN][MAXN]; + public static int[][] dmax = new int[MAXN][MAXN]; + public static char[][] s = new char[MAXN][MAXN]; public static int n, a, b; @@ -37,28 +37,30 @@ public static void compute() { for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { if (s[i][j] == '=') { - dmax[i][j] = dmin[i][j] = 0; + dmin[i][j] = 0; + dmax[i][j] = 0; } else if (s[i][j] == '+') { - dmax[i][j] = 2; dmin[i][j] = 1; + dmax[i][j] = 2; } else if (s[i][j] == '-') { - dmax[i][j] = -1; dmin[i][j] = -2; + dmax[i][j] = -1; } else { - dmax[i][j] = 2; dmin[i][j] = -2; + dmax[i][j] = 2; } } } for (int i = 1; i <= n; i++) { - dmax[i][i] = dmin[i][i] = 0; + dmin[i][i] = 0; + dmax[i][i] = 0; } // 来自讲解065,Floyd算法 for (int bridge = 1; bridge <= n; bridge++) { for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { - dmax[i][j] = Math.min(dmax[i][bridge] + dmax[bridge][j], dmax[i][j]); - dmin[i][j] = Math.max(dmin[i][bridge] + dmin[bridge][j], dmin[i][j]); + dmin[i][j] = Math.max(dmin[i][j], dmin[i][bridge] + dmin[bridge][j]); + dmax[i][j] = Math.min(dmax[i][j], dmax[i][bridge] + dmax[bridge][j]); } } } From 00bca5917b09a55ace499035859390367be51c93 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 9 Sep 2024 16:05:45 +0800 Subject: [PATCH 0121/2029] modify code --- src/class143/Code01_Elevator.java | 155 ++++++++++++++++++++++++++ src/class143/Code02_MomoEquation.java | 122 ++++++++++++++++++++ 2 files changed, 277 insertions(+) create mode 100644 src/class143/Code01_Elevator.java create mode 100644 src/class143/Code02_MomoEquation.java diff --git a/src/class143/Code01_Elevator.java b/src/class143/Code01_Elevator.java new file mode 100644 index 000000000..0e3e790b9 --- /dev/null +++ b/src/class143/Code01_Elevator.java @@ -0,0 +1,155 @@ +package class143; + +// 跳楼机 +// 测试链接 : https://www.luogu.com.cn/problem/P3403 + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.PriorityQueue; +import java.util.StringTokenizer; + +public class Code01_Elevator { + + public static int MAXN = 100001; + + public static int MAXM = 200001; + + public static long h; + + public static int x, y, z; + + // 链式前向星需要 + public static int[] head = new int[MAXN]; + + public static int[] next = new int[MAXM]; + + public static int[] to = new int[MAXM]; + + public static long[] weight = new long[MAXM]; + + public static int cnt; + + // dijkstra算法需要 + public static PriorityQueue heap = new PriorityQueue<>((a, b) -> Long.compare(a[1], b[1])); + + public static long[] distance = new long[MAXN]; + + public static boolean[] visited = new boolean[MAXN]; + + public static void prepare() { + cnt = 1; + Arrays.fill(head, 0, x, 0); + heap.clear(); + Arrays.fill(distance, 0, x, Long.MAX_VALUE); + Arrays.fill(visited, 0, x, false); + } + + public static void addEdge(int u, int v, long w) { + next[cnt] = head[u]; + to[cnt] = v; + weight[cnt] = w; + head[u] = cnt++; + } + + public static long compute() { + dijkstra(); + long ans = 0; + for (int i = 0; i < x; i++) { + if (distance[i] <= h) { + ans += (h - distance[i]) / x + 1; + } + } + return ans; + } + + public static void dijkstra() { + heap.add(new long[] { 0, 0 }); + distance[0] = 0; + long[] curData; + int u; + long w; + while (!heap.isEmpty()) { + curData = heap.poll(); + u = (int) curData[0]; + w = curData[1]; + if (visited[u]) { + continue; + } + visited[u] = true; + for (int ei = head[u], v; ei > 0; ei = next[ei]) { + v = to[ei]; + if (!visited[v] && distance[v] > w + weight[ei]) { + distance[v] = w + weight[ei]; + heap.add(new long[] { v, distance[v] }); + } + } + } + } + + public static void main(String[] args) throws IOException { + Kattio io = new Kattio(); + h = io.nextLong() - 1; + x = io.nextInt(); + y = io.nextInt(); + z = io.nextInt(); + prepare(); + for (int i = 0; i < x; i++) { + addEdge(i, (i + y) % x, y); + addEdge(i, (i + z) % x, z); + } + io.println(compute()); + io.flush(); + io.close(); + } + + // Kattio类IO效率很好,但还是不如StreamTokenizer + // 只有StreamTokenizer无法正确处理时,才考虑使用这个类 + // 参考链接 : https://oi-wiki.org/lang/java-pro/ + public static class Kattio extends PrintWriter { + private BufferedReader r; + private StringTokenizer st; + + public Kattio() { + this(System.in, System.out); + } + + public Kattio(InputStream i, OutputStream o) { + super(o); + r = new BufferedReader(new InputStreamReader(i)); + } + + public Kattio(String intput, String output) throws IOException { + super(output); + r = new BufferedReader(new FileReader(intput)); + } + + public String next() { + try { + while (st == null || !st.hasMoreTokens()) + st = new StringTokenizer(r.readLine()); + return st.nextToken(); + } catch (Exception e) { + } + return null; + } + + public int nextInt() { + return Integer.parseInt(next()); + } + + public double nextDouble() { + return Double.parseDouble(next()); + } + + public long nextLong() { + return Long.parseLong(next()); + } + } + +} diff --git a/src/class143/Code02_MomoEquation.java b/src/class143/Code02_MomoEquation.java new file mode 100644 index 000000000..1aadd796e --- /dev/null +++ b/src/class143/Code02_MomoEquation.java @@ -0,0 +1,122 @@ +package class143; + +// 墨墨的等式 +// 测试链接 : https://www.luogu.com.cn/problem/P2371 + +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; +import java.util.PriorityQueue; + +public class Code02_MomoEquation { + + public static int MAXN = 500001; + + public static int MAXM = 5000001; + + public static int n, x; + + public static long l, r; + + // 链式前向星需要 + public static int[] head = new int[MAXN]; + + public static int[] next = new int[MAXM]; + + public static int[] to = new int[MAXM]; + + public static long[] weight = new long[MAXM]; + + public static int cnt; + + // dijkstra算法需要 + public static PriorityQueue heap = new PriorityQueue<>((a, b) -> Long.compare(a[1], b[1])); + + public static long[] distance = new long[MAXN]; + + public static boolean[] visited = new boolean[MAXN]; + + public static void prepare() { + cnt = 1; + Arrays.fill(head, 0, x, 0); + heap.clear(); + Arrays.fill(distance, 0, x, Long.MAX_VALUE); + Arrays.fill(visited, 0, x, false); + } + + public static void addEdge(int u, int v, long w) { + next[cnt] = head[u]; + to[cnt] = v; + weight[cnt] = w; + head[u] = cnt++; + } + + public static long compute() { + dijkstra(); + long ans = 0; + for (int i = 0; i < x; i++) { + if (r >= distance[i]) { + ans += (r - distance[i]) / x + 1; + } + if (l >= distance[i]) { + ans -= (l - distance[i]) / x + 1; + } + } + return ans; + } + + public static void dijkstra() { + heap.add(new long[] { 0, 0 }); + distance[0] = 0; + long[] curData; + int u; + long w; + while (!heap.isEmpty()) { + curData = heap.poll(); + u = (int) curData[0]; + w = curData[1]; + if (visited[u]) { + continue; + } + visited[u] = true; + for (int ei = head[u], v; ei > 0; ei = next[ei]) { + v = to[ei]; + if (!visited[v] && distance[v] > w + weight[ei]) { + distance[v] = w + weight[ei]; + heap.add(new long[] { v, distance[v] }); + } + } + } + } + + 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(); + l = (long) in.nval - 1; + in.nextToken(); + r = (long) in.nval; + in.nextToken(); + x = (int) in.nval; + prepare(); + for (int i = 1, y; i < n; i++) { + in.nextToken(); + y = (int) in.nval; + for (int j = 0; j < x; j++) { + addEdge(j, (j + y) % x, y); + } + } + out.println(compute()); + out.flush(); + out.close(); + br.close(); + } + +} From e02a31ee712ff7c1759068cd665d74af3718dc9c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 9 Sep 2024 22:36:33 +0800 Subject: [PATCH 0122/2029] modify code --- src/class143/Code01_Elevator.java | 4 +- src/class143/Code02_MomoEquation.java | 4 +- src/class143/Code03_CattleFence.java | 136 ++++++++++++++++++++++++++ 3 files changed, 140 insertions(+), 4 deletions(-) create mode 100644 src/class143/Code03_CattleFence.java diff --git a/src/class143/Code01_Elevator.java b/src/class143/Code01_Elevator.java index 0e3e790b9..cc9e55458 100644 --- a/src/class143/Code01_Elevator.java +++ b/src/class143/Code01_Elevator.java @@ -36,7 +36,7 @@ public class Code01_Elevator { public static int cnt; // dijkstra算法需要 - public static PriorityQueue heap = new PriorityQueue<>((a, b) -> Long.compare(a[1], b[1])); + public static PriorityQueue heap = new PriorityQueue<>((a, b) -> a[1] <= b[1] ? -1 : 1); public static long[] distance = new long[MAXN]; @@ -44,8 +44,8 @@ public class Code01_Elevator { public static void prepare() { cnt = 1; - Arrays.fill(head, 0, x, 0); heap.clear(); + Arrays.fill(head, 0, x, 0); Arrays.fill(distance, 0, x, Long.MAX_VALUE); Arrays.fill(visited, 0, x, false); } diff --git a/src/class143/Code02_MomoEquation.java b/src/class143/Code02_MomoEquation.java index 1aadd796e..de6b29be6 100644 --- a/src/class143/Code02_MomoEquation.java +++ b/src/class143/Code02_MomoEquation.java @@ -34,7 +34,7 @@ public class Code02_MomoEquation { public static int cnt; // dijkstra算法需要 - public static PriorityQueue heap = new PriorityQueue<>((a, b) -> Long.compare(a[1], b[1])); + public static PriorityQueue heap = new PriorityQueue<>((a, b) -> a[1] <= b[1] ? -1 : 1); public static long[] distance = new long[MAXN]; @@ -42,8 +42,8 @@ public class Code02_MomoEquation { public static void prepare() { cnt = 1; - Arrays.fill(head, 0, x, 0); heap.clear(); + Arrays.fill(head, 0, x, 0); Arrays.fill(distance, 0, x, Long.MAX_VALUE); Arrays.fill(visited, 0, x, false); } diff --git a/src/class143/Code03_CattleFence.java b/src/class143/Code03_CattleFence.java new file mode 100644 index 000000000..3147ead58 --- /dev/null +++ b/src/class143/Code03_CattleFence.java @@ -0,0 +1,136 @@ +package class143; + +// 牛场围栏 +// 测试链接 : https://www.luogu.com.cn/problem/P2662 + +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; +import java.util.PriorityQueue; + +public class Code03_CattleFence { + + public static int MAXN = 101; + + public static int MAXV = 3001; + + public static int MAXM = 30001; + + public static int inf = Integer.MAX_VALUE; + + public static int n, m, x; + + public static int[] arr = new int[MAXN]; + + public static boolean[] set = new boolean[MAXV]; + + // 链式前向星需要 + public static int[] head = new int[MAXV]; + + public static int[] next = new int[MAXM]; + + public static int[] to = new int[MAXM]; + + public static int[] weight = new int[MAXM]; + + public static int cnt; + + // dijkstra算法需要 + public static PriorityQueue heap = new PriorityQueue<>((a, b) -> a[1] - b[1]); + + public static int[] distance = new int[MAXV]; + + public static boolean[] visited = new boolean[MAXV]; + + public static void prepare() { + cnt = 1; + heap.clear(); + Arrays.fill(set, false); + Arrays.fill(head, 0, x, 0); + Arrays.fill(distance, 0, x, inf); + Arrays.fill(visited, 0, x, false); + } + + public static void addEdge(int u, int v, int w) { + next[cnt] = head[u]; + to[cnt] = v; + weight[cnt] = w; + head[u] = cnt++; + } + + public static void dijkstra() { + heap.add(new int[] { 0, 0 }); + distance[0] = 0; + int[] curData; + int u, w; + while (!heap.isEmpty()) { + curData = heap.poll(); + u = (int) curData[0]; + w = curData[1]; + if (visited[u]) { + continue; + } + visited[u] = true; + for (int ei = head[u], v; ei > 0; ei = next[ei]) { + v = to[ei]; + if (!visited[v] && distance[v] > w + weight[ei]) { + distance[v] = w + weight[ei]; + heap.add(new int[] { v, distance[v] }); + } + } + } + } + + public static int compute() { + int ans = 0; + if (x == 1) { + ans = -1; + } else { + for (int i = 1; i <= n; i++) { + for (int j = Math.max(1, arr[i] - m); j <= arr[i]; j++) { + if (!set[j]) { + set[j] = true; + for (int k = 0; k < x; k++) { + addEdge(k, (k + j) % x, j); + } + } + } + } + dijkstra(); + for (int i = 1; i < x; i++) { + if (distance[i] == inf) { + ans = -1; + break; + } + ans = Math.max(ans, distance[i] - x); + } + } + return ans; + } + + 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; + x = inf; + for (int i = 1; i <= n; i++) { + in.nextToken(); + arr[i] = (int) in.nval; + x = Math.min(x, Math.max(1, arr[i] - m)); + } + prepare(); + out.println(compute()); + out.flush(); + out.close(); + br.close(); + } + +} From 6fc66bae27fb6eb9e886114507ed7c9edd47fcbc Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 10 Sep 2024 22:19:39 +0800 Subject: [PATCH 0123/2029] modify code --- ...ttleFence.java => Code02_CattleFence.java} | 2 +- src/class143/Code03_CurrencySystem.java | 7 ++ ...quation.java => Code04_MomoEquation1.java} | 4 +- src/class143/Code04_MomoEquation2.java | 90 +++++++++++++++++++ src/class143/Code05_Knapsack.java | 85 ++++++++++++++++++ 5 files changed, 185 insertions(+), 3 deletions(-) rename src/class143/{Code03_CattleFence.java => Code02_CattleFence.java} (98%) create mode 100644 src/class143/Code03_CurrencySystem.java rename src/class143/{Code02_MomoEquation.java => Code04_MomoEquation1.java} (97%) create mode 100644 src/class143/Code04_MomoEquation2.java create mode 100644 src/class143/Code05_Knapsack.java diff --git a/src/class143/Code03_CattleFence.java b/src/class143/Code02_CattleFence.java similarity index 98% rename from src/class143/Code03_CattleFence.java rename to src/class143/Code02_CattleFence.java index 3147ead58..757e3c8dc 100644 --- a/src/class143/Code03_CattleFence.java +++ b/src/class143/Code02_CattleFence.java @@ -12,7 +12,7 @@ import java.util.Arrays; import java.util.PriorityQueue; -public class Code03_CattleFence { +public class Code02_CattleFence { public static int MAXN = 101; diff --git a/src/class143/Code03_CurrencySystem.java b/src/class143/Code03_CurrencySystem.java new file mode 100644 index 000000000..25b6782eb --- /dev/null +++ b/src/class143/Code03_CurrencySystem.java @@ -0,0 +1,7 @@ +package class143; + +// 货币系统 +// 测试链接 : https://www.luogu.com.cn/problem/P5020 +public class Code03_CurrencySystem { + +} diff --git a/src/class143/Code02_MomoEquation.java b/src/class143/Code04_MomoEquation1.java similarity index 97% rename from src/class143/Code02_MomoEquation.java rename to src/class143/Code04_MomoEquation1.java index de6b29be6..e6712e555 100644 --- a/src/class143/Code02_MomoEquation.java +++ b/src/class143/Code04_MomoEquation1.java @@ -1,6 +1,6 @@ package class143; -// 墨墨的等式 +// 墨墨的等式(dijkstra算法) // 测试链接 : https://www.luogu.com.cn/problem/P2371 import java.io.BufferedReader; @@ -12,7 +12,7 @@ import java.util.Arrays; import java.util.PriorityQueue; -public class Code02_MomoEquation { +public class Code04_MomoEquation1 { public static int MAXN = 500001; diff --git a/src/class143/Code04_MomoEquation2.java b/src/class143/Code04_MomoEquation2.java new file mode 100644 index 000000000..62bec1294 --- /dev/null +++ b/src/class143/Code04_MomoEquation2.java @@ -0,0 +1,90 @@ +package class143; + +// 墨墨的等式(两次转圈法) +// 测试链接 : https://www.luogu.com.cn/problem/P2371 + +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 Code04_MomoEquation2 { + + public static int MAXN = 500001; + + public static long inf = Long.MAX_VALUE; + + public static int[] arr = new int[MAXN]; + + public static long[] dp = new long[MAXN]; + + public static int n, x; + + public static long l, r; + + public static int gcd(int a, int b) { + return b == 0 ? a : gcd(b, a % b); + } + + public static long compute() { + Arrays.sort(arr, 1, n + 1); + int size = 0; + for (int i = 1; i <= n; i++) { + if (arr[i] != 0) { + arr[++size] = arr[i]; + } + } + if (size == 0) { + return 0; + } + x = arr[1]; + Arrays.fill(dp, 0, x, inf); + dp[0] = 0; + for (int i = 2, d; i <= size; i++) { + d = gcd(arr[i], x); + for (int j = 0; j < d; j++) { + for (int cur = j, next, times = 0; times < 2; times += cur == j ? 1 : 0) { + next = (cur + arr[i]) % x; + if (dp[cur] != inf) { + dp[next] = Math.min(dp[next], dp[cur] + arr[i]); + } + cur = next; + } + } + } + long ans = 0; + for (int i = 0; i < x; i++) { + if (r >= dp[i]) { + ans += Math.max(0, (r - dp[i]) / x + 1); + } + if (l >= dp[i]) { + ans -= Math.max(0, (l - dp[i]) / x + 1); + } + } + return ans; + } + + 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(); + l = (long) in.nval - 1; + in.nextToken(); + r = (long) in.nval; + for (int i = 1; i <= n; i++) { + in.nextToken(); + arr[i] = (int) in.nval; + } + out.println(compute()); + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class143/Code05_Knapsack.java b/src/class143/Code05_Knapsack.java new file mode 100644 index 000000000..790c8252e --- /dev/null +++ b/src/class143/Code05_Knapsack.java @@ -0,0 +1,85 @@ +package class143; + +// 背包(两次转圈法) +// 测试链接 : https://www.luogu.com.cn/problem/P9140 + +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 Code05_Knapsack { + + public static int MAXN = 100001; + + public static long inf = Long.MIN_VALUE; + + public static int[] value = new int[MAXN]; + + public static int[] cost = new int[MAXN]; + + public static long[] dp = new long[MAXN]; + + public static int n, x, y; + + public static int gcd(int a, int b) { + return b == 0 ? a : gcd(b, a % b); + } + + public static void compute() { + Arrays.fill(dp, 0, x, inf); + dp[0] = 0; + for (int i = 1; i <= n; i++) { + for (int j = 0, d = gcd(cost[i], x); j < d; j++) { + for (int cur = j, next, times = 0; times < 2; times += cur == j ? 1 : 0) { + next = (cur + cost[i]) % x; + if (dp[cur] != inf) { + dp[next] = Math.max(dp[next], dp[cur] - (long) ((cur + cost[i]) / x) * y + value[i]); + } + cur = next; + } + } + } + } + + 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(); + int query = (int) in.nval; + x = 1; + y = 0; + for (int i = 1; i <= n; i++) { + in.nextToken(); + cost[i] = (int) in.nval; + in.nextToken(); + value[i] = (int) in.nval; + if ((long) y * cost[i] < (long) x * value[i]) { + x = cost[i]; + y = value[i]; + } + } + compute(); + long jobv; + for (int i = 1, cur; i <= query; i++) { + in.nextToken(); + jobv = (long) in.nval; + cur = (int) (jobv % x); + if (dp[cur] == inf) { + out.println("-1"); + } else { + out.println(dp[cur] + jobv / x * y); + } + } + out.flush(); + out.close(); + br.close(); + } + +} From 7d5d8e523eb91024dd723e8369c89d85832d1af0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 11 Sep 2024 12:02:00 +0800 Subject: [PATCH 0124/2029] modify code --- src/class143/Code05_Knapsack.java | 33 ++++++++++++++++--------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/src/class143/Code05_Knapsack.java b/src/class143/Code05_Knapsack.java index 790c8252e..974b7d3b9 100644 --- a/src/class143/Code05_Knapsack.java +++ b/src/class143/Code05_Knapsack.java @@ -17,9 +17,9 @@ public class Code05_Knapsack { public static long inf = Long.MIN_VALUE; - public static int[] value = new int[MAXN]; + public static int[] v = new int[MAXN]; - public static int[] cost = new int[MAXN]; + public static int[] c = new int[MAXN]; public static long[] dp = new long[MAXN]; @@ -33,11 +33,11 @@ public static void compute() { Arrays.fill(dp, 0, x, inf); dp[0] = 0; for (int i = 1; i <= n; i++) { - for (int j = 0, d = gcd(cost[i], x); j < d; j++) { + for (int j = 0, d = gcd(v[i], x); j < d; j++) { for (int cur = j, next, times = 0; times < 2; times += cur == j ? 1 : 0) { - next = (cur + cost[i]) % x; + next = (cur + v[i]) % x; if (dp[cur] != inf) { - dp[next] = Math.max(dp[next], dp[cur] - (long) ((cur + cost[i]) / x) * y + value[i]); + dp[next] = Math.max(dp[next], dp[cur] - (long) ((cur + v[i]) / x) * y + c[i]); } cur = next; } @@ -53,28 +53,29 @@ public static void main(String[] args) throws IOException { n = (int) in.nval; in.nextToken(); int query = (int) in.nval; - x = 1; - y = 0; + double best = 0, ratio; for (int i = 1; i <= n; i++) { in.nextToken(); - cost[i] = (int) in.nval; + v[i] = (int) in.nval; in.nextToken(); - value[i] = (int) in.nval; - if ((long) y * cost[i] < (long) x * value[i]) { - x = cost[i]; - y = value[i]; + c[i] = (int) in.nval; + ratio = (double) c[i] / v[i]; + if (ratio > best) { + best = ratio; + x = v[i]; + y = c[i]; } } compute(); long jobv; - for (int i = 1, cur; i <= query; i++) { + for (int i = 1, v; i <= query; i++) { in.nextToken(); jobv = (long) in.nval; - cur = (int) (jobv % x); - if (dp[cur] == inf) { + v = (int) (jobv % x); + if (dp[v] == inf) { out.println("-1"); } else { - out.println(dp[cur] + jobv / x * y); + out.println(dp[v] + jobv / x * y); } } out.flush(); From 3054f227407026b2c41779a128a711f74731555a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 11 Sep 2024 13:22:21 +0800 Subject: [PATCH 0125/2029] modify code --- src/class143/Code03_CurrencySystem.java | 7 --- src/class143/Code03_SmallMultiple.java | 58 +++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 7 deletions(-) delete mode 100644 src/class143/Code03_CurrencySystem.java create mode 100644 src/class143/Code03_SmallMultiple.java diff --git a/src/class143/Code03_CurrencySystem.java b/src/class143/Code03_CurrencySystem.java deleted file mode 100644 index 25b6782eb..000000000 --- a/src/class143/Code03_CurrencySystem.java +++ /dev/null @@ -1,7 +0,0 @@ -package class143; - -// 货币系统 -// 测试链接 : https://www.luogu.com.cn/problem/P5020 -public class Code03_CurrencySystem { - -} diff --git a/src/class143/Code03_SmallMultiple.java b/src/class143/Code03_SmallMultiple.java new file mode 100644 index 000000000..af9e2f850 --- /dev/null +++ b/src/class143/Code03_SmallMultiple.java @@ -0,0 +1,58 @@ +package class143; + +// 整数倍的最小数位和 +// 测试链接 : https://www.luogu.com.cn/problem/AT_arc084_b +// 测试链接 : https://atcoder.jp/contests/abc077/tasks/arc084_b + +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.ArrayDeque; + +public class Code03_SmallMultiple { + + public static int MAXN = 100001; + + public static boolean[] visit = new boolean[MAXN]; + + public static ArrayDeque deque = new ArrayDeque<>(); + + public static int k; + + 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(); + k = (int) in.nval; + out.println(bfs()); + out.flush(); + out.close(); + br.close(); + } + + public static int bfs() { + deque.clear(); + deque.add(new int[] { 1, 1 }); + int[] cur; + int mod, cost; + while (!deque.isEmpty()) { + cur = deque.pollFirst(); + mod = cur[0]; + cost = cur[1]; + if (!visit[mod]) { + visit[mod] = true; + if (mod == 0) { + return cost; + } + deque.addFirst(new int[] { (mod * 10) % k, cost }); + deque.addLast(new int[] { (mod + 1) % k, cost + 1 }); + } + } + return -1; + } + +} From 2fe8db468b2d9f078b1e953bba13d4de906194fa Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 11 Sep 2024 13:26:56 +0800 Subject: [PATCH 0126/2029] modify code --- src/class143/Code03_SmallMultiple.java | 29 +++++++++++++------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/src/class143/Code03_SmallMultiple.java b/src/class143/Code03_SmallMultiple.java index af9e2f850..bdca1df5c 100644 --- a/src/class143/Code03_SmallMultiple.java +++ b/src/class143/Code03_SmallMultiple.java @@ -14,26 +14,15 @@ public class Code03_SmallMultiple { - public static int MAXN = 100001; + public static int MAXK = 100001; - public static boolean[] visit = new boolean[MAXN]; + public static boolean[] visit = new boolean[MAXK]; public static ArrayDeque deque = new ArrayDeque<>(); public static int k; - 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(); - k = (int) in.nval; - out.println(bfs()); - out.flush(); - out.close(); - br.close(); - } - + // 来自讲解062,01bfs public static int bfs() { deque.clear(); deque.add(new int[] { 1, 1 }); @@ -55,4 +44,16 @@ public static int bfs() { return -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)); + in.nextToken(); + k = (int) in.nval; + out.println(bfs()); + out.flush(); + out.close(); + br.close(); + } + } From 7deea714f6f3825fdb315fd06aac7965c4b84783 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 11 Sep 2024 13:27:58 +0800 Subject: [PATCH 0127/2029] modify code --- src/class143/Code03_SmallMultiple.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/class143/Code03_SmallMultiple.java b/src/class143/Code03_SmallMultiple.java index bdca1df5c..774fe0a62 100644 --- a/src/class143/Code03_SmallMultiple.java +++ b/src/class143/Code03_SmallMultiple.java @@ -16,11 +16,12 @@ public class Code03_SmallMultiple { public static int MAXK = 100001; - public static boolean[] visit = new boolean[MAXK]; + public static int k; + // 01bfs需要 public static ArrayDeque deque = new ArrayDeque<>(); - public static int k; + public static boolean[] visit = new boolean[MAXK]; // 来自讲解062,01bfs public static int bfs() { From 7da08cf272f28bbe403e328d3f4c90a6f009784f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 12 Sep 2024 18:05:05 +0800 Subject: [PATCH 0128/2029] modify code --- src/class049/Code04_GasStation.java | 23 +++--- ..._ReplaceTheSubstringForBalancedString.java | 70 +++++++------------ 2 files changed, 33 insertions(+), 60 deletions(-) diff --git a/src/class049/Code04_GasStation.java b/src/class049/Code04_GasStation.java index 638589a1b..e3f85597c 100644 --- a/src/class049/Code04_GasStation.java +++ b/src/class049/Code04_GasStation.java @@ -12,23 +12,18 @@ public class Code04_GasStation { public static int canCompleteCircuit(int[] gas, int[] cost) { int n = gas.length; - // 车辆尝试从0~n-1出发,看能不能走一圈,l - // r : 窗口即将进来数字的位置 - // len : 窗口大小 - // sum : 窗口累加和 - for (int l = 0, r = 0, len = 0, sum = 0; l < n; l++) { - while (sum >= 0) { - // 当前窗口累加和>=0,尝试扩 - if (len == n) { + // 本来下标是0..n-1,概念上扩展到0...2*n-1 + // 那么从任何点出发的情况都可以包括了,i位置的信息在(i%n)位置 + // 窗口范围[l..r),左闭右开,也就是说r是窗口的下一个位置 + for (int l = 0, r = 0, sum; l < n; l = r + 1, r = l) { + sum = 0; + while (sum + gas[r % n] - cost[r % n] >= 0) { + if (r - l == n) { return l; } - // r : 窗口即将进来数字的位置 - r = (l + (len++)) % n; - sum += gas[r] - cost[r]; + sum += gas[r % n] - cost[r % n]; + r++; } - // sum < 0,此时l位置无法转一圈 - len--; - sum -= gas[l] - cost[l]; } return -1; } diff --git a/src/class049/Code05_ReplaceTheSubstringForBalancedString.java b/src/class049/Code05_ReplaceTheSubstringForBalancedString.java index 556d1c451..670c40a4f 100644 --- a/src/class049/Code05_ReplaceTheSubstringForBalancedString.java +++ b/src/class049/Code05_ReplaceTheSubstringForBalancedString.java @@ -10,62 +10,40 @@ // 测试链接 : https://leetcode.cn/problems/replace-the-substring-for-balanced-string/ public class Code05_ReplaceTheSubstringForBalancedString { - // Q W E R - // 0 1 2 3 - // "W Q Q R R E" - // 1 0 0 3 3 2 - // cnts[1] = 1; - // cnts[0] = 2; - // cnts[2] = 1; - // cnts[3] = 2; public static int balancedString(String str) { int n = str.length(); - int[] arr = new int[n]; + int[] s = new int[n]; int[] cnts = new int[4]; for (int i = 0; i < n; i++) { char c = str.charAt(i); - arr[i] = c == 'W' ? 1 : (c == 'E' ? 2 : (c == 'R' ? 3 : 0)); - cnts[arr[i]]++; + s[i] = c == 'W' ? 1 : (c == 'E' ? 2 : (c == 'R' ? 3 : 0)); + cnts[s[i]]++; } - // str : 长度是4的整数倍,n - // 每种字符出现的个数 : n/4 - int require = n / 4; - // 至少要修改多长的子串,才能做到四种字符一样多 - int ans = n; - // 自由变化的窗口l....r - for (int l = 0, r = 0; l < n; l++) { - // l = 0, r= 0, 窗口0长度 - // l...r-1 : [l,r) - while (!ok(cnts, r - l, require) && r < n) { - // cnts : 窗口之外的统计 - cnts[arr[r++]]--; - } - // 1) l...r-1 [l,r) ,做到了! - // 2) r == n,也没做到 - if (ok(cnts, r - l, require)) { - ans = Math.min(ans, r - l); + int debt = 0; + for (int i = 0; i < 4; i++) { + if (cnts[i] < n / 4) { + cnts[i] = 0; + } else { + cnts[i] = n / 4 - cnts[i]; + debt -= cnts[i]; } - // [l,r),不被cnts统计到的 - // l+1 - cnts[arr[l]]++; } - return ans; - } - - // cnts : l...r范围上的字符不算!在自由变化的窗口之外,每一种字符的词频统计 - // len : 自由变化窗口的长度 - // require : 每一种字符都要达到的数量 - // 返回值 : 请问能不能做到 - public static boolean ok(int[] cnts, int len, int require) { - for (int i = 0; i < 4; i++) { - // 0 1 2 3 - if (cnts[i] > require) { - return false; + if (debt == 0) { + return 0; + } + int ans = Integer.MAX_VALUE; + for (int l = 0, r = 0; r < n; r++) { + if (cnts[s[r]]++ < 0) { + debt--; + } + if (debt == 0) { + while (cnts[s[l]] > 0) { + cnts[s[l++]]--; + } + ans = Math.min(ans, r - l + 1); } - // require - cnts[i] : 20 - 16 = 4 - len -= require - cnts[i]; } - return len == 0; + return ans; } } From dfc64de5924d842746ef71405a57ab46a076849c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 12 Sep 2024 18:33:03 +0800 Subject: [PATCH 0129/2029] modify code --- src/class049/Code04_GasStation.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class049/Code04_GasStation.java b/src/class049/Code04_GasStation.java index e3f85597c..0709c91c2 100644 --- a/src/class049/Code04_GasStation.java +++ b/src/class049/Code04_GasStation.java @@ -14,7 +14,7 @@ public static int canCompleteCircuit(int[] gas, int[] cost) { int n = gas.length; // 本来下标是0..n-1,概念上扩展到0...2*n-1 // 那么从任何点出发的情况都可以包括了,i位置的信息在(i%n)位置 - // 窗口范围[l..r),左闭右开,也就是说r是窗口的下一个位置 + // 窗口范围[l..r),左闭右开,r是窗口的下一个位置(到不了的位置) for (int l = 0, r = 0, sum; l < n; l = r + 1, r = l) { sum = 0; while (sum + gas[r % n] - cost[r % n] >= 0) { From 6f4706cd002f0ee16ce4fa2a08e524b1cb278651 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 12 Sep 2024 20:05:43 +0800 Subject: [PATCH 0130/2029] modify code --- ...\345\205\263\351\242\230\347\233\256.pptx" | Bin 48307 -> 48297 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243049\343\200\220\345\277\205\345\244\207\343\200\221\346\273\221\345\212\250\347\252\227\345\217\243\346\212\200\345\267\247\344\270\216\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\243049\343\200\220\345\277\205\345\244\207\343\200\221\346\273\221\345\212\250\347\252\227\345\217\243\346\212\200\345\267\247\344\270\216\347\233\270\345\205\263\351\242\230\347\233\256.pptx" index c5805478eae3dceb780896c1e034ebd60599dce6..57f52367f8b882a057350123a33f97160fa9c54e 100644 GIT binary patch delta 3013 zcmZ9Oc|4TcAIE2GW$e2xezUQ3RYtA99Fc4Q5IIYYWnfPHa*nU`EjgTL3=0%uleM9h3LVv?D>R}rz`3;rEbL{;0*o-&>V81QK#KGZeU#2*t`B8p z45)NCqY?pF9fz6_Gwz0l<}Hr^5~fgM+4L8PN%NNbpcSs4(uNw_vie}a4yIEsr&#~) zzzuQlj5I0GCWNk>m_1Z((O!iPJDdfhq02Y?q#0naR;I0}6V4dgj;-=pWCU=~6l${C z*&6DG%^f;H63=;8=#VaX`+^F%n7lIemZ>+lI^U0X&cJe1dpIY5`kUxzUE#uqw_tKTlmv2_+&E;m?vm|?IS!1;y{ z;C@FMkNw7`szLcmDSgl(DOrR;A`4g1xV!U35wEE(IX1FWau-w*3v*3ikLvdGCb8vv zGRJb$%*HEvPjCL!*F!}b9=I}s#v~oQjsGyGosIc}ej{h-{OcqQKBXsG2-xQ%@a zd6u6eLR}uOgW@*nmS0T}4I^dQCpQf(Rw~HjQ={JZ9=uhMT5-Jr*WRjm`~CqJNpXT3 zMv+&YQ#gfaWTQdEc9c&#>1uUF7GO}pkzKFamA%&(t~v3od?>KfbW}A8x_jj_FBQ(7 zJ=Q7v^?g0l)k$t9&-o=MWkdOdspNIsSOvqiL=pX$15F%d)Z1KAeeG_-4E-ZIH@Ys5 z;>)of;>uTby#?)O>ZF-mZAnTVaXM5^9^Lg2_qdbBNv>}?TD0tKuf#T)^8lBQYpF%4 zmpr5z#bZmDvLD4~uwOph*(fk{Q$Er}D03B8hSMEwwpGoZbt=8aWi=w!^^o^P$bR`j zL}6nHfV&xbs?%j{}DfrI?5Ipe)?%5p9E; z$!^}?9tA8`Val6Q;OU8Om4_4>^-eJ8!DN44xGk);(oQovNH`^nN^;Z9J^qP6NSIjg zQV;Z!DEmCPtdEzA{vqE)c53fQ;G3u~7fEP}bnF-#;!}|N(J%1 zI42cm>n&j@*MLP$FC2KSz$yH=Q^c+6r5|r|#z>?2S`Tf`#b;)UFAgPm%en(SZx^z{ zSA@#y^tUlSLJZap|KK>#Uty#yhWFh_!=m8G>7pNeL{!#E&oryJht1yJ%fvP&J5(fb z;tj1l!ThcEuuOD*=CjtrV^ew|hAr<>AN6Nt#;W!9Sv@ca+}F>B={LA^6M(aEZ%{i5 zRjC7Idii~R1DeqVetxfKG*(w_7MdAX*F(quK?R3;eo{X~a~v%k(zKnX;t@~g`3c9~ z|BQUKAR1};Y|4@AEcODrQ3boU)>}Q&RytNETF=VvJ91~m?2xu|4~xvIiLeTs=|Jg=;p=@=#)HC^mnpuo~y_u9Ilmp|trx5{^=;%8tKCg+rZ9N1x zr2rz03KyQmUBW~hvpDCNkH4t;HO#iP@<3qub&PXZ8vS5N%1QVri}yWO0#Y%8c%O)yFV@NJQkhRqXE(m;ZM{2l zF2jgaTwN-g46E>-+te9@0FH3@>k47`jc>3!4=$UcG2`!?vqwKg#L+vM?rqUWl z95Y8ZCVisLn{=5{e@rxg>wNxZI8$nN(5F?_viW&R0XLNZ6P@oq`st1UI=g8@(K_&C zevG->*IHqosIH{huC8|uO0Mp6hbn#V8BAoA`fn=J>g%$@Dk#~t95rb$1p~52IU8nq zaicI*fB28~=OOI0Pmy!gHEebvY(nm=0!kZ?bMfMD+XZM`Hyd3yVgLIG*}iM$z<+=6 zzHv?_(OnENlP2cgTub1baZ%!3jMuHMS$49 zq3N3TC=yUCgDQBI?Rt?w{|@CX-=$C^ls$q3WGbMvTg9#q3H0tzj!HTjS_yf{mF8g6 z6(l4eK{^J0IFoj%9Z1-#b_o&)t%7_t^i;AMqAt~R-ku%GL8hZ&WXM}fhPv8U1Fgxq z2HM=b8a;6CF$(ftts1D+Yxf|Kv_o6zsZ<^0wXLJ`l6L46JvFLV`@hFVY`y00tc<1r z3SJyTc?XyR#rOiB$%cqm}pAO(87e}5VRHyh+w>WEwO{R^IZO{xF@ delta 3011 zcmZ9Oc_374AIE0~6N4eLjjdrUNkol??_bEa+8WwvRsO+b>o~e?|aTa-{iV!lB(F+ulDkO~kB zhHdY}&!QpbfK%dKR{)Zr3)s>zK!pNaDN2zFZLyF9G#n_X;>u;uVqk!rZLs}N7%J-poN&J5?4RJmmKHEpu#d3z z2>jK;i$DyB0v@T7ET`~M_gdL4pI=EzOCZvG6>t^QL_^`!QT z)|<()Mb+Ol>nZ$gJf}_80?*+cPP4;`m6ko;Q^qFt3};P0?pjz#5a>a;ULg+E1m75B zS|i*uh~4yOSzq3990@yaOYf$aCGnJY|V0^&KRq0?_eC+uS#C_-{ej%_d6pV zUY%g|PK-9<5`Ug^*uv(KYVVHr?5kjUz<)X#Xbvw1ZzX6RQg7izE3kX$A5vt!LmHlq zkw%^LBPeRXW2d^xXe4vu;txy1K5WwL63`Qk1Uf1l>#C^0Nld-`g293wt3#;Aa{ zm$p5OYG>&F9zjIYNvTIa8YxTTkFZL;Dx3ppI*Q*Kjgn$czBSVH&dVaSe~Z>uO|)rL zQcO3+xp+|Wk`5km%4{)r$P3bGzoYxm6mC?Bkx_4vz#U`b{7ztH-%u>glQr5yRXZb-)kbtwDAHNQ88#(@M%!%psU9lE{hcf9-seQHGbB08eSn$F(8t+zLY6SJ+=_|5I&_(saYgZNlxy5T>s zygh7<8Mf-=-QCF6VA0fROsBVKhG$4&eRv_YDRMFruYO7KjF7kF86Q0v=QHh||5bOk zNG<$OH=BJqiEbk86=1h0=r^t>fQ&87S$HEoGnsP?mDpBs2WXPFFUVVTQ4+Tq6Zau7 zG(K9JGR>8XXtTB_6GVj1y;W<@Z#bBt!y1t`!gkV>$)*al^Bbbt70%y}i`G3v0&0p$}nO#wOvA_=cov7LSX>j5?)jEm@4#p0}->VNPYWn@uR*RquFNcM!)Bue@?cq?McTdbx|{p z_;?CGp=>WOGzdCKPRk?HWQ3anCG+Vc?u6E1ai@xD>_9~%qKrUCm zGv0G72UK&A6v$yB)VFEsZj|p3JuBS49M}%4HTb$z87Xk*dv?6-J2@ z#_A3n{N~av2Riy*b>DPXk* z?%k~xo@sjRJ}6&h0}hz4-3cu;>bPip9ZW%PDqRm#`+6>K$xk}OO^q6M{@*p@QiH*- zvM3h-m0gNy;DKy7G= zZ^R*^0pms`{Mrp?H2K&gogbGph6Dm3{^Ksb@f<8d0HmTVl8$zK=rwBk;~f-3ARd&g Gt^NfQmilu5 From ca8ce2459d4c87612b5caa86fb6baa3592e5ed78 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 12 Sep 2024 20:29:16 +0800 Subject: [PATCH 0131/2029] modify code --- src/class049/Code06_SubarraysWithKDifferentIntegers.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/class049/Code06_SubarraysWithKDifferentIntegers.java b/src/class049/Code06_SubarraysWithKDifferentIntegers.java index c159891fc..0d6fcb6e3 100644 --- a/src/class049/Code06_SubarraysWithKDifferentIntegers.java +++ b/src/class049/Code06_SubarraysWithKDifferentIntegers.java @@ -25,22 +25,14 @@ public static int numsOfMostKinds(int[] arr, int k) { Arrays.fill(cnts, 1, arr.length + 1, 0); int ans = 0; for (int l = 0, r = 0, collect = 0; r < arr.length; r++) { - // r(刚进) if (++cnts[arr[r]] == 1) { collect++; } - // l.....r 要求不超过3种,已经4种,l往右(吐数字) while (collect > k) { if (--cnts[arr[l++]] == 0) { collect--; } } - // l.....r不超过了 - // 0...3 - // 0~3 - // 1~3 - // 2~3 - // 3~3 ans += r - l + 1; } return ans; From d18d899578006182d1ffece7f55e499b49a0be46 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 12 Sep 2024 21:41:43 +0800 Subject: [PATCH 0132/2029] modify code --- src/class143/Code01_Elevator.java | 8 ++++++++ src/class143/Code02_CattleFence.java | 8 ++++++++ src/class143/Code03_SmallMultiple.java | 4 +++- src/class143/Code04_MomoEquation1.java | 12 +++++++++--- src/class143/Code04_MomoEquation2.java | 24 +++++++++++++++--------- src/class143/Code05_Knapsack.java | 15 ++++++++++++--- 6 files changed, 55 insertions(+), 16 deletions(-) diff --git a/src/class143/Code01_Elevator.java b/src/class143/Code01_Elevator.java index cc9e55458..d3057ba4a 100644 --- a/src/class143/Code01_Elevator.java +++ b/src/class143/Code01_Elevator.java @@ -1,6 +1,14 @@ package class143; // 跳楼机 +// 一座大楼一共有h层,楼层编号1~h,有如下四种移动方式 +// 1, 向上移动x层 +// 2, 向上移动y层 +// 3, 向上移动z层 +// 4, 回到1层 +// 假设你正在第1层,请问大楼里有多少楼层你可以到达 +// 1 <= h <= 2^63 - 1 +// 1 <= x、y、z <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3403 import java.io.BufferedReader; diff --git a/src/class143/Code02_CattleFence.java b/src/class143/Code02_CattleFence.java index 757e3c8dc..a44cf61c4 100644 --- a/src/class143/Code02_CattleFence.java +++ b/src/class143/Code02_CattleFence.java @@ -1,6 +1,14 @@ package class143; // 牛场围栏 +// 给定一个长度为n的数组arr, arr[i]代表第i种木棍的长度,每种木棍有无穷多个 +// 给定一个正数m,表示你可以把任何一根木棍消去最多m的长度,同一种木棍可以消去不同的长度 +// 你可以随意拼接木棍形成一个长度,返回不能拼出来的长度中,最大值是多少 +// 如果你可以拼出所有的长度,返回-1 +// 如果不能拼出来的长度有无穷多,返回-1 +// 1 <= n <= 100 +// 1 <= arr[i] <= 3000 +// 1 <= m <= 3000 // 测试链接 : https://www.luogu.com.cn/problem/P2662 import java.io.BufferedReader; diff --git a/src/class143/Code03_SmallMultiple.java b/src/class143/Code03_SmallMultiple.java index 774fe0a62..d2bd94b49 100644 --- a/src/class143/Code03_SmallMultiple.java +++ b/src/class143/Code03_SmallMultiple.java @@ -1,6 +1,8 @@ package class143; -// 整数倍的最小数位和 +// 正整数倍的最小数位和 +// 给定一个整数k,求一个k的正整数倍s,使得在十进制下,s的数位累加和最小 +// 2 <= k <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/AT_arc084_b // 测试链接 : https://atcoder.jp/contests/abc077/tasks/arc084_b diff --git a/src/class143/Code04_MomoEquation1.java b/src/class143/Code04_MomoEquation1.java index e6712e555..ff2b1ce66 100644 --- a/src/class143/Code04_MomoEquation1.java +++ b/src/class143/Code04_MomoEquation1.java @@ -1,6 +1,12 @@ package class143; // 墨墨的等式(dijkstra算法) +// 一共有n种物品,第i种物品价值是v[i],每种物品可以选择任意个,个数不能是负数 +// 那么各种物品组合在一起可以形成很多价值累加和 +// 请问在[l...r]范围上,其中有多少个数是能被组成的价值累加和 +// 0 <= n <= 12 +// 0 <= v[i] <= 5 * 10^5 +// 1 <= l <= r <= 10^12 // 测试链接 : https://www.luogu.com.cn/problem/P2371 import java.io.BufferedReader; @@ -106,11 +112,11 @@ public static void main(String[] args) throws IOException { in.nextToken(); x = (int) in.nval; prepare(); - for (int i = 1, y; i < n; i++) { + for (int i = 1, vi; i < n; i++) { in.nextToken(); - y = (int) in.nval; + vi = (int) in.nval; for (int j = 0; j < x; j++) { - addEdge(j, (j + y) % x, y); + addEdge(j, (j + vi) % x, vi); } } out.println(compute()); diff --git a/src/class143/Code04_MomoEquation2.java b/src/class143/Code04_MomoEquation2.java index 62bec1294..01a24ef92 100644 --- a/src/class143/Code04_MomoEquation2.java +++ b/src/class143/Code04_MomoEquation2.java @@ -1,6 +1,12 @@ package class143; // 墨墨的等式(两次转圈法) +// 一共有n种物品,第i种物品价值是v[i],每种物品可以选择任意个,个数不能是负数 +// 那么各种物品组合在一起可以形成很多价值累加和 +// 请问在[l...r]范围上,其中有多少个数是能被组成的价值累加和 +// 0 <= n <= 12 +// 0 <= v[i] <= 5 * 10^5 +// 1 <= l <= r <= 10^12 // 测试链接 : https://www.luogu.com.cn/problem/P2371 import java.io.BufferedReader; @@ -17,7 +23,7 @@ public class Code04_MomoEquation2 { public static long inf = Long.MAX_VALUE; - public static int[] arr = new int[MAXN]; + public static int[] v = new int[MAXN]; public static long[] dp = new long[MAXN]; @@ -30,26 +36,26 @@ public static int gcd(int a, int b) { } public static long compute() { - Arrays.sort(arr, 1, n + 1); + Arrays.sort(v, 1, n + 1); int size = 0; for (int i = 1; i <= n; i++) { - if (arr[i] != 0) { - arr[++size] = arr[i]; + if (v[i] != 0) { + v[++size] = v[i]; } } if (size == 0) { return 0; } - x = arr[1]; + x = v[1]; Arrays.fill(dp, 0, x, inf); dp[0] = 0; for (int i = 2, d; i <= size; i++) { - d = gcd(arr[i], x); + d = gcd(v[i], x); for (int j = 0; j < d; j++) { for (int cur = j, next, times = 0; times < 2; times += cur == j ? 1 : 0) { - next = (cur + arr[i]) % x; + next = (cur + v[i]) % x; if (dp[cur] != inf) { - dp[next] = Math.min(dp[next], dp[cur] + arr[i]); + dp[next] = Math.min(dp[next], dp[cur] + v[i]); } cur = next; } @@ -79,7 +85,7 @@ public static void main(String[] args) throws IOException { r = (long) in.nval; for (int i = 1; i <= n; i++) { in.nextToken(); - arr[i] = (int) in.nval; + v[i] = (int) in.nval; } out.println(compute()); out.flush(); diff --git a/src/class143/Code05_Knapsack.java b/src/class143/Code05_Knapsack.java index 974b7d3b9..da4778f9d 100644 --- a/src/class143/Code05_Knapsack.java +++ b/src/class143/Code05_Knapsack.java @@ -1,6 +1,15 @@ package class143; // 背包(两次转圈法) +// 一共有n种物品,第i种物品的体积为v[i],价值为c[i],每种物品可以选择任意个,个数不能是负数 +// 一共有m条查询,每次查询都会给定jobv,代表体积的要求 +// 要求挑选物品的体积和一定要严格是jobv,返回能得到的最大价值和 +// 如果没有方案能正好凑满jobv,返回-1 +// 1 <= n <= 50 +// 1 <= m <= 10^5 +// 1 <= v[i] <= 10^5 +// 1 <= c[i] <= 10^6 +// 10^11 <= jobv <= 10^12 // 测试链接 : https://www.luogu.com.cn/problem/P9140 import java.io.BufferedReader; @@ -23,7 +32,7 @@ public class Code05_Knapsack { public static long[] dp = new long[MAXN]; - public static int n, x, y; + public static int n, m, x, y; public static int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); @@ -52,7 +61,7 @@ public static void main(String[] args) throws IOException { in.nextToken(); n = (int) in.nval; in.nextToken(); - int query = (int) in.nval; + m = (int) in.nval; double best = 0, ratio; for (int i = 1; i <= n; i++) { in.nextToken(); @@ -68,7 +77,7 @@ public static void main(String[] args) throws IOException { } compute(); long jobv; - for (int i = 1, v; i <= query; i++) { + for (int i = 1, v; i <= m; i++) { in.nextToken(); jobv = (long) in.nval; v = (int) (jobv % x); From 32cc5e899b20677c0e74cdb74902a658ee7fa3a7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 13 Sep 2024 12:15:09 +0800 Subject: [PATCH 0133/2029] modify code --- src/class075/Code04_BoundedKnapsackWithMonotonicQueue.java | 1 + src/class075/Code05_MixedKnapsack.java | 2 +- src/class105/Code05_ConcatenationAllWords.java | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/class075/Code04_BoundedKnapsackWithMonotonicQueue.java b/src/class075/Code04_BoundedKnapsackWithMonotonicQueue.java index 5fdfcb468..6a14ffb0b 100644 --- a/src/class075/Code04_BoundedKnapsackWithMonotonicQueue.java +++ b/src/class075/Code04_BoundedKnapsackWithMonotonicQueue.java @@ -64,6 +64,7 @@ public static void main(String[] args) throws IOException { public static int compute1() { int[][] dp = new int[n + 1][t + 1]; for (int i = 1; i <= n; i++) { + // 同余分组 for (int mod = 0; mod <= Math.min(t, w[i] - 1); mod++) { l = r = 0; for (int j = mod; j <= t; j += w[i]) { diff --git a/src/class075/Code05_MixedKnapsack.java b/src/class075/Code05_MixedKnapsack.java index ece8b5790..a8ac4365f 100644 --- a/src/class075/Code05_MixedKnapsack.java +++ b/src/class075/Code05_MixedKnapsack.java @@ -84,8 +84,8 @@ public static int compute() { } } else { // 多重背包的空间压缩实现 - // 根据余数分组 // 每一组都是从右往左更新的 + // 同余分组 for (int mod = 0; mod < val[i]; mod++) { int trueCnt = 0; for (int j = m - mod, size = 0; j >= 0 && size <= cnt[i]; j -= val[i], size++) { diff --git a/src/class105/Code05_ConcatenationAllWords.java b/src/class105/Code05_ConcatenationAllWords.java index ef396da49..91ac5898b 100644 --- a/src/class105/Code05_ConcatenationAllWords.java +++ b/src/class105/Code05_ConcatenationAllWords.java @@ -21,7 +21,7 @@ public class Code05_ConcatenationAllWords { // 所有题解都没有做到这个复杂度的 // 虽然这个做法打败比例没有到100%,但那是因为测试数据量不够大 // 所以最优解的时间复杂度优势没有体现出来 - // 这个方法绝对是最优解,只有用字符串哈希,时间复杂度才能到最优 + // 这个方法绝对是最优解,只有同余分组 + 字符串哈希,时间复杂度才能到最优 public static List findSubstring(String s, String[] words) { List ans = new ArrayList<>(); if (s == null || s.length() == 0 || words == null || words.length == 0) { From 4b7db2b0b18d97be1a750acdf43f25e4a505604d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 13 Sep 2024 12:20:44 +0800 Subject: [PATCH 0134/2029] modify code --- src/class105/Code05_ConcatenationAllWords.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class105/Code05_ConcatenationAllWords.java b/src/class105/Code05_ConcatenationAllWords.java index 91ac5898b..2ebc2a076 100644 --- a/src/class105/Code05_ConcatenationAllWords.java +++ b/src/class105/Code05_ConcatenationAllWords.java @@ -40,7 +40,7 @@ public static List findSubstring(String s, String[] words) { int allLen = wordLen * wordNum; // 窗口的词频表 HashMap window = new HashMap<>(); - for (int init = 0; init < wordLen && init + allLen <= n; init++) { + for (int init = 0; init < wordLen && init + allLen <= n; init++) { // 同余分组 // init是当前组的首个开头 int debt = wordNum; // 建立起窗口 From 2e30393940b661fcccfae98446d6a427bd0ba798 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 13 Sep 2024 12:34:17 +0800 Subject: [PATCH 0135/2029] modify code --- src/class061/Code02_PrimStatic.java | 2 +- src/class064/Code01_DijkstraLeetcode.java | 2 +- src/class064/Code01_DijkstraLuogu.java | 2 +- src/class064/Code06_FlightPath2.java | 7 +++---- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/class061/Code02_PrimStatic.java b/src/class061/Code02_PrimStatic.java index a08b2c6bb..4d378b63e 100644 --- a/src/class061/Code02_PrimStatic.java +++ b/src/class061/Code02_PrimStatic.java @@ -109,7 +109,7 @@ public static void pop() { } public static void heapify(int i) { - int l = 1; + int l = i * 2 + 1; while (l < heapSize) { int best = l + 1 < heapSize && heap[l + 1][1] < heap[l][1] ? l + 1 : l; best = heap[best][1] < heap[i][1] ? best : i; diff --git a/src/class064/Code01_DijkstraLeetcode.java b/src/class064/Code01_DijkstraLeetcode.java index 17a4b1635..0e3f05de5 100644 --- a/src/class064/Code01_DijkstraLeetcode.java +++ b/src/class064/Code01_DijkstraLeetcode.java @@ -151,7 +151,7 @@ public static int pop() { } public static void heapify(int i) { - int l = 1; + int l = i * 2 + 1; while (l < heapSize) { int best = l + 1 < heapSize && distance[heap[l + 1]] < distance[heap[l]] ? l + 1 : l; best = distance[heap[best]] < distance[heap[i]] ? best : i; diff --git a/src/class064/Code01_DijkstraLuogu.java b/src/class064/Code01_DijkstraLuogu.java index 8bfa3ec23..2f34d4943 100644 --- a/src/class064/Code01_DijkstraLuogu.java +++ b/src/class064/Code01_DijkstraLuogu.java @@ -90,7 +90,7 @@ public static int pop() { } public static void heapify(int i) { - int l = 1; + int l = i * 2 + 1; while (l < heapSize) { int best = l + 1 < heapSize && distance[heap[l + 1]] < distance[heap[l]] ? l + 1 : l; best = distance[heap[best]] < distance[heap[i]] ? best : i; diff --git a/src/class064/Code06_FlightPath2.java b/src/class064/Code06_FlightPath2.java index 410bc8daf..189eef59b 100644 --- a/src/class064/Code06_FlightPath2.java +++ b/src/class064/Code06_FlightPath2.java @@ -92,12 +92,11 @@ public static void pop() { use = heap[0][1]; cost = heap[0][2]; swap(0, --heapSize); - heapify(); + heapify(0); } - public static void heapify() { - int i = 0; - int l = 1; + public static void heapify(int i) { + int l = i * 2 + 1; while (l < heapSize) { int best = l + 1 < heapSize && heap[l + 1][2] < heap[l][2] ? l + 1 : l; best = heap[best][2] < heap[i][2] ? best : i; From e5e7085644c366cef62c97d16a040c57e2bbc603 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 13 Sep 2024 15:19:02 +0800 Subject: [PATCH 0136/2029] modify code --- src/class143/Code01_Elevator.java | 8 ++++---- src/class143/Code02_CattleFence.java | 8 ++++---- src/class143/Code04_MomoEquation1.java | 8 ++++---- src/class143/Code04_MomoEquation2.java | 2 +- src/class143/Code05_Knapsack.java | 2 +- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/class143/Code01_Elevator.java b/src/class143/Code01_Elevator.java index d3057ba4a..4502b4ee9 100644 --- a/src/class143/Code01_Elevator.java +++ b/src/class143/Code01_Elevator.java @@ -79,13 +79,13 @@ public static long compute() { public static void dijkstra() { heap.add(new long[] { 0, 0 }); distance[0] = 0; - long[] curData; + long[] cur; int u; long w; while (!heap.isEmpty()) { - curData = heap.poll(); - u = (int) curData[0]; - w = curData[1]; + cur = heap.poll(); + u = (int) cur[0]; + w = cur[1]; if (visited[u]) { continue; } diff --git a/src/class143/Code02_CattleFence.java b/src/class143/Code02_CattleFence.java index a44cf61c4..f4c6a9768 100644 --- a/src/class143/Code02_CattleFence.java +++ b/src/class143/Code02_CattleFence.java @@ -73,12 +73,12 @@ public static void addEdge(int u, int v, int w) { public static void dijkstra() { heap.add(new int[] { 0, 0 }); distance[0] = 0; - int[] curData; + int[] cur; int u, w; while (!heap.isEmpty()) { - curData = heap.poll(); - u = (int) curData[0]; - w = curData[1]; + cur = heap.poll(); + u = (int) cur[0]; + w = cur[1]; if (visited[u]) { continue; } diff --git a/src/class143/Code04_MomoEquation1.java b/src/class143/Code04_MomoEquation1.java index ff2b1ce66..6977487fb 100644 --- a/src/class143/Code04_MomoEquation1.java +++ b/src/class143/Code04_MomoEquation1.java @@ -78,13 +78,13 @@ public static long compute() { public static void dijkstra() { heap.add(new long[] { 0, 0 }); distance[0] = 0; - long[] curData; + long[] cur; int u; long w; while (!heap.isEmpty()) { - curData = heap.poll(); - u = (int) curData[0]; - w = curData[1]; + cur = heap.poll(); + u = (int) cur[0]; + w = cur[1]; if (visited[u]) { continue; } diff --git a/src/class143/Code04_MomoEquation2.java b/src/class143/Code04_MomoEquation2.java index 01a24ef92..f0a515964 100644 --- a/src/class143/Code04_MomoEquation2.java +++ b/src/class143/Code04_MomoEquation2.java @@ -52,7 +52,7 @@ public static long compute() { for (int i = 2, d; i <= size; i++) { d = gcd(v[i], x); for (int j = 0; j < d; j++) { - for (int cur = j, next, times = 0; times < 2; times += cur == j ? 1 : 0) { + for (int cur = j, next, circle = 0; circle < 2; circle += cur == j ? 1 : 0) { next = (cur + v[i]) % x; if (dp[cur] != inf) { dp[next] = Math.min(dp[next], dp[cur] + v[i]); diff --git a/src/class143/Code05_Knapsack.java b/src/class143/Code05_Knapsack.java index da4778f9d..9a67635b9 100644 --- a/src/class143/Code05_Knapsack.java +++ b/src/class143/Code05_Knapsack.java @@ -43,7 +43,7 @@ public static void compute() { dp[0] = 0; for (int i = 1; i <= n; i++) { for (int j = 0, d = gcd(v[i], x); j < d; j++) { - for (int cur = j, next, times = 0; times < 2; times += cur == j ? 1 : 0) { + for (int cur = j, next, circle = 0; circle < 2; circle += cur == j ? 1 : 0) { next = (cur + v[i]) % x; if (dp[cur] != inf) { dp[next] = Math.max(dp[next], dp[cur] - (long) ((cur + v[i]) / x) * y + c[i]); From 63350a0914f5d42809440b23670bb9e28e973c76 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 13 Sep 2024 15:22:39 +0800 Subject: [PATCH 0137/2029] modify code --- src/class143/Code01_Elevator.java | 22 ++++++++++---------- src/class143/Code04_MomoEquation1.java | 28 +++++++++++++------------- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/src/class143/Code01_Elevator.java b/src/class143/Code01_Elevator.java index 4502b4ee9..13384b9ac 100644 --- a/src/class143/Code01_Elevator.java +++ b/src/class143/Code01_Elevator.java @@ -65,17 +65,6 @@ public static void addEdge(int u, int v, long w) { head[u] = cnt++; } - public static long compute() { - dijkstra(); - long ans = 0; - for (int i = 0; i < x; i++) { - if (distance[i] <= h) { - ans += (h - distance[i]) / x + 1; - } - } - return ans; - } - public static void dijkstra() { heap.add(new long[] { 0, 0 }); distance[0] = 0; @@ -100,6 +89,17 @@ public static void dijkstra() { } } + public static long compute() { + dijkstra(); + long ans = 0; + for (int i = 0; i < x; i++) { + if (distance[i] <= h) { + ans += (h - distance[i]) / x + 1; + } + } + return ans; + } + public static void main(String[] args) throws IOException { Kattio io = new Kattio(); h = io.nextLong() - 1; diff --git a/src/class143/Code04_MomoEquation1.java b/src/class143/Code04_MomoEquation1.java index 6977487fb..e02f9ff3e 100644 --- a/src/class143/Code04_MomoEquation1.java +++ b/src/class143/Code04_MomoEquation1.java @@ -61,20 +61,6 @@ public static void addEdge(int u, int v, long w) { head[u] = cnt++; } - public static long compute() { - dijkstra(); - long ans = 0; - for (int i = 0; i < x; i++) { - if (r >= distance[i]) { - ans += (r - distance[i]) / x + 1; - } - if (l >= distance[i]) { - ans -= (l - distance[i]) / x + 1; - } - } - return ans; - } - public static void dijkstra() { heap.add(new long[] { 0, 0 }); distance[0] = 0; @@ -99,6 +85,20 @@ public static void dijkstra() { } } + public static long compute() { + dijkstra(); + long ans = 0; + for (int i = 0; i < x; i++) { + if (r >= distance[i]) { + ans += (r - distance[i]) / x + 1; + } + if (l >= distance[i]) { + ans -= (l - distance[i]) / x + 1; + } + } + return ans; + } + public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StreamTokenizer in = new StreamTokenizer(br); From ae12bfbd49d1a270fda7a31163d5ec916656abc7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 13 Sep 2024 15:59:40 +0800 Subject: [PATCH 0138/2029] modify code --- src/class143/Code01_Elevator.java | 1 + src/class143/Code02_CattleFence.java | 1 + 2 files changed, 2 insertions(+) diff --git a/src/class143/Code01_Elevator.java b/src/class143/Code01_Elevator.java index 13384b9ac..594a26403 100644 --- a/src/class143/Code01_Elevator.java +++ b/src/class143/Code01_Elevator.java @@ -65,6 +65,7 @@ public static void addEdge(int u, int v, long w) { head[u] = cnt++; } + // 来自讲解064,dijkstra算法 public static void dijkstra() { heap.add(new long[] { 0, 0 }); distance[0] = 0; diff --git a/src/class143/Code02_CattleFence.java b/src/class143/Code02_CattleFence.java index f4c6a9768..64331965c 100644 --- a/src/class143/Code02_CattleFence.java +++ b/src/class143/Code02_CattleFence.java @@ -70,6 +70,7 @@ public static void addEdge(int u, int v, int w) { head[u] = cnt++; } + // 来自讲解064,dijkstra算法 public static void dijkstra() { heap.add(new int[] { 0, 0 }); distance[0] = 0; From c730c77fd035a6990eaaa2bc28fd98a1ebaba6a7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 13 Sep 2024 16:03:33 +0800 Subject: [PATCH 0139/2029] modify code --- src/class143/Code01_Elevator.java | 2 ++ src/class143/Code02_CattleFence.java | 2 ++ src/class143/Code04_MomoEquation1.java | 2 ++ 3 files changed, 6 insertions(+) diff --git a/src/class143/Code01_Elevator.java b/src/class143/Code01_Elevator.java index 594a26403..efbb514e4 100644 --- a/src/class143/Code01_Elevator.java +++ b/src/class143/Code01_Elevator.java @@ -44,6 +44,8 @@ public class Code01_Elevator { public static int cnt; // dijkstra算法需要 + // 0 : 当前节点 + // 1 : 源点到当前点距离 public static PriorityQueue heap = new PriorityQueue<>((a, b) -> a[1] <= b[1] ? -1 : 1); public static long[] distance = new long[MAXN]; diff --git a/src/class143/Code02_CattleFence.java b/src/class143/Code02_CattleFence.java index 64331965c..481e3c0fc 100644 --- a/src/class143/Code02_CattleFence.java +++ b/src/class143/Code02_CattleFence.java @@ -48,6 +48,8 @@ public class Code02_CattleFence { public static int cnt; // dijkstra算法需要 + // 0 : 当前节点 + // 1 : 源点到当前点距离 public static PriorityQueue heap = new PriorityQueue<>((a, b) -> a[1] - b[1]); public static int[] distance = new int[MAXV]; diff --git a/src/class143/Code04_MomoEquation1.java b/src/class143/Code04_MomoEquation1.java index e02f9ff3e..ce9b28ab1 100644 --- a/src/class143/Code04_MomoEquation1.java +++ b/src/class143/Code04_MomoEquation1.java @@ -40,6 +40,8 @@ public class Code04_MomoEquation1 { public static int cnt; // dijkstra算法需要 + // 0 : 当前节点 + // 1 : 源点到当前点距离 public static PriorityQueue heap = new PriorityQueue<>((a, b) -> a[1] <= b[1] ? -1 : 1); public static long[] distance = new long[MAXN]; From 9639e045b1640612abf71be841a36639cb94ac8f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 13 Sep 2024 18:17:30 +0800 Subject: [PATCH 0140/2029] modify code --- src/class143/Code04_MomoEquation1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class143/Code04_MomoEquation1.java b/src/class143/Code04_MomoEquation1.java index ce9b28ab1..34544dcda 100644 --- a/src/class143/Code04_MomoEquation1.java +++ b/src/class143/Code04_MomoEquation1.java @@ -114,7 +114,7 @@ public static void main(String[] args) throws IOException { in.nextToken(); x = (int) in.nval; prepare(); - for (int i = 1, vi; i < n; i++) { + for (int i = 2, vi; i <= n; i++) { in.nextToken(); vi = (int) in.nval; for (int j = 0; j < x; j++) { From 53fe71338a5f9887cda6a7c150aa1daf75b4172b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 13 Sep 2024 20:37:46 +0800 Subject: [PATCH 0141/2029] modify code --- src/class143/Code04_MomoEquation1.java | 8 ++++---- src/class143/Code04_MomoEquation2.java | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/class143/Code04_MomoEquation1.java b/src/class143/Code04_MomoEquation1.java index 34544dcda..53e510c8c 100644 --- a/src/class143/Code04_MomoEquation1.java +++ b/src/class143/Code04_MomoEquation1.java @@ -1,11 +1,11 @@ package class143; // 墨墨的等式(dijkstra算法) -// 一共有n种物品,第i种物品价值是v[i],每种物品可以选择任意个,个数不能是负数 -// 那么各种物品组合在一起可以形成很多价值累加和 -// 请问在[l...r]范围上,其中有多少个数是能被组成的价值累加和 +// 一共有n种正数,每种数可以选择任意个,个数不能是负数 +// 那么一定有某些数值可以由这些数字累加得到 +// 请问在[l...r]范围上,有多少个数能被累加得到 // 0 <= n <= 12 -// 0 <= v[i] <= 5 * 10^5 +// 0 <= 数值范围 <= 5 * 10^5 // 1 <= l <= r <= 10^12 // 测试链接 : https://www.luogu.com.cn/problem/P2371 diff --git a/src/class143/Code04_MomoEquation2.java b/src/class143/Code04_MomoEquation2.java index f0a515964..fcbc0101b 100644 --- a/src/class143/Code04_MomoEquation2.java +++ b/src/class143/Code04_MomoEquation2.java @@ -1,11 +1,11 @@ package class143; // 墨墨的等式(两次转圈法) -// 一共有n种物品,第i种物品价值是v[i],每种物品可以选择任意个,个数不能是负数 -// 那么各种物品组合在一起可以形成很多价值累加和 -// 请问在[l...r]范围上,其中有多少个数是能被组成的价值累加和 +// 一共有n种正数,每种数可以选择任意个,个数不能是负数 +// 那么一定有某些数值可以由这些数字累加得到 +// 请问在[l...r]范围上,有多少个数能被累加得到 // 0 <= n <= 12 -// 0 <= v[i] <= 5 * 10^5 +// 0 <= 数值范围 <= 5 * 10^5 // 1 <= l <= r <= 10^12 // 测试链接 : https://www.luogu.com.cn/problem/P2371 From 3233c68e93ea8c372f396ee80da04b8399928125 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 13 Sep 2024 22:30:53 +0800 Subject: [PATCH 0142/2029] modify code --- src/class143/Code04_MomoEquation2.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/class143/Code04_MomoEquation2.java b/src/class143/Code04_MomoEquation2.java index fcbc0101b..386597d6d 100644 --- a/src/class143/Code04_MomoEquation2.java +++ b/src/class143/Code04_MomoEquation2.java @@ -25,7 +25,7 @@ public class Code04_MomoEquation2 { public static int[] v = new int[MAXN]; - public static long[] dp = new long[MAXN]; + public static long[] dist = new long[MAXN]; public static int n, x; @@ -47,15 +47,15 @@ public static long compute() { return 0; } x = v[1]; - Arrays.fill(dp, 0, x, inf); - dp[0] = 0; + Arrays.fill(dist, 0, x, inf); + dist[0] = 0; for (int i = 2, d; i <= size; i++) { d = gcd(v[i], x); for (int j = 0; j < d; j++) { for (int cur = j, next, circle = 0; circle < 2; circle += cur == j ? 1 : 0) { next = (cur + v[i]) % x; - if (dp[cur] != inf) { - dp[next] = Math.min(dp[next], dp[cur] + v[i]); + if (dist[cur] != inf) { + dist[next] = Math.min(dist[next], dist[cur] + v[i]); } cur = next; } @@ -63,11 +63,11 @@ public static long compute() { } long ans = 0; for (int i = 0; i < x; i++) { - if (r >= dp[i]) { - ans += Math.max(0, (r - dp[i]) / x + 1); + if (r >= dist[i]) { + ans += Math.max(0, (r - dist[i]) / x + 1); } - if (l >= dp[i]) { - ans -= Math.max(0, (l - dp[i]) / x + 1); + if (l >= dist[i]) { + ans -= Math.max(0, (l - dist[i]) / x + 1); } } return ans; From 691d15fa1cefad101790a2b117a933763fc7fdb2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 13 Sep 2024 22:52:14 +0800 Subject: [PATCH 0143/2029] modify code --- src/class143/Code04_MomoEquation2.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/class143/Code04_MomoEquation2.java b/src/class143/Code04_MomoEquation2.java index 386597d6d..e508723d9 100644 --- a/src/class143/Code04_MomoEquation2.java +++ b/src/class143/Code04_MomoEquation2.java @@ -49,9 +49,9 @@ public static long compute() { x = v[1]; Arrays.fill(dist, 0, x, inf); dist[0] = 0; - for (int i = 2, d; i <= size; i++) { - d = gcd(v[i], x); - for (int j = 0; j < d; j++) { + for (int i = 2, d; i <= size; i++) { // 出现基准数之外的其他数,更新最短路 + d = gcd(v[i], x); // 求最大公约数 + for (int j = 0; j < d; j++) { // j是每个子环的起点 for (int cur = j, next, circle = 0; circle < 2; circle += cur == j ? 1 : 0) { next = (cur + v[i]) % x; if (dist[cur] != inf) { From 0a0c5a5371a2447221b03899a76572ffac73e932 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 14 Sep 2024 17:44:43 +0800 Subject: [PATCH 0144/2029] modify code --- src/class143/Code05_Knapsack.java | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/class143/Code05_Knapsack.java b/src/class143/Code05_Knapsack.java index 9a67635b9..bb33b5fbd 100644 --- a/src/class143/Code05_Knapsack.java +++ b/src/class143/Code05_Knapsack.java @@ -30,6 +30,9 @@ public class Code05_Knapsack { public static int[] c = new int[MAXN]; + // dp[i] : 总体积为某数,先尽可能用基准物品填入,剩余的体积为i + // 可以去掉若干基准物品,加入若干其他物品,最终凑齐总体积 + // 能获得的最大补偿是多少 public static long[] dp = new long[MAXN]; public static int n, m, x, y; @@ -42,13 +45,15 @@ public static void compute() { Arrays.fill(dp, 0, x, inf); dp[0] = 0; for (int i = 1; i <= n; i++) { - for (int j = 0, d = gcd(v[i], x); j < d; j++) { - for (int cur = j, next, circle = 0; circle < 2; circle += cur == j ? 1 : 0) { - next = (cur + v[i]) % x; - if (dp[cur] != inf) { - dp[next] = Math.max(dp[next], dp[cur] - (long) ((cur + v[i]) / x) * y + c[i]); + if (v[i] != x) { + for (int j = 0, d = gcd(v[i], x); j < d; j++) { + for (int cur = j, next, circle = 0; circle < 2; circle += cur == j ? 1 : 0) { + next = (cur + v[i]) % x; + if (dp[cur] != inf) { + dp[next] = Math.max(dp[next], dp[cur] - (long) ((cur + v[i]) / x) * y + c[i]); + } + cur = next; } - cur = next; } } } From 4887dd33a8ca69cdc680bd6bf2279153059ce57e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 14 Sep 2024 23:47:23 +0800 Subject: [PATCH 0145/2029] modify code --- ...31\346\234\200\347\237\255\350\267\257.pptx" | Bin 0 -> 49560 bytes src/class143/Code05_Knapsack.java | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 "ppt/\347\256\227\346\263\225\350\256\262\350\247\243143\343\200\220\346\211\251\345\261\225\343\200\221\345\220\214\344\275\231\346\234\200\347\237\255\350\267\257.pptx" diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243143\343\200\220\346\211\251\345\261\225\343\200\221\345\220\214\344\275\231\346\234\200\347\237\255\350\267\257.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243143\343\200\220\346\211\251\345\261\225\343\200\221\345\220\214\344\275\231\346\234\200\347\237\255\350\267\257.pptx" new file mode 100644 index 0000000000000000000000000000000000000000..c03ac2506ba086b8f5c5d50a090f47de6adf4565 GIT binary patch literal 49560 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

6;`!=yhr28pyVPH% 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 Date: Wed, 18 Sep 2024 12:07:44 +0800 Subject: [PATCH 0146/2029] modify code --- src/class143/Code04_MomoEquation3.java | 91 ++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 src/class143/Code04_MomoEquation3.java diff --git a/src/class143/Code04_MomoEquation3.java b/src/class143/Code04_MomoEquation3.java new file mode 100644 index 000000000..4fb2dd5a4 --- /dev/null +++ b/src/class143/Code04_MomoEquation3.java @@ -0,0 +1,91 @@ +package class143; + +// 墨墨的等式(不排序+两次转圈法) +// 不排序也一样能通过,本文件实现没有任何新内容,只是去掉了排序逻辑 +// 一共有n种正数,每种数可以选择任意个,个数不能是负数 +// 那么一定有某些数值可以由这些数字累加得到 +// 请问在[l...r]范围上,有多少个数能被累加得到 +// 0 <= n <= 12 +// 0 <= 数值范围 <= 5 * 10^5 +// 1 <= l <= r <= 10^12 +// 测试链接 : https://www.luogu.com.cn/problem/P2371 + +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 Code04_MomoEquation3 { + + public static int MAXN = 500001; + + public static long inf = Long.MAX_VALUE; + + public static int[] v = new int[MAXN]; + + public static long[] dist = new long[MAXN]; + + public static int n, size, x; + + public static long l, r; + + public static int gcd(int a, int b) { + return b == 0 ? a : gcd(b, a % b); + } + + public static long compute() { + x = v[1]; + Arrays.fill(dist, 0, x, inf); + dist[0] = 0; + for (int i = 2, d; i <= size; i++) { + d = gcd(v[i], x); + for (int j = 0; j < d; j++) { + for (int cur = j, next, circle = 0; circle < 2; circle += cur == j ? 1 : 0) { + next = (cur + v[i]) % x; + if (dist[cur] != inf) { + dist[next] = Math.min(dist[next], dist[cur] + v[i]); + } + cur = next; + } + } + } + long ans = 0; + for (int i = 0; i < x; i++) { + if (r >= dist[i]) { + ans += Math.max(0, (r - dist[i]) / x + 1); + } + if (l >= dist[i]) { + ans -= Math.max(0, (l - dist[i]) / x + 1); + } + } + return ans; + } + + 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; + size = 0; + in.nextToken(); + l = (long) in.nval - 1; + in.nextToken(); + r = (long) in.nval; + for (int i = 1, num; i <= n; i++) { + in.nextToken(); + num = (int) in.nval; + if (num != 0) { + v[++size] = num; + } + } + out.println(compute()); + out.flush(); + out.close(); + br.close(); + } + +} From 4811ad6ffa84ea87b53480ef4a548fa751e8bfe1 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 18 Sep 2024 13:45:07 +0800 Subject: [PATCH 0147/2029] modify code --- src/class143/Code01_Elevator.java | 1 + src/class143/Code02_CattleFence.java | 1 + src/class143/Code03_SmallMultiple.java | 1 + src/class143/Code04_MomoEquation1.java | 1 + src/class143/Code04_MomoEquation2.java | 1 + src/class143/Code04_MomoEquation3.java | 1 + src/class143/Code05_Knapsack.java | 1 + .../Code01_CalculateCoefficients.java | 85 +++++++++++++++++++ src/class144/Code02.java | 6 ++ src/class144/Code03.java | 6 ++ src/class144/Code04.java | 6 ++ src/class144/Code05.java | 5 ++ 12 files changed, 115 insertions(+) create mode 100644 src/class144/Code01_CalculateCoefficients.java create mode 100644 src/class144/Code02.java create mode 100644 src/class144/Code03.java create mode 100644 src/class144/Code04.java create mode 100644 src/class144/Code05.java diff --git a/src/class143/Code01_Elevator.java b/src/class143/Code01_Elevator.java index efbb514e4..0cdf58781 100644 --- a/src/class143/Code01_Elevator.java +++ b/src/class143/Code01_Elevator.java @@ -10,6 +10,7 @@ // 1 <= h <= 2^63 - 1 // 1 <= x、y、z <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3403 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.BufferedReader; import java.io.FileReader; diff --git a/src/class143/Code02_CattleFence.java b/src/class143/Code02_CattleFence.java index 481e3c0fc..545d54adf 100644 --- a/src/class143/Code02_CattleFence.java +++ b/src/class143/Code02_CattleFence.java @@ -10,6 +10,7 @@ // 1 <= arr[i] <= 3000 // 1 <= m <= 3000 // 测试链接 : https://www.luogu.com.cn/problem/P2662 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.BufferedReader; import java.io.IOException; diff --git a/src/class143/Code03_SmallMultiple.java b/src/class143/Code03_SmallMultiple.java index d2bd94b49..b82d20867 100644 --- a/src/class143/Code03_SmallMultiple.java +++ b/src/class143/Code03_SmallMultiple.java @@ -5,6 +5,7 @@ // 2 <= k <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/AT_arc084_b // 测试链接 : https://atcoder.jp/contests/abc077/tasks/arc084_b +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.BufferedReader; import java.io.IOException; diff --git a/src/class143/Code04_MomoEquation1.java b/src/class143/Code04_MomoEquation1.java index 53e510c8c..56189443b 100644 --- a/src/class143/Code04_MomoEquation1.java +++ b/src/class143/Code04_MomoEquation1.java @@ -8,6 +8,7 @@ // 0 <= 数值范围 <= 5 * 10^5 // 1 <= l <= r <= 10^12 // 测试链接 : https://www.luogu.com.cn/problem/P2371 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.BufferedReader; import java.io.IOException; diff --git a/src/class143/Code04_MomoEquation2.java b/src/class143/Code04_MomoEquation2.java index e508723d9..77f966eb4 100644 --- a/src/class143/Code04_MomoEquation2.java +++ b/src/class143/Code04_MomoEquation2.java @@ -8,6 +8,7 @@ // 0 <= 数值范围 <= 5 * 10^5 // 1 <= l <= r <= 10^12 // 测试链接 : https://www.luogu.com.cn/problem/P2371 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.BufferedReader; import java.io.IOException; diff --git a/src/class143/Code04_MomoEquation3.java b/src/class143/Code04_MomoEquation3.java index 4fb2dd5a4..acddf56cb 100644 --- a/src/class143/Code04_MomoEquation3.java +++ b/src/class143/Code04_MomoEquation3.java @@ -9,6 +9,7 @@ // 0 <= 数值范围 <= 5 * 10^5 // 1 <= l <= r <= 10^12 // 测试链接 : https://www.luogu.com.cn/problem/P2371 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.BufferedReader; import java.io.IOException; diff --git a/src/class143/Code05_Knapsack.java b/src/class143/Code05_Knapsack.java index 39605c7ea..de1c25b97 100644 --- a/src/class143/Code05_Knapsack.java +++ b/src/class143/Code05_Knapsack.java @@ -11,6 +11,7 @@ // 1 <= c[i] <= 10^6 // 10^11 <= jobv <= 10^12 // 测试链接 : https://www.luogu.com.cn/problem/P9140 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.BufferedReader; import java.io.IOException; diff --git a/src/class144/Code01_CalculateCoefficients.java b/src/class144/Code01_CalculateCoefficients.java new file mode 100644 index 000000000..2faec6024 --- /dev/null +++ b/src/class144/Code01_CalculateCoefficients.java @@ -0,0 +1,85 @@ +package class144; + +// 计算系数 +// 多项式为,(ax + by)的k次方,其中a、b、k为常数 +// 计算这个多项式展开后,x的n次方 * y的m次方,这一项的系数 +// 0 <= k <= 1000 +// n + m == k +// 0 <= a、b <= 10^6 +// 测试链接 : https://www.luogu.com.cn/problem/P1313 +// 提交以下的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 Code01_CalculateCoefficients { + + public static int MAXK = 1001; + + public static int MOD = 10007; + + // fac[i]代表 i! 在 %MOD 意义下的余数 + public static long[] fac = new long[MAXK + 1]; + + // inv[i]代表 i! 在 %MOD 意义下的逆元 + public static long[] inv = new long[MAXK + 1]; + + public static int a, b, k, n, m; + + // 来自讲解098,乘法快速幂,x的p次方 % MOD + public static long power(long x, int p) { + long ans = 1; + while (p > 0) { + if ((p & 1) == 1) { + ans = (ans * x) % MOD; + } + x = (x * x) % MOD; + p >>= 1; + } + return ans; + } + + // 来自讲解099,生成阶乘表和逆元表 + public static void build() { + // 阶乘表线性递推 + fac[1] = 1; + for (int i = 2; i <= MAXK; i++) { + fac[i] = ((long) i * fac[i - 1]) % MOD; + } + // 逆元表线性递推 + inv[MAXK] = power(fac[MAXK], MOD - 2); + for (int i = MAXK - 1; i >= 0; i--) { + inv[i] = ((long) (i + 1) * inv[i + 1]) % MOD; + } + } + + // 组合公式,一共all个物品,从中挑选pick个,返回方法数 + public static long c(int all, int pick) { + return (((fac[all] * inv[pick]) % MOD) * inv[all - pick]) % MOD; + } + + public static long compute() { + build(); + return (((power(a, n) * power(b, m)) % MOD) * c(k, n)) % MOD; + } + + 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(); a = (int) in.nval; + in.nextToken(); b = (int) in.nval; + in.nextToken(); k = (int) in.nval; + in.nextToken(); n = (int) in.nval; + in.nextToken(); m = (int) in.nval; + out.println(compute()); + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class144/Code02.java b/src/class144/Code02.java new file mode 100644 index 000000000..75c97b0fd --- /dev/null +++ b/src/class144/Code02.java @@ -0,0 +1,6 @@ +package class144; + +// 测试链接 : https://www.luogu.com.cn/problem/P2822 +public class Code02 { + +} diff --git a/src/class144/Code03.java b/src/class144/Code03.java new file mode 100644 index 000000000..ee8ae5626 --- /dev/null +++ b/src/class144/Code03.java @@ -0,0 +1,6 @@ +package class144; + +// 测试链接 : https://www.luogu.com.cn/problem/P4859 +public class Code03 { + +} diff --git a/src/class144/Code04.java b/src/class144/Code04.java new file mode 100644 index 000000000..2b4bb70d5 --- /dev/null +++ b/src/class144/Code04.java @@ -0,0 +1,6 @@ +package class144; + +// 测试链接 : https://www.luogu.com.cn/problem/P6478 +public class Code04 { + +} diff --git a/src/class144/Code05.java b/src/class144/Code05.java new file mode 100644 index 000000000..aee09c60c --- /dev/null +++ b/src/class144/Code05.java @@ -0,0 +1,5 @@ +package class144; + +public class Code05 { + +} From 6fd46e2e80e0528be97d277c4c82556fcd94e128 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 18 Sep 2024 13:47:28 +0800 Subject: [PATCH 0148/2029] modify code --- src/class144/Code01_CalculateCoefficients.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class144/Code01_CalculateCoefficients.java b/src/class144/Code01_CalculateCoefficients.java index 2faec6024..3675e34d2 100644 --- a/src/class144/Code01_CalculateCoefficients.java +++ b/src/class144/Code01_CalculateCoefficients.java @@ -4,8 +4,8 @@ // 多项式为,(ax + by)的k次方,其中a、b、k为常数 // 计算这个多项式展开后,x的n次方 * y的m次方,这一项的系数 // 0 <= k <= 1000 -// n + m == k // 0 <= a、b <= 10^6 +// n + m == k // 测试链接 : https://www.luogu.com.cn/problem/P1313 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 From 0546ac881f3c7399c17cbdd7240302f83eeb490a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 18 Sep 2024 15:01:40 +0800 Subject: [PATCH 0149/2029] modify code --- src/class144/Code02.java | 6 -- src/class144/Code02_CombinationNumber.java | 75 ++++++++++++++++++++++ src/class144/Code05.java | 1 + src/class144/Code06.java | 5 ++ 4 files changed, 81 insertions(+), 6 deletions(-) delete mode 100644 src/class144/Code02.java create mode 100644 src/class144/Code02_CombinationNumber.java create mode 100644 src/class144/Code06.java diff --git a/src/class144/Code02.java b/src/class144/Code02.java deleted file mode 100644 index 75c97b0fd..000000000 --- a/src/class144/Code02.java +++ /dev/null @@ -1,6 +0,0 @@ -package class144; - -// 测试链接 : https://www.luogu.com.cn/problem/P2822 -public class Code02 { - -} diff --git a/src/class144/Code02_CombinationNumber.java b/src/class144/Code02_CombinationNumber.java new file mode 100644 index 000000000..af37e68a0 --- /dev/null +++ b/src/class144/Code02_CombinationNumber.java @@ -0,0 +1,75 @@ +package class144; + +// 组合数问题 +// 组合公式c(i, j),表示从i个物品中选出j个物品的方案数 +// 如果该数值是k的整数倍,那么称(i, j)是一个合法对 +// 给定具体的一组数字n和m,当i和j满足:0 <= i <= n,0 <= j <= min(i, m) +// 返回有多少合法对 +// 一共有t组测试,所有测试的k都为同一个值 +// 每组测试给定n和m,打印每组测试的答案 +// 1 <= t <= 10^4 +// 2 <= k <= 21 +// 0 <= n、m <= 2000 +// 测试链接 : https://www.luogu.com.cn/problem/P2822 +// 提交以下的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 Code02_CombinationNumber { + + public static int MAXV = 2000; + + public static int MAXN = 2002; + + public static int[][] c = new int[MAXN][MAXN]; + + public static int[][] sum = new int[MAXN][MAXN]; + + public static int t, k, n, m; + + public static void build() { + c[1][0] = c[1][1] = 1; + for (int i = 2; i <= MAXV; i++) { + c[i][0] = 1; + for (int j = 1; j <= i; j++) { + c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % k; + } + } + for (int i = 2; i <= MAXV; i++) { + for (int j = 1; j <= i; j++) { + sum[i][j] = sum[i][j - 1] + sum[i - 1][j] - sum[i - 1][j - 1] + (c[i][j] == 0 ? 1 : 0); + } + sum[i][i + 1] = sum[i][i]; + } + } + + 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(); + t = (int) in.nval; + in.nextToken(); + k = (int) in.nval; + build(); + for (int i = 1; i <= t; i++) { + in.nextToken(); + n = (int) in.nval; + in.nextToken(); + m = (int) in.nval; + if (m > n) { + out.println(sum[n][n]); + } else { + out.println(sum[n][m]); + } + } + out.flush(); + out.close(); + br.close(); + } +} diff --git a/src/class144/Code05.java b/src/class144/Code05.java index aee09c60c..c9ea3e7b5 100644 --- a/src/class144/Code05.java +++ b/src/class144/Code05.java @@ -1,5 +1,6 @@ package class144; +// 测试链接 : https://www.luogu.com.cn/problem/P5505 public class Code05 { } diff --git a/src/class144/Code06.java b/src/class144/Code06.java new file mode 100644 index 000000000..fc561e542 --- /dev/null +++ b/src/class144/Code06.java @@ -0,0 +1,5 @@ +package class144; + +public class Code06 { + +} From 125cbfaa486a5a65c8efaf93bd296fbedfc518ab Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 18 Sep 2024 21:19:28 +0800 Subject: [PATCH 0150/2029] modify code --- src/class144/Code03.java | 1 - src/class144/Code04.java | 2 +- src/class144/Code05.java | 2 +- src/class144/Code06.java | 1 + src/class144/Code07.java | 6 ++++++ 5 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 src/class144/Code07.java diff --git a/src/class144/Code03.java b/src/class144/Code03.java index ee8ae5626..205aed150 100644 --- a/src/class144/Code03.java +++ b/src/class144/Code03.java @@ -1,6 +1,5 @@ package class144; -// 测试链接 : https://www.luogu.com.cn/problem/P4859 public class Code03 { } diff --git a/src/class144/Code04.java b/src/class144/Code04.java index 2b4bb70d5..8947c37fc 100644 --- a/src/class144/Code04.java +++ b/src/class144/Code04.java @@ -1,6 +1,6 @@ package class144; -// 测试链接 : https://www.luogu.com.cn/problem/P6478 +// 测试链接 : https://www.luogu.com.cn/problem/P10596 public class Code04 { } diff --git a/src/class144/Code05.java b/src/class144/Code05.java index c9ea3e7b5..61cf58c9d 100644 --- a/src/class144/Code05.java +++ b/src/class144/Code05.java @@ -1,6 +1,6 @@ package class144; -// 测试链接 : https://www.luogu.com.cn/problem/P5505 +// 测试链接 : https://www.luogu.com.cn/problem/P4859 public class Code05 { } diff --git a/src/class144/Code06.java b/src/class144/Code06.java index fc561e542..b0e375d85 100644 --- a/src/class144/Code06.java +++ b/src/class144/Code06.java @@ -1,5 +1,6 @@ package class144; +// 测试链接 : https://www.luogu.com.cn/problem/P5505 public class Code06 { } diff --git a/src/class144/Code07.java b/src/class144/Code07.java new file mode 100644 index 000000000..9e4f42bc4 --- /dev/null +++ b/src/class144/Code07.java @@ -0,0 +1,6 @@ +package class144; + +// 测试链接 : https://www.luogu.com.cn/problem/P6478 +public class Code07 { + +} From b2bb975d5f24da3230881209515fe33004707802 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 19 Sep 2024 18:12:56 +0800 Subject: [PATCH 0151/2029] modify code --- src/class144/Code04.java | 6 -- src/class144/Code04_SetCounting.java | 91 ++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 6 deletions(-) delete mode 100644 src/class144/Code04.java create mode 100644 src/class144/Code04_SetCounting.java diff --git a/src/class144/Code04.java b/src/class144/Code04.java deleted file mode 100644 index 8947c37fc..000000000 --- a/src/class144/Code04.java +++ /dev/null @@ -1,6 +0,0 @@ -package class144; - -// 测试链接 : https://www.luogu.com.cn/problem/P10596 -public class Code04 { - -} diff --git a/src/class144/Code04_SetCounting.java b/src/class144/Code04_SetCounting.java new file mode 100644 index 000000000..4d5408eef --- /dev/null +++ b/src/class144/Code04_SetCounting.java @@ -0,0 +1,91 @@ +package class144; + +// 集合计数 +// 测试链接 : https://www.luogu.com.cn/problem/P10596 + +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 Code04_SetCounting { + + public static int MAXN = 1000001; + + public static int MOD = 1000000007; + + public static long[] fac = new long[MAXN]; + + public static long[] inv = new long[MAXN]; + + public static long[] f = new long[MAXN]; + + public static int n, k; + + public static void build() { + // 一般情况下,不用计算0!的余数表和逆元表 + // 但是这道题需要,所以单独设置一下 + fac[0] = inv[0] = 1; + fac[1] = 1; + for (int i = 2; i <= n; i++) { + fac[i] = ((long) i * fac[i - 1]) % MOD; + } + inv[n] = power(fac[n], MOD - 2); + for (int i = n - 1; i >= 1; i--) { + inv[i] = ((long) (i + 1) * inv[i + 1]) % MOD; + } + } + + public static long power(long x, long p) { + long ans = 1; + while (p > 0) { + if ((p & 1) == 1) { + ans = (ans * x) % MOD; + } + x = (x * x) % MOD; + p >>= 1; + } + return ans; + } + + public static long c(int all, int pick) { + return (((fac[all] * inv[pick]) % MOD) * inv[all - pick]) % MOD; + } + + public static long compute() { + build(); + long tmp = 2, cur; + for (int i = n; i >= k; i--) { + cur = (tmp + MOD - 1) % MOD; + f[i] = (c(n, i) * cur) % MOD; + tmp = (tmp * tmp) % MOD; + + } + long g = 0; + for (int i = k; i <= n; i++) { + if (((i - k) & 1) == 0) { + g = (g + ((c(i, k) * f[i]) % MOD)) % MOD; + } else { + g = (g + (((((long) (MOD - 1) * c(i, k)) % MOD) * f[i]) % MOD)) % MOD; + } + } + return g; + } + + 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(); + k = (int) in.nval; + out.println(compute()); + out.flush(); + out.close(); + br.close(); + } + +} From dd57a743cf5d42e7d5e0e6b0912cb6840c18582c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 19 Sep 2024 18:16:44 +0800 Subject: [PATCH 0152/2029] modify code --- src/class144/Code04_SetCounting.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/class144/Code04_SetCounting.java b/src/class144/Code04_SetCounting.java index 4d5408eef..ca5f4a6d9 100644 --- a/src/class144/Code04_SetCounting.java +++ b/src/class144/Code04_SetCounting.java @@ -56,12 +56,13 @@ public static long c(int all, int pick) { public static long compute() { build(); - long tmp = 2, cur; + long tmp = 2; for (int i = n; i >= k; i--) { - cur = (tmp + MOD - 1) % MOD; - f[i] = (c(n, i) * cur) % MOD; + f[i] = (tmp + MOD - 1) % MOD; tmp = (tmp * tmp) % MOD; - + } + for (int i = n; i >= k; i--) { + f[i] = (c(n, i) * f[i]) % MOD; } long g = 0; for (int i = k; i <= n; i++) { From 204bd74addf0d8e85ea8f60383f6050c2df60da4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 19 Sep 2024 19:58:25 +0800 Subject: [PATCH 0153/2029] modify code --- src/class144/Code05.java | 6 -- src/class144/Code05_NothingFear.java | 116 +++++++++++++++++++++++++++ 2 files changed, 116 insertions(+), 6 deletions(-) delete mode 100644 src/class144/Code05.java create mode 100644 src/class144/Code05_NothingFear.java diff --git a/src/class144/Code05.java b/src/class144/Code05.java deleted file mode 100644 index 61cf58c9d..000000000 --- a/src/class144/Code05.java +++ /dev/null @@ -1,6 +0,0 @@ -package class144; - -// 测试链接 : https://www.luogu.com.cn/problem/P4859 -public class Code05 { - -} diff --git a/src/class144/Code05_NothingFear.java b/src/class144/Code05_NothingFear.java new file mode 100644 index 000000000..dcdf9afad --- /dev/null +++ b/src/class144/Code05_NothingFear.java @@ -0,0 +1,116 @@ +package class144; + +// 已经没有什么好害怕的了 +// 测试链接 : https://www.luogu.com.cn/problem/P4859 + +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 Code05_NothingFear { + + public static int MAXN = 2001; + + public static int MOD = 1000000009; + + public static int n, k; + + public static int[] a = new int[MAXN]; + + public static int[] b = new int[MAXN]; + + public static long[] fac = new long[MAXN]; + + public static long[] inv = new long[MAXN]; + + public static long[] near = new long[MAXN]; + + public static long[][] f = new long[MAXN][MAXN]; + + public static void build() { + fac[0] = inv[0] = 1; + fac[1] = 1; + for (int i = 2; i <= n; i++) { + fac[i] = ((long) i * fac[i - 1]) % MOD; + } + inv[n] = power(fac[n], MOD - 2); + for (int i = n - 1; i >= 1; i--) { + inv[i] = ((long) (i + 1) * inv[i + 1]) % MOD; + } + } + + public static long power(long x, long p) { + long ans = 1; + while (p > 0) { + if ((p & 1) == 1) { + ans = (ans * x) % MOD; + } + x = (x * x) % MOD; + p >>= 1; + } + return ans; + } + + public static long c(int all, int pick) { + return (((fac[all] * inv[pick]) % MOD) * inv[all - pick]) % MOD; + } + + public static long compute() { + if ((n + k) % 2 != 0) { + return 0; + } + k = (n + k) / 2; + build(); + Arrays.sort(a, 1, n + 1); + Arrays.sort(b, 1, n + 1); + for (int i = 1, find = 0; i <= n; i++) { + while (find + 1 <= n && b[find + 1] < a[i]) { + find++; + } + near[i] = find; + } + f[0][0] = 1; + for (int i = 1; i <= n; i++) { + f[i][0] = f[i - 1][0]; + for (int j = 1; j <= i; j++) { + f[i][j] = (f[i - 1][j] + f[i - 1][j - 1] * Math.max(0, near[i] - j + 1) % MOD) % MOD; + } + } + long ans = 0; + for (int i = k; i <= n; i++) { + if ((i - k) % 2 == 0) { + ans = (ans + (c(i, k) * ((f[n][i] * fac[n - i]) % MOD))) % MOD; + } else { + ans = (ans + ((((MOD - 1) * c(i, k)) % MOD) * ((f[n][i] * fac[n - i]) % MOD))) % MOD; + } + } + return ans; + } + + 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(); + k = (int) in.nval; + for (int i = 1; i <= n; i++) { + in.nextToken(); + a[i] = (int) in.nval; + } + for (int i = 1; i <= n; i++) { + in.nextToken(); + b[i] = (int) in.nval; + } + out.println(compute()); + out.flush(); + out.close(); + br.close(); + } + +} From 3e055a696bf5139f697be32c0b5fe0b09113a5ff Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 19 Sep 2024 20:05:41 +0800 Subject: [PATCH 0154/2029] modify code --- src/class144/Code05_NothingFear.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class144/Code05_NothingFear.java b/src/class144/Code05_NothingFear.java index dcdf9afad..e65e2750e 100644 --- a/src/class144/Code05_NothingFear.java +++ b/src/class144/Code05_NothingFear.java @@ -80,15 +80,15 @@ public static long compute() { f[i][j] = (f[i - 1][j] + f[i - 1][j - 1] * Math.max(0, near[i] - j + 1) % MOD) % MOD; } } - long ans = 0; + long g = 0; for (int i = k; i <= n; i++) { if ((i - k) % 2 == 0) { - ans = (ans + (c(i, k) * ((f[n][i] * fac[n - i]) % MOD))) % MOD; + g = (g + (c(i, k) * ((fac[n - i] * f[n][i]) % MOD))) % MOD; } else { - ans = (ans + ((((MOD - 1) * c(i, k)) % MOD) * ((f[n][i] * fac[n - i]) % MOD))) % MOD; + g = (g + ((((MOD - 1) * c(i, k)) % MOD) * ((fac[n - i] * f[n][i]) % MOD))) % MOD; } } - return ans; + return g; } public static void main(String[] args) throws IOException { From 2d4e3044638e299a5e3fcc3be657cc8ccf329762 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 19 Sep 2024 23:02:49 +0800 Subject: [PATCH 0155/2029] modify code --- src/class144/Code04_SetCounting.java | 14 +-- src/class144/Code05_NothingFear.java | 16 +-- src/class144/Code06.java | 6 -- .../Code06_DistributeSpecialties.java | 97 +++++++++++++++++++ src/class144/Code07.java | 6 -- src/class144/Code07_Game.java | 65 +++++++++++++ 6 files changed, 177 insertions(+), 27 deletions(-) delete mode 100644 src/class144/Code06.java create mode 100644 src/class144/Code06_DistributeSpecialties.java delete mode 100644 src/class144/Code07.java create mode 100644 src/class144/Code07_Game.java diff --git a/src/class144/Code04_SetCounting.java b/src/class144/Code04_SetCounting.java index ca5f4a6d9..b40abf2d3 100644 --- a/src/class144/Code04_SetCounting.java +++ b/src/class144/Code04_SetCounting.java @@ -20,7 +20,7 @@ public class Code04_SetCounting { public static long[] inv = new long[MAXN]; - public static long[] f = new long[MAXN]; + public static long[] g = new long[MAXN]; public static int n, k; @@ -58,21 +58,21 @@ public static long compute() { build(); long tmp = 2; for (int i = n; i >= k; i--) { - f[i] = (tmp + MOD - 1) % MOD; + g[i] = (tmp + MOD - 1) % MOD; tmp = (tmp * tmp) % MOD; } for (int i = n; i >= k; i--) { - f[i] = (c(n, i) * f[i]) % MOD; + g[i] = (c(n, i) * g[i]) % MOD; } - long g = 0; + long ans = 0; for (int i = k; i <= n; i++) { if (((i - k) & 1) == 0) { - g = (g + ((c(i, k) * f[i]) % MOD)) % MOD; + ans = (ans + ((c(i, k) * g[i]) % MOD)) % MOD; } else { - g = (g + (((((long) (MOD - 1) * c(i, k)) % MOD) * f[i]) % MOD)) % MOD; + ans = (ans + (((((long) (MOD - 1) * c(i, k)) % MOD) * g[i]) % MOD)) % MOD; } } - return g; + return ans; } public static void main(String[] args) throws IOException { diff --git a/src/class144/Code05_NothingFear.java b/src/class144/Code05_NothingFear.java index e65e2750e..cd2ece332 100644 --- a/src/class144/Code05_NothingFear.java +++ b/src/class144/Code05_NothingFear.java @@ -29,7 +29,7 @@ public class Code05_NothingFear { public static long[] near = new long[MAXN]; - public static long[][] f = new long[MAXN][MAXN]; + public static long[][] g = new long[MAXN][MAXN]; public static void build() { fac[0] = inv[0] = 1; @@ -73,22 +73,22 @@ public static long compute() { } near[i] = find; } - f[0][0] = 1; + g[0][0] = 1; for (int i = 1; i <= n; i++) { - f[i][0] = f[i - 1][0]; + g[i][0] = g[i - 1][0]; for (int j = 1; j <= i; j++) { - f[i][j] = (f[i - 1][j] + f[i - 1][j - 1] * Math.max(0, near[i] - j + 1) % MOD) % MOD; + g[i][j] = (g[i - 1][j] + g[i - 1][j - 1] * Math.max(0, near[i] - j + 1) % MOD) % MOD; } } - long g = 0; + long ans = 0; for (int i = k; i <= n; i++) { if ((i - k) % 2 == 0) { - g = (g + (c(i, k) * ((fac[n - i] * f[n][i]) % MOD))) % MOD; + ans = (ans + (c(i, k) * ((fac[n - i] * g[n][i]) % MOD))) % MOD; } else { - g = (g + ((((MOD - 1) * c(i, k)) % MOD) * ((fac[n - i] * f[n][i]) % MOD))) % MOD; + ans = (ans + ((((MOD - 1) * c(i, k)) % MOD) * ((fac[n - i] * g[n][i]) % MOD))) % MOD; } } - return g; + return ans; } public static void main(String[] args) throws IOException { diff --git a/src/class144/Code06.java b/src/class144/Code06.java deleted file mode 100644 index b0e375d85..000000000 --- a/src/class144/Code06.java +++ /dev/null @@ -1,6 +0,0 @@ -package class144; - -// 测试链接 : https://www.luogu.com.cn/problem/P5505 -public class Code06 { - -} diff --git a/src/class144/Code06_DistributeSpecialties.java b/src/class144/Code06_DistributeSpecialties.java new file mode 100644 index 000000000..b2717e79a --- /dev/null +++ b/src/class144/Code06_DistributeSpecialties.java @@ -0,0 +1,97 @@ +package class144; + +// 分特产 +// 测试链接 : https://www.luogu.com.cn/problem/P5505 + +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 Code06_DistributeSpecialties { + + public static int MAXN = 1001; + + public static int MAXK = MAXN * 2; + + public static int MOD = 1000000007; + + public static int[] arr = new int[MAXN]; + + public static long[] fac = new long[MAXK]; + + public static long[] inv = new long[MAXK]; + + public static long[] g = new long[MAXN]; + + public static int n, k, m; + + public static void build() { + fac[0] = inv[0] = 1; + fac[1] = 1; + for (int i = 2; i <= k; i++) { + fac[i] = ((long) i * fac[i - 1]) % MOD; + } + inv[k] = power(fac[k], MOD - 2); + for (int i = k - 1; i >= 1; i--) { + inv[i] = ((long) (i + 1) * inv[i + 1]) % MOD; + } + } + + public static long power(long x, long p) { + long ans = 1; + while (p > 0) { + if ((p & 1) == 1) { + ans = (ans * x) % MOD; + } + x = (x * x) % MOD; + p >>= 1; + } + return ans; + } + + public static long c(int all, int pick) { + return (((fac[all] * inv[pick]) % MOD) * inv[all - pick]) % MOD; + } + + public static long compute() { + build(); + for (int i = 0; i < n; i++) { + g[i] = c(n, i); + for (int j = 0; j < m; j++) { + g[i] = (int) ((g[i] * c(arr[j] + n - i - 1, n - i - 1)) % MOD); + } + } + long ans = 0; + for (int i = 0; i < n; i++) { + if ((i & 1) == 0) { + ans = (ans + g[i]) % MOD; + } else { + ans = (ans - g[i] + MOD) % MOD; + } + } + return ans; + } + + 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; + k = n * 2; + in.nextToken(); + m = (int) in.nval; + for (int i = 0; i < m; i++) { + in.nextToken(); + arr[i] = (int) in.nval; + } + out.println(compute()); + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class144/Code07.java b/src/class144/Code07.java deleted file mode 100644 index 9e4f42bc4..000000000 --- a/src/class144/Code07.java +++ /dev/null @@ -1,6 +0,0 @@ -package class144; - -// 测试链接 : https://www.luogu.com.cn/problem/P6478 -public class Code07 { - -} diff --git a/src/class144/Code07_Game.java b/src/class144/Code07_Game.java new file mode 100644 index 000000000..154123961 --- /dev/null +++ b/src/class144/Code07_Game.java @@ -0,0 +1,65 @@ +package class144; + +// 游戏 +// 测试链接 : https://www.luogu.com.cn/problem/P6478 + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.util.StringTokenizer; + +public class Code07_Game { + + public static void main(String[] args) throws IOException { + + } + + // Kattio类IO效率很好,但还是不如StreamTokenizer + // 只有StreamTokenizer无法正确处理时,才考虑使用这个类 + // 参考链接 : https://oi-wiki.org/lang/java-pro/ + public static class Kattio extends PrintWriter { + private BufferedReader r; + private StringTokenizer st; + + public Kattio() { + this(System.in, System.out); + } + + public Kattio(InputStream i, OutputStream o) { + super(o); + r = new BufferedReader(new InputStreamReader(i)); + } + + public Kattio(String intput, String output) throws IOException { + super(output); + r = new BufferedReader(new FileReader(intput)); + } + + public String next() { + try { + while (st == null || !st.hasMoreTokens()) + st = new StringTokenizer(r.readLine()); + return st.nextToken(); + } catch (Exception e) { + } + return null; + } + + public int nextInt() { + return Integer.parseInt(next()); + } + + public double nextDouble() { + return Double.parseDouble(next()); + } + + public long nextLong() { + return Long.parseLong(next()); + } + } + +} From 9ec55ff6b9795a2e147fdefacbc573dec1d80f6d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 20 Sep 2024 13:03:29 +0800 Subject: [PATCH 0156/2029] modify code --- src/class144/Code01.java | 8 + ...java => Code02_CalculateCoefficients.java} | 2 +- src/class144/Code03.java | 5 - ...ber.java => Code03_CombinationNumber.java} | 2 +- src/class144/Code04_SplitWays.java | 149 ++++++++++++++++++ src/class145/Code01_Derangement.java | 8 + .../Code02_SetCounting.java} | 4 +- .../Code03_NothingFear.java} | 4 +- .../Code04_DistributeSpecialties.java} | 4 +- .../Code05_Game.java} | 4 +- 10 files changed, 175 insertions(+), 15 deletions(-) create mode 100644 src/class144/Code01.java rename src/class144/{Code01_CalculateCoefficients.java => Code02_CalculateCoefficients.java} (98%) delete mode 100644 src/class144/Code03.java rename src/class144/{Code02_CombinationNumber.java => Code03_CombinationNumber.java} (98%) create mode 100644 src/class144/Code04_SplitWays.java create mode 100644 src/class145/Code01_Derangement.java rename src/{class144/Code04_SetCounting.java => class145/Code02_SetCounting.java} (97%) rename src/{class144/Code05_NothingFear.java => class145/Code03_NothingFear.java} (98%) rename src/{class144/Code06_DistributeSpecialties.java => class145/Code04_DistributeSpecialties.java} (97%) rename src/{class144/Code07_Game.java => class145/Code05_Game.java} (96%) diff --git a/src/class144/Code01.java b/src/class144/Code01.java new file mode 100644 index 000000000..76eb7a682 --- /dev/null +++ b/src/class144/Code01.java @@ -0,0 +1,8 @@ +package class144; + +// 杨辉三角形 +// 测试链接 : + +public class Code01 { + +} diff --git a/src/class144/Code01_CalculateCoefficients.java b/src/class144/Code02_CalculateCoefficients.java similarity index 98% rename from src/class144/Code01_CalculateCoefficients.java rename to src/class144/Code02_CalculateCoefficients.java index 3675e34d2..bf418cf8c 100644 --- a/src/class144/Code01_CalculateCoefficients.java +++ b/src/class144/Code02_CalculateCoefficients.java @@ -16,7 +16,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code01_CalculateCoefficients { +public class Code02_CalculateCoefficients { public static int MAXK = 1001; diff --git a/src/class144/Code03.java b/src/class144/Code03.java deleted file mode 100644 index 205aed150..000000000 --- a/src/class144/Code03.java +++ /dev/null @@ -1,5 +0,0 @@ -package class144; - -public class Code03 { - -} diff --git a/src/class144/Code02_CombinationNumber.java b/src/class144/Code03_CombinationNumber.java similarity index 98% rename from src/class144/Code02_CombinationNumber.java rename to src/class144/Code03_CombinationNumber.java index af37e68a0..95a27a908 100644 --- a/src/class144/Code02_CombinationNumber.java +++ b/src/class144/Code03_CombinationNumber.java @@ -20,7 +20,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code02_CombinationNumber { +public class Code03_CombinationNumber { public static int MAXV = 2000; diff --git a/src/class144/Code04_SplitWays.java b/src/class144/Code04_SplitWays.java new file mode 100644 index 000000000..f4d8f4e0e --- /dev/null +++ b/src/class144/Code04_SplitWays.java @@ -0,0 +1,149 @@ +package class144; + +// 分割的方法数 +// 给定一个长度为n的数组A, 将其分割成数组B和数组C,满足A[i] = B[i] + C[i] +// 也就是一个数字分成两份,然后各自进入B和C,要求B[i], C[i] >= 1 +// 同时要求,B数组从左到右不能降序,C数组从左到右不能升序 +// 比如,A = { 5, 4, 5 },一种有效的划分,B = { 2, 2, 3 },C = { 3, 2, 2 } +// 返回有多少种有效的划分方式 +// 1 <= n <= 10^7 +// 1 <= A[i] <= 10^7 +// 最终结果可能很大,对1000000007取余 +// 来自真实大厂笔试题,对数器验证 +public class Code04_SplitWays { + + // 暴力方法 + // 为了验证 + public static int ways1(int[] arr) { + int ans = 0; + for (int a = 1, b = arr[0] - 1; a < arr[0]; a++, b--) { + ans += process1(arr, 1, a, b); + } + return ans; + } + + public static int process1(int[] arr, int i, int ip, int dp) { + if (i == arr.length) { + return 1; + } + int ans = 0; + for (int a = 1, b = arr[i] - 1; a < arr[i]; a++, b--) { + if (ip <= a && dp >= b) { + ans += process1(arr, i + 1, a, b); + } + } + return ans; + } + + // 正式方法 + // 转化成杨辉三角形 + public static int ways2(int[] arr) { + int n = arr.length; + int k = arr[0] - 1; + for (int i = 1; i < n && k > 0; i++) { + if (arr[i - 1] > arr[i]) { + k -= arr[i - 1] - arr[i]; + } + } + if (k <= 0) { + return 0; + } + return c(k - 1 + n, n); + } + + // 组合公式 + public static int c(int n, int r) { + int mod = 1000000007; + long up = 1; + long inv1 = 1; + long inv2 = 1; + for (int i = 1; i <= n; i++) { + up = (up * i) % mod; + if (i == r) { + inv1 = power(up, mod - 2, mod); + } + if (i == n - r) { + inv2 = power(up, mod - 2, mod); + } + } + return (int) ((((up * inv1) % mod) * inv2) % mod); + } + + public static long power(long x, long p, long mod) { + long ans = 1; + while (p > 0) { + if ((p & 1) == 1) { + ans = (ans * x) % mod; + } + x = (x * x) % mod; + p >>= 1; + } + return ans; + } + + // 为了测试 + public static int[] randomArray(int n, int v) { + int[] ans = new int[n]; + for (int i = 0; i < n; i++) { + ans[i] = (int) (Math.random() * v) + 1; + } + return ans; + } + + // 为了测试 + public static void main(String[] args) { + // 展示一下pascalTriangleModulus的用法 + System.out.println("打印部分杨辉三角形"); + for (int n = 0; n <= 10; n++) { + for (int r = 0; r <= n; r++) { + System.out.print(c(n, r) + " "); + } + System.out.println(); + } + int N = 10; + int V = 20; + int testTimes = 20000; + System.out.println("功能测试开始"); + for (int i = 0; i < testTimes; i++) { + int n = (int) (Math.random() * N) + 1; + int[] arr = randomArray(n, V); + int ans1 = ways1(arr); + int ans2 = ways2(arr); + if (ans1 != ans2) { + System.out.println("出错了!"); + } + } + System.out.println("功能测试结束"); + + System.out.println("性能测试开始"); + int n = 10000000; + int v = 10000000; + long start, end; + int[] arr = new int[n]; + System.out.println("随机生成的数据测试 : "); + System.out.println("数组长度 : " + n); + System.out.println("数值范围 : [" + 1 + "," + v + "]"); + for (int i = 0; i < n; i++) { + arr[i] = (int) (Math.random() * v) + 1; + } + + start = System.currentTimeMillis(); + ways2(arr); + end = System.currentTimeMillis(); + System.out.println("运行时间 : " + (end - start) + " 毫秒"); + + System.out.println("运行最慢的数据测试 : "); + System.out.println("数组长度 : " + n); + System.out.println("数值都是 : " + v); + System.out.println("这种情况其实是复杂度最高的情况"); + for (int i = 0; i < n; i++) { + arr[i] = v; + } + start = System.currentTimeMillis(); + ways2(arr); + end = System.currentTimeMillis(); + System.out.println("运行时间 : " + (end - start) + " 毫秒"); + System.out.println("性能测试结束"); + } + +} diff --git a/src/class145/Code01_Derangement.java b/src/class145/Code01_Derangement.java new file mode 100644 index 000000000..3bac52bca --- /dev/null +++ b/src/class145/Code01_Derangement.java @@ -0,0 +1,8 @@ +package class145; + +// 信封问题(错位排列) +// 测试链接 : https://www.luogu.com.cn/problem/P1595 + +public class Code01_Derangement { + +} diff --git a/src/class144/Code04_SetCounting.java b/src/class145/Code02_SetCounting.java similarity index 97% rename from src/class144/Code04_SetCounting.java rename to src/class145/Code02_SetCounting.java index b40abf2d3..9b35d0a35 100644 --- a/src/class144/Code04_SetCounting.java +++ b/src/class145/Code02_SetCounting.java @@ -1,4 +1,4 @@ -package class144; +package class145; // 集合计数 // 测试链接 : https://www.luogu.com.cn/problem/P10596 @@ -10,7 +10,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code04_SetCounting { +public class Code02_SetCounting { public static int MAXN = 1000001; diff --git a/src/class144/Code05_NothingFear.java b/src/class145/Code03_NothingFear.java similarity index 98% rename from src/class144/Code05_NothingFear.java rename to src/class145/Code03_NothingFear.java index cd2ece332..a16b1cf2a 100644 --- a/src/class144/Code05_NothingFear.java +++ b/src/class145/Code03_NothingFear.java @@ -1,4 +1,4 @@ -package class144; +package class145; // 已经没有什么好害怕的了 // 测试链接 : https://www.luogu.com.cn/problem/P4859 @@ -11,7 +11,7 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class Code05_NothingFear { +public class Code03_NothingFear { public static int MAXN = 2001; diff --git a/src/class144/Code06_DistributeSpecialties.java b/src/class145/Code04_DistributeSpecialties.java similarity index 97% rename from src/class144/Code06_DistributeSpecialties.java rename to src/class145/Code04_DistributeSpecialties.java index b2717e79a..d3f1d396c 100644 --- a/src/class144/Code06_DistributeSpecialties.java +++ b/src/class145/Code04_DistributeSpecialties.java @@ -1,4 +1,4 @@ -package class144; +package class145; // 分特产 // 测试链接 : https://www.luogu.com.cn/problem/P5505 @@ -10,7 +10,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code06_DistributeSpecialties { +public class Code04_DistributeSpecialties { public static int MAXN = 1001; diff --git a/src/class144/Code07_Game.java b/src/class145/Code05_Game.java similarity index 96% rename from src/class144/Code07_Game.java rename to src/class145/Code05_Game.java index 154123961..2487dee26 100644 --- a/src/class144/Code07_Game.java +++ b/src/class145/Code05_Game.java @@ -1,4 +1,4 @@ -package class144; +package class145; // 游戏 // 测试链接 : https://www.luogu.com.cn/problem/P6478 @@ -12,7 +12,7 @@ import java.io.PrintWriter; import java.util.StringTokenizer; -public class Code07_Game { +public class Code05_Game { public static void main(String[] args) throws IOException { From d76d7b53fc769352e6ae9c9ce2d04124f134b2e5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 20 Sep 2024 13:05:02 +0800 Subject: [PATCH 0157/2029] modify code --- src/class144/Code04_SplitWays.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/class144/Code04_SplitWays.java b/src/class144/Code04_SplitWays.java index f4d8f4e0e..78d388658 100644 --- a/src/class144/Code04_SplitWays.java +++ b/src/class144/Code04_SplitWays.java @@ -17,19 +17,19 @@ public class Code04_SplitWays { public static int ways1(int[] arr) { int ans = 0; for (int a = 1, b = arr[0] - 1; a < arr[0]; a++, b--) { - ans += process1(arr, 1, a, b); + ans += f(arr, 1, a, b); } return ans; } - public static int process1(int[] arr, int i, int ip, int dp) { + public static int f(int[] arr, int i, int ip, int dp) { if (i == arr.length) { return 1; } int ans = 0; for (int a = 1, b = arr[i] - 1; a < arr[i]; a++, b--) { if (ip <= a && dp >= b) { - ans += process1(arr, i + 1, a, b); + ans += f(arr, i + 1, a, b); } } return ans; From 445038adf3022a0ea06b6128f5e22c643928cb4c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 20 Sep 2024 18:40:57 +0800 Subject: [PATCH 0158/2029] modify code --- src/class145/Code03_NothingFear.java | 35 +-- .../Code04_DistributeSpecialties.java | 35 +-- src/class145/Code05_Game.java | 65 ----- src/class145/Code05_Game1.java | 190 +++++++++++++++ src/class145/Code05_Game2.java | 225 ++++++++++++++++++ 5 files changed, 435 insertions(+), 115 deletions(-) delete mode 100644 src/class145/Code05_Game.java create mode 100644 src/class145/Code05_Game1.java create mode 100644 src/class145/Code05_Game2.java diff --git a/src/class145/Code03_NothingFear.java b/src/class145/Code03_NothingFear.java index a16b1cf2a..74e25d472 100644 --- a/src/class145/Code03_NothingFear.java +++ b/src/class145/Code03_NothingFear.java @@ -25,38 +25,23 @@ public class Code03_NothingFear { public static long[] fac = new long[MAXN]; - public static long[] inv = new long[MAXN]; + public static long[][] c = new long[MAXN][MAXN]; public static long[] near = new long[MAXN]; public static long[][] g = new long[MAXN][MAXN]; public static void build() { - fac[0] = inv[0] = 1; - fac[1] = 1; - for (int i = 2; i <= n; i++) { - fac[i] = ((long) i * fac[i - 1]) % MOD; - } - inv[n] = power(fac[n], MOD - 2); - for (int i = n - 1; i >= 1; i--) { - inv[i] = ((long) (i + 1) * inv[i + 1]) % MOD; + fac[0] = 1; + for (int i = 1; i <= n; i++) { + fac[i] = fac[i - 1] * i % MOD; } - } - - public static long power(long x, long p) { - long ans = 1; - while (p > 0) { - if ((p & 1) == 1) { - ans = (ans * x) % MOD; + for (int i = 0; i <= n; i++) { + c[i][0] = 1; + for (int j = 1; j <= i; j++) { + c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % MOD; } - x = (x * x) % MOD; - p >>= 1; } - return ans; - } - - public static long c(int all, int pick) { - return (((fac[all] * inv[pick]) % MOD) * inv[all - pick]) % MOD; } public static long compute() { @@ -83,9 +68,9 @@ public static long compute() { long ans = 0; for (int i = k; i <= n; i++) { if ((i - k) % 2 == 0) { - ans = (ans + (c(i, k) * ((fac[n - i] * g[n][i]) % MOD))) % MOD; + ans = (ans + (c[i][k] * ((fac[n - i] * g[n][i]) % MOD))) % MOD; } else { - ans = (ans + ((((MOD - 1) * c(i, k)) % MOD) * ((fac[n - i] * g[n][i]) % MOD))) % MOD; + ans = (ans + ((((MOD - 1) * c[i][k]) % MOD) * ((fac[n - i] * g[n][i]) % MOD))) % MOD; } } return ans; diff --git a/src/class145/Code04_DistributeSpecialties.java b/src/class145/Code04_DistributeSpecialties.java index d3f1d396c..bf38b1f06 100644 --- a/src/class145/Code04_DistributeSpecialties.java +++ b/src/class145/Code04_DistributeSpecialties.java @@ -22,46 +22,31 @@ public class Code04_DistributeSpecialties { public static long[] fac = new long[MAXK]; - public static long[] inv = new long[MAXK]; + public static long[][] c = new long[MAXK][MAXK]; public static long[] g = new long[MAXN]; public static int n, k, m; public static void build() { - fac[0] = inv[0] = 1; - fac[1] = 1; - for (int i = 2; i <= k; i++) { - fac[i] = ((long) i * fac[i - 1]) % MOD; + fac[0] = 1; + for (int i = 1; i <= k; i++) { + fac[i] = fac[i - 1] * i % MOD; } - inv[k] = power(fac[k], MOD - 2); - for (int i = k - 1; i >= 1; i--) { - inv[i] = ((long) (i + 1) * inv[i + 1]) % MOD; - } - } - - public static long power(long x, long p) { - long ans = 1; - while (p > 0) { - if ((p & 1) == 1) { - ans = (ans * x) % MOD; + for (int i = 0; i <= k; i++) { + c[i][0] = 1; + for (int j = 1; j <= i; j++) { + c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % MOD; } - x = (x * x) % MOD; - p >>= 1; } - return ans; - } - - public static long c(int all, int pick) { - return (((fac[all] * inv[pick]) % MOD) * inv[all - pick]) % MOD; } public static long compute() { build(); for (int i = 0; i < n; i++) { - g[i] = c(n, i); + g[i] = c[n][i]; for (int j = 0; j < m; j++) { - g[i] = (int) ((g[i] * c(arr[j] + n - i - 1, n - i - 1)) % MOD); + g[i] = (int) ((g[i] * c[arr[j] + n - i - 1][n - i - 1]) % MOD); } } long ans = 0; diff --git a/src/class145/Code05_Game.java b/src/class145/Code05_Game.java deleted file mode 100644 index 2487dee26..000000000 --- a/src/class145/Code05_Game.java +++ /dev/null @@ -1,65 +0,0 @@ -package class145; - -// 游戏 -// 测试链接 : https://www.luogu.com.cn/problem/P6478 - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.io.PrintWriter; -import java.util.StringTokenizer; - -public class Code05_Game { - - public static void main(String[] args) throws IOException { - - } - - // Kattio类IO效率很好,但还是不如StreamTokenizer - // 只有StreamTokenizer无法正确处理时,才考虑使用这个类 - // 参考链接 : https://oi-wiki.org/lang/java-pro/ - public static class Kattio extends PrintWriter { - private BufferedReader r; - private StringTokenizer st; - - public Kattio() { - this(System.in, System.out); - } - - public Kattio(InputStream i, OutputStream o) { - super(o); - r = new BufferedReader(new InputStreamReader(i)); - } - - public Kattio(String intput, String output) throws IOException { - super(output); - r = new BufferedReader(new FileReader(intput)); - } - - public String next() { - try { - while (st == null || !st.hasMoreTokens()) - st = new StringTokenizer(r.readLine()); - return st.nextToken(); - } catch (Exception e) { - } - return null; - } - - public int nextInt() { - return Integer.parseInt(next()); - } - - public double nextDouble() { - return Double.parseDouble(next()); - } - - public long nextLong() { - return Long.parseLong(next()); - } - } - -} diff --git a/src/class145/Code05_Game1.java b/src/class145/Code05_Game1.java new file mode 100644 index 000000000..d66309af0 --- /dev/null +++ b/src/class145/Code05_Game1.java @@ -0,0 +1,190 @@ +package class145; + +// 游戏(递归版) +// 测试链接 : https://www.luogu.com.cn/problem/P6478 +// 提交以下的code,提交时请把类名改成"Main" +// C++这么写能全部通过,java有时候能全部通过,有时候若干测试点会出错 +// 这是因为递归展开太多层爆栈了,所以最稳妥的方式是改成迭代版 +// 迭代版就是本节课Code05_Game2文件 + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.StringTokenizer; + +public class Code05_Game1 { + + public static final int MAXN = 5001; + + public static final int MOD = 998244353; + + public static int[] arr = new int[MAXN]; + + // 阶乘表 + public static long[] fac = new long[MAXN]; + + // 组合结果表 + public static long[][] c = new long[MAXN][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 cnt; + + // dfs需要 + public static int[] size = new int[MAXN]; + + public static int[][] belong = new int[MAXN][2]; + + public static long[][] dp = new long[MAXN][MAXN]; + + public static long[] tmp = new long[MAXN]; + + // 反演需要 + public static long[] g = new long[MAXN]; + + public static long[] f = new long[MAXN]; + + public static int n, m; + + public static void build() { + fac[0] = 1; + for (int i = 1; i <= n; i++) { + fac[i] = fac[i - 1] * i % MOD; + } + for (int i = 0; i <= n; i++) { + c[i][0] = 1; + for (int j = 1; j <= i; j++) { + c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % MOD; + } + } + cnt = 1; + Arrays.fill(head, 1, n + 1, 0); + } + + public static void addEdge(int u, int v) { + next[cnt] = head[u]; + to[cnt] = v; + head[u] = cnt++; + } + + public static void dfs(int u, int fa) { + size[u] = 1; + belong[u][arr[u]] = 1; + dp[u][0] = 1; + for (int e = head[u], v; e > 0; e = next[e]) { + v = to[e]; + if (v != fa) { + dfs(v, u); + Arrays.fill(tmp, 0, Math.min(size[u] + size[v], m) + 1, 0); + for (int i = 0; i <= Math.min(size[u], m); i++) { + for (int j = 0; j <= Math.min(size[v], m - i); j++) { + tmp[i + j] = (tmp[i + j] + dp[u][i] * dp[v][j] % MOD) % MOD; + } + } + size[u] += size[v]; + belong[u][0] += belong[v][0]; + belong[u][1] += belong[v][1]; + for (int i = 0; i <= Math.min(size[u], m); i++) { + dp[u][i] = tmp[i]; + } + } + } + for (int i = belong[u][arr[u] ^ 1]; i >= 0; i--) { + dp[u][i + 1] = (dp[u][i + 1] + dp[u][i] * (belong[u][arr[u] ^ 1] - i) % MOD) % MOD; + } + } + + public static void compute() { + dfs(1, 0); + for (int i = 0; i <= m; i++) { + g[i] = dp[1][i] * fac[m - i] % MOD; + } + for (int i = 0; i <= m; i++) { + for (int j = i; j <= m; j++) { + if ((j - i) % 2 == 1) { + f[i] = (f[i] - c[j][i] * g[j] % MOD + MOD) % MOD; + } else { + f[i] = (f[i] + c[j][i] * g[j] % MOD) % MOD; + } + } + } + } + + public static void main(String[] args) { + Kattio io = new Kattio(); + n = io.nextInt(); + m = n >> 1; + build(); + String str = io.next(); + for (int i = 1; i <= n; i++) { + arr[i] = str.charAt(i - 1) - '0'; + } + for (int i = 1, u, v; i < n; i++) { + u = io.nextInt(); + v = io.nextInt(); + addEdge(u, v); + addEdge(v, u); + } + compute(); + for (int i = 0; i <= m; i++) { + io.println(f[i]); + } + io.flush(); + io.close(); + } + + // Kattio类IO效率很好,但还是不如StreamTokenizer + // 只有StreamTokenizer无法正确处理时,才考虑使用这个类 + // 参考链接 : https://oi-wiki.org/lang/java-pro/ + public static class Kattio extends PrintWriter { + private BufferedReader r; + private StringTokenizer st; + + public Kattio() { + this(System.in, System.out); + } + + public Kattio(InputStream i, OutputStream o) { + super(o); + r = new BufferedReader(new InputStreamReader(i)); + } + + public Kattio(String intput, String output) throws IOException { + super(output); + r = new BufferedReader(new FileReader(intput)); + } + + public String next() { + try { + while (st == null || !st.hasMoreTokens()) + st = new StringTokenizer(r.readLine()); + return st.nextToken(); + } catch (Exception e) { + } + return null; + } + + public int nextInt() { + return Integer.parseInt(next()); + } + + public double nextDouble() { + return Double.parseDouble(next()); + } + + public long nextLong() { + return Long.parseLong(next()); + } + } + +} \ No newline at end of file diff --git a/src/class145/Code05_Game2.java b/src/class145/Code05_Game2.java new file mode 100644 index 000000000..c36388402 --- /dev/null +++ b/src/class145/Code05_Game2.java @@ -0,0 +1,225 @@ +package class145; + +// 游戏(迭代版) +// 测试链接 : https://www.luogu.com.cn/problem/P6478 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有用例 + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.StringTokenizer; + +public class Code05_Game2 { + + public static final int MAXN = 5001; + + public static final int MOD = 998244353; + + public static int[] arr = new int[MAXN]; + + // 阶乘表 + public static long[] fac = new long[MAXN]; + + // 组合结果表 + public static long[][] c = new long[MAXN][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 cnt; + + // dfs需要 + public static int[] size = new int[MAXN]; + + public static int[][] belong = new int[MAXN][2]; + + public static long[][] dp = new long[MAXN][MAXN]; + + public static long[] tmp = new long[MAXN]; + + // 反演需要 + public static long[] g = new long[MAXN]; + + public static long[] f = new long[MAXN]; + + public static int n, m; + + public static void build() { + fac[0] = 1; + for (int i = 1; i <= n; i++) { + fac[i] = fac[i - 1] * i % MOD; + } + for (int i = 0; i <= n; i++) { + c[i][0] = 1; + for (int j = 1; j <= i; j++) { + c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % MOD; + } + } + cnt = 1; + Arrays.fill(head, 1, n + 1, 0); + } + + public static void addEdge(int u, int v) { + next[cnt] = head[u]; + to[cnt] = v; + head[u] = cnt++; + } + + // ufe是为了实现迭代版而准备的栈 + public static int[][] ufe = new int[MAXN][3]; + + public static int stackSize, u, fa, e; + + public static void push(int u, int fa, int e) { + ufe[stackSize][0] = u; + ufe[stackSize][1] = fa; + ufe[stackSize][2] = e; + stackSize++; + } + + public static void pop() { + --stackSize; + u = ufe[stackSize][0]; + fa = ufe[stackSize][1]; + e = ufe[stackSize][2]; + } + + // 迭代版 + // 不会改看讲解118,讲了怎么从递归版改成迭代版 + public static void dfs(int root) { + stackSize = 0; + push(root, 0, -1); + int v; + while (stackSize > 0) { + pop(); + if (e == -1) { // 第一次来到当前节点,设置初始值 + size[u] = 1; + belong[u][arr[u]] = 1; + dp[u][0] = 1; + e = head[u]; + } else { // 不是第一次来到当前节点 + v = to[e]; + if (v != fa) { + // 之前的孩子,dfs过程计算完了,所以用之前孩子的信息,更新当前节点的信息 + Arrays.fill(tmp, 0, Math.min(size[u] + size[v], m) + 1, 0); + for (int i = 0; i <= Math.min(size[u], m); i++) { + for (int j = 0; j <= Math.min(size[v], m - i); j++) { + tmp[i + j] = (tmp[i + j] + dp[u][i] * dp[v][j] % MOD) % MOD; + } + } + size[u] += size[v]; + belong[u][0] += belong[v][0]; + belong[u][1] += belong[v][1]; + for (int i = 0; i <= Math.min(size[u], m); i++) { + dp[u][i] = tmp[i]; + } + } + // 去往下一个孩子 + e = next[e]; + } + if (e != 0) { // 还有后续子节点 + push(u, fa, e); + if (to[e] != fa) { + push(to[e], u, -1); + } + } else { // 没有后续子节点,做最后的收尾工作 + for (int i = belong[u][arr[u] ^ 1]; i >= 0; i--) { + dp[u][i + 1] = (dp[u][i + 1] + dp[u][i] * (belong[u][arr[u] ^ 1] - i) % MOD) % MOD; + } + } + } + } + + public static void compute() { + dfs(1); + for (int i = 0; i <= m; i++) { + g[i] = dp[1][i] * fac[m - i] % MOD; + } + for (int i = 0; i <= m; i++) { + for (int j = i; j <= m; j++) { + if ((j - i) % 2 == 1) { + f[i] = (f[i] - c[j][i] * g[j] % MOD + MOD) % MOD; + } else { + f[i] = (f[i] + c[j][i] * g[j] % MOD) % MOD; + } + } + } + } + + public static void main(String[] args) { + Kattio io = new Kattio(); + n = io.nextInt(); + m = n >> 1; + build(); + String str = io.next(); + for (int i = 1; i <= n; i++) { + arr[i] = str.charAt(i - 1) - '0'; + } + for (int i = 1, u, v; i < n; i++) { + u = io.nextInt(); + v = io.nextInt(); + addEdge(u, v); + addEdge(v, u); + } + compute(); + for (int i = 0; i <= m; i++) { + io.println(f[i]); + } + io.flush(); + io.close(); + } + + // Kattio类IO效率很好,但还是不如StreamTokenizer + // 只有StreamTokenizer无法正确处理时,才考虑使用这个类 + // 参考链接 : https://oi-wiki.org/lang/java-pro/ + public static class Kattio extends PrintWriter { + private BufferedReader r; + private StringTokenizer st; + + public Kattio() { + this(System.in, System.out); + } + + public Kattio(InputStream i, OutputStream o) { + super(o); + r = new BufferedReader(new InputStreamReader(i)); + } + + public Kattio(String intput, String output) throws IOException { + super(output); + r = new BufferedReader(new FileReader(intput)); + } + + public String next() { + try { + while (st == null || !st.hasMoreTokens()) + st = new StringTokenizer(r.readLine()); + return st.nextToken(); + } catch (Exception e) { + } + return null; + } + + public int nextInt() { + return Integer.parseInt(next()); + } + + public double nextDouble() { + return Double.parseDouble(next()); + } + + public long nextLong() { + return Long.parseLong(next()); + } + } + +} \ No newline at end of file From b1abb92bddfe20c68442a8d62e927b012f48535c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 20 Sep 2024 18:46:23 +0800 Subject: [PATCH 0159/2029] modify code --- src/class120/Code03_GreatCowGathering2.java | 4 ++-- src/class121/Code02_DiameterAndCommonEdges2.java | 4 ++-- src/class121/Code05_FireFighting2.java | 2 +- src/class122/Code01_MaxFlow2.java | 4 ++-- src/class122/Code02_SquirrelHome2.java | 4 ++-- src/class122/Code05_TransportPlan2.java | 4 ++-- src/class123/Code01_MaximizeSumOfDeeps2.java | 4 ++-- src/class123/Code04_MaximizeFlow2.java | 4 ++-- src/class123/Code05_SumOfNearby2.java | 4 ++-- src/class145/Code05_Game2.java | 2 +- 10 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/class120/Code03_GreatCowGathering2.java b/src/class120/Code03_GreatCowGathering2.java index c0f4e7cdc..9ab5ba92b 100644 --- a/src/class120/Code03_GreatCowGathering2.java +++ b/src/class120/Code03_GreatCowGathering2.java @@ -78,7 +78,7 @@ public static void pop() { } // 迭代版 - // 不会改看讲解118,讲了怎么从递归版改成迭代版 + // 不会改,看讲解118,讲了怎么从递归版改成迭代版 public static void findCenter(int root) { stackSize = 0; push(root, 0, -1); @@ -114,7 +114,7 @@ public static void findCenter(int root) { } // 迭代版 - // 不会改看讲解118,讲了怎么从递归版改成迭代版 + // 不会改,看讲解118,讲了怎么从递归版改成迭代版 public static void setPath(int root) { stackSize = 0; push(root, 0, -1); diff --git a/src/class121/Code02_DiameterAndCommonEdges2.java b/src/class121/Code02_DiameterAndCommonEdges2.java index 13bc88914..0cb93ab20 100644 --- a/src/class121/Code02_DiameterAndCommonEdges2.java +++ b/src/class121/Code02_DiameterAndCommonEdges2.java @@ -76,7 +76,7 @@ public static void road() { } // dfs方法改迭代版 - // 不会改看讲解118,讲了怎么从递归版改成迭代版 + // 不会改,看讲解118,讲了怎么从递归版改成迭代版 public static int[][] ufeStack = new int[MAXN][3]; public static long[] distStack = new long[MAXN]; @@ -125,7 +125,7 @@ public static void dfs(int root) { } // maxDistanceExceptDiameter方法改迭代版 - // 不会改看讲解118,讲了怎么从递归版改成迭代版 + // 不会改,看讲解118,讲了怎么从递归版改成迭代版 public static long maxDistanceExceptDiameter(int root) { stackSize = 0; push(root, 0, -1, 0); diff --git a/src/class121/Code05_FireFighting2.java b/src/class121/Code05_FireFighting2.java index d4fa0e3cb..67d5e08f5 100644 --- a/src/class121/Code05_FireFighting2.java +++ b/src/class121/Code05_FireFighting2.java @@ -83,7 +83,7 @@ public static void road() { } // dfs方法改迭代版 - // 不会改看讲解118,讲了怎么从递归版改成迭代版 + // 不会改,看讲解118,讲了怎么从递归版改成迭代版 public static int[][] ufwe = new int[MAXN][4]; public static int stackSize; diff --git a/src/class122/Code01_MaxFlow2.java b/src/class122/Code01_MaxFlow2.java index fda5bfd17..cc97662cf 100644 --- a/src/class122/Code01_MaxFlow2.java +++ b/src/class122/Code01_MaxFlow2.java @@ -59,7 +59,7 @@ public static void addEdge(int u, int v) { } // dfs1方法的递归版改迭代版 - // 不会改看讲解118,讲了怎么从递归版改成迭代版 + // 不会改,看讲解118,讲了怎么从递归版改成迭代版 public static int[][] ufe = new int[MAXN][3]; public static int stackSize, u, f, e; @@ -126,7 +126,7 @@ public static int lca(int a, int b) { } // dfs2方法的递归版改迭代版 - // 不会改看讲解118,讲了怎么从递归版改成迭代版 + // 不会改,看讲解118,讲了怎么从递归版改成迭代版 public static void dfs2(int root) { stackSize = 0; push(root, 0, -1); diff --git a/src/class122/Code02_SquirrelHome2.java b/src/class122/Code02_SquirrelHome2.java index 6b94cddc5..c1173db45 100644 --- a/src/class122/Code02_SquirrelHome2.java +++ b/src/class122/Code02_SquirrelHome2.java @@ -91,7 +91,7 @@ public static int find(int i) { } // tarjan方法的递归版改迭代版 - // 不会改看讲解118,讲了怎么从递归版改成迭代版 + // 不会改,看讲解118,讲了怎么从递归版改成迭代版 public static int[][] ufe = new int[MAXN][3]; public static int stackSize, u, f, e; @@ -140,7 +140,7 @@ public static void tarjan(int root) { } // dfs方法的递归版改迭代版 - // 不会改看讲解118,讲了怎么从递归版改成迭代版 + // 不会改,看讲解118,讲了怎么从递归版改成迭代版 public static void dfs(int root) { stackSize = 0; push(root, 0, -1); diff --git a/src/class122/Code05_TransportPlan2.java b/src/class122/Code05_TransportPlan2.java index 0ccb308e3..b84f76fee 100644 --- a/src/class122/Code05_TransportPlan2.java +++ b/src/class122/Code05_TransportPlan2.java @@ -107,7 +107,7 @@ public static int find(int i) { } // tarjan方法的递归版改迭代版 - // 不会改看讲解118,讲了怎么从递归版改成迭代版 + // 不会改,看讲解118,讲了怎么从递归版改成迭代版 public static int[][] ufwe = new int[MAXN][4]; public static int stackSize, u, f, w, e; @@ -182,7 +182,7 @@ public static boolean f(int limit) { public static int beyond; // dfs方法的递归版改迭代版 - // 不会改看讲解118,讲了怎么从递归版改成迭代版 + // 不会改,看讲解118,讲了怎么从递归版改成迭代版 public static boolean dfs(int root) { stackSize = 0; push(root, 0, 0, -1); diff --git a/src/class123/Code01_MaximizeSumOfDeeps2.java b/src/class123/Code01_MaximizeSumOfDeeps2.java index 0635f22b9..05619883f 100644 --- a/src/class123/Code01_MaximizeSumOfDeeps2.java +++ b/src/class123/Code01_MaximizeSumOfDeeps2.java @@ -46,7 +46,7 @@ public static void addEdge(int u, int v) { } // dfs1方法改迭代版 - // 不会改看讲解118,讲了怎么从递归版改成迭代版 + // 不会改,看讲解118,讲了怎么从递归版改成迭代版 public static int[][] ufe = new int[MAXN][3]; public static int stackSize; @@ -97,7 +97,7 @@ public static void dfs1(int root) { } // dfs2方法改迭代版 - // 不会改看讲解118,讲了怎么从递归版改成迭代版 + // 不会改,看讲解118,讲了怎么从递归版改成迭代版 public static void dfs2(int root) { stackSize = 0; push(root, 0, -1); diff --git a/src/class123/Code04_MaximizeFlow2.java b/src/class123/Code04_MaximizeFlow2.java index 91e0e9bb0..dcae406c2 100644 --- a/src/class123/Code04_MaximizeFlow2.java +++ b/src/class123/Code04_MaximizeFlow2.java @@ -53,7 +53,7 @@ public static void addEdge(int u, int v, int w) { } // dfs1方法改迭代版 - // 不会改看讲解118,讲了怎么从递归版改成迭代版 + // 不会改,看讲解118,讲了怎么从递归版改成迭代版 public static int[][] ufe = new int[MAXN][3]; public static int stackSize; @@ -105,7 +105,7 @@ public static void dfs1(int root) { } // dfs2方法改迭代版 - // 不会改看讲解118,讲了怎么从递归版改成迭代版 + // 不会改,看讲解118,讲了怎么从递归版改成迭代版 public static void dfs2(int root) { stackSize = 0; push(root, 0, -1); diff --git a/src/class123/Code05_SumOfNearby2.java b/src/class123/Code05_SumOfNearby2.java index 5b0e34f85..0ae847604 100644 --- a/src/class123/Code05_SumOfNearby2.java +++ b/src/class123/Code05_SumOfNearby2.java @@ -51,7 +51,7 @@ public static void addEdge(int u, int v) { } // dfs1方法改迭代版 - // 不会改看讲解118,讲了怎么从递归版改成迭代版 + // 不会改,看讲解118,讲了怎么从递归版改成迭代版 public static int[][] ufe = new int[MAXN][3]; public static int stackSize; @@ -101,7 +101,7 @@ public static void dfs1(int root) { } // dfs2方法改迭代版 - // 不会改看讲解118,讲了怎么从递归版改成迭代版 + // 不会改,看讲解118,讲了怎么从递归版改成迭代版 public static void dfs2(int root) { stackSize = 0; push(root, 0, -1); diff --git a/src/class145/Code05_Game2.java b/src/class145/Code05_Game2.java index c36388402..bf75a71a8 100644 --- a/src/class145/Code05_Game2.java +++ b/src/class145/Code05_Game2.java @@ -94,7 +94,7 @@ public static void pop() { } // 迭代版 - // 不会改看讲解118,讲了怎么从递归版改成迭代版 + // 不会改,看讲解118,讲了怎么从递归版改成迭代版 public static void dfs(int root) { stackSize = 0; push(root, 0, -1); From db399be9c52352802fed097b56662c4aad5beccf Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 20 Sep 2024 20:02:32 +0800 Subject: [PATCH 0160/2029] modify code --- src/class145/Code01_Derangement.java | 54 +++++ .../{Code05_Game2.java => Code05_Game.java} | 41 +++- src/class145/Code05_Game1.java | 190 ------------------ 3 files changed, 89 insertions(+), 196 deletions(-) rename src/class145/{Code05_Game2.java => Code05_Game.java} (84%) delete mode 100644 src/class145/Code05_Game1.java diff --git a/src/class145/Code01_Derangement.java b/src/class145/Code01_Derangement.java index 3bac52bca..78ee8dda3 100644 --- a/src/class145/Code01_Derangement.java +++ b/src/class145/Code01_Derangement.java @@ -3,6 +3,60 @@ // 信封问题(错位排列) // 测试链接 : https://www.luogu.com.cn/problem/P1595 +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 Code01_Derangement { + 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(); + int n = (int) in.nval; + // out.println(ways1(n)); + out.println(ways2(n)); + out.flush(); + out.close(); + br.close(); + } + + // 普通分析的方法 + public static long ways1(int n) { + long[] dp = new long[n + 1]; + for (int i = 1; i <= n; i++) { + if (i == 1) { + dp[i] = 0; + } else if (i == 2) { + dp[i] = 1; + } else { + dp[i] = (i - 1) * (dp[i - 1] + dp[i - 2]); + } + } + return dp[n]; + } + + // 二项式反演的方法 + public static long ways2(int n) { + long fac = 1; + for (int i = 1; i <= n; i++) { + fac *= i; + } + long ans = fac; + long tmp = 1; + for (int i = 1; i <= n; i++) { + tmp = tmp * i; + if ((i & 1) == 0) { + ans += fac / tmp; + } else { + ans -= fac / tmp; + } + } + return ans; + } + } diff --git a/src/class145/Code05_Game2.java b/src/class145/Code05_Game.java similarity index 84% rename from src/class145/Code05_Game2.java rename to src/class145/Code05_Game.java index bf75a71a8..bd2d9f563 100644 --- a/src/class145/Code05_Game2.java +++ b/src/class145/Code05_Game.java @@ -1,8 +1,7 @@ package class145; -// 游戏(迭代版) +// 游戏 // 测试链接 : https://www.luogu.com.cn/problem/P6478 -// 提交以下的code,提交时请把类名改成"Main",可以通过所有用例 import java.io.BufferedReader; import java.io.FileReader; @@ -14,7 +13,7 @@ import java.util.Arrays; import java.util.StringTokenizer; -public class Code05_Game2 { +public class Code05_Game { public static final int MAXN = 5001; @@ -74,7 +73,37 @@ public static void addEdge(int u, int v) { head[u] = cnt++; } + // 递归版 + public static void dfs1(int u, int fa) { + size[u] = 1; + belong[u][arr[u]] = 1; + dp[u][0] = 1; + for (int e = head[u], v; e > 0; e = next[e]) { + v = to[e]; + if (v != fa) { + dfs1(v, u); + Arrays.fill(tmp, 0, Math.min(size[u] + size[v], m) + 1, 0); + for (int i = 0; i <= Math.min(size[u], m); i++) { + for (int j = 0; j <= Math.min(size[v], m - i); j++) { + tmp[i + j] = (tmp[i + j] + dp[u][i] * dp[v][j] % MOD) % MOD; + } + } + size[u] += size[v]; + belong[u][0] += belong[v][0]; + belong[u][1] += belong[v][1]; + for (int i = 0; i <= Math.min(size[u], m); i++) { + dp[u][i] = tmp[i]; + } + } + } + for (int i = belong[u][arr[u] ^ 1]; i >= 0; i--) { + dp[u][i + 1] = (dp[u][i + 1] + dp[u][i] * (belong[u][arr[u] ^ 1] - i) % MOD) % MOD; + } + } + + // 迭代版 // ufe是为了实现迭代版而准备的栈 + // 不会改,看讲解118,讲了怎么从递归版改成迭代版 public static int[][] ufe = new int[MAXN][3]; public static int stackSize, u, fa, e; @@ -94,8 +123,7 @@ public static void pop() { } // 迭代版 - // 不会改,看讲解118,讲了怎么从递归版改成迭代版 - public static void dfs(int root) { + public static void dfs2(int root) { stackSize = 0; push(root, 0, -1); int v; @@ -140,7 +168,8 @@ public static void dfs(int root) { } public static void compute() { - dfs(1); + // dfs1(1, 0); // 递归版 + dfs2(1); // 迭代版 for (int i = 0; i <= m; i++) { g[i] = dp[1][i] * fac[m - i] % MOD; } diff --git a/src/class145/Code05_Game1.java b/src/class145/Code05_Game1.java deleted file mode 100644 index d66309af0..000000000 --- a/src/class145/Code05_Game1.java +++ /dev/null @@ -1,190 +0,0 @@ -package class145; - -// 游戏(递归版) -// 测试链接 : https://www.luogu.com.cn/problem/P6478 -// 提交以下的code,提交时请把类名改成"Main" -// C++这么写能全部通过,java有时候能全部通过,有时候若干测试点会出错 -// 这是因为递归展开太多层爆栈了,所以最稳妥的方式是改成迭代版 -// 迭代版就是本节课Code05_Game2文件 - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.io.PrintWriter; -import java.util.Arrays; -import java.util.StringTokenizer; - -public class Code05_Game1 { - - public static final int MAXN = 5001; - - public static final int MOD = 998244353; - - public static int[] arr = new int[MAXN]; - - // 阶乘表 - public static long[] fac = new long[MAXN]; - - // 组合结果表 - public static long[][] c = new long[MAXN][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 cnt; - - // dfs需要 - public static int[] size = new int[MAXN]; - - public static int[][] belong = new int[MAXN][2]; - - public static long[][] dp = new long[MAXN][MAXN]; - - public static long[] tmp = new long[MAXN]; - - // 反演需要 - public static long[] g = new long[MAXN]; - - public static long[] f = new long[MAXN]; - - public static int n, m; - - public static void build() { - fac[0] = 1; - for (int i = 1; i <= n; i++) { - fac[i] = fac[i - 1] * i % MOD; - } - for (int i = 0; i <= n; i++) { - c[i][0] = 1; - for (int j = 1; j <= i; j++) { - c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % MOD; - } - } - cnt = 1; - Arrays.fill(head, 1, n + 1, 0); - } - - public static void addEdge(int u, int v) { - next[cnt] = head[u]; - to[cnt] = v; - head[u] = cnt++; - } - - public static void dfs(int u, int fa) { - size[u] = 1; - belong[u][arr[u]] = 1; - dp[u][0] = 1; - for (int e = head[u], v; e > 0; e = next[e]) { - v = to[e]; - if (v != fa) { - dfs(v, u); - Arrays.fill(tmp, 0, Math.min(size[u] + size[v], m) + 1, 0); - for (int i = 0; i <= Math.min(size[u], m); i++) { - for (int j = 0; j <= Math.min(size[v], m - i); j++) { - tmp[i + j] = (tmp[i + j] + dp[u][i] * dp[v][j] % MOD) % MOD; - } - } - size[u] += size[v]; - belong[u][0] += belong[v][0]; - belong[u][1] += belong[v][1]; - for (int i = 0; i <= Math.min(size[u], m); i++) { - dp[u][i] = tmp[i]; - } - } - } - for (int i = belong[u][arr[u] ^ 1]; i >= 0; i--) { - dp[u][i + 1] = (dp[u][i + 1] + dp[u][i] * (belong[u][arr[u] ^ 1] - i) % MOD) % MOD; - } - } - - public static void compute() { - dfs(1, 0); - for (int i = 0; i <= m; i++) { - g[i] = dp[1][i] * fac[m - i] % MOD; - } - for (int i = 0; i <= m; i++) { - for (int j = i; j <= m; j++) { - if ((j - i) % 2 == 1) { - f[i] = (f[i] - c[j][i] * g[j] % MOD + MOD) % MOD; - } else { - f[i] = (f[i] + c[j][i] * g[j] % MOD) % MOD; - } - } - } - } - - public static void main(String[] args) { - Kattio io = new Kattio(); - n = io.nextInt(); - m = n >> 1; - build(); - String str = io.next(); - for (int i = 1; i <= n; i++) { - arr[i] = str.charAt(i - 1) - '0'; - } - for (int i = 1, u, v; i < n; i++) { - u = io.nextInt(); - v = io.nextInt(); - addEdge(u, v); - addEdge(v, u); - } - compute(); - for (int i = 0; i <= m; i++) { - io.println(f[i]); - } - io.flush(); - io.close(); - } - - // Kattio类IO效率很好,但还是不如StreamTokenizer - // 只有StreamTokenizer无法正确处理时,才考虑使用这个类 - // 参考链接 : https://oi-wiki.org/lang/java-pro/ - public static class Kattio extends PrintWriter { - private BufferedReader r; - private StringTokenizer st; - - public Kattio() { - this(System.in, System.out); - } - - public Kattio(InputStream i, OutputStream o) { - super(o); - r = new BufferedReader(new InputStreamReader(i)); - } - - public Kattio(String intput, String output) throws IOException { - super(output); - r = new BufferedReader(new FileReader(intput)); - } - - public String next() { - try { - while (st == null || !st.hasMoreTokens()) - st = new StringTokenizer(r.readLine()); - return st.nextToken(); - } catch (Exception e) { - } - return null; - } - - public int nextInt() { - return Integer.parseInt(next()); - } - - public double nextDouble() { - return Double.parseDouble(next()); - } - - public long nextLong() { - return Long.parseLong(next()); - } - } - -} \ No newline at end of file From a7604728ae537914eb42dbd6660eca571c1b6d90 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 20 Sep 2024 20:17:03 +0800 Subject: [PATCH 0161/2029] modify code --- src/class144/Code04_SplitWays.java | 49 +++++++++++++--------------- src/class145/Code01_Derangement.java | 2 +- 2 files changed, 24 insertions(+), 27 deletions(-) diff --git a/src/class144/Code04_SplitWays.java b/src/class144/Code04_SplitWays.java index 78d388658..ad1d85d8a 100644 --- a/src/class144/Code04_SplitWays.java +++ b/src/class144/Code04_SplitWays.java @@ -37,6 +37,8 @@ public static int f(int[] arr, int i, int ip, int dp) { // 正式方法 // 转化成杨辉三角形 + public static final int MOD = 1000000007; + public static int ways2(int[] arr) { int n = arr.length; int k = arr[0] - 1; @@ -52,30 +54,30 @@ public static int ways2(int[] arr) { } // 组合公式 - public static int c(int n, int r) { - int mod = 1000000007; - long up = 1; + public static int c(int n, int k) { + long fac = 1; long inv1 = 1; long inv2 = 1; for (int i = 1; i <= n; i++) { - up = (up * i) % mod; - if (i == r) { - inv1 = power(up, mod - 2, mod); + fac = (fac * i) % MOD; + if (i == k) { + inv1 = power(fac, MOD - 2); // 费马小定理求逆元 } - if (i == n - r) { - inv2 = power(up, mod - 2, mod); + if (i == n - k) { + inv2 = power(fac, MOD - 2); // 费马小定理求逆元 } } - return (int) ((((up * inv1) % mod) * inv2) % mod); + return (int) ((((fac * inv1) % MOD) * inv2) % MOD); } - public static long power(long x, long p, long mod) { + // 乘法快速幂 + public static long power(long x, long p) { long ans = 1; while (p > 0) { if ((p & 1) == 1) { - ans = (ans * x) % mod; + ans = (ans * x) % MOD; } - x = (x * x) % mod; + x = (x * x) % MOD; p >>= 1; } return ans; @@ -92,19 +94,11 @@ public static int[] randomArray(int n, int v) { // 为了测试 public static void main(String[] args) { - // 展示一下pascalTriangleModulus的用法 - System.out.println("打印部分杨辉三角形"); - for (int n = 0; n <= 10; n++) { - for (int r = 0; r <= n; r++) { - System.out.print(c(n, r) + " "); - } - System.out.println(); - } + System.out.println("功能测试开始"); int N = 10; int V = 20; - int testTimes = 20000; - System.out.println("功能测试开始"); - for (int i = 0; i < testTimes; i++) { + int test = 20000; + for (int i = 0; i < test; i++) { int n = (int) (Math.random() * N) + 1; int[] arr = randomArray(n, V); int ans1 = ways1(arr); @@ -115,24 +109,27 @@ public static void main(String[] args) { } System.out.println("功能测试结束"); + System.out.println("=========="); + System.out.println("性能测试开始"); int n = 10000000; int v = 10000000; long start, end; int[] arr = new int[n]; - System.out.println("随机生成的数据测试 : "); + System.out.println("随机生成的数据测试"); System.out.println("数组长度 : " + n); System.out.println("数值范围 : [" + 1 + "," + v + "]"); for (int i = 0; i < n; i++) { arr[i] = (int) (Math.random() * v) + 1; } - start = System.currentTimeMillis(); ways2(arr); end = System.currentTimeMillis(); System.out.println("运行时间 : " + (end - start) + " 毫秒"); - System.out.println("运行最慢的数据测试 : "); + System.out.println(); + + System.out.println("运行最慢的数据测试"); System.out.println("数组长度 : " + n); System.out.println("数值都是 : " + v); System.out.println("这种情况其实是复杂度最高的情况"); diff --git a/src/class145/Code01_Derangement.java b/src/class145/Code01_Derangement.java index 78ee8dda3..9defbeff0 100644 --- a/src/class145/Code01_Derangement.java +++ b/src/class145/Code01_Derangement.java @@ -1,6 +1,6 @@ package class145; -// 信封问题(错位排列) +// 错位排列 // 测试链接 : https://www.luogu.com.cn/problem/P1595 import java.io.BufferedReader; From fcbd942d3355aef9d623957282d83bdef35c1017 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 20 Sep 2024 20:38:46 +0800 Subject: [PATCH 0162/2029] modify code --- src/class144/Code01.java | 8 ----- src/class144/Code01_PascalTriangle.java | 44 +++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 8 deletions(-) delete mode 100644 src/class144/Code01.java create mode 100644 src/class144/Code01_PascalTriangle.java diff --git a/src/class144/Code01.java b/src/class144/Code01.java deleted file mode 100644 index 76eb7a682..000000000 --- a/src/class144/Code01.java +++ /dev/null @@ -1,8 +0,0 @@ -package class144; - -// 杨辉三角形 -// 测试链接 : - -public class Code01 { - -} diff --git a/src/class144/Code01_PascalTriangle.java b/src/class144/Code01_PascalTriangle.java new file mode 100644 index 000000000..2835f635f --- /dev/null +++ b/src/class144/Code01_PascalTriangle.java @@ -0,0 +1,44 @@ +package class144; + +// 杨辉三角 +// 测试链接 : https://www.luogu.com.cn/problem/P5732 + +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 Code01_PascalTriangle { + + public static int MAXN = 20; + + public static long[][] tri = new long[MAXN][MAXN]; + + 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(); + int n = (int) in.nval; + for (int i = 0; i < n; i++) { + tri[i][0] = tri[i][i] = 1; + } + for (int i = 1; i < n; i++) { + for (int j = 1; j < i; j++) { + tri[i][j] = tri[i - 1][j] + tri[i - 1][j - 1]; + } + } + for (int i = 0; i < n; i++) { + for (int j = 0; j <= i; j++) { + out.print(tri[i][j] + " "); + } + out.println(); + } + out.flush(); + out.close(); + br.close(); + } + +} From 1ed14b1cfae7c5eddd6fcbb1d01e757a9cf17396 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 23 Sep 2024 14:54:58 +0800 Subject: [PATCH 0163/2029] modify code --- .../Code02_CalculateCoefficients.java | 21 ++++++++++++------- src/class145/Code02_SetCounting.java | 4 ++-- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/class144/Code02_CalculateCoefficients.java b/src/class144/Code02_CalculateCoefficients.java index bf418cf8c..b3f7c35cd 100644 --- a/src/class144/Code02_CalculateCoefficients.java +++ b/src/class144/Code02_CalculateCoefficients.java @@ -57,9 +57,9 @@ public static void build() { } } - // 组合公式,一共all个物品,从中挑选pick个,返回方法数 - public static long c(int all, int pick) { - return (((fac[all] * inv[pick]) % MOD) * inv[all - pick]) % MOD; + // 组合公式 + public static long c(int n, int k) { + return (((fac[n] * inv[k]) % MOD) * inv[n - k]) % MOD; } public static long compute() { @@ -71,11 +71,16 @@ 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(); a = (int) in.nval; - in.nextToken(); b = (int) in.nval; - in.nextToken(); k = (int) in.nval; - in.nextToken(); n = (int) in.nval; - in.nextToken(); m = (int) in.nval; + in.nextToken(); + a = (int) in.nval; + in.nextToken(); + b = (int) in.nval; + in.nextToken(); + k = (int) in.nval; + in.nextToken(); + n = (int) in.nval; + in.nextToken(); + m = (int) in.nval; out.println(compute()); out.flush(); out.close(); diff --git a/src/class145/Code02_SetCounting.java b/src/class145/Code02_SetCounting.java index 9b35d0a35..fa3aed996 100644 --- a/src/class145/Code02_SetCounting.java +++ b/src/class145/Code02_SetCounting.java @@ -50,8 +50,8 @@ public static long power(long x, long p) { return ans; } - public static long c(int all, int pick) { - return (((fac[all] * inv[pick]) % MOD) * inv[all - pick]) % MOD; + public static long c(int n, int k) { + return (((fac[n] * inv[k]) % MOD) * inv[n - k]) % MOD; } public static long compute() { From affcad2370c298a0e4b6cb609e347ac1e46d2b0b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 23 Sep 2024 15:01:06 +0800 Subject: [PATCH 0164/2029] modify code --- src/class144/Code01_PascalTriangle.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/class144/Code01_PascalTriangle.java b/src/class144/Code01_PascalTriangle.java index 2835f635f..07c49841b 100644 --- a/src/class144/Code01_PascalTriangle.java +++ b/src/class144/Code01_PascalTriangle.java @@ -1,7 +1,10 @@ package class144; // 杨辉三角 +// 给定数字n,打印杨辉三角的前n行 +// 1 <= n <= 20 // 测试链接 : https://www.luogu.com.cn/problem/P5732 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.BufferedReader; import java.io.IOException; From 1136e88dd6b2603b77ecdeb39f5cbe3a41dd9c59 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 23 Sep 2024 18:06:47 +0800 Subject: [PATCH 0165/2029] modify code --- src/class144/Code02_CalculateCoefficients.java | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/src/class144/Code02_CalculateCoefficients.java b/src/class144/Code02_CalculateCoefficients.java index b3f7c35cd..c9331ab16 100644 --- a/src/class144/Code02_CalculateCoefficients.java +++ b/src/class144/Code02_CalculateCoefficients.java @@ -64,23 +64,18 @@ public static long c(int n, int k) { public static long compute() { build(); - return (((power(a, n) * power(b, m)) % MOD) * c(k, n)) % MOD; + return (((power(a, n) * power(b, m)) % MOD) * c(k, k - n)) % MOD; } 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(); - a = (int) in.nval; - in.nextToken(); - b = (int) in.nval; - in.nextToken(); - k = (int) in.nval; - in.nextToken(); - n = (int) in.nval; - in.nextToken(); - m = (int) in.nval; + in.nextToken(); a = (int) in.nval; + in.nextToken(); b = (int) in.nval; + in.nextToken(); k = (int) in.nval; + in.nextToken(); n = (int) in.nval; + in.nextToken(); m = (int) in.nval; out.println(compute()); out.flush(); out.close(); From 3e03e0b16d849fec688ba4e9070c840fb25f7924 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 23 Sep 2024 18:41:12 +0800 Subject: [PATCH 0166/2029] modify code --- src/class144/Code03_CombinationNumber.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/class144/Code03_CombinationNumber.java b/src/class144/Code03_CombinationNumber.java index 95a27a908..da6a7ce34 100644 --- a/src/class144/Code03_CombinationNumber.java +++ b/src/class144/Code03_CombinationNumber.java @@ -28,6 +28,8 @@ public class Code03_CombinationNumber { public static int[][] c = new int[MAXN][MAXN]; + public static int[][] f = new int[MAXN][MAXN]; + public static int[][] sum = new int[MAXN][MAXN]; public static int t, k, n, m; @@ -40,9 +42,14 @@ public static void build() { c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % k; } } + for (int i = 1; i <= MAXV; i++) { + for (int j = 1; j <= i; j++) { + f[i][j] = c[i][j] % k == 0 ? 1 : 0; + } + } for (int i = 2; i <= MAXV; i++) { for (int j = 1; j <= i; j++) { - sum[i][j] = sum[i][j - 1] + sum[i - 1][j] - sum[i - 1][j - 1] + (c[i][j] == 0 ? 1 : 0); + sum[i][j] = sum[i][j - 1] + sum[i - 1][j] - sum[i - 1][j - 1] + f[i][j]; } sum[i][i + 1] = sum[i][i]; } From 1b3cf9feb5375ce916278e265c9dd2af889f1a77 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 23 Sep 2024 19:40:22 +0800 Subject: [PATCH 0167/2029] modify code --- src/class144/Code03_CombinationNumber.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/class144/Code03_CombinationNumber.java b/src/class144/Code03_CombinationNumber.java index da6a7ce34..08cd309ce 100644 --- a/src/class144/Code03_CombinationNumber.java +++ b/src/class144/Code03_CombinationNumber.java @@ -35,8 +35,7 @@ public class Code03_CombinationNumber { public static int t, k, n, m; public static void build() { - c[1][0] = c[1][1] = 1; - for (int i = 2; i <= MAXV; i++) { + for (int i = 0; i <= MAXV; i++) { c[i][0] = 1; for (int j = 1; j <= i; j++) { c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % k; From e2a74926bd1db25441da78334c80df5dab4f180a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 23 Sep 2024 21:11:29 +0800 Subject: [PATCH 0168/2029] modify code --- src/class144/Code04_SplitWays.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class144/Code04_SplitWays.java b/src/class144/Code04_SplitWays.java index ad1d85d8a..35182686f 100644 --- a/src/class144/Code04_SplitWays.java +++ b/src/class144/Code04_SplitWays.java @@ -50,7 +50,7 @@ public static int ways2(int[] arr) { if (k <= 0) { return 0; } - return c(k - 1 + n, n); + return c(k + n - 1, n); } // 组合公式 From 211a4648a9e2e7ab64017774d849da393cc0c71c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 23 Sep 2024 22:41:19 +0800 Subject: [PATCH 0169/2029] modify code --- ...70\345\205\263\351\242\230\347\233\256.pdf" | Bin 0 -> 922338 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "ppt/\347\256\227\346\263\225\350\256\262\350\247\243144\343\200\220\346\211\251\345\261\225\343\200\221\344\272\214\351\241\271\345\274\217\345\256\232\347\220\206\350\257\201\346\230\216\345\222\214\347\233\270\345\205\263\351\242\230\347\233\256.pdf" diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243144\343\200\220\346\211\251\345\261\225\343\200\221\344\272\214\351\241\271\345\274\217\345\256\232\347\220\206\350\257\201\346\230\216\345\222\214\347\233\270\345\205\263\351\242\230\347\233\256.pdf" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243144\343\200\220\346\211\251\345\261\225\343\200\221\344\272\214\351\241\271\345\274\217\345\256\232\347\220\206\350\257\201\346\230\216\345\222\214\347\233\270\345\205\263\351\242\230\347\233\256.pdf" new file mode 100644 index 0000000000000000000000000000000000000000..3495713770b92c7fd708ee17f0ea31c56c7b9e27 GIT binary patch literal 922338 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 d1f?6KMp{yuWf2ug=>Y~Ty1N-c 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

eHyFyt_UDc+3wRq1 zlVU73ov!z)II<8B6eRV$CbOZkj|}Jri#*Po@g*op`c%$X>#B~;ZZoR~gN=eq9&x<) z)unHXsPz64$SOwERaCfG(sSGV@%~u2W8>qxLy|#`3EMlIB2AeQ${+^v3ls%7e|28R zM0$6=%e29MqN=L8e)i%+N;B}%HXd}?H*Vn7;{N92fRRYA`J5>e9tWS1xmEeTFq+SI zcc~pLTM|Op_6&noSBc@%TlXGnG}&+I&B9KuQ#V8rOiBNiZiSP1LOiU$SX1RUE!%ke8;n0FGqG`sL+i zNR>3g{Ih-!y&CX0-=bA^$>M_wdy>aTR9x1OAx zo#D`OKdyW7mGfrdeD?dh^tV#1ez!@{`OQG;&no7<@^*h+V@kNk{t9%`hsYG>x0DY= zZ{Kx@{p?(y_dMP*6o(x|6__jz9AtuO1-G=nv~ke^>#WzrZ5m>)uGL4R;b>1 zgok)pwH-;$)8boN$#2gMjja8{v`X4zfLg>A6D%1KX-?*kkeE~vmkyC1$Kaak94

JG=tynWv?KVtKwSWt;V{oj?9RS+Gc=&3 zW)#uBqpjdGl+?0z^ z)uO1R>17`*a7rW9*oySeH55|Y449_pQ*k}OVYIQbf_yIvg_5Yl8~?^&onYyd=L5R~ zY@BYgHQ4PKl-ccwxb*_#lo6so4kb|eFpL4d3ow8JNq`k!yA#*)Sdo1>_!xvyC|7|~ zVqx~H!spoDrt>}_d{2P&x5PGT!Ad_~041sJF?oxvZ)W3qdwS+%sA~}6a6!9~w1$R; zl9nVMQ{t+gt=z`Ouim@3ZHO26J-<0l;Kyb{qNz_FrMS}lsp7K;TlW09co4M0qZBLx z@j|xm^^&%1tJ(a&-SttvYTHvuItUqjrpdo4a-tp4)7$H|41DB*p{Xg$w3V!(uV1%< zGnREqpEeE1kyVEN&72SlUB^f_c+$lLcW#9XJ7sdQDOb9zs%##@@(OZuS?)1R9yNoQ zX>qT!Y1xj3j7&Q?BFQ*(qN7x-?)*7flC;cdGex-}Lp4s{&Uaa{W)i`7qhuZG)q@|>scL+SqXwz1kCr56?!*4CbaYPi79KNP{K`Oy2Np1 z(4R}-ZyxD?zxKaj`u}2C(3YZI-F#^H1%_j8Z|36aZ2rs+^~%A-8i${omYWv!LQIVI zzJ`~hIqiL&|Hs~2zeWAEYr|3sA}AmoA_I~`r=-NtQc5>NcQ=S4J;)%^EhQjGH_{A^ zbR!K)gM=Wwi+exsKEB?2{{zqQ+`oZ%%)pw@TI;&b>kJiB8*?)^S`H0&Q@4Npi@d#w zCHR4sHQddLmP>$-mzG1$+}hI0jh2f`2z(>&;AZaP={E2dihKDifL@99470l8@yJ%@2VCE9kT1!)) z5nt{7QZ0qFbEWW2&iL*$oec2Z-)*oMuz?v=tj`q%xV{*_z6hlGi@Eu~GO_LkWslKym&s?!Jx2|)G(R29ujftM?fijEx4fn?`Wd~1{64_b=lv&Ru|5LxQKV+#TlHl;%X ze~)G~17+s*Dx)Vp++Uan(#>?=-8yr!a}X8kq__8H2*kcPMoqT8!!*PO^!Y)r@`ECgu_2M8 z{zuoYjUcykWozXJsNN52zWzZ>J{R^9@5mj%+i%|jQn8E0>pzPFeC;#;6n=fF!uH$q zUA)kL3Yh<4Nhdt2zn4kBCUX1Z3t3r|d``Jl#V>F&`St48gneIQyf~2Dfxmgf^@!l! z1{7}LlS3?xDtODa*Uv_O)@O7@sN*qZ5=!)3a0$S48L`eqIVQD#ayk5&XXL)K8lCsv z#&tX2CBk+)!|bWAg0g|5WtT#Mbp!pN!My_ zB~N+9e|9H6{Oowd;pp}INMSkAl@Eg%268l5I<@5r5hrUB%d*uW5K^gH)8>bjKy)VlsB73IlLzaaGsOs9Ek|+~DmLi^ZC49CjIDZ6cG8$z zaU)TQ3pZK@dIU25qc4qsKOscv2QmEB7lod((v zyp4>&fL)Onty>iD>=!28 zaMu3FVpca%uOGLLOz2M>M@Wpd41v`ZLdu3-(nzr<<$NjhkwaBn2N3IC9M8Ba#9hwS zza2*zc+T^YHfWR8eYkjA#AA1U9O8NiHv7;9XXEQqK=*t+&NZ9Sepb$I5%S+Aw>L|? zuLDta;}6i{IWxWMvFD6>99sG90lw}zsh~;7>dKw3`#iH?Pn5@fX&g<02&Te^AIt;Tv^5 za(+_P%E#0Lxlk&6EDSSj4gAA^Xge792fv6>izBvd>st6xY%B2>t=&Pqjm|crh#LAJ z!bSfLX>|6iryO%X9J=TpR9y|xkD3xwvo*YT?_=gF*v$=AjZo)qb6vc~0%6lc^< z;4H$7)2+3&(^AO9ffE`msjP_(b znLPa3oBc#q{5OG4M9WlM;A(g3Avibe-d5;KMQ;o(_bd1k^}m21F*)it=@wj+HU~3u zBOF)JZRqVy)`k1<_lFPGx0<_MFi3F&VF5J93p$X09u=HO3G#HM^PK@sG}1_BX2s;h zsVO@>Wmf^3gmf6wRm56|OT@d;j&yz=a&-JR9r{=+9fszD5vH}tqeRWi z5v)YkSi+WP8K%XQkd(AAq+xAHgl)v$k3(h5{f z=V2R#F{a{EV~ch2&zXi2CU_Yhs#)U~zos|`33_oJ?k}5_)gZDtC<{*RnLduMsou}; zZ%i+`Jq~Uj@l}I_N4aAZa0yG0JZrAIqf#oWKKKIS%r)T2s9B-kK;aFdV^?Dn2n;14 zc-()f`1f^a_W{O2nvu%NW{fp}C*|%Sn(~@Zsou&1K z1f%>7$i+Xqo;m`K2FYFNw{!1sKcQwJw-kDqm`XESPCB6417 zace0Hwp^_XeC_{469uH=?=F|#ujDIa!s9~kJfiY%k3g$ zqnu6zr=Cn=jsCedjDD}abAqwsT0CLs(OL;bIFZZq_gZhE3ptHwugCR+l5FS|H7zLH zwtRMMR?$n5cJer`o?a{dE0l}hheTOjzI=yL2V7zak}?tfQw3*y0cjb!=!7SA=Ew!K zJ6hVn$v?QMIJ3=V&xfSp*0T`N5e|6YD7~QOtFql8k&*mb_em)D<9!n{g zW}nz;_?%AT3Y3tflwB&mO>}CghR7;zlCCE2#>y(AfwUke_89xT29DqZggN<_A?eV~ zR*}u@8a7(UL)(fq++ZDPcD(>_ZOJ^|79RB|3&*rfbJx^QBb3mNZiI63GA0vy_Q|3> z-|)F5ppNL!E1$hAp*SB8`pAiPDA86LAGcydfArI}^oe7sO+C_v{;EXgwJmg+In&df z!{pl3ly>pmYhunw3Y~?b?YTI|M@Dz(IM7J8))ZTZTPJf<1wt(gk<&u&cd5N6OJF3= z_yjDOs0_^CiJp8nA9Qnns7o_7EY~jbw+Tdx5;`aq+)ise_q-mx6AYo>Vfy%86Wu}R zo{fSvO5xtxVJo`oG>Zrid0)Rs@0Yi_Os*Csv9At%OX?}vKdvx0BXgVPN1=rEU=vGI^vRXtZb{R6%LwickMLISr=o;19-%*?5cD4|Q ze07Vm?<6lARi{bNaVki<(Dv9~O{*^A?M*RN=|CP7mF)Cs8E9U6pBD-&`nk%hJ~xA` zOguQW_%4k<;L7I6s2R}C@W~f0W?;J|#8ePTZJFu}W2Z7_OL$+U5G-BYZl#s4NYaT$ zX;6@9o9|^}&VvnkcbrERvAwITaaX^4l-UM;>Q5Q(noz+dqT&1rGs5y$ErkxRK;xXE z^-kPZzB-Qu#O3r4(cw=nz21|E96b-q4h`B7|BB!c&udhy@d6(j)90-P5elzRLUtQ^ zo+=><4>4Z&_h45_%Mdlyl!N)eKBJ`SNW8BPj1^7&q+OTDh!~0u5b($XeZl2b`2v&?WTdY;ql)(CsZoNHKmRg(vp^X|9%BJ7Zz=1ljMU@il`@_dA*XSn_svx|c@&2P!ANQDvx zuDenHF zly-`I#-;HsayJOAGA(I-e#FO2n;&uPN?lj>xjt5uktre3dxj5VDGUSa$@|ww1=wqQ-ibu0sFiGuae1zg7 zhdKy%Vc%!Oe1u6Q0^~^0O-sz-qq}}Wju~!S%N)!D|9ioSpOgL|j8EzO!JBB=UJu%w zl}EE}YkIe+-+8UNp*Py-CRalhzd>DnecNRa{cRR%kWZ0sB%h0&!;|L>M&5hc3D=8d zU)QN$e+7jwPZM^6J0#!kPS?*GUZ=bJ1>gQ&^#_--=uNp=q897f=c^DA7WNe;7pByTY%*CxI{%>5Aps2mAJ73#WGF+ zDJV8)>apv1SO;((;LUh(jy{RvofO77283sJ=GiS!9FmUcuzwA1;3@Z2)boX>7#rF= z5+AUkuc;Mq=8qa2O|dAEa}%nr9q6p)Ojh5z7uF^BXFg8DW4|@0oYkQw^%sIUqT|8) zp=b&nl3hKcnOt6vqAe`LF*&LfZ@UCHx0;aFoTR;3&W6jh-U!VcYqaB?xl4jYx%9Zy z*!3F1v+^#UutO5M^YU>yG4{+0b2GX*)|f+<^|ueeq(t{M;qTYi7b0Z;2>VVaI5adv&4t{xcbg3>=r!mMx(20h|7hpOOGuJ8H4ZkXuTM^{2K!R`#4oQL_`1bOFUQ&Bn)`TLVku|? zdD6<)KRnFd??l%@l0D0!s3TiA&?g#4{qj#i%&pb(9{E!;PZ}Vkhx>4GZ*hv$n?W8E zrh2a@-SkuH<8oJp>*rscS-nYMnueXMj#g_@6L+y4=38dQQHM2x_h{~}T4sb3Bkx@= zJm!n#J?`2)9YzU@avlp*79dA)Qw10Xljj?Z|2u#7Uu!mu&B;Mo6Y=P3KQ#aHlmMUX zGW%+e_1ZH;_zsKmDdF0x(YDeEy>sciZnrBiA}*ggZXDGZq@w0{iRhnkytVxyE3d}N zQ~|c!6z!21gfXtfAxm;J^i-Wpg}!hSl|h#UsNQFmn0(@ zp94E|;INGekr(;ObKT`kTK}`Vn()D`&}Pif1_-v(*LC-qe0Na7E5FxhX*MZi;q zo*EWX=*&!6Rp54owc38|$oz2bDdidOPR*#$Hzs6i){``wo%XYHYaGf!VpqNyyRz)R+-*~TSST#hw;j}Q(4}x?WP7O zJi$2$Z*yIP+Ae;JG2E(p@lAA1vAezi$wt(zfE`I)dzZA`BEH@A1+Vv|@#Iu)k757! zO1&p{@7vlQpQO_DL>C~pSzN#p!UR4Z9h1n>+y0q%?xvO^bnbb%P(wC!TDtJD@}c9> z0$e&iU|d*(GJjc;qf(f^yvO|j)5KK`q7(68vUdT(u_qxU#op_7`!4ffk{Snxl41Va z@nLHv`><_-mdU0IF5G+t!!yBv8VI2$M&fD4i|gy_Mwtdv3;rm_=sK!(=8dA@^L0X; z{T((N_(I~Rxl9zFqp?+|F?_^3QkSg>)CBjvSpKp4K}yD*<0#;{!G9lX9_m~yfU^YoXCts zkMDdBFJNliX_(YcxYuvJ)sQKEHEG+`fpT$`b;&y6)VoB=(vZvZjQz0l6X@S~St-I5sacq85h;}E27L zouFRDCo`S-C2ZH(u3Zf1ms|Z>u3iNf_K6hUpz_3!sT87@{Pr|>eYRaL)KQTF~e&8X59Z648I3sMgB2_u*KUXl^DY5>(CWT+{ZK@94T=oKVO3n__f_E#Bo-XfoHaOWoNa*aN)qSEz z<%4iO5@zn2qTm$*Jr2I|bB1_b{_hW&-!Y#giI@a0hX)06Y^4xPE`@ zoAKq9Ln8&wdxH05yKDY%vOKNl>4 zRR_G)dbzII7FAnOVcz$e>oE;?pm$Cn317JoB)B-LWwmpUaAi#%`rh+9PUeaciB&W+4As~{dmGiqB@ z=5^#6*Q6psx+R0@)=6?@JnHas)Gze@snQ2A!KE z{63$H)kZQvX2j~rgQ|*ThjP)Toz$o>XDALduQ?&(rY}8+51p8KKW50!Q!h+ z+dzGUeypp-v`}_py^Rf==e}}mRb2?xkOC2jn0Y33QA?-2X*I{}UUWZQR2&aR)cl~( zMyf-378bptRPV53`sr{%q@G(e$(*VjNiaCyu>X!1_l{(#t;b0G+sGdl9gwH4WYgMpnc5dhJ2%!hTK>Cr z8zJ7)MF`$$SMCwcQGQFy5oi4$cy8lz>7N!Lq>70tvnf%i*m7Zw3xJNO$&dOb`-g)i z$CNxc%C~vSNZEShlHX*}PaGb71JZgLeHYPbeI!%n$B}tAXT98CWos$NB-~&Eu|4x1 zcc{+d!dH=wJgCYboYvZ7n5zDsuIHCoWLuimQfN z%=r@*jn{Xy^31&IQS)o8ca%1NO(rr3(Df7%{qIrr0#n)|zUs;E@b?N;3<4H6Lj7wsP7 zochi#hHV8Nc6LZbrloKj`nm^|rFHAcbTsNRlYP-uOp)ZN+^iKZ=ASoUaUTydABhZT zvgveXw5B#Sq^Nt&3yqNCI9RpECE2W=5td46rO2C$Su1S~4Cn}^GEj3yvo&d}7ONqo zpEC>lTb}Z33ili2dOAjLQ^+nu-if$SNrKYdl*yl}h@EJTW6)je)9SeL!H*Tc-@1K@lgJB;n|!-Xt-C-xBeJTTfvT(=zapsv9yk3@eE%@l#j*VDd3`y z)7rEl-tb!K&)1(L{CpevTV%c`ZHvVyewkC?vNHJ5HxFl}syrS;JY$Ydq7PQ^o?@4ngngxz>6ZSD~i8Re3oGT zG4skv?O{%QvuB~#Lt-?VP<}H~tyz67MTsKW<6Kjv=}(0pURAIM{cze`#(_msPg z^oi?oX=UQ9tVwmDO4vIKne#!bBg=2S`iYro{Us#wGE#+fo!Cf+q}ht!HL@b6^EA>y zuNVK9)%-lKkcGw=YCZJbA18~9G+g%DSCfjjp9?w?ylq{Rm;KcD8MRc7E~SN_=Q2!q z5#*Hc6`xZ!09ra1Pn!Rm^L9{KRb(>-601KZ9Gy3F)$_K|0pTpw2n{zo z!h}wlS&!9@ZZ%AMpRpKLX9mqb3hUPsxQ@_&P21SyZgsXfd*t ze&qWNTb~hNm}?eWm3fv#H~$nvH0c-3x!FANd4+zDWgLjCdRluBN@%sMMa+d+&#;UPUkuHOjw+Gv-97H>VSzKV6O+nsQ%GIIQA3{Jo+s#nGJwo;LP}y#&DnBPQA-p{*(^aO- zfxa(u?Tm!IFVmd#qg)j7vF`dE8-0yrFR96F*z-@>g1Fz9E@^tOb02qiT6y8$%Cb6J zsp26OX053!z}Bz`qXebEnR=hnmD-tpP#!Ek{4#DhO-XmVC%-W-=nXI5|t34DxaN3M7Q{csI{9)INKz;x!7|Rk7}Xjww6%`-2)D zzF5yOFiOct(K#W1q+7`Ak+-5k&x)}zi@1iT8x9bq^*Nfnn0wH2GqxlYDuEql1!2CJ z5oK>W9?=(Ga-c9RC>xO4qi_Y)>Kfrp!~+>bN6>pQ@dKtsTNsJ&o+=2k6ffnJG$qhzvsGm4vhQ79$)xp z6FOf{!MSp$pL)r~U+i)CV)^Lr1DD%5C%>dAFSBTtnDWo`ah3iO}fxa=Tg)1V>LAEnGgt#F`?9xqaYj7sv3#r zUd4BxE2sO?A@QH%`3jLr*w7UXm^Me#u{y6w1VxV~Iyu48!pl1!`-yQcJCpVxmSn5gKi<+v`%uLZx2GZ4*E_I9fZNJRr#IVrTkfDo;zjAY(J*Shqie6 z!IA9?@!8jLlFJW!N(wwsv|jMf2^7;+mU3ykdGt>t_}(Pt&7>3ylvlDQH#SO?Qt0%5 z-xaXc+2_%Vtr=p+Hx3(zD(Y|sZL8^W1d-^FWcPn4(em0Ud4>2nY*i-Ar5AwuD&$y)!?=EDY9@_MQZi_=7>!*Dil*CEm3pI;P1PQ`Br2uxw zjkB`yM??d`CVqeBa<@x|ue|2#U#`zV&gh-rY*B0PB>A-wY^I$_mgzzZF;xXfyWSY$ z9R3$QtZ3@)Nz;>9otx#GFQSaf?{wDwxfgoyLI@1a$@7AIL=Ju%zC=VN&B(ZfKVwCs z#|>F!f(n%fr^s6EDss&j^g(BD@ev*kk8G8B9dZAvMe)@oeU<^zx4>xl;fg-1NqqjN zsAGcRdZO$)J{g3**F0*sDNzx@wv0ij33}5+It+^t#k;44$hwj_8QeR&io7}fj{aaW zJ(Ekvy0k{714D;Uv&~k=JC#z%a}3y$RUi5~-enJ*G8#i|o!D90&n~pru%T8Euuok0{_{KaX!zyx9@z>npS#> zvX!br$~l&YMSZ)=Wfg8N$m2k))wl4JN0gmJ6GC8e*jQn40@xTvY;3>f!G+3tt}%!w zFsFK#{Ani+kD_+iE!WRq1zv1-oPle2uVGKD>s6ENaT0cB?r|P{xtunfT%l*Ik=wSk zfL$5EHtW42>Dt4P5DYv6cl%0MtvDF)Xf)3?21M^VVVy!Yq`BV`WakOt~GOFy8hPM$(viauVuL4r~W;;@|r-Ifq-~ zjbs@n2UYH?DlF$SHh+JO8-X|1klJ+CUNP?5Oi{#45)}3eL$A!d{!jl93_2OMondRF zSX%^JrqZ_9ijEsv6jpkPunVgXY(B48$elD_aPT}`#8ZV-T$qyW11bwwihl=zY^CCg z4O~aHp6Rj>88rD9mYqj5^-9g;;y~Q|w;{i<;?uYXt{pDPRN!8Q`^|iyBe!*P|KQAb z_)YfFfEiWWJ>LrNm8E5C*a;m$l%>(iI4HMEIN!MhL5NU>FF~QU7N_Cz*gM;*CWc!k z4u4pg=i%tfjD6(+o-cyHkQTd+0xQhI#_BIrGJu zlYd|IbxR1}ROUaHTL3`Y^tLvK8#pavg%8afl5OC5CfffrQPjYW(@{Lv`duHI-*DgL zoYJuoi6^m?G@XhyCKvy@pF*w(nP^CDERERy?V~mpv!dxJRd1o%cC53|Wd8geo6RbK z5gWG473Zot$57e#c>1ZVJAW4b>fIU}9fj0FdbC?1kpmL?y0%1xUb=aJXOzI)0WU z^P1A9!-b=F0$)eQPb-Z^zCZWybMSys*XU4VuclGbYX3U|tWJF!_`x33Vd0&~pC+=a7GmzT!w!w(~P@!-BSja*j(a)@y=qXt( zvOvr*J#6irAX%Er<`3C3ZC^aqhb$e|euCkD<2U^0x=Uf!)A+Axojy&+pB|<(f@v!` zZY#$_HeNy;n|@6={2U%m_dD#-w+rsO1r6Ef?3YwvC3^G~CCD%giu4$G{;Gj*GO-$D zx~^&tNw5~AS^AMe=f@gvPLz{B+`J<8o_~3(Y%^2BvYWnjlGk1@_S3oXCl(n=_f)=@ zlloPNv-JMqsR?__+qaH_OFtqzgu{+m@e2-eR$0p1UOjvz@WNIS`JG=40T*~*+ld)t zeizNyE$K`rCxLs_S?{ojW^_^^v4@_G&pW7Xe`aX0V z0;9?~IlkD9CZ>~fTy&$>-Y6W*AM8nniKAbI9O5Z@8W=qH&JG20U?bV(E?AC*<**VP zxZ^3O`ajnef=RYj5x6`2&47vfI*L&wuBKP?u}p3k z0zzGeVwv+y5$p;uzfdd+tPiYB*ZszssgjCYYWydlDn3|eQ$ehz zTU;|yg{sEK;3|YJ9pK=aC27EOi@j7|~bqk7z@=&IPt_UgQ2v%7g0T)tUwW`$cXl$dWxwMkOeF!c3g+?K>k#x@A zf?E^EKPq0Ad2`dD9}WmCramTOKk^Rsz-75lt1L0XEb}WpzUO;4jjx?!IZ0i!4Sfo) z3FGP8jkxZJ`Lc#yAzh*a;D^9@`yro8hhBryx&as_i6vc7QoR;W4_&k8JmwscaeWMp zDxj1>+~Jo&NLxYqk3@5)g>qmdn(%I-W?p5!@>>Tl{<*@ok6Uild2xNnIJoz-t8eJA zt?|gC&qZ6R7shXF$QRpK#zL(uCE1Vug1zqTL6Edb*h()gGoJS)<(eNKQe|AW!Hw&wt5qZz zQihk99tijTVka>Kov&P~cUtaB)dVrR5Z=NL5!c? zm@#y%OI=YUGopu)MYi@_&1vyh60ToTlfD-7hEc+sv+PgfZx)DB$?WUJ{2r{wT%E_p zUjN7K`a!L!MP*IXyAgF`sQx>B4GZ7P4sY4#oO>z8&&)EP3M?LHHB1cX8Sb$u%_tLb z{Val&uQSqlc=^Jh(3YYL0IJ#hB}-kM;s;?+rwP9`?n z*~2pKh5qd(9I_`XA+4BBB#hFQKb0$TP|Bcj#)%ikA4wt_p9Hv;T6S?QwyN@aC%hH-5KjIr#>Ka;)bGS+M09>7w>QY~y|4&#e*F@0njC6E*BRj$`a0 zbG2@+`yx`mGp6JveeD--`e9ppYwCO%L{5vH3j5bjNVw4Umv$GCrTuc&fU%WQ1$e*u zU~Q=}PjhBs3GBw(Ft@(MRB2HnuKibyFY`y%y_RjIl=mMv9cN4>^d45yM~(ti;o}sQ zv83ovCX$T}^CF}lE{clZF3)4nH5uBol=bO!{yAk`t&xZ_xuc^OzfD#c#sa+F-7mW# zE?!=UXf9C}KJ7Mx4Mx65EX99IstRGgtHPf;cUY(+wN~Q=qib?7ChPBCPSW7+#$7Bf zN&y9tTu5!go}fubd=l@38p4isvI^=Mx_-^=%5yv4p2V^&rl(Q4OW&D~u+>jaNy6xd zeE@H&o>VPwV_Gwa29Qa&IgL9OY+h$$lOj!#mG&z!#Tb*L6*-wQ+oqPxTFx6E4eV6815z}>wi&XRht^t~4g7rJVFPw2 zB9V;g%6Js$>=~;uC<|-cCXtMl{e@t7=54*d5v4WPFZQL?hTb#qrjY9;nw+Z$HD32p z{r*;XWXYS}d6FaJ$Nnp*&RGQte~f{!%60X*Nmo}9(wy>OL51d$U}HlzAV{`hlk*aj zLd*1Ax{oUK-t?Eh24};HugJX_)4i5awfFL?5;4F<=|Mfae8&&7-d1Hv9_4to0CADY z6wnEe>L6gknb|B)kaDE2c$ne6P99=rFz~q03hk1~$6wAT(x4Sgrs5}{9t!!%)9Uq_ zj*AU|f@!(V(8@iAO8Ui3>1jpY6kk)U#+f}oP|QkLyr;CYTsOJP;nNnA8f}_-(c%@! zl(YF_Rpv73{FPl414RcDK2i_{)?AaLw^Go9zjj{WKaxh;bYtz#X!XnT!$wQmX;}X$~pX=0+2w3vUYQ* z>9p(x9v;2z#K89=a~4Q~T3WdaiSm@Q|987>e-4^;(wMKephyEEOCW+^Vw% zoOMI~@XyJK3|yGOXMj$hdK`uTta%&nFqg7m?}X+33|s-Wf6S24a4^wePCPHA14=f| zHKo82ANlE$+cCfMD>_f_aHhcIZ`iUF;lR6FE8Ms7y_U<&uxv4|erSDdJ6{5cIMzSq z2YFu|aFk@J&5+=^b$jwqit(Ve*AP%d*-uk{tcd}^%vSVf&6VKp;Lm*PjAH?WI=4%C z(%+5%4XvBvPlS#UAK@15#YgU@r>v58bFb1p0CO`_mcG;^%$)9@Qm;Ab630;L){4}0au>;OZD_EX5{Y4q|_YtG)*pi86&I_rDBTZ#@BL;Xjp-$>djv0`4-PV zKZYQ8#+F2fRZ>AihP4fW+xI>p&Cy?6kuSE%5gA-qMl&?56?5eQY*dzMv`E6dem&W? z`WBHB6blH4(F&XU(M|av=R&h=#pwTbhs1`N?FosuC2Oxi{gIbslXRVxr(zXG>I7 zV9nPu@^?=#*%J`l6~k{T<|5pZ4bD^V>mLO@fsP%#@#DyYRnMpDTl5e-xVq~D$gqL@ zheoN=V*n_8Gj^4lk;c(9>OnS{h{%DgkNLTNs%Fq;X+OvmfFMP3gv$P&o@NrX-2ZaH znvBFYi!hW1B=(g92O((4(h$h~SkRkcDL@LsPM$L3@#S~&q<03E|J<3L?S~T79oW$0 z%Nd|hovuRfi^C}DfGwwk9$m9M>? zz$FO37OFQQYheuE?K+;HBV3ZbEf-$dfJ7hkp&!zVpb@!l>lXP)`c(KpupQ$(8RHQD)pdNwMH;Yvl;67BIKn zCYXFS$9abK6?uoyw8mX#gLwt%*DLt@raa!9fx?TrAMz2pV+~DVMYAyl*<#{8bs~UG zQDqh3M8&n_f)BSW*det+AvlP0zRw}2EH~lg$1TY8Mtz6>{R>|Vds=a=Bn`riK_1Y# zeX3cA{Z@ZoI1-I;R{23pPw@06rmf_yQqYj`K~D~&=X*pqTON#?kJxg)psDWjVfO8_ zSbP%Z0X&nk?%}{!@f>(>D?++3h$BP4k5b|>qw)8W|HwVYqc^RrI=JJy8O~0uER?oM z8GcpQ!kWO=h*wSy;i>X9w-jTC=MVdlo>eS#%--e+fU3?9%fiYxls9V$8h^MZ5iF1a zn1U+1OFQos^ed#isC=aU4gS+Gb3M9&xLX5_U{f3^ZYP>WC&hl_{U_z_%#P5Qt$q03 zoh)v>iUgP%#B%rTj2@~`CZ77~;g@L6KEu{KSy69)g}`1GO=M$j1CBvkgzbqZHK<8q zf8kKtH;&cf;wCml+t6Pqvl&akpY?Ev-sxHU(vI)D_CbqoKo_0z6U>zHw1hW5%_UH0 z&KQbE-jgDFyYDs;G7?I^Zx;m#{v`J$9PMEWsCRj44}Oq&M<+5VC{*GuG#y3ke?~-p zLav(Q4QXD0$gUdZT2*O+PsV&@9=qIy*22Au%$Hu?LN#xGNnmFRE(O(*jf9^RYjKN> z%Q!yf^w&5vy`}hU-9=kG2hd7@IP1kvFO(Z9M0G&Rw>_)i2;&t^pX<|+GCiELyVai9 zlAex9(j?@ZCw1-A2Uov@H|?fh-GDdiqf#z#yTfQ6dQ-lEeyxqW-99MZK=_@Ex?bM0 zziNdRx&3lCwmjgN4D-{P3Jmry8xq=}3aMnn2s%;38*a&)vLVs{Of9gS1MWdall?%7>EW~53yLUy-21!3!`|j|R{hL&J&7ZdY^N-iS z?*ldtK~o>xHg234rkUj`=U*I#Jk ze^iuz%}f5d2md3{{j0kBk3RW78|SYk_W#L^lbF!*1|)?7Wz}&>!>$kDH*O3xIQ_nn zBs==~0I~43cI^Z11yE=jRMdbXFrK?cVL?Uge6?NWzVY+Qq}8DSpL-@Zu~bGNlPo;f z-l6iww?fAleyQ3>0JktoqBM#`IMj-MM2(3K} zHh=#tb$ofbA1ZG5Apod?ZMlFVclstp)`ENf_Hn_D_&UyY_}QI5Af|?41*qmO!53*{ zZiQQGcAC96LA2LLTi=LZW(!oKnS;i{P-w2D3)m2IXOk(Le6Kk^+pa00^U^ORE$C3ouf{` z{+maYXCO!Qbt1?zY)A{(QZ({e4rhc#3?u;Aw~_P`P$p9)++^#LRDe8Vz9sCW*Aja{ zdn3Yojc=YJ`#My1KCJ;C*ghi{nc#z;wiCNRZLl^HHwtiTwq$VzQEN%W<&D^J;1D=K z!-9x%t>GDt>^l;lb|}cXfc#x6rRt_8l8%=MTQE9nBR#p?`?xj_V$2lcvqnRr@5D63 zj}9APP%Jc`kHm2bWSj35BEcg@FM0{ozGr_npP@_FiC-?=UlH>%S=H2n02Q~mtlo2= zlE0nwj+#J-VVHRT`ZVy`^PSLrLkFqCCmgAqAN`qI`qlRz3uIQ(ZT_Z*F!_Qj5OAa9&5kP!5zLr)48_KP zU=`=tLPUB+{W%5BlYpL-EcE$vK}_e#VqlX4_*<>vi1cED3Jd)x)Zx+MgP-(kJ=Urd{FtpCrbYq_|qpwLtW5Z}&ZY+!)&ch#l1+*>C3zMYW9;{3X8jk_fN){*N+ zlCGykc__#vHPBHPH;a+ zjHJp}^U{PE0snyFYV#G}b{)j(Ah)vDX4v*TrgQjo*?bZ7_PdTRjZiD{I*Z%Ml9XV% z5F^Xqmuwi6l0K!myI5d`$`g3~`8C;2lZt=@C>Tdj$P3U2W&Z#?#xw5`y?v+k#qR41 zV>%%PT4!_fH_Z0>rM$&mEu%9tih-!k5Q?5%exc@IDS9>)(Vp5k#*Ujf;QL>S1(6&w zwV&~yEjUd^={+D;3$uaO;r`DBWqDxy!sS4q zatd$2$yOEC$k*w)**0c4y~B9g-`JH9Er3ZeydD05ewHDXk-)HREUPE~-acf2tD8#7 zFfQnc$O@#2nA+n_ykvUU0{Bu9 z%PDFl^M9l1|Ed`D4A1!9XD8l7lYw4ZV0ve2It#W3HvBkXr{}njd zUJZ-SI0{_u4F*ufC)M0sDNu*d-uxC$u@gK1MW`->8R_s5;;Mya2NjqMV^_G|y7MKz z_;XVdN7cS#;KeLc{%4QGanztkR6-7?6w4-8$Q+p=`v#$U4H@cg_pF$R4k z&l8J>HC615uz?#IITyrJEpGSQ&~qLUgbNrV{D6Ag^?nCKts-9$a zpah!mt?&XAaAXfQo2EnFj>~l%Sr8f^tq<#z{+2`D^Z`M+gxCfJK*E*v2`{K!&551Q z1+}g5T!;ZSA?2DBdg!r&>|5BRQWI-4+gPRqBP^VHE!TTj)^#uvmMH7$xCcCzHH>_* zCl+;QDT|jD0JEP`Z?u8{u{C}+!j+Z22+4M9%1`y%X{{`qJcTZv&ak|M|M*L-PJ6l* z-b?+ney7!)ybkd%25CZCPd9Rjp`=C1>t1c%L^gRzHAMz|vGTP`9fIn7>hLic1nP~_ z7?jULMQVc{_ci@&oabof$Lc3hmkofM?ze?~(Jt$@GLEV>dJt*;*qJ%U@hGt}*IWt_ zg=ylAzn^C_B|C-!MX%sUoG{s*A>kZ=*3=G7!P(I8*jN2K@Nyu;qWGW9GFwUupr`bY z;ah$tSVS529q`$-+h0Lbo>d-uJ>m*YSOK-)HZ)5*WRqGH?pWspvSHO3&Go>RHvG9o`28>+ZON(wTCV{?7|Xa7gv_zO|G$0n1ooOCPoR zGO;+4B7D|T?onmsrtaAp!E~`H!Jw%`s)bfd#^oww))FrtcdX1S>%t}|-sGHI5{8eaX&^>P?}Z+M;3hzP5QvXU0EdfTRoDhf)%n>;jY!!kVqkKc(Q+2 z_~;PZB=+BnF;JGoVn-DqmuN{{hAGD7M4U`7BOj?bMgoC^bCskRi|m+WrvCE($KG4U zRkglb!-}AUNOvjSC@GCd3DVutwE(3v?H-pIDtvm!a0<63!J1ZuOQGI~*KbcR6N`Ib9!Y4L2fwQ*QiJn%%1S0T2xP0g zN`Hw2J&sU^<)4Nt!awW!IwF{W!lke6?5d6am7X_~q9wg;LCcqqjmGh=K#ZlDQm zqbr3v6750jL5yw^(Hqd0KeJrf3zu50$B9h6{-{A1DWxj)i&2P}yrW7i20tcGN@Uu# z_*$0B1hD*}w2p1*W9}?Q$>R`q@jWR_`owd^XoIWF>0S{emIcl}1j=w<`Yop$30 zCtO;h$XEl9TwS;DP~#|p%^aClkBkCtwZV`GvDvl$LrY zvec;(48s<|Ep}mY~EmFGQqwv9ZPWgMHZ;B#&alV{~=i};r~pT(bK z1OPdt0@{!fs4|U7#j6be9MYZen)2R8R&nghY-BpZ`;bLUaIfphL3tN1 z&uf_2Q7Y|1jGabaY9R3lMd>iEv~TPqW+LgU*Xz!Hv3D9RN?vsWcxE_LpE=C9jMN=u zoaGS>gumJ*3qL%QB~zhMX4U;wb0aAW9j~w|?xb+lWAUToBm0<>aAzcb>2A%@uw49Y zII|dXxC(~ zSDO8@#LR2@e_cu~4y0#iJD32-lcsbxmGfyQ(Bzf_9fOQ)?loQebLzZO&NVZm-{#Dn{y=*#Tb2sUh*?xuZ=El;73AMn12{i$XDqH5e)pSOPw;V$zYhOG3qoU5?ZvS1qX&8s zjNi9){b~R{Y$b%*#5&_XGVrZcuC5=u0`jb8fZMpT6H0S3*4Z z0O|D!*J>yF?s`tc6k)f9wc?IB*@Eg1x%~E9P!R~#=q2mo`1sz{;rWr`Z<)veqp_~n zt^bNQA!taBJI4M*N@PyKRQ=VY-GsEME*+K)xv&ODNt!+x-@pm;512f-+ClM^&-sE* ziMXh``-g1{!uGzVPv+n=Wa^<{>_2HO#dr$KgWW~%n)2ty+X^ac(l~^gQmw@+n5A~S zwV{4i>dr1I(I1!lb&J|$>O*i}$dVLZ2!T@YXqVoE-eMu?D;J$PYb=ubs@JAk7q%j2 zD%j>D%kP<5V0WP5H1FidU?>Ts@%m+h7Nt$(!z*20R}pYnFD_JftiH^)uceq!{YvHBrY!+vhAx|?ic{_=(Y)%o$KxOYrD=qvuCDYsP0r-3=mXN) z^iYRZwlRtIvOM2hz^w~^nl;inZjWbWAWKb8|LE_X&A$;C|JrV5JYr>_`Z$xGIsQ&q4})zvr>zi$5``@#GqZ?WZcEz+a4$u z_FL)1t=vsto^J+RsT}t?f9>wRH?&2@3?FRkxEpnqx@_FDml!uezlDYM+oZ}nWbXLJ zkV5_8W!1{*7hTNS&usxsA$pY4JK*Kx8fvq5S1gS%)QnUyYNbx3h!Eb%4#Leo%Hcr< zWw&Xj9?eKNEJTuRrPl{orbR*-<)vZQW(j*NTc7pH;iO_V!qx~})Sq1BJ7yNt#$lu+ zp=G2bW|0qqM!ROUPKF|xTl7DY4N+^3@EtISo}*!|sk?ysswn72#1vPh+2BIXA}7&T z@BxnT{znaEzyyh`T5qwYov(l2xOm;|kYyC~FMsl}`93yS!Xb-E%b;|&_-f#Nzue_i zm5+}NTcdqYYFbkH>J=lUt?|aE(JtZ$qM2!?8~fKk*n=uYCO7#wKcw-QMb5hMaQ1Ft z=7Wae0hsH(U zjSyk{d`8J(@EI zxdBCfXi)GLDOy|$)yT&ov>DzN*r#St$4~Atq9Q@w`G^U2dFFL=BilxNPpBuiGPG@h za}zT+`}~Nrh9}AM)rgSj#@?bM@nK!K-S{>d4`*8kgkh0U2p2i6P$|l`PvJd}9RJ)1 zYmRs$2*leA)>3z!RZGpVj+33owReU=Ppu@6^rPQ$HeDa>X+PM?Da~4fdESeJRORXZ z1wWIgF*WP8_Uvg_K_SdWUhB+owrq)V(K@opl0VI~{KA20)^N%3_3VfGa8>Vsbatcx zkxK}^!X1Y0_hbKZKr(M~k;S2=uSuuHHO+-Um^8Egg`2f=qGisMCX4+Q)Km-l2+!ou zT#VaP25LH1kruZ?hYbj^-j(y!fI?K;H|55I>s8^IL!(@@&t8o(zb1=H! z$|FChMIO9q8FSMz&x3Kf>W9XkJqcXd#2!qGE~a?h*hczk2N%v*e#Vw9wYoa^b$x!n zepxQSzx8!8oyl3Lizt@l4?r*lAQU6z1G~0f0_HSKlF2+OI^c-lnxxqy$#z-zs-d|vlNS{a1@R^g(zSBEsE zD1c?gdcRlbYmU?}KSEoMyT3<)hyjs@esw^F=@Y%;1T)hBE#8Oxv2sVzACYT7n*#2@ z`^~pX5{W-b_dxPH>y+1@XsL=~gF^m(@4FG3oKjFl{;Z7D#l2{C-4A9tFjQaEpWM*A z4K*V)_76s{>>uY-V|WKOSm~Jl#9Zs0Z*$)m1?=8xzN(nC`$Q(UmNksXbdz&Va{Pf{6>-MR0Fr4EoO{m1LbY$`!528D589+Kjc~bm{5mUMi!>;6e zAArRuU~I)+!1vQPc=^^1JX(5=Ck1Z}EL~(Svjpn6yUlUV#Ilb~@Q0C}#DeH=M z$@7M2z43t_FMrwO%Ojdn>m=5;EciA3a?)IstSPaBBl*jl%B z?Avm?%yxh63u4WEGuzPkP%3rl$K=MZxEgj~ULJ42mB<~dmaktq=qV#;RO7)NcFzjz~g=NcVr*g#Il)cxp8>glJrPD0zVFI1{a(!*79Aa^U< z+6Hwdoro8_kns-LIFLj|?Ira}zXeY)`{rt(k(uT!M4>{H`+?5_^;31R`K>`A=sG?J zsAk#EJM1a-Chl+CiHq!PpaK?|qnPCNJs$`mc1A6--8yyGJOnJmo|)h6uv-hA(3gGNC5%$l2T_B8+>f5r!f5H2iOrufGb~&yZx^lGC{3;Js}M zeZuB2NX_>I6=}Aq!KMalQ$&w1-@MyW^F6HIz{6^|T8gwkvT}Nfoz)3K-_Lj>1J9N~ ztqA%loeWEOS18C$69LKqo;M}@Ij5)ae9YZEGGc41n5=#FM_dp8P504=zT?f~9=pSf zZ0?&h)-<9h+91ds8JGIZA);s>Y8u)k)1;NM&ZQ;8AA*}2QDHpf^0qB(Y-exNbaa8v z2MG7L^t~yxlch_|gJ@1$tCd(|=%F)CZv18Va=3x)!1pSCp@;sWGx@Gisxa+Or15K(e6PsA zlBiC-5`us3Th+4T2B1L6dC2%m6l#s~dtLtXlDhmN+kmx8BS8 z0H*=2xlXV7oLO2f7^!~24Z24Xk}cTCxc@A~?sezSXWd0axL95iT11Zt|INbFB0_p* z$P?7My{{}Qr4Rw9YnG{@jT|BV#PJf^)@6*A{p`fz$qQ4z-|v@;p?3^k)gWgi&--10 zwd-MCJ#$BcRTwdsBtUMqfd;MB<6=Pe29c{@eBCulShi@aF;HN&0{m;{)ebG z|FPeyMOV%Vs7+Y>a48BzkWFgBF8ojjA35FW7^Q(P!t$Y?m1#g$r+t6IhJVkkH)syj z)!d0AkNk?cGW3@t_#?1`J)fZ8krl6otRM$~`rec$wXO`Yy;K%|?7^BqpX0FOB6li_ zsXRwbXwsQ0K^F~OF*mjKunZD=Amll>Y9cqQKmyrti&I(Z%!`;i;ds;4cjw^lpSl#?KcK7Aw?rc_N}-sY15?(|PbVu_U6LufHvNv7cp0h6-d}6kw5=Z)e6H8x;8d9tNj#5b z6!jmnCT6@hPEm~IziG6ON=8J4KkCJdzP~EnYx#lOS*zJ5q%?|~5tJWa%ucRD-ifG* zs?oI2cxRKdrUz5@M4Y95c5E+uaX;~e>f-~H3Op%n13^CnNjvt|+R$g8`0L3neF4B8 zWcJ&)`}?#jpbjwH4j1m%RE6+D-nV|wze+U@{Rtoy^jR-tw^t`l6u$ufz+U7w_4+w+S>OLcThYH z9G&Ly9bH;N%Gu16Z#LF?1qMR>n!^J>J#&Lnzh{pbZrO5pKa-VYQ}Xn)k`n*qBP(+> z?ik(fO&FGs$IqPEEgRvoq);^Mv}aMB!S}k{

3Qpp(!X#4XpKuL8b$R}e-8R{wDM~!^V+WAR6)>upRJL+BH1-X*A41$ zC93_^QTcyGeW_p!P#z(h1gKL>t^{GoLFg8+1wwa=8!zBBQNYNtk}Qj4=lw!1K{73U zuL%>JqvIC5jz77#LwzoTT_R1JJU!xU<79uW-a2H*?Slppgd(rRdME3vL9#JX!3T1u z`{dkvn(uE+PzgXaHBa}~a-u%OZ*BU@ar7(`6sgRDGm9)xD@T405n`vjh_CAmqtDB@ z5QB)Ab`Tdg5rK5Pl;l%Qe0szDfd!mj<7>}#bMGAUTg7dT%&yDf6*9b#JSshYu@M#3 zr&K)b4|i)h%t1|KoKV7p$l+V%WO;OTC=eE^ciooT;YCpnP1oZDGGV`{UYups@}ACwK+rLs$`&laLo zP1Wkv1J7)caiIcw+cnGV8^cyKc?>AIJX^$9@8fnE1mf+hjWN?WfuH=y`2oL>$r1gK z2XK@afxVWJlJ(6Dw>&1Dt<xEmca$^wM?=ou;QsLQXGc89W;; zgKr7JrxU&69|-d5>pIHCzk}vK*!ZxyF>I^0eP&?2r9Xn^;UdJ`-g#)1vmFdnvh7UO zHs}hvo`PNxf7K%Cj8cF`q9&egw)eMx)!4V&SnT$e)e)h~GdCFk|2Nsa=#6~*8f0WW)Dx zxklglV}CHwC}?|OIYAvhPzWdLg-5zrJSwLj8(Rd}J#ArDL1n0NSwI(+1p_1xB3{B+ z9~OtYkRH-4t#%pHpST;Y^&`b~_C}ZXVb-mR*ZE$f71gS25bvT&oT~HMg~YRC55a%c z?)TIbrRak^rJ}?u*&f8!3nsN*g)8Fxu)2hQk2BcK`wimMB>pOH#hnsx6YrX&s#TnGR^}eIXn?c!Z>P6t1K5_ zy1asobw+QNnWG$+wUx=>%G5Hw&l)+}R|1j`5lAX zp>W$@#JD}lZQr#4fG7shC)?mYbPf0BR&WgjAQkNi^FCsUi&dRXCwmNtVohDM4}O?W z41vJfauQN=n@ujQM62q6YR|e5c&xTXp;2vc5qYbF8@kF1`knyB1JOT99y7sfo|rs0 z&>(6bR5px&<}=JZdl8@~@Ql|g`5^YN74YT+&Y0tDEctf;0DkCv16K*=bFlSj>`r*+ z(M$o{_|d~|Kt;G&9P}@gOk6|is`M>=y+`)%q1gMQ!MKtqM?zehidCkyUV!Kmqi>&Y zAW~n!3HD*8S!{NA309Hb6X9!G3DM(NLm^Q2&wW$|N>0L%l~Cy+_yO=^S;!E#;U^Jy zcPr6dg3_#P0M3VIBOf*6>L_T@)apz-4Z_M@!*?qpc)j(Da_oOV6!q5xKtq*H!NYU7 z19-F?*ebZ-O)lyXqUK=)q}o?1huD5Td@QYPX<9yafiP_Jt|ww30=yhB>O+-ZM?b-n zC8_hv??y3y=a%xgur{N+w|lvPtQgHR3cz;E7I>hzFurQ-tw2osSWqg8`A6a%zU@9p zIMnE~-B-)KpbpUcJ4H@nJ|Y~G82|N*cZO#K5MqHr&OwxciFO2-j)0ISuW#bbh}avFM2KpN zQc~m*D8J`2)<7!1pm%zR6hE#x?jvVoC{Gsx zH8UOq$Y7zy`7=v`Z~KIvj+_DH=l1|i`DYG&n^{4s0B2R?DQzeqYZ$~qigR66GKzst zc4Q?a5;mFMF#v0?kq#8g)MP8mFo@@?=h(nzuB7_ajx-ys-p!DLT6(Fb1 zU6|Mz(%l(&if%c+wTu4jd0h5XHX%LgV!?txN)nQn#i(iPUz{`60LxqjyZ<2SMn=>L z?>K{{h9`X2NsazG34ZaZ!vk5%H8Y(+bS74)PH}gmbGuI%Ud$|akQBc|GxRXxG z&_6R^;)6%0dm70K+vL-s+R(}6u1=xe9b}#1B;2_dFe($QKWo5*2Mw;tInzVjS-yQ_ zEdgx8#iNKcWZV(DJ|UNXLv2 z+mS~ccqC@7z%o^%bky6=8JmSaddXQj{n1yU);ndZW=Ky|`9AS@mLO=`v$WmzSTG$R9Yt;K|IBv&UW&ZD1H& z`z_YA+*D}`8U3TEKsBRkhZYGAF~~~7Jt5-oy{)7kiop@d@o!JADse369%hC1DULS9 z)p7Q=`yV_Mv_|F>w(bRjWXCh!@gO}4jT88!&Xc0Dmg~&Y{3|X8Pi_V({F-Q`)tqyc9Sq&(#WVN%os`Kh?9dsTF{wo;3RHXdk&qV60 zWe}x$3{ZLjp8n#N;b)1wrXhC#BdAMaaMeeGQ9)hb%fOZ20l38I440TRpItYVqbJGR zZA}4^-0q#AM4yj*>d*N#{CdUOUiiu&taB~N0wBfmv7Css;*{GzdkH1(apyoUtnxB; zSSi9mDH~}#1`20tmO-zA)buHq=s81Skap?n6gJJNW2$N%;_XH;`FzBY-espTxEThKArp)!v1aEmrR*% z5_E@?EKga4AmIZIcY)F4=rSrpfKRJytG>jm9&Nu4l3| z9(Jgs%q)auGB%z{w7|pYBD-y@%ZrtzjT==!k$SvH@%_+Wj^6pkm@3opj-^$9@>qh9 zt%?mX(xmx%<3!9>aY|L4&Lf^y^w1r#r`rB;UeguX2B-F3vgdetjsit}k_wETqrTkt zY)9d;^!s_0SXDYJx^{pY^0Jg%uIXz}isw%7!a(#Y+mi0;_YFj04Isj=j?d+nsvlImi&G-ehpvn-ox^l$-^sJsI@aNGT%i~g#)X+ zdSov~rb`UA&rWCfAdAFsEm$DA(kG%yZOSu@$o@v}lf7r*u~Q8%fybZ0t6^^o>Q{Oe zABS4|kt)hmck_k*w987lXkTx$=v_*Rfbwr_Euc!Zknn-?<; z|FEa1d0T_09+XxmcNi+fte_lBs>yqu2NXB>%w_1CCF$LZJQ|vq7oz_su1CTmty(bkL1Hdg_*YQ*7D5Cn?EglSr^o zV{l*GR(Om2iUqWeba(H^w!hDLNH{c*{=|u_NgOG#G5p;czPGaQBetH$naG4+BSDkN z*g#JT^$1JygS3WMMLt5!pnwx$1E1m~Xzmv_x_oq^t5W(fV&Mcg_oM=tQ-)BU1esEy z%=XkdYOvyA>m1v>98sONIhNaf+&C6-0*1%mf{E0RQHJWL!MKXhlvQgNehrkOZN7J1 zd;bTyJ+@s)^j3I5Q{n}^w%8DF?uXLQJ{FVimk+|uvoBmfzZ!9Pxo4627PBKYMpZ$&SG70dU_WE7K+4fbiKj?lk=oh*jRR zY_cp4KYM)=IeKjeVKEKEd!_?f5qlno!sTOeXZE8jAyTXffy()E zW%Ljh_^|e?&l%n=nO8#N|O-u@A}jA43O;;ZS-c zPk2%Rj#2OYdAKzwrYU=e zBRzNK4f!^+ZU_c_063i(8Ek|>;T!nlQw@_E{0TgANr0clb!0M!&!uwzM_<&%G}#K(}> z1#e02lzQ}mtf4IpxcJSFA4HO)Tmm}nBJgiF4R9mLs6E>zN%fF|As_@FvTbbhG3b37&<{;jN7|- z({_s!L3uO^W_yB25NGl9gZC7VnhAUb2vYoII6VKlD zTl2d$g!xS(33qGYsWxLD!9^k<=m5F|laCnSNG2<3HVZ=s%{lI7SlXlFi+xKTNZxiq z!@bO>vABoVLHs(A-+no@DU&0wcZz-NDgq8WGaOO>X}_ zt4XVNYr4SSpnql!r0Md?yH$AVB1pksLkq6X9fg%Er;B8ILNh-cIQ2?WZOnN89pytY zsBiXZ)(zGExYRgmOUHD6Rf_87lKApCXWnhT>ixbg^c#JhT~9IWrK^|%TYA~^mXPIV zM?=E_c*EiNd;`jsP`EHuk!;gZtNCseJtRs^YGNT5+LC_$ z%3P$meoVZ)L6>?+M?H_t#T_UD^KPIZ)vGxLqy#3&&XZ$&8i}8)gN>~ENVW&7vTk%| zE*6zYng~Jz*M5cmvpoRK6tsGT0~SR#&7pq-pG`rc!kR73g~f!wPQd=ozI9_G>;w{mrvh_FdT`h@)r*-iW5>L0rAkq412t!B;;4kegVX=QNztE#RqGBAO4zF<(3!yHPJ&g(^4+%z^x$N+TDR9NW(k2J8G z#YQc<;D^S(4cAtS%XR^Q@}CP;!P%=O+~$XGlCE?Ap(sqwZ?+=jY4?&BSK|a&w?JZl z^}WZ+1kxIi;n;qi&|el(7EW34##!z>d#3P7{KGM|EB(+}3lphExNJ}Q7+wU_;JD#o z#G7a8;fT6HD6Ka~axVicG4py-V5p1W-oEAylY$EJNU|b-8{dP+5$T^}B*BFv2DzPE z8IWb6f@hYlV z!UuDgw*6bz80A7v>=b$mjU#==_bG-y8=o$NDMxq(nxCFF@>($a964&%@pO`AStnsn z7$b)y`+_WsCkQc$MIRal1gSh!bPJS}j=qfupC*a=XGU=aXlk46dRL)F5;sf07BH#e zo=)}3vgDwNt)q+Js{oH5yAM*7)5rSBV2&{~6hT>Xrn!y&1^dxMnnTV%$bp$^4 zCc?O6q~W`sl1RR&r1a`efatNe8OrE)u zHK^-P;#RZCI04b3JZB!@J6Zt{E#a$HvM&kh1y@1+5;XQJC-VPmWk6V8?(l_(!%(jc zQ1ZxKu(@@pTU_{Ih%_^g#5AynkP3IWi&bufkM+5hoFTNuG}G>~JtTUoTl7TVlF~pg z8{>WDufRRA^^D`XkOHfb6537+3vvSz*^TEJ&q;i>oLP0!K81}~l<~N|TTa(_%K}|G z8CLbXkr8o*pi_6*c(mmg)0=7K^_`OYWMFDB49eO_$uD=BVB4_mm>};OHXOfk34b{a znwJU8y(%bwOD~b;jq)|pERMzU#!ko=t1iv%Ur^r(8 zkspbsu3x9-7?`l26{OdMsvKns#4~WemaP=0ame=ZDf{pCx_@IsQr=ey4EpEw>&p&( z9+T!q&+^-AFu|Lwb~HuPQ3|-E7Qsyhv!-)6k{@&(*-ANU|%1Qq(`L#LSY!Enukl~^=*E*wxRcOG?8W%G>$~C0E-u> z|3X`t@8vyoY7brQywegze6^pAe!Y;uo?TVi_jAd44VcLN&L@&89#7SR0pXD!RRm<- z+RI11KE{y8x#LOh=DWI?#+r!QxW>qrDp-VG8Cml=ZtrCJOV^UqBa7W{)fvq0V6B>NBL z-+z9()C>lY6`l9^Tx8^CTnw)Dt4ey!g$uEZ0|padHvQ-W=71;r!^Xf7qOb~R^w4~( z_0N4kK*nCDP5g)K?Em(xxY9E)D+rerzBdPm7$zv$(^o*t(s;HL%Bd3t6-_Uh2lNdu z(2z$@d4ka9MVNIbTF@YX)xg_QyFZof|GN#;K7Rq3VOr2E@Z$x_2J1B0^Hac+ItR3Q zqhVlsvrI!J;_xlPcBJI%JK&Hpb?g1VlAHff!QNxwion0U0P>!F(5v%$nbrbSrm)19 zpY)~aHZs5nulr&bK<+he-?e@-;=`Z5CV#bA-0Qvo78~*`34;YR`#INuah+jK%i;B# zl;{^yHYQaML}+IWvvKLTfnu}7gNkhctImn!Nk{0KHgz14aKP)tH;w0Es* zJ#M(EBnT?kM_!MOVX#{t;R!d@ma72Tn6k0n537hK@ePe07ax-S?;k?-oW>%$ZHqqOeB%go4VvZ#m8xoEdq2cS5D!AKYG9G!RCV5-V$N}0^rKXix z)phO>DDamJ$sC_hWVS;0miv1%D*;oneh+VW-NQ2C;vAIh3bv}l0;z8fE7tH4UpFpT z(JkQ9TrlJ>O)(lM+@cA$WYhMIBf&w8o)q+6%$mZ0{LhsT^#$w_exGmDHAwG|W`nZi z9qyuFr7WYbTdx+^m@@()s5v-D z7W3q5uGRZ5nkEE7Wzc3+B-LBM5$ja^0dTjHH5laR%3T!SAg#|$0*^;6>HQP?8t4X{ zs&4>Rf^Q(E=d9laUKwB=1a?~+n|Uv8lxMyCPa6pK=nKtVlD+;5V&#v$*_!-Ci$MKU zs`ffC5}8LDBAd#5mFAh}VrN`QCpa_X!+J9vTSq|nX!2b^T>m>-uvhQ37-!xjM)DZE zRven2Hz|eHq6#X_fYD-`4UrG2#d3qzak8Kj?O^-Q&Ej;fu|h7f(!+K> z4n{6Sf7NN`9qjTI4{W6J{2hh%%zU?ew*gg7J44M$>sl5&@fTQl{sh$+5$+SvSA3x} zW1j_VqbzBx$0}IPmcjhx^11k)tT|w3KQsBwbF@{=d?NXyyZyb?113dFiQ1aS_C}p_#&^;+I3rqvF z5i|D^MI6%|6@A7xjp#h>`fbLtjBVl9i0KY|InVU(M>C6!kR0+`*^y;|{XXy!)419c zgxRO}r8V#52BC$Q>y7JUJ>5gk^5mQA$j>^H-eCSG*ZN3zTY~#0gkRo|Q^5k7tiYu7 z>DlG5ih2_K!njsU_hE7}#}-=0ROJNXI4XKIN`_|CX?>ag(uS=Wh>+7&!87?9HPQU! z$2|d7yIIB#i0g$6tW(BHRsHPetk(zI2|b#w5xqitijT^F5aQ$zu20t2 z7McwpVpH6n()|x;CUuH==BwUAH8{#gx9^S&2yby5(1KcK655wIT_q4yquc?ZUbRwY zT-tWLQrTnZzGPn%;0JGvl+FRhR9;GqN6AFJ%+YiuFiLaas$~)BZZIBYgWvxkQ^EYc#gU`Sy^`* z%{Q~#^lzvr$sb5u#H3Qbdn+Y&(Rtl{@M6xDx6no+xkgPzMhX-C^=##K5MC>oto^dn zyy8U`C76B98TqjidY`@ui0$qjGT$My`SenW9e!Yx*g#jeQ915O+*c|8$XR8LpQWYl ztaE}`efJ=nbM&;X0(ZeN5OY@j4NnT{UC=-mJwdhX-@il(^ZLCKt5IHKQ&0mtz9#l~ zOlMF%3do@D!J1J)uW>#SwuvkJv}-1iz_tGQxs?AF{oc38Y{T$-muS8m4xdN?dzVF0 zH?Hn?Cu~>=)q-2rg!(is?F>w5AB|{m!)OTtnH^2QlV+y>;u}bT4^q}Fpi{L(!cD!ys zdlj4V^~3yr7140fARjQ>_^w%cLVrdwS_JR&+!gEg)jP02F7;ga$>pswF-2vbnUY*n2G z!(O*+ng}!r_&S5Wm9%?)ve*Sb@D%u*eIq;EocJMg@&=Fd-W5$tB{s*EPQXPWZhj_7 z>PHI>B153x%?Hchh*W=8SZIb$h&%7fYunrbp9lTrtAsiGF&L@cto3Q@Z1Yv)ZZ+x6 z^}71AogZ}qk0FFG zAqD=h#AoWk?|cJzGTUo2AOXNoTrLd^xduXYGEt@42VEWWHETt?4|uU--YVZa21AHj z<_>u7{_y!hqAP6g=fnbVPg5&DIY_KQp4DFU;1#rL%u3^Y6GxFaxyU(Qp#YzZMD2z^bMQQz{A_FzH$I)4p$?Aa3NI*sZD zr%;#;Sk1KD362wd5YzegoP%*5WH?^UiF(}5yLomjB{<-0qrbjXU`_(_qLc!DNyS;A zO`cbDEgw`KwA1ro^R|MCyJ!bT#B3|Vt z4DX^e|94Nn!<>CnP<@qI^kukU#;9-Dd#MEC(bA|-Rl=5KdFoI4_1iv^oq?$nt;0+; zrH2cAoSiF5_{CR1G$FVF-Yo>G!adMgx0~$PEka;SIm5gc;d9oE_vXbIM|2=oO6W82 z5sgu21GG6*kFm;IOSA1>%nCmi$K7M+*1))bh3Bq$l{j@_MT=ayGdRgSkC#kU3&*=E z*A<>(nkh~L*!H04Yel7r8JMjLw>{sm^_h#FJ@V7vzn}kdvun+}a9lcFekE>(^8Klh zQ*MF~X4bR+#JPJI{e*T4bc?L=cp2iC@wvUO70PWM_}>2AqnDr7YU*zfj%@I(^l}(GlMwA8W)IGYE(aO>|dpI-MT*`BBh@ns8Rn6W(e@3b$O@msnlg z_uSL^>-GcJQ>uV3EGYZ9x(Q7*TNE@SN)Wy9%=eoE(Sc*}ZHooIH1H!#l0o1?eMww?sav)w==h2@qEGeauAX&EF5XbyaR0g zzT@K+WXe9fk4e}pL!d0+pfrARN6-p!&*ll04`#I0XEHokb9{Z<@P{}T9(*!q{VNwO zV=sB6>LY60#A(Dy{*JHU){vVbE?BDu_U_g8Qq%u!Rl=dwX6iTCJ`TTsa_oM?c=_$%<~0UD(jf=j}B9WODaKn-DNa z`Jni~p*vwjjXjV$lgyrHA$ysqc>==fS?fbQ7SwrEG zCaoOTY?@hG`A~8bo^*8R+wkwNPcc`7+K#N=I>P%KHfMUoc9kN`7doOhX{dCK+_K)9 z1e4KJi!Q#+NL6$$fPDJ0`nG1=|nsB36x|F2{=WkHLRP z=%;|k4_NLzLRX7vxZc8$ZPd^X!aSx5F-tn=pMT7ezd@~t7HAi2A8K%riK8YnQJ zya&C~w@hSxCrrY;mq@8zG%taO+TEC3eL|ksHE3$;y;m8m0-mScxcK}TUUP< zG_&al>N-A=Y}$GSimYUZ4i>$HrC%WDkV*Q4yzW`z(UaE$_N|H6O>*?icM5Ix5EfD| zZXeyc;1~J4jJ~H3hWD^JRW0oLdoH8)o@2e@mFhuO-{+RJv3)6GY&PHQYvkxFif<@1 zu9mIejWEpYjNc_iX9;01CIbq-F>;jE%NUI|c!|>ch=wEcZZixEs+(44MR^j`n@mrK z3Tg)~@pH>L)D3t}8OG9W0!x;Mvz(Ve-)I!C6P6P?8X4u}xF;EPNH>Ze;ML6K7&zPY zJd2XF&k?Y&Xjk&o{*J)q46kqcsmAFcD!P^M7>Ev*L))!^z;U-Z&>^pWbJj3R0<|Z! zq@>u)4nn?VdNS_I*XB>fYL0H^#T&zMl!3Pfr;cP%yK=<$L%`)v() zqe&277|2Uf?%E@Qt;giN!U?rk7z2%t^-0Pmef%?efu}&-n@H~AC7-C|1MM9BxNjux zg9?(XtFe%9nH}4VTx}<9F@3zg`#T_U2I<;fcDLHpuR!?^7~L=K7O_9H?IrkuUt)a% z3`Ol(%6}ApVq91}0OWaxww9$A>)wkh_W0Z1ZTa2PHp&K``yd8j^FXk<;YB1DYbF?I z(|y3anxsQF_0q)Vv7+U7HwT{Za(~D0x3iV2x%vqkA1*?l>uBMvSt=4qx zQNEgW^*-ag64r*+kHEH-W#12r=d&io|RO*e>iN_TgNbb}xv-LYvU1*DNiK)R)*K~h?2P{7~Z@8k2H@0{_CvHxT+ z)|zY1d){#c{hNjlL_!kI^)^Ii86q!gEb<45;zl7R9}ZrOQF`|Wo`}&MhrSS#IwtMb znCn{Fseqj?FC?M-Th7WY+yrT3qHnUj8vZZ!2s2u*et;nHR6+L_jM@mP>a*X*;Ocme z323F0eXQP>O#W(XjSn{{HZ3aGiwaJ~TwqylS8Ea4iG_Z*zaV+cw9>Z)O&+aT?%jMu8vfo| z(pP*{H%eBY|cf7t)@M<{VJL2Qm5<|O3!w$S!dxc zE>q4eOl5KrioIAm_uKreB>F9ieN1(&%wp!Z9k)11zQ|}o3wUSA*cU~x?iCJ1-^p$9 zn>mq0&>t5T=;S3SHvi#tS0ol4ic@_TQM_Eni8N2WY^xx#p#h%CY?fZpJf)WNX8sGo zu5Yg~K6Kq6go^R<(nW?TjIb9iU}`sYl(6B2j=^$)Q1v}G71&3{;#%>(h))<+ppXi3YAfIL_qzh zqg=ng+wE1=2$Iao4i`T|&tl+@bfJ!c<0qPP8l}+qKJi|cgyN}emnktWIrk4x7-=YF zqxD8uzG%?+r#9n11^Di3sm6wQ<|42BEnMzW^paCoJJnp=bSisG(`^g=aRagD757*_ z7`wX!GVeR!XE^8IuzTs}$7kqJJXsQpG9b+1GAGg{QaMDrS=gIXEnM*x`<9Fl|I$7$ z#M$+IMSwdjPzgUZ;VyiZqyr08jYZGX40*-mSY(2tcds4Hyt32b4Eff6R`@&Jy-qWI zoc!Se!YZA=_yVF@%lSHr!e(-n0AFXi$J$9)|6^3D(o4?xxYKrLR}#x&OAcyyg)upa z=H(aP0{uT}%i(#rXWW9S*D14(K7YC?`RFXu6pPg7Ht5ehhoT%-Z{%&Rg`iKw6_~9E z4s-m5eyxD*9#gqQr1s#Le+nTfVuT~D-|lf+(p5zpD!%lqhThOzqD~!w=d`JzOq3a`_20|NRu`;XZ%h#zGQt= z=W_6De4l)R{HE;tyUfuX%bFt|C2c}1ucwpT&D?s(IeU^z8bf-Dx?@C@UC}nwMj@X- z0nu7p@~sN{QAK}$BVJMRhn`pq?$_T>Dct&SiN2*MbM~Yrzso!hu`H~DC8geZxhM&y z0|j3rC?ER$l9@2M$UR4UtHs0uk1;bWJ1*i)xvP3SChb;c-Z`|s@}z(LH1fmE>dMp0AeeJK--1!)z95vaFuF&YVpz18zP?9C%irBM=Bm^UD)`~DI>}W z`H{FxOmW}#btm4|x?9irSQ)8F*;AeZ(7%&a$NfyV0E zW||M=&N&FgEw}T+*_hRCByPF!%RtQjK-YDUb}Q%Az})vpAwqc4uP$=9a40O&6IL}P zzTA!STReoiq#T2FC$I?%WCV5F2vQs=s(b$0I7Z7^88!ay=up46N|HT2ApJPK_A&h| zWI7Pa%3_&X-x4abSza%X{*3&^&AiXElp!k;#uDx7Q6?j5$9x^Z=9wJ=qKL_2s7pm= z8D*I`RfF7Pd73wW>-Gz^ZZ4h1;W6@;9aEfWU-OB=?v1>jnQ7BhDjkB0{PMj%_5$0T zk^fz>qD%6=U${`qZ2PcLXLygc5X&!(orVdK*yw`s;jHJk#t9`jvBsk2%8Er|SL1@~ z&d^jhCA!YgbhV-T&2-M@48HADQGGss>Sgki9v61ikv%~t&klipwy6=FIgixYoIi2s zjr3E7S&m~xIDDIXdL^W56iY+TV5vy#aCMT;T!orHzy$k4L5khRCmFXESiw&6@yMkq zqZH3NT`s?u*GKDO^hLbl5BI8as5we_&0|@)Zz{pAKXq&xCRY?*x`bgOayK~xzK}8`himCrzQZ2o@=>PKRz-t(5yiD z5o^@r9D^$|S+2fvBA5@)s{#lSuc%fRTw(vW+_vYvdeIN-DgVm^5Jkc-cB|QZD?NgA+qDt-bT}Lr5_sn!EpM0|P zwp$01n`48HN%7LWxX&(c-?ZOSe(^j$U5;0=4l{n}mx4W^iXM-C zq@*)#*cF3;cD~jbP#H74jkOE0s(KmQKyN!Y-bo;{Y{o(7zh zL3V?%Gsg6p6FaiQg#yVz*}tblIpqBF!?9dZk@EIYCy(H_22+2*`2I2N&@8xA+J0?71#OYe?f819NsyuKUPs7Vu#v5ND6T8UN>^v}z?I zVYQsJnNOh-w__4xWskyV6_Ef{+!XoN981gA*Z8N3D3N#3zDbjuESghm@U6s?=iSbI z_gTpO!)UY^0ke1Z1IDn^5hatH%C3NnYwf0+HymB`c2Shp=SF29Y~!2B$^51*+^>$Djm)7#_Tp-bH8uz_b&cdv*(=@F> z2wie-xLR)1*AC5dd)?KQ#riabdgAft1o6CsxZQL;8e*r%Q;rv|1nz&ki&EGK)gOk4 zTjfgA==N#0F6b%=QXPJBD=tHbG6aBSOvz+miVfF6#8s4z`WT`7@K{$Xw7Q+o-4f9? z0-Y;CSm4DH0WbCHhfNNZa=w&y{xS~RxWI6i%82m9d+XCVS$d(~&%0C%n>5#q7|W!E zdnumv1n#054LCcxjO^&}0>;8T#4`Q*z#=>tgW+^Z7g89{x&~6AqjPHN~F8l4Q>C zYmzaTrZYX&@A9c4f>^P?W01F82qb<9)H}d}^@8wxVe_dmk+R4bkr*!nuT$?tOG&~{ z4w~MPekzMPR*BCyiMLE;B|-x3{{00eiBYJHo45NqWg2%xInmP!M+k1a*pxIAEwcIi zZ2V?d^=r|{eAl#jvscrhkk8R4oJ>t(522KZad=bDSx-VSg!J9n{Vc7Z!yETK=9>91L9OaF9|;GDnRBgz6>)l(g;X zBcn5dfx*ymJp7~Y?M31`D!TPnhyBKI@*O;pXA}FJ+kG)m9l>h{-kDMQR1GOZvGQ>U zTk$&34iW?H=#Hn;gO%*2oYQ;BA=B!AJ53~rq1)d$n2H9IDk=OF)Y70j?JJ338O_?$d`FY&qq9&6>DFFXmS_7%PP8 zPV&!B%wP07HdYWhs!YZ=d;?2{I}fVtf#G)n)%GNHI<65)*Fy5-y?Es_Q)e}k3vj9s zL-`F4-GT!6{9r(q`TE;FOVQmWJCW|{6!#n{fT1ok#r{*jn)uZCcRW7@mHt&unhz;* z1C`56j0A}E?dH+WNlDN_5Jr^KRR%ov5`5q0%*V=GiWdt z=w`jBb}ycA7S3pFDaxkPNSx8(!K;+07KBpF$a&4Uj}l}r8;a-q%U`E19TCqnZKxNu zDsygn{weGw_Dn0enf+lsMxV9u7EAN_(J^uA#6j>{u7@n+GuZ$ENPwmipxKeTc>n|;Ydzsjh0#~1C9YhgP*9@Ow@A^6DoBY!QK zCFdmlHfSH3;ZIXJTtK4~;QuWgk>Q;Umi3k&RM{CnM!7cDxOOmS@M#bZWglm&&goR@ z8dT%aeRo+I_&$km_nY8dJ74`R8SBK(fu5uOkk6Uy97fj?Kw4A@JHmUJX*RQAy7!sk z+qvtG(tI;VSa+S$!~bKR2&^YyP*G7kA6~Q)=xR0_ zRmwRe4M93L8N95TF0~R`C>Lcuj%_tp4nr)hst^=QU!fmr9U;KuG7sN6S14;^t(O?< zNrPklJr$0>y{P~SW zLPoNG^eeGs?x}c&Jo_hggSo#;9W@9?ba+yh@q~$OTUYC>9tlH^Bcjp0!W8Ms@ipxleeiDT3Y#2{D9b4 zz}VeF;aRn6vcbE@8RGcjSd8(;nqDIM3|BeNPfDZSKDjzv`4x=6ansD$da@EP$H+ur z8h9!@+I383zK~U5m*@4hFT72eZr$&DUUa!9+Bf{isaSaF4v#gZoNIs1Or)f(mA}{* zSWlqupw5q{wyeP}#Sd@YFU?WNBQM~12>!z#y=Xo?v`z9G{Db+IZgPanV5ye>JY~=N zQj2B3G%fr+H&yJcV8-$4tWZ!do+?2D`)@efQw!m33jBCnbMfTGHT?j7*pCS<(+^zO z8IW~t)#^XzEF$N*P*Us9rgY3!+zlm;F_8>gY`fszG5!?j2U#jq=gG`@57{()9sM?% zO|+``mXq`8oiv^st~R@x1a)yu-JF5Ny&0e88N;g8SgSnRgrYD$#rf+JN(;$4d)cOR z-}d*V{!Zo&+bI<@<*b%sp&o*=lGx6wt9`}|tP;P2GU7M0+?q{tSI!3bSFX?nN0N_$ z@h7xE)%me^rd-==OKjt63^K{s;PY$~1v~lKO6*aUcFKJsheEM0U2(c{eL1c?4B^l?Ud|ip`=x4+S=SnwpFThNXlH`_wTv>v)JUg0*y)>KUlLC%C`|Vi11X%FUJ&X6TO(6e`x^yNNza?rSFiR78A+gm zTCKsEKvuJwIqJ%4EM&QK3*|+1Z>{)KzBMbTrjMvYF^2xocQ6DuCiCFRzfz@7kNW&V z*c~a1JOPKWaKS8nrExh~f~@a!usFGC+|eVyvbwE;wLjs(yG(`sV;eJPJn0=Ir zoL=ZLw(k)qv|oQqQcw56`aHDsW|&Y~i?BkXmUNHm z1F|XTh}P{`4cAHpc-(vHuI4_w|7x@6(o{YuQMx=(zPPK*7obYo@(G>KfA)Xo!1nS_ zOu0UfK!j?(~WDh<5N?@N{UF_4wu z-^We8%DP#N#EA47i<4k&2?~Z3BP7po{`}m~m}8h9Hcs%>|MG4v8Z(uF@X;sz`t%Vs z{NK{L80D)^l;&I0kZ-ug;JQD3Jz7xyUi`s(BrltOf_=@Ly8-zq|8TWj2+B-kD z$-3chu956jwj|#G$lBT?!o-kKyO8s5*Zp1&+}h|O^@ArWpW;g?iZ&j z;1W#f!sOo$+TM!UkT)`Zz7e)U+QLZKWcwf#EKNW5EahbzmV{W08&CR~#_N<%KxpsO zq05Es%zRp*o$pcHRWks*2FLPNEcoy5UMPK1rKlfZ$FzG5#&^5h^coJyb@bhwT~C`P zUgr$x(kU?I7us?G5J9zySymrUGne6uxjl^$v;4m^>@Ue7lfB1I6OWp$!s%YEUJF)r zT=HgE8bI5a=Kb`=#=5igJYLYw1n9~Qi{<+2Gec%LsmPx`!t61bYt@#~-%b)?O+O-R zcr&RzJv2>{?K{v)fpq8otjOXIPYoNtd?LJScrH8o1Ql$rbv>U}GaJh4kTumJ!=!Gjnq8!X3(23$rcha3={J!+1kd%=LQJF4NI}ckctg|eo zo#g>YJFnHaJ*heh2=ToG?KX}+2*AP=>C1_{20UXLWCK7(Wd*SL^aH3K+ zU?}YX@0Zt}0bMQt1GgikFFG(My6L17QvLvk_fzamiA-Y}TclX=RBGz~4amuG=QDRuEI?Z*(QRE&0pgB`wEchD)TMSO;bk{ij%jKMB^y*Hl=(=i`z;Gcmw&mnQ*a1K1~uXx_RF{a)6QO>P~6ISp1+|}2slp5_Ma-8wb zdd#oba4pF_ibZlC%r&jIF!RSU8CgI0=eAOUPlFGyH~VzlWO`%k$MksejGVZU_jyhG ziAYn$mi02(f-JGgtlpGmjD)2t(mv>;$Ms^MqXd-*>4?RO`>RAqhyGKN5#@I`OiCQC zTT&1kyY^TTlZGkOb?oi(vvUPpKhQRublvT6JU9Kj;*SC*oHryyC+TD*&q?WGDPLBZfm5PBxmwBqGNk zzm^#94!s>@+yPRnK3hhQ#ePbi>DJG*E$~hPrT}ERI}Zx5UOT9)c4}7I(+U%O{rf)B z?vaKc6;l%=JrePT4?+%8Ee~S9%b78M6}9^n$+DF+JyfDw);nwdqa5=Kft8jWU5zsC zrY<%Dk^~<_V8VW|(SNo$rhEtsULcOvQRR+7|BLH6oN-2;Sl;ktXi4&LZmoTZ9V5;e z!@*p9k%ge0Ey;Ijk~_uvX5cD8^1`g42xz|Y$i><~I|HrhxAQ5U@|uU?GHss z`5+wi+}aV#&s8z3;*%+2?qLm_4OA^uP!tCBd>&k9B~0&29mS|wj9_?G7Fy)_LkIK@>p~knNC8H<%|F4d*Wxd7!lJ{ ztjq*~6t$n8HJrT8h`-B?FA5Xd9(3A``Tb%AQuSM} zufnzf5YGW`*xUjXZ!7NPv6EO;VT3Oj(T;(xR7P{r9cg-PB-U~y3qfm6c%pZs;d4Vr zuO);j64U)=mW&K$s)6Fg%*d=gKj0ugz^Sz)bo<2@N@YWgf8I2U&=-4vbCOOZIkH)Q z5bVL%%hqWoKZi9@vcus&U_04ugjs7YQP-i}*EenPeD)ASqJ(MDL6{0fs|0_`8Slx| z+uaEOD;U0VDo2t2-z$=2d=`6P9;>jsmo6h%?`g$H#585Wmi`sy2qt0k84_t!Y=!&F zOE7Dc;k%QN#r#Vu_NMLZIDKTwRarKD;j_tT=Tz+U-6mg07I`YNfvkYE8$gJlMf%Xo zKemvIqD=3lgFb+z>;oqE^8P`sixDhy{*KT}aH6s5;yCoXRO=c&H5_6F49H5?QWMoE zSSzhXk1Tz+ekglu6x5a6rj3r|dF*@BYdv`!vNfxvKK>|%Jj-f1YTw%p|2vF$!>~*N ze}(x4xlM+j_=nouIKCCX&hNxJ+uut&>YhBxU2aoncd4CekC^Z)E6nS|7R}bREXG=VGAaM_<57Lv*S0w`XyMj zB)6hgwLdebsf#72!EC1SoHR`(G4B$T@qC5@m}p!F~i^Q%G0VvVMaX* zF~4{^T!$GleH(SMJ2lqSzQJRUT33hr~@#1$oHmzHM~}(&LFRo znrPRG(ln-A*Vm7Xe2bES+u_g8mQm%6aw)AVV?G)3_JY%`{jGJOC0SmxBR_|JyMy|h zo9;(Ey1e|pv02Fku{v!z`IuU1d5!h7j+!gSM-kN+NiIo%^FBqj6GimTH1Rf|ppHy4 z8B-R=&Y1LF8waXG38Z^KjZ%r2r5XWA{W8se? zXXsmt)dHv)z@ZIb3PF6L>dxO~(Go_N(d?L0bd7+`5^oIlS%3`|{sx>Xu0vS!73=V` zAd9+JJdj9V>7IBwclpQ2#=cLVi+2VW$SE%on|NwK+}WuDY&L|zo{F`w-Q=z1;|cz{ z!Oi;Yi|~!$k6kdf&~m2HDd-}3M;^a@BS6kpB^UR9XSS)!%g}E%#&wYmbU#M8D z6s@Z$fbRc}@yk7RUTPdJBNb|LUervT?33G+Nsqg~TAsArQnRL|4l^`Y-Cq*l^lU=B z+bc?pN#<_8fD;C z>B7{Ti?3^HWYIFCR`#^*3jo>m7DqZ;Y6}npkMovO;*)x-Oo>Y}sp=gL;a$Z5vWL!s zAG~SImkn-#L$*#mrE`~w{f7nV?4z@WX4%Na&1PaC&X)7__PY3%jEHXIgHqaSOR@j8 zHO29K_e(PG4&x9P6%vyZxmh`<5_SNz!%3Afxv9Uqgr=za?O|NjMqh=OmV?;&CaKQz z7{RKyv3SuIKb$ak$g22wOjm_$>Cjr`qqp~T+qZJ9>>aSqYk|D;f~p!=_ed^pOo3uP z_wqT1!HTT8Lqxv*g;`<7#lm9XL|iDZ>9{1)S~%a-eaD$T{i2U(@e3PHl+RV`Kz8a= z1PU(%$m6|4+Y=IfvMi{aOp1U9f&uS0ae~1<7Z)?y0OT-*{y14eV@WoPc{*B-Blpg1 z4002{C#4e;vh1kWm;+@n9O*wdDxj5U#J_K|s=oHLBisPhB`y>Br7cyek#h`rJ#$0< z0(ZGg>)o$NpnWu60ll5x!O11Q1?h4u8qKTjq%=tzBR_ii?E#i}7#k&*5Tk?>|41K0 zcm*^NG#U`tg_R)rLiqb9=6YsWEb-x2p!sszSY7T8iYcBCx6E%4BkIcQ?LvidkCHza zeq@af9reCmw4;9fEhUL}LI`m(LhM}<4#}C_Y-$&v`lJ?fb=|qwptk)PMkz$A51R7 zLN%w>sb&!$B+}1waOUto35fKpsEuak5UbTt=qg>B+yFo2n|0-vjFeDKRd?807`(1- zObQxAle}86lBoE`+_^Y|c)bTcAn2wv4my(YQ~<0VfLh0@=G9fp?iYF@M9aj5-Yj0l zDE=H~g!BK+s1ID^pJ8(O$RkW4^g5K~5m_l$FITT0#B*V9QR$O84Ev43q|M*3?5b#H zHRY^(&Zw$InuI~^Y^OBn6>5PpM;2UgnYDZ?XU3TLzL31^Te6p<(jUF(bM|o)R{jR% zT3;l*)U9FdSEnQ7kI8tM{6Gb8I671kAmL@f5Ya@x(JJr@;9Y%Q`M53)g0_tf+0$Wy zN{Mt~{}>a>t~4A6M7jQ9vCoaDefRR3)pd$=TdmUCK3|SW(cV`$V{$9?odqqelG$Ch9NH8JF0CPg=iY(#7OyuubFD zBSJxq7J6^&8xYjn{9a2vf&F1><=3R=he%O zcZV7~Ki*96dnmIfw{^_`#bEL8F3vNd4{N6cij7_2H&Y)(T(_)gW7xB4vJcTUcmHK9 zjUjE$7wjBB8Q%q6ht^EbF>M^_c0L)eUWXP#Q$Kg z7Km?EbVhZ5P+8;s#v5Se2P-W8&_0L(6HJDfBWwf6zf)Wf1Q+=TE}n+hyId1iLoMMJ zku$ZZ%;LX1hjuycI(D<27RDG*@&|@7F^Si%_!$?4XQ`Fra|qEhqZ?vZlMc*#KoPtx zmCAPhMeWG`k2ysfeOf?T)RlsRvVO%;%5t{PpNH!%kF(ek+JQZ8g@}5h!zW+qI@vuO zr{fcA0||dm0Ds}FnZOfpBMTo8bXtB*F}8WlBOqdkDz^Aw&OZIC&ZJ>@l>m}Yk@E|P z$S&=qHVdTy@!m5Mau)%lbx`HzPs0_?SyH*h=1v$km74saC9^qoq^TtMWWO>h0PG6E zf1V=22n6$H?L^P&f~Lb=d+h-Z6eroZgQoOEyrNO2W84_{APs3B!RTE2FMRq(h?hZA zT4H|>$``KC?Vs+09ynO%154C15O%$+PqggPs}tBy1p_<1YMHfV&>=cvFa*7$EJdZv z9hBtPZ`dR%;P_)%zJH8j0_8oFbypZG&U78L?|cF5F0ACjvM)K!iGEsv3{7=nckb>t z$ifrC)l;28nuen#L`tz|$TzGL%MD1$7AixlxxbuojoS5+QhnQmP*Srn+2hAF%A%8{ z2BDZk#|JiJFQ*ie3O(SmDC4Ql!5og!QDHTJR8wBy_YL|?TMXH3U`i6gX(-kC_4~nt zoEO?KWVZ(uBOLRC220>K+nj=5v*0k*4{jIXC$QCY)WaICjmm<9tQa%40`*yPjA7)l zxL0JgW1t}WYH9aFVT{&}#KI}1vN0gB%j)W)?e7)CPKf}^8*};Jg(iJGqUebl3>0(N z4p%{|XN+epVtTU$x@wczxwO=1p%4YStY6gtKAdBAN;RBZTQMScqOl3Y|2>6-RwxW~ zf(?H&UF-W5K4YDiea9DOaagbNd$W6bh{DTow&WcOu7+By<)_bdM$cXjF0tyhT|jSF zR3WDIDi2*Zo3T{9HScBK3d0iBqr{s*7~1B;HQNmV z-wB8d;QwYkK+i%Sa=|zt+B22o5S@5ur&P^nC|RYRoXKINOUC%-`+pvKgd`ygwbAA# z&^PSqpv0r<#ewKjQYO+LfQHz|DAzSTw4&+;vvpS$iWK&PEXQaaY|)48Yn(WfO+WWo z@g6Mg6RNvNVe>jSLgn1VHaQ}02}qN} z{z9EQeg6zb)mA5a-}Vl zX3{a1eMm1RRcd5j>$0u*%@@dme=mHUHr&b>^1jb#74$nKpvm2+SapbBv)Wd;xIwq^ z@y4#MZZT1ZrYmMEBs8c3dO_*4g6rhivyye-2~1g&Ei7L+uaSO@qGj<)oF0PDw(MYi z?SXS{%0JSD%Ey$Xk39SWsoZbC|8cp?ny98M^WQQ>IYz2uc?Zzc>;tvcZMNMps|oEgVA)>9TWmDm0ll|{>o=eH;UO2|fli^EXoXsG zqCp0ZZeiNVT=*8KTu+G8Eb&7j_)&JW_J0CB2XdFc`e_Nij926O3u+BPB?$!-&mldm zAqxM&&z9?3HMr3-mkMe+*ZEj#-F^Z@zrU&c*dwsOKzL8piu8CV)L`{nh;A{ZQ$Mp) ztmX|HNLcN)GlEC1!kJdvtpKG+f&i0!VhJcDGsPo1*>+~Sh~e5+XnDrvZ5Y_)@#mlI z4xwe_cGe2{r^x|M5iE-r9z?OlmWa_p8c>8gZ>qbu`ski}djtjhGy(4N->47;H$vj} z^#b4zFGlH2Lp3~5c-NLkd79S6aE$m^^A(XBuf^Ct3o}SDon1w8|Ae`K>pX1{UGw)D z6g>n@M*G+O8t<)K4jtr0^}ry$^6|=#89=cew1mlm+z&`rEV$1)xEmY;Zm*oq_8M=h zI&2|ffc?61t_m0ZAN$2XiDld>QHCz$6|l|p0)mtI0eowb5peixMAOYh;guM+}Bc&5zS@< zG-~>?vc;SsBrI$RiVYI|+a4z$xVQ``|LhoPVXOEZ}hh|cB}m7 zqdmDk&+rDA8gu=kQ8EkF{&<1-Xz5$lh)}+LK+Vjv z$Ktc3M2{sk%>bT{is{thkI)xQs>d177$7*{9;XG`}Z zHVP2b{MzeX8^1@AyO{4i>p24k@i6TROEEC`vSBM|M0Eu$?fPLaK=1tnE-nbB76PUo zP#?%3At48%h%#dX-qcic<8;>l!?!oYkBXetmuyNXyP?Ie6{2qc`57bDV(d+hljRVs z+GDlG_~UCB$YMX+C{?W2hTn41cG!V+%{KQkzZnoAqm{G8$c28T9PN-ZeDFklY1PzT zldkj*bP_h%k0|7D(X*b`wDYBS=K~3uXk=@`Mb3O-U_36Oso=m1Ai#Mc1N zv>T=4pv$XB2VkGTMrg3j7uZ@UDKn|#>YF1B=UxG_mZOHgzy)w47+T12g;fwlb0$8k z>0IHY&9x6*NpI zBKNE0)TDK<{}Ks-DbfL&j4+yV0#@XribnH?{ydLHq&`vs5t zo)+gjQ!r*RtEJrh?2=}OH)<+F%pYb0x75k5=sMHN=eD)YB96o<}$n|PA zmM*5@h(KUee1^)xy4K1`KlP{BH+!FsYN%1TEyOSlCDwvyx@=Iyt3+O5sb3}F>If2K z-URpQ?o1iZQkcU%->0f$yI~>L)hncwB)xH}+;k|iN;TTS`BktW`>aWtW*7G83K6nT?m~jMd1zo z6FS?G4(zXHS3}9H<8s>@jzO#U4UFW!wcg>^@aWl_zI#!T1o12VL?W-Agu3ymLqLX| zzWUXh0K_y7NDLFL--+_tsoDD;fo zWOagJxL^`IL>C>JvNLeakN@uJEFY=vHbDDgBcw_}e!Q?!;*Vcvjuf15r)RQvGpzLlm&N^nWu!J{lY>7iuu$Q#H*Z*#(HN zpAL@`$jJGJIRt!Gz2^Ida*%{Ti7Ae#QjpzI$W05RQ^+vZ8VB}az0Yg{>k4iFQ-Oxs zzb}xTX^d>L)Q)b~&V_kbVBay)1pEQwsaFfqZ5ZYLlNMi51IlMwZoHtz){_xSK{gT) z(u49w@5XjnK_VtVaqOYGwDpuuy5LcfB0U8)5UifiekFQglYWB18 zEq%_9l9=S-q}NFed=>ucUg!Q2{;YrVaM~}gr836|Wqf_!v_BW`VuP z8fX7@mHmwR?ghTkuf+&BG8f~LI{!;YcK$qnz(LM+M{kR|dp9*mttsl_sP>?naql)) z`sen1Th_8cGIj+o=1+>qE9>5eq3JfS!xoDMWq9TFafni1IBGK&pr$;=CAZmdvgC zt>W5WEC{ixAgbWL%i0en$8wa5yBU%3p`Ebg*PH#gWtkRz+K4JO?S^^eR8S(TW_zPF zD6%sfcqj7q^b=5ckfTNgic$fQ$YW`qXK07a@f2@a+$%mGmefq-L{}9OhFYM$r8~}h z9a?Ep2sOV{XfX!qhdtjJP%PuZ!r$7kmvVqc=O66iBYfqivHgSRR1X;lgF~0hKoG zrZGYuHH%vjtPPP9xB^iKrQog!7{UrVL8KXqZ$+AoPcv$kAldH{^+5x)0P~=f) zF07M!j0zq-CAUv&jsjgdzv*VUN?(FZ<~R)iuS5V~Z0>xBR0<$5I!_RBGbIA10r>Fz zCNsN8InUiFo;QxnCt40BH1tE8^yi~m)PrFg_X{>y&I-K!G;0{yWvwj>?PbkRP-WO= z_;b#5b{sAEQhry&)XC1YJWy_vzk$T>@>+YH)9U}v)civBiQ~JA`nOTPNWi6HrXv9i zxGc?v%xP;_^*#O=z3iN$Gj8{OaZXIA2~;@prG6C2q!?@4T*zwS*;W+rGes1o9f8Ss zo&BnkSf?TiD6aRbNCL(=7jcF)7ktd!ij=>mUZMXu0ZP(^*or`VuQ|>oF zBwCg5llK$OoPlJ|2f2( zk7(*%E!Fbwd}pRw4U(}(7)}?QB7|V@D@yt8&mXc0;zpmN`Obg@ol_oAm4K|hlr^k6 zFDI5Yr$ICJn$wZce^(@=Lt0cf$S6mr{A1+l+&XVauU-EmD&HrPmEpOH5@4wP1RTr1 z=lF|gXv^Tz(wNuS96)03G`!X9`3#aJoPOjII~B`t{8i)rLzZfw)%cIv6g1{PUqnPH zdM!f3OeJ6K(qq2bgo-eMd4e{7{r<$~0ai#iLRB;Cx9;aPY)9SCfZBZy>vAk{i%Fgf znAEW`<8oUn_felBLo9>!M!{c;{lLU`*siSkv{Wqvrcb_@E69|`?v>3l=BKEA5<}+w zYD&F4ZH1rWy-EhCUV#jl8qKZaVp_R>2xx_QKMq5hMrdIejuf;m&mry^k^fsZ%e*y1 z&=43pjfeTpTHWo5{9=#N@zW58)lrvlKyl;*N>M}YK14&c0czH-;?n&fu;HLxNGSCU zjZ+4kf~}~7`Q^)-^LYs}P~TWaIWjd#%P=}@fa`KUQZWr>OIJ(%8rVKFV>Qf*8O^d> zmkSSU^VEZR&j7U>O>)o0!2{TtyOdlbNv2X1Kzc^H9S?vg6(q$9Is!6toe_s}?_c1V(A3esd|hA+RFlZ)~A zbK4hE#5cn61Er#T-s-!bW^+u`zl*Z8Yld8Ykx@jGPL6 z~%3|*6twv;|KCYg5y=j`;hm-^uw;%A@*o7{mnj`!>Bn<6iFB1u|0^|TVR zls(M{VVykp)iA3*+?V45k%B9(VUJvg>DRM&AJNF`5VPri__?X#`N6ogUU3(M4Vk`t zofm)j%W)$N>X8;?eokoG!1ILmIxm`)PuC?b-wUq!TH%G=-vL=4aVk&t+lGSc6%TcX zoB#V(255aw9%Ua}O|l_lyX;0yV`a~x!x#=g3&`--rgr|=S20_Y5^+KiWTH?9*p8$p zje7J2$fdn~uay`6;dXzME6&D3yOtzn2RceaDvskw7?IK6>=;Ng5=gM=?E8!onvF`l zKc($O_A&Z7F}r)ni?pUtN{#J17wJV4-bOhxnoR_P_bHNMe%9k3qhSSE_^TDWT(h(O zQU+?=y*xN0-%k$GTrj&nCdSZ&#vs)N-O43vgJze!2%59(ocRUfSThk*7+HeJHU#cq zSCyG1?*9`Pp}`b@$|umfVW!r7i6@+`@Lt_@vo}MV-MZyZng^{3wyggE_s+5Zb5!`Y zN>BeW7-x?F4VK1AYh-Q10FsGhZ3cN3-33806(tm>Z#&}sj0ldCo;{ow{Bb7n(BW>M zSwxwfR(@1rYE1i}HOEpwb+7}_0yVdCZ?B%+;~l{U9JH9^L@hX?PcX7WAex zG%@f+Bx+ph--Vne0ac;`js`LaU4eiNoUZi?m-U?^azifyf&nbwS32ag4l`ZAt703akvNt~VMNCQ$&Tn3-yQasCW zJbUY6iYTA>7Y`|gRF4<6+~S;Qt6FKb4YH6loVRq(I@hwhVW#W1SysLd^dnZ}f-c4l zwyKAkjR6oK&xoAA=l^kZoBO5PT+8xSN?>W^EybLJD$Br~eMsqEsow7V^Y2in=YB@o z2yUX0TVfOkq#lZM_b9`+b%H_l$V_4si<4dh$D0MXnn^d+6?kJAkUuCjpt$fdpjwIORWs-?0#~~ zpWl6rhz6gb5JuqvS?!nxCiRbon0x|VV;09*^ogO-eC{C{pON#KQ!#6NmWl=H1{rQu z@SjuJ-gzAu66!JI)UswPJz--x zbnoTvZ8Yg~!9>1oqJJ?iP>#@+_}{=3d_sU1atXR*?J1GraLI8iz4)$vvmm*UP&ufs zjH3u{npPOe0W(d6NdQ!^BKfSUxuG-z1HjxUOU#5r-;ln@^T+-^3X#(4Fyc2J4Bjc=x&hi0R*I5LTZ2+I;25BKuQEeK)R%) zOFBhq0g312UiWo9&;7)^*8Bbbb}rU}VfMNAKI(t`j>LI@`@Pq;F<97o<+m><{;$3! ztP{{*Sh*0~(GIpCLjk6p8;@sZL!C1=la?aNhSQ8}$o=0RhEan%(wI)*(&6VSKj-SY zl?nlqDNH|BVGYdUEZxG%+AKFn)lIWD2=6z3*HARUzYG+SfI*uxQ}gIk%8`j_rL&4* zhZG%`KbtoaPY-+Nk=mm9+@YoaNXwYCR4jqaR}&FscMB0dk_KQ~q~{ZBh=t=ush)Ca z5>iBW=HK5qxWIvhcLHK^tsOdMAjfW>dqwU#V#V=^B~6w0%hX9k<(%k`AYEdeq)M!W zYK`|N;-2?_!Xe8cudXbS%@h0#3Hm^2r-{x&v>KL_Us-?)q@m*Z;?PqqTkjApn4ghpD zl&hoDq-Yt5{-BU1hmOvWAX~4na^BQ~|8dy}u+0E%U=xRIC(-SjS3dy0WBMC_5X${N z*Ik*oh-cO-`HoV6XT+g2R#<;_) zr3vWI1-uobO(4HHm%nhg42Ts<#c6VckZQn6CCBmMJip#8E|tMNy1D!NTN}CvBxqoY z7m9(~-V27Zn28QyWqtq+etcO9Ftp+EWt$3?u>_sbU~{|_UMPlxJ`iyjBMe*r^&uV} z#uLM+;gW!2%vje_j^N1~z$yI;xK4uS;&+NzPKbP9@Z~S@YP9%2z&}zbR4b_ z%Rll@^!)HczFG7oN3ejh0^*^9N&YyzM44ro^^H7GM%E+!2Pp8b-uT~#1USmYP72yA zV7~4F$w73Rh4SP;-AA0Qe_h{y_`3gE5KjV`Bge^sZv1CI0r%H?aI>zTZrI}|4LjM! zD<`nw4oUw1^qc>WUskZ>#{yiSNpSK~fqLu;K&O*#{-!8m02y@&v;sE#kmBOu-Kh8u zO%kgF7@qLI++qK&*gtg`Mdr@uvn=qX28X1yhl29<>E%Y!#_4RwU0Qy~y9?$Fv)7n5 zpQYUnczW5KY}v{D|4kwN`|bbpp_7U55+H@C9Stnczo>c0yhs9$zPIG;2aB;WAb=T1 zJNuO^RPS37r}fV%{y)B0ALIf1Ciry&5HW50o7P!J`G)}2l!tTk_!B?-o~DmV*e?}`9J;;u+H|XmH?=Q#ZRahk)8#p-?MfA-0K&BZoKs1`6vDd+W>$! zjRT!r4ukU@Sm2hahy79^Adm%O1uB&PzN-KIfk8AJprT?^GAtwk3eC6g&H>yo9l+z^ zVQd3hMsKt`@R59fQ*0UT)&@Z*i_S*Wf_ew7IXVRyizA(z29OzBlwIyHFFbJgUy1>A zuN~&@^f5sFum^xu zWrp;T)Sk=YbJ$@cDV$Nk?MxuYT^SWbWAd=~tE9(l*RnSP*l znit#7w5bYvC@Zw9$2rAU9sOTDZ!h&#pwM6U-kb0l&^f}+J`CvVg8;Oq*D1!EDga;l zEDxyg0C}dMNoCgC%aQ zr4`xOX@*6}nqw0wjhH!3X0cB8&f^1w0nQx&CQ&*iC+FG((w~+z1Y=ANiKP!6*}#x4 z6Y!XxQ2*lL1R#s|UyCAtU|?N>27-ZN;YhyVZynp@-+%ilygAVb|13UT1*9&{0e94B^vV|~BPc8X&sNg^x--j|I++(( zoMq&?zK{-n-t{;J1W(f5d&JU&WghGoz)|HzwRkn5c+qMcvAMbrq>`hhO;Wd$%$Q@p zhXAMV4Ov*|!zrBPi{Ffmh4Q+m4LNq7Y`;&9rev4{YGHBL@6&bxA)4dex^<*Nu10s$ zdVcW5ymH~)Nk+#J)}c~WNkHkwYCXkSGIm1A#LeETGZsBgU+kujjGS^w-Fk+^R|4_LmQ{XI{6c zk#W9TM~zh2m>qs0By3533$*%@#~eSWkm%GtrVzFXjhr@ccx}6Klk>ynhdEV?buZ4C zOhxzaSr+$if(BG+{}93c>zbzvgy*=m4k|LyeAUoe0yv72z>+u|`>OLL+Vop4#k=w| zm|p>b(JdhnR621#FBXk4;a$7W;lkz~(`^vYf6!I}=)m@L8kf>0CEYWhDki|T|1rD#RQ}h>)DaGdg+8+agy%)eJgQ9liNTgt?egYXh1He=s zKiu4aWq6oTWgSK)<+yDr7B3xVa4j($4g~&hmT$`Aw5aNLV+r3S0TAZFAZpcfA?&{! z(XXvxSwZFBfF#}rzbXM;PxGQJRD+SftYmke6^w#1e4+?N?l8qe zUX;TG#903__D+a#bb3Y<{HjjtB#T1d2}Lhrm-c))x$g!j0W#pY%tnm=Dy9~p`5|Ve z=66@wc&?&aSDyFME1WU?Ag*__b5GyUTrt8yPpDAkcuv@Neh$=8*}d*@wFq#u%@XE= zmrlTlWcoiAe2>de;Y6L(P178xXnFw2P%%{co#tM8V!)>GteMTn!45OlR7)$ERa1m4 z^hUhfjj;|!5D^U6rEQDUb%*w?x1@|FjA%UZR^7w=vm#*Obp9PvWQ28 z&aY`BxWjU`t7RD?*e(+gv^BLD;&Kx)Br^&~4zfSD1 zh1dH2eo;nnbN&%lH6&wk$K~yN_nTgDrG358k3j6`%dV(K*=^8=oRMZDqlcHNE+;a^ zXb`abtcokUqv#>Yf(ZN2mYG!d@f$0blP!?a3J;$Q1oUQe3Hna!ducMlFpQMp$Lt)R9l@Nw|oh~P2_wvk@p&{G{W}uTqFL~yWl8lPdMiNj3JMDm)r@V zvd-7dx6iF-sOTp~Mmp}y-pyi#Q+C_n;cjemy0cwo#KW#R4BJ(l^5n^cUo}m2%i8*#van&7-vW{A2U(BpA~xI&?l{mnDO)6Ytg4Xo<)Bj(1V^iD7gp` z;^4&p?&OX(x3{Gz^%|(DI~3`VDp%YCi4P6QO`M!kgX)2~H5oan3Z7sOaGu&_^@|1N z8ns0l)TQ2;T7?8}$jS`Epy`?Q!R0Gr5f

@>Isa8S|34Al8)`o-Enh4~xi6RW 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 z̩TOFz`Gfq0>D^Je$myA5$vbnmyQU! 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

dSg41W1 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
    @&$bu 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%0AO{uPhwftwJDb!ul~IyMzrKH%y*;Ejq*Kvi_!98! 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

    qSN~O!gJ^lj*yt^0|W9bt-A$&c6rv|7d4? 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

    GWr4_;{(*mPx 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 Date: Mon, 23 Sep 2024 22:57:17 +0800 Subject: [PATCH 0170/2029] modify code --- src/class144/Code04_SplitWays.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/class144/Code04_SplitWays.java b/src/class144/Code04_SplitWays.java index 35182686f..11dfa3aa0 100644 --- a/src/class144/Code04_SplitWays.java +++ b/src/class144/Code04_SplitWays.java @@ -16,20 +16,20 @@ public class Code04_SplitWays { // 为了验证 public static int ways1(int[] arr) { int ans = 0; - for (int a = 1, b = arr[0] - 1; a < arr[0]; a++, b--) { - ans += f(arr, 1, a, b); + for (int b = 1, c = arr[0] - 1; b < arr[0]; b++, c--) { + ans += f(arr, 1, b, c); } return ans; } - public static int f(int[] arr, int i, int ip, int dp) { + public static int f(int[] arr, int i, int preb, int prec) { if (i == arr.length) { return 1; } int ans = 0; - for (int a = 1, b = arr[i] - 1; a < arr[i]; a++, b--) { - if (ip <= a && dp >= b) { - ans += f(arr, i + 1, a, b); + for (int b = 1, c = arr[i] - 1; b < arr[i]; b++, c--) { + if (preb <= b && prec >= c) { + ans += f(arr, i + 1, b, c); } } return ans; From e4290e2e3986574eac5be353a483284d9eea8a19 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 23 Sep 2024 22:57:48 +0800 Subject: [PATCH 0171/2029] modify code --- src/class144/Code04_SplitWays.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class144/Code04_SplitWays.java b/src/class144/Code04_SplitWays.java index 11dfa3aa0..3b43bf422 100644 --- a/src/class144/Code04_SplitWays.java +++ b/src/class144/Code04_SplitWays.java @@ -36,7 +36,7 @@ public static int f(int[] arr, int i, int preb, int prec) { } // 正式方法 - // 转化成杨辉三角形 + // 转化成杨辉三角 public static final int MOD = 1000000007; public static int ways2(int[] arr) { From d11b45f199c70af7eb64d5a5fca2e9e4fc5f2d8f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 25 Sep 2024 14:44:24 +0800 Subject: [PATCH 0172/2029] modify code --- src/class145/Code01_Derangement.java | 6 +++++- src/class145/Code02_SetCounting.java | 6 ++++++ src/class145/Code03_NothingFear.java | 13 +++++++++++++ src/class145/Code04_DistributeSpecialties.java | 18 +++++++----------- src/class145/Code05_Game.java | 10 ++++++++++ 5 files changed, 41 insertions(+), 12 deletions(-) diff --git a/src/class145/Code01_Derangement.java b/src/class145/Code01_Derangement.java index 9defbeff0..7a5ec9278 100644 --- a/src/class145/Code01_Derangement.java +++ b/src/class145/Code01_Derangement.java @@ -1,7 +1,11 @@ package class145; -// 错位排列 +// 错排问题 +// 一共n个人,每个人都写了一封信,每个人必须寄出一封信,每个人必须收到一封信 +// 并且不能自己寄给自己,返回一共有多少种寄信的方法 +// 1 <= n <= 20 // 测试链接 : https://www.luogu.com.cn/problem/P1595 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.BufferedReader; import java.io.IOException; diff --git a/src/class145/Code02_SetCounting.java b/src/class145/Code02_SetCounting.java index fa3aed996..d08255c66 100644 --- a/src/class145/Code02_SetCounting.java +++ b/src/class145/Code02_SetCounting.java @@ -1,7 +1,12 @@ package class145; // 集合计数 +// 一共有n个不同的数,能构成2^n个不同集合 +// 在2^n个集合中挑出若干个集合,至少挑一个 +// 希望这若干个集合的交集,正好有k个数 +// 返回挑选集合的方案数,答案对1000000007取余 // 测试链接 : https://www.luogu.com.cn/problem/P10596 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.BufferedReader; import java.io.IOException; @@ -69,6 +74,7 @@ public static long compute() { if (((i - k) & 1) == 0) { ans = (ans + ((c(i, k) * g[i]) % MOD)) % MOD; } else { + // -1 和 (MOD-1) 同余 ans = (ans + (((((long) (MOD - 1) * c(i, k)) % MOD) * g[i]) % MOD)) % MOD; } } diff --git a/src/class145/Code03_NothingFear.java b/src/class145/Code03_NothingFear.java index 74e25d472..80ebe8797 100644 --- a/src/class145/Code03_NothingFear.java +++ b/src/class145/Code03_NothingFear.java @@ -1,7 +1,19 @@ package class145; // 已经没有什么好害怕的了 +// 给定两个长度为n的数组,a[i]表示i糖果的能量,b[i]表示i药片的能量 +// 要求一个糖果要和一个药片配对,你可以决定配对的方式 +// 如果配对之后,糖果能量 > 药片能量,这个配对叫糖果大 +// 如果配对之后,糖果能量 < 药片能量,这个配对叫药片大 +// 配对希望做到,糖果大的数量 = 药片大的数量 + k +// 返回有多少种配对方式,答案对1000000007取余 +// 举例,a = [5, 35, 15, 45],b = [40, 20, 10, 30],k = 2,有4种配对方式 +// (5-40,35-20,15-10,45-30) (5-40,45-20,15-10,35-30) +// (45-40,5-20,15-10,35-30) (45-40,35-20,15-10,5-30) +// 1 <= n <= 2000 +// 0 <= k <= n // 测试链接 : https://www.luogu.com.cn/problem/P4859 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.BufferedReader; import java.io.IOException; @@ -70,6 +82,7 @@ public static long compute() { if ((i - k) % 2 == 0) { ans = (ans + (c[i][k] * ((fac[n - i] * g[n][i]) % MOD))) % MOD; } else { + // -1 和 (MOD-1) 同余 ans = (ans + ((((MOD - 1) * c[i][k]) % MOD) * ((fac[n - i] * g[n][i]) % MOD))) % MOD; } } diff --git a/src/class145/Code04_DistributeSpecialties.java b/src/class145/Code04_DistributeSpecialties.java index bf38b1f06..434cd7822 100644 --- a/src/class145/Code04_DistributeSpecialties.java +++ b/src/class145/Code04_DistributeSpecialties.java @@ -1,7 +1,13 @@ package class145; // 分特产 +// 一共有m种特产,arr[i]表示i种特产有几个 +// 一共有n个同学,每个同学至少要得到一个特产 +// 返回分配特产的方法数 +// 0 <= n、m <= 1000 +// 0 <= arr[i] <= 1000 // 测试链接 : https://www.luogu.com.cn/problem/P5505 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.BufferedReader; import java.io.IOException; @@ -20,29 +26,19 @@ public class Code04_DistributeSpecialties { public static int[] arr = new int[MAXN]; - public static long[] fac = new long[MAXK]; - public static long[][] c = new long[MAXK][MAXK]; public static long[] g = new long[MAXN]; public static int n, k, m; - public static void build() { - fac[0] = 1; - for (int i = 1; i <= k; i++) { - fac[i] = fac[i - 1] * i % MOD; - } + public static long compute() { for (int i = 0; i <= k; i++) { c[i][0] = 1; for (int j = 1; j <= i; j++) { c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % MOD; } } - } - - public static long compute() { - build(); for (int i = 0; i < n; i++) { g[i] = c[n][i]; for (int j = 0; j < m; j++) { diff --git a/src/class145/Code05_Game.java b/src/class145/Code05_Game.java index bd2d9f563..2518251e7 100644 --- a/src/class145/Code05_Game.java +++ b/src/class145/Code05_Game.java @@ -1,7 +1,17 @@ package class145; // 游戏 +// 一共有n个节点,编号1~n,一共有n-1条边连接成一棵树 +// 给定长度为n的数组arr,arr[i]为0表示小A拥有i节点,arr[i]为1表示小B拥有i节点 +// 输入保证n为偶数,并且小A和小B拥有的节点数量都是m,m = n/2 +// 游戏一共进行m回合,每个回合两人都需要选出一个自己拥有、但是之前未被选过的节点 +// 对手节点在自己节点的子树内,该回合自己获胜;自己节点在对手节点的子树内,该回合自己失败;其他为平局 +// 小A和小B选择点的方式完全随机,想知道在第k个回合才分出胜负的话,情况数是多少 +// 两种情况不同当且仅当存在一个小A拥有的点x,在x被小A选择的那个回合,小B所选择的点不同 +// 你需要打印k = 0、1、2...m时的所有答案,答案对 998244353 取余 +// 1 <= n <= 5000 // 测试链接 : https://www.luogu.com.cn/problem/P6478 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.BufferedReader; import java.io.FileReader; From 33d04fba80d84172445c542650efa7c523a329b4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 25 Sep 2024 14:50:36 +0800 Subject: [PATCH 0173/2029] modify code --- src/class145/Code03_NothingFear.java | 3 +-- src/class145/Code05_Game.java | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/class145/Code03_NothingFear.java b/src/class145/Code03_NothingFear.java index 80ebe8797..cbb4b1a58 100644 --- a/src/class145/Code03_NothingFear.java +++ b/src/class145/Code03_NothingFear.java @@ -5,8 +5,7 @@ // 要求一个糖果要和一个药片配对,你可以决定配对的方式 // 如果配对之后,糖果能量 > 药片能量,这个配对叫糖果大 // 如果配对之后,糖果能量 < 药片能量,这个配对叫药片大 -// 配对希望做到,糖果大的数量 = 药片大的数量 + k -// 返回有多少种配对方式,答案对1000000007取余 +// 配对希望做到,糖果大的数量 = 药片大的数量 + k,返回有多少种配对方式,答案对1000000007取余 // 举例,a = [5, 35, 15, 45],b = [40, 20, 10, 30],k = 2,有4种配对方式 // (5-40,35-20,15-10,45-30) (5-40,45-20,15-10,35-30) // (45-40,5-20,15-10,35-30) (45-40,35-20,15-10,5-30) diff --git a/src/class145/Code05_Game.java b/src/class145/Code05_Game.java index 2518251e7..374664c45 100644 --- a/src/class145/Code05_Game.java +++ b/src/class145/Code05_Game.java @@ -5,7 +5,7 @@ // 给定长度为n的数组arr,arr[i]为0表示小A拥有i节点,arr[i]为1表示小B拥有i节点 // 输入保证n为偶数,并且小A和小B拥有的节点数量都是m,m = n/2 // 游戏一共进行m回合,每个回合两人都需要选出一个自己拥有、但是之前未被选过的节点 -// 对手节点在自己节点的子树内,该回合自己获胜;自己节点在对手节点的子树内,该回合自己失败;其他为平局 +// 对手节点在自己节点的子树内,获胜;自己节点在对手节点的子树内,失败;其他为平局,继续游戏 // 小A和小B选择点的方式完全随机,想知道在第k个回合才分出胜负的话,情况数是多少 // 两种情况不同当且仅当存在一个小A拥有的点x,在x被小A选择的那个回合,小B所选择的点不同 // 你需要打印k = 0、1、2...m时的所有答案,答案对 998244353 取余 From 0cdf3873e6a00a8cda8a0b1682f6de5d63951773 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 25 Sep 2024 14:53:04 +0800 Subject: [PATCH 0174/2029] modify code --- ...ributeSpecialties.java => Code03_DistributeSpecialties.java} | 2 +- .../{Code03_NothingFear.java => Code04_NothingFear.java} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename src/class145/{Code04_DistributeSpecialties.java => Code03_DistributeSpecialties.java} (97%) rename src/class145/{Code03_NothingFear.java => Code04_NothingFear.java} (98%) diff --git a/src/class145/Code04_DistributeSpecialties.java b/src/class145/Code03_DistributeSpecialties.java similarity index 97% rename from src/class145/Code04_DistributeSpecialties.java rename to src/class145/Code03_DistributeSpecialties.java index 434cd7822..292af72dc 100644 --- a/src/class145/Code04_DistributeSpecialties.java +++ b/src/class145/Code03_DistributeSpecialties.java @@ -16,7 +16,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code04_DistributeSpecialties { +public class Code03_DistributeSpecialties { public static int MAXN = 1001; diff --git a/src/class145/Code03_NothingFear.java b/src/class145/Code04_NothingFear.java similarity index 98% rename from src/class145/Code03_NothingFear.java rename to src/class145/Code04_NothingFear.java index cbb4b1a58..5c791322d 100644 --- a/src/class145/Code03_NothingFear.java +++ b/src/class145/Code04_NothingFear.java @@ -22,7 +22,7 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class Code03_NothingFear { +public class Code04_NothingFear { public static int MAXN = 2001; From 79737427b10eb43e74dbf9ec8bae3e360afd6f38 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 25 Sep 2024 14:59:21 +0800 Subject: [PATCH 0175/2029] modify code --- src/class145/Code01_Derangement.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class145/Code01_Derangement.java b/src/class145/Code01_Derangement.java index 7a5ec9278..64e84a061 100644 --- a/src/class145/Code01_Derangement.java +++ b/src/class145/Code01_Derangement.java @@ -51,13 +51,13 @@ public static long ways2(int n) { fac *= i; } long ans = fac; - long tmp = 1; + long f = 1; for (int i = 1; i <= n; i++) { - tmp = tmp * i; + f = f * i; if ((i & 1) == 0) { - ans += fac / tmp; + ans += fac / f; } else { - ans -= fac / tmp; + ans -= fac / f; } } return ans; From b35f82b7a6abba785e6473be76b00a3b53faf1d4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 25 Sep 2024 15:03:04 +0800 Subject: [PATCH 0176/2029] modify code --- src/class145/Code01_Derangement.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class145/Code01_Derangement.java b/src/class145/Code01_Derangement.java index 64e84a061..b751229e1 100644 --- a/src/class145/Code01_Derangement.java +++ b/src/class145/Code01_Derangement.java @@ -1,6 +1,6 @@ package class145; -// 错排问题 +// 信封问题 // 一共n个人,每个人都写了一封信,每个人必须寄出一封信,每个人必须收到一封信 // 并且不能自己寄给自己,返回一共有多少种寄信的方法 // 1 <= n <= 20 From c9d56d211e9d1b276b89f5a1c2264152d3adc6a6 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 25 Sep 2024 15:05:46 +0800 Subject: [PATCH 0177/2029] modify code --- src/class145/Code01_Derangement.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class145/Code01_Derangement.java b/src/class145/Code01_Derangement.java index b751229e1..7ce7f9911 100644 --- a/src/class145/Code01_Derangement.java +++ b/src/class145/Code01_Derangement.java @@ -1,6 +1,6 @@ package class145; -// 信封问题 +// 信封问题(错排问题) // 一共n个人,每个人都写了一封信,每个人必须寄出一封信,每个人必须收到一封信 // 并且不能自己寄给自己,返回一共有多少种寄信的方法 // 1 <= n <= 20 From d018cc85facf8e9c5c385c29ec2f9e68d6ce8a16 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 25 Sep 2024 16:24:35 +0800 Subject: [PATCH 0178/2029] modify code --- src/class145/Code02_SetCounting.java | 2 +- src/class145/Code03_DistributeSpecialties.java | 2 +- src/class145/Code04_NothingFear.java | 8 ++++---- src/class145/Code05_Game.java | 5 ++--- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/class145/Code02_SetCounting.java b/src/class145/Code02_SetCounting.java index d08255c66..5f6ad009a 100644 --- a/src/class145/Code02_SetCounting.java +++ b/src/class145/Code02_SetCounting.java @@ -4,7 +4,7 @@ // 一共有n个不同的数,能构成2^n个不同集合 // 在2^n个集合中挑出若干个集合,至少挑一个 // 希望这若干个集合的交集,正好有k个数 -// 返回挑选集合的方案数,答案对1000000007取余 +// 返回挑选集合的方案数,答案对 1000000007 取余 // 测试链接 : https://www.luogu.com.cn/problem/P10596 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class145/Code03_DistributeSpecialties.java b/src/class145/Code03_DistributeSpecialties.java index 292af72dc..43c5910ed 100644 --- a/src/class145/Code03_DistributeSpecialties.java +++ b/src/class145/Code03_DistributeSpecialties.java @@ -3,7 +3,7 @@ // 分特产 // 一共有m种特产,arr[i]表示i种特产有几个 // 一共有n个同学,每个同学至少要得到一个特产 -// 返回分配特产的方法数 +// 返回分配特产的方法数,答案对 1000000007 取余 // 0 <= n、m <= 1000 // 0 <= arr[i] <= 1000 // 测试链接 : https://www.luogu.com.cn/problem/P5505 diff --git a/src/class145/Code04_NothingFear.java b/src/class145/Code04_NothingFear.java index 5c791322d..567a74bd5 100644 --- a/src/class145/Code04_NothingFear.java +++ b/src/class145/Code04_NothingFear.java @@ -3,10 +3,10 @@ // 已经没有什么好害怕的了 // 给定两个长度为n的数组,a[i]表示i糖果的能量,b[i]表示i药片的能量 // 要求一个糖果要和一个药片配对,你可以决定配对的方式 -// 如果配对之后,糖果能量 > 药片能量,这个配对叫糖果大 -// 如果配对之后,糖果能量 < 药片能量,这个配对叫药片大 -// 配对希望做到,糖果大的数量 = 药片大的数量 + k,返回有多少种配对方式,答案对1000000007取余 -// 举例,a = [5, 35, 15, 45],b = [40, 20, 10, 30],k = 2,有4种配对方式 +// 如果配对之后,糖果能量 > 药片能量,这个配对,叫糖果大的配对 +// 如果配对之后,糖果能量 < 药片能量,这个配对,叫药片大的配对 +// 希望做到,糖果大的配对数 = 药片大的配对数 + k,返回配对方法数,答案对 1000000009 取余 +// 举例,a = [5, 35, 15, 45],b = [40, 20, 10, 30],k = 2,有4种配对方法 // (5-40,35-20,15-10,45-30) (5-40,45-20,15-10,35-30) // (45-40,5-20,15-10,35-30) (45-40,35-20,15-10,5-30) // 1 <= n <= 2000 diff --git a/src/class145/Code05_Game.java b/src/class145/Code05_Game.java index 374664c45..b821d5333 100644 --- a/src/class145/Code05_Game.java +++ b/src/class145/Code05_Game.java @@ -6,9 +6,8 @@ // 输入保证n为偶数,并且小A和小B拥有的节点数量都是m,m = n/2 // 游戏一共进行m回合,每个回合两人都需要选出一个自己拥有、但是之前未被选过的节点 // 对手节点在自己节点的子树内,获胜;自己节点在对手节点的子树内,失败;其他为平局,继续游戏 -// 小A和小B选择点的方式完全随机,想知道在第k个回合才分出胜负的话,情况数是多少 -// 两种情况不同当且仅当存在一个小A拥有的点x,在x被小A选择的那个回合,小B所选择的点不同 -// 你需要打印k = 0、1、2...m时的所有答案,答案对 998244353 取余 +// 想知道有多少种不同的选择方法,能在第k个回合恰好分出胜负 +// 需要打印k = 0、1、2...m时的所有答案,答案对 998244353 取余 // 1 <= n <= 5000 // 测试链接 : https://www.luogu.com.cn/problem/P6478 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 From 0c364b6cbf6cd7b4ce6bd75c989e7a7dbc21193b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 26 Sep 2024 12:09:26 +0800 Subject: [PATCH 0179/2029] modify code --- src/class145/Code02_SetCounting.java | 4 ++-- src/class145/Code03_DistributeSpecialties.java | 3 ++- src/class145/Code04_NothingFear.java | 6 +++--- src/class145/Code05_Game.java | 7 ++++--- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/class145/Code02_SetCounting.java b/src/class145/Code02_SetCounting.java index 5f6ad009a..ae273b9a4 100644 --- a/src/class145/Code02_SetCounting.java +++ b/src/class145/Code02_SetCounting.java @@ -72,10 +72,10 @@ public static long compute() { long ans = 0; for (int i = k; i <= n; i++) { if (((i - k) & 1) == 0) { - ans = (ans + ((c(i, k) * g[i]) % MOD)) % MOD; + ans = (ans + c(i, k) * g[i] % MOD) % MOD; } else { // -1 和 (MOD-1) 同余 - ans = (ans + (((((long) (MOD - 1) * c(i, k)) % MOD) * g[i]) % MOD)) % MOD; + ans = (ans + c(i, k) * g[i] % MOD * (MOD - 1) % MOD) % MOD; } } return ans; diff --git a/src/class145/Code03_DistributeSpecialties.java b/src/class145/Code03_DistributeSpecialties.java index 43c5910ed..a7f832a1b 100644 --- a/src/class145/Code03_DistributeSpecialties.java +++ b/src/class145/Code03_DistributeSpecialties.java @@ -50,7 +50,8 @@ public static long compute() { if ((i & 1) == 0) { ans = (ans + g[i]) % MOD; } else { - ans = (ans - g[i] + MOD) % MOD; + // -1 和 (MOD-1) 同余 + ans = (ans + g[i] * (MOD - 1) % MOD) % MOD; } } return ans; diff --git a/src/class145/Code04_NothingFear.java b/src/class145/Code04_NothingFear.java index 567a74bd5..ca61d59a9 100644 --- a/src/class145/Code04_NothingFear.java +++ b/src/class145/Code04_NothingFear.java @@ -78,11 +78,11 @@ public static long compute() { } long ans = 0; for (int i = k; i <= n; i++) { - if ((i - k) % 2 == 0) { - ans = (ans + (c[i][k] * ((fac[n - i] * g[n][i]) % MOD))) % MOD; + if (((i - k) & 1) == 0) { + ans = (ans + c[i][k] * fac[n - i] % MOD * g[n][i] % MOD) % MOD; } else { // -1 和 (MOD-1) 同余 - ans = (ans + ((((MOD - 1) * c[i][k]) % MOD) * ((fac[n - i] * g[n][i]) % MOD))) % MOD; + ans = (ans + c[i][k] * fac[n - i] % MOD * g[n][i] % MOD * (MOD - 1) % MOD) % MOD; } } return ans; diff --git a/src/class145/Code05_Game.java b/src/class145/Code05_Game.java index b821d5333..04ad8daa0 100644 --- a/src/class145/Code05_Game.java +++ b/src/class145/Code05_Game.java @@ -184,10 +184,11 @@ public static void compute() { } for (int i = 0; i <= m; i++) { for (int j = i; j <= m; j++) { - if ((j - i) % 2 == 1) { - f[i] = (f[i] - c[j][i] * g[j] % MOD + MOD) % MOD; - } else { + if (((j - i) & 1) == 0) { f[i] = (f[i] + c[j][i] * g[j] % MOD) % MOD; + } else { + // -1 和 (MOD-1) 同余 + f[i] = (f[i] + c[j][i] * g[j] % MOD * (MOD - 1) % MOD) % MOD; } } } From e1a7f51277b786601c308e7ba207dda80d356cf5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 26 Sep 2024 12:14:49 +0800 Subject: [PATCH 0180/2029] modify code --- src/class145/Code02_SetCounting.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/class145/Code02_SetCounting.java b/src/class145/Code02_SetCounting.java index ae273b9a4..045ab4b74 100644 --- a/src/class145/Code02_SetCounting.java +++ b/src/class145/Code02_SetCounting.java @@ -30,8 +30,6 @@ public class Code02_SetCounting { public static int n, k; public static void build() { - // 一般情况下,不用计算0!的余数表和逆元表 - // 但是这道题需要,所以单独设置一下 fac[0] = inv[0] = 1; fac[1] = 1; for (int i = 2; i <= n; i++) { From c84dc4fc882ee6264982b35cda301cce71d485ff Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 26 Sep 2024 12:26:36 +0800 Subject: [PATCH 0181/2029] modify code --- src/class145/Code01_Derangement.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/class145/Code01_Derangement.java b/src/class145/Code01_Derangement.java index 7ce7f9911..ea7f00281 100644 --- a/src/class145/Code01_Derangement.java +++ b/src/class145/Code01_Derangement.java @@ -1,8 +1,9 @@ package class145; // 信封问题(错排问题) -// 一共n个人,每个人都写了一封信,每个人必须寄出一封信,每个人必须收到一封信 -// 并且不能自己寄给自己,返回一共有多少种寄信的方法 +// 一共n个人,每个人都写了一封信 +// 每个人必须寄出一封信,每个人必须收到一封信,并且不能自己寄给自己 +// 返回一共有多少种寄信的方法 // 1 <= n <= 20 // 测试链接 : https://www.luogu.com.cn/problem/P1595 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 From 8b5daddd1f666ab03cfae16bd9595958b15f5ed7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 26 Sep 2024 16:45:52 +0800 Subject: [PATCH 0182/2029] modify code --- src/class145/Code01_Derangement.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/class145/Code01_Derangement.java b/src/class145/Code01_Derangement.java index ea7f00281..fa24182b4 100644 --- a/src/class145/Code01_Derangement.java +++ b/src/class145/Code01_Derangement.java @@ -30,7 +30,7 @@ public static void main(String[] args) throws IOException { br.close(); } - // 普通分析的方法 + // 普通动态规划的方法 public static long ways1(int n) { long[] dp = new long[n + 1]; for (int i = 1; i <= n; i++) { @@ -56,9 +56,9 @@ public static long ways2(int n) { for (int i = 1; i <= n; i++) { f = f * i; if ((i & 1) == 0) { - ans += fac / f; + ans += 1 * (fac / f); } else { - ans -= fac / f; + ans += -1 * (fac / f); } } return ans; From e5517504dd414f6ce644d4344c5e5749e5367604 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 26 Sep 2024 17:54:37 +0800 Subject: [PATCH 0183/2029] modify code --- src/class145/Code01_Derangement.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/class145/Code01_Derangement.java b/src/class145/Code01_Derangement.java index fa24182b4..2215daf51 100644 --- a/src/class145/Code01_Derangement.java +++ b/src/class145/Code01_Derangement.java @@ -47,18 +47,20 @@ public static long ways1(int n) { // 二项式反演的方法 public static long ways2(int n) { - long fac = 1; + long facn = 1; // n! for (int i = 1; i <= n; i++) { - fac *= i; + facn *= i; } - long ans = fac; - long f = 1; + long ans = facn; // i = 0时的项 + long faci = 1; // i! for (int i = 1; i <= n; i++) { - f = f * i; + // i = 1...n + // (-1)的i次方 * (n! / i!) + faci = faci * i; if ((i & 1) == 0) { - ans += 1 * (fac / f); + ans += facn / faci; } else { - ans += -1 * (fac / f); + ans -= facn / faci; } } return ans; From 6bb4cdf753dacc86c30ce97295004e6f8a044116 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 26 Sep 2024 21:46:42 +0800 Subject: [PATCH 0184/2029] modify code --- src/class145/Code02_SetCounting.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/class145/Code02_SetCounting.java b/src/class145/Code02_SetCounting.java index 045ab4b74..c53e91c5e 100644 --- a/src/class145/Code02_SetCounting.java +++ b/src/class145/Code02_SetCounting.java @@ -61,6 +61,7 @@ public static long compute() { build(); long tmp = 2; for (int i = n; i >= k; i--) { + // -1 和 (MOD-1) 同余 g[i] = (tmp + MOD - 1) % MOD; tmp = (tmp * tmp) % MOD; } From 2499dbc19b07c99c0b5b51683009bd628f80ed79 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 26 Sep 2024 22:10:07 +0800 Subject: [PATCH 0185/2029] modify code --- src/class145/Code02_SetCounting.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/class145/Code02_SetCounting.java b/src/class145/Code02_SetCounting.java index c53e91c5e..aace1cb14 100644 --- a/src/class145/Code02_SetCounting.java +++ b/src/class145/Code02_SetCounting.java @@ -62,11 +62,8 @@ public static long compute() { long tmp = 2; for (int i = n; i >= k; i--) { // -1 和 (MOD-1) 同余 - g[i] = (tmp + MOD - 1) % MOD; - tmp = (tmp * tmp) % MOD; - } - for (int i = n; i >= k; i--) { - g[i] = (c(n, i) * g[i]) % MOD; + g[i] = c(n, i) * (tmp + MOD - 1) % MOD; + tmp = tmp * tmp % MOD; } long ans = 0; for (int i = k; i <= n; i++) { From 7259d808d3997532ea8ffa84388c3cd59b48db4f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 26 Sep 2024 22:29:28 +0800 Subject: [PATCH 0186/2029] modify code --- src/class145/Code02_SetCounting.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class145/Code02_SetCounting.java b/src/class145/Code02_SetCounting.java index aace1cb14..6e576fb61 100644 --- a/src/class145/Code02_SetCounting.java +++ b/src/class145/Code02_SetCounting.java @@ -62,7 +62,7 @@ public static long compute() { long tmp = 2; for (int i = n; i >= k; i--) { // -1 和 (MOD-1) 同余 - g[i] = c(n, i) * (tmp + MOD - 1) % MOD; + g[i] = (tmp + MOD - 1) * c(n, i) % MOD; tmp = tmp * tmp % MOD; } long ans = 0; From 218462014f3638a9c5d0e13e537545a49971d96d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 27 Sep 2024 00:32:06 +0800 Subject: [PATCH 0187/2029] modify code --- ..._SplitWays.java => Code04_SplitWays1.java} | 5 +- src/class144/Code04_SplitWays2.java | 59 +++++++++++++++++++ 2 files changed, 62 insertions(+), 2 deletions(-) rename src/class144/{Code04_SplitWays.java => Code04_SplitWays1.java} (95%) create mode 100644 src/class144/Code04_SplitWays2.java diff --git a/src/class144/Code04_SplitWays.java b/src/class144/Code04_SplitWays1.java similarity index 95% rename from src/class144/Code04_SplitWays.java rename to src/class144/Code04_SplitWays1.java index 3b43bf422..32e57f25a 100644 --- a/src/class144/Code04_SplitWays.java +++ b/src/class144/Code04_SplitWays1.java @@ -9,8 +9,9 @@ // 1 <= n <= 10^7 // 1 <= A[i] <= 10^7 // 最终结果可能很大,对1000000007取余 -// 来自真实大厂笔试题,对数器验证 -public class Code04_SplitWays { +// 来自真实大厂笔试题,该实现为对数器版本 +// 有同学找到了测试链接,就是Code04_SplitWays2文件 +public class Code04_SplitWays1 { // 暴力方法 // 为了验证 diff --git a/src/class144/Code04_SplitWays2.java b/src/class144/Code04_SplitWays2.java new file mode 100644 index 000000000..7663e3047 --- /dev/null +++ b/src/class144/Code04_SplitWays2.java @@ -0,0 +1,59 @@ +package class144; + +// 分割的方法数 +// 有同学找到了测试链接,题意几乎一样,而且数据量小很多 +// 唯一的区别是: +// 课上讲的题意,单独的3可以分裂成(1, 2)、(2, 1),一共两种方式 +// 测试链接题意,单独的3可以分裂成(0, 3)、(1, 2)、(2, 1)、(3, 0),一共四种方式 +// 也就是对单独的v来说,课上讲的题意,分裂方式为v-1。测试链接题意,分裂方式为v+1 +// 别的没有任何区别!实现代码中唯一有注释的那行,是仅有的改动 +// 测试链接 : https://leetcode.cn/problems/find-the-count-of-monotonic-pairs-ii/ +public class Code04_SplitWays2 { + + public static final int MOD = 1000000007; + + public static int countOfPairs(int[] arr) { + int n = arr.length; + // 原始题意,k = arr[0] - 1,这里改成,k = arr[0] + 1 + // 其他代码毫无区别 + int k = arr[0] + 1; + for (int i = 1; i < n && k > 0; i++) { + if (arr[i - 1] > arr[i]) { + k -= arr[i - 1] - arr[i]; + } + } + if (k <= 0) { + return 0; + } + return c(k + n - 1, n); + } + + public static int c(int n, int k) { + long fac = 1; + long inv1 = 1; + long inv2 = 1; + for (int i = 1; i <= n; i++) { + fac = (fac * i) % MOD; + if (i == k) { + inv1 = power(fac, MOD - 2); + } + if (i == n - k) { + inv2 = power(fac, MOD - 2); + } + } + return (int) ((((fac * inv1) % MOD) * inv2) % MOD); + } + + public static long power(long x, long p) { + long ans = 1; + while (p > 0) { + if ((p & 1) == 1) { + ans = (ans * x) % MOD; + } + x = (x * x) % MOD; + p >>= 1; + } + return ans; + } + +} From f2ed893c89dce013e7db99b7d8e089a6e02d2680 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 27 Sep 2024 00:34:36 +0800 Subject: [PATCH 0188/2029] modify code --- src/class144/Code04_SplitWays2.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class144/Code04_SplitWays2.java b/src/class144/Code04_SplitWays2.java index 7663e3047..4258061bf 100644 --- a/src/class144/Code04_SplitWays2.java +++ b/src/class144/Code04_SplitWays2.java @@ -5,8 +5,8 @@ // 唯一的区别是: // 课上讲的题意,单独的3可以分裂成(1, 2)、(2, 1),一共两种方式 // 测试链接题意,单独的3可以分裂成(0, 3)、(1, 2)、(2, 1)、(3, 0),一共四种方式 -// 也就是对单独的v来说,课上讲的题意,分裂方式为v-1。测试链接题意,分裂方式为v+1 -// 别的没有任何区别!实现代码中唯一有注释的那行,是仅有的改动 +// 也就是对单独的v来说,课上讲的题意,分裂方式为v-1种。测试链接题意,分裂方式为v+1种 +// 别的没有任何区别,实现代码中唯一有注释的那行,是仅有的改动 // 测试链接 : https://leetcode.cn/problems/find-the-count-of-monotonic-pairs-ii/ public class Code04_SplitWays2 { From 94330a5e243cbd1539e2d6331aa003172ea3479d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 27 Sep 2024 14:38:54 +0800 Subject: [PATCH 0189/2029] modify code --- src/class145/Code02_SetCounting.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/class145/Code02_SetCounting.java b/src/class145/Code02_SetCounting.java index 6e576fb61..e9a5ca5e3 100644 --- a/src/class145/Code02_SetCounting.java +++ b/src/class145/Code02_SetCounting.java @@ -61,10 +61,13 @@ public static long compute() { build(); long tmp = 2; for (int i = n; i >= k; i--) { - // -1 和 (MOD-1) 同余 - g[i] = (tmp + MOD - 1) * c(n, i) % MOD; + g[i] = tmp; tmp = tmp * tmp % MOD; } + for (int i = k; i <= n; i++) { + // -1 和 (MOD-1) 同余 + g[i] = (g[i] + MOD - 1) * c(n, i) % MOD; + } long ans = 0; for (int i = k; i <= n; i++) { if (((i - k) & 1) == 0) { From 758ad016a0c5f2279cd8843b59a71e86fae41d27 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 27 Sep 2024 14:41:19 +0800 Subject: [PATCH 0190/2029] modify code --- src/class145/Code02_SetCounting.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class145/Code02_SetCounting.java b/src/class145/Code02_SetCounting.java index e9a5ca5e3..811018b80 100644 --- a/src/class145/Code02_SetCounting.java +++ b/src/class145/Code02_SetCounting.java @@ -60,11 +60,11 @@ public static long c(int n, int k) { public static long compute() { build(); long tmp = 2; - for (int i = n; i >= k; i--) { + for (int i = n; i >= 0; i--) { g[i] = tmp; tmp = tmp * tmp % MOD; } - for (int i = k; i <= n; i++) { + for (int i = 0; i <= n; i++) { // -1 和 (MOD-1) 同余 g[i] = (g[i] + MOD - 1) * c(n, i) % MOD; } From 1a2bc2e4412501b62c821f8667b6b6648c14fa71 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 27 Sep 2024 16:02:17 +0800 Subject: [PATCH 0191/2029] modify code --- src/class145/Code02_SetCounting.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/class145/Code02_SetCounting.java b/src/class145/Code02_SetCounting.java index 811018b80..877a95ed6 100644 --- a/src/class145/Code02_SetCounting.java +++ b/src/class145/Code02_SetCounting.java @@ -5,6 +5,8 @@ // 在2^n个集合中挑出若干个集合,至少挑一个 // 希望这若干个集合的交集,正好有k个数 // 返回挑选集合的方案数,答案对 1000000007 取余 +// 1 <= n <= 10^6 +// 0 <= k <= n // 测试链接 : https://www.luogu.com.cn/problem/P10596 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 From b5f34b640dfd2a6ee2038f027264d14f1f55ef12 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 27 Sep 2024 17:05:31 +0800 Subject: [PATCH 0192/2029] modify code --- src/class145/Code03_DistributeSpecialties.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/class145/Code03_DistributeSpecialties.java b/src/class145/Code03_DistributeSpecialties.java index a7f832a1b..65a836332 100644 --- a/src/class145/Code03_DistributeSpecialties.java +++ b/src/class145/Code03_DistributeSpecialties.java @@ -39,6 +39,7 @@ public static long compute() { c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % MOD; } } + // 不需要计算g[n],因为从含义上来说,不可能 for (int i = 0; i < n; i++) { g[i] = c[n][i]; for (int j = 0; j < m; j++) { @@ -46,6 +47,7 @@ public static long compute() { } } long ans = 0; + // 不需要包含g[n],因为无意义 for (int i = 0; i < n; i++) { if ((i & 1) == 0) { ans = (ans + g[i]) % MOD; From d5828cfbdbb426b0f46250b0ed9f8f38c47bd4e3 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 27 Sep 2024 17:26:00 +0800 Subject: [PATCH 0193/2029] modify code --- src/class145/Code03_DistributeSpecialties.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/class145/Code03_DistributeSpecialties.java b/src/class145/Code03_DistributeSpecialties.java index 65a836332..d7240ad9c 100644 --- a/src/class145/Code03_DistributeSpecialties.java +++ b/src/class145/Code03_DistributeSpecialties.java @@ -39,16 +39,15 @@ public static long compute() { c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % MOD; } } - // 不需要计算g[n],因为从含义上来说,不可能 for (int i = 0; i < n; i++) { g[i] = c[n][i]; for (int j = 0; j < m; j++) { g[i] = (int) ((g[i] * c[arr[j] + n - i - 1][n - i - 1]) % MOD); } } + g[n] = 0; long ans = 0; - // 不需要包含g[n],因为无意义 - for (int i = 0; i < n; i++) { + for (int i = 0; i <= n; i++) { if ((i & 1) == 0) { ans = (ans + g[i]) % MOD; } else { From f6c2d637ab182ffb0387d690e35230ce0a3a6c8d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 27 Sep 2024 18:27:34 +0800 Subject: [PATCH 0194/2029] modify code --- src/class145/Code03_DistributeSpecialties.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class145/Code03_DistributeSpecialties.java b/src/class145/Code03_DistributeSpecialties.java index d7240ad9c..d183dc169 100644 --- a/src/class145/Code03_DistributeSpecialties.java +++ b/src/class145/Code03_DistributeSpecialties.java @@ -41,7 +41,7 @@ public static long compute() { } for (int i = 0; i < n; i++) { g[i] = c[n][i]; - for (int j = 0; j < m; j++) { + for (int j = 1; j <= m; j++) { g[i] = (int) ((g[i] * c[arr[j] + n - i - 1][n - i - 1]) % MOD); } } @@ -67,7 +67,7 @@ public static void main(String[] args) throws IOException { k = n * 2; in.nextToken(); m = (int) in.nval; - for (int i = 0; i < m; i++) { + for (int i = 1; i <= m; i++) { in.nextToken(); arr[i] = (int) in.nval; } From 224bdbf1c181e0f311bd7c999870657469345af4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 27 Sep 2024 22:37:51 +0800 Subject: [PATCH 0195/2029] modify code --- src/class145/Code04_NothingFear.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class145/Code04_NothingFear.java b/src/class145/Code04_NothingFear.java index ca61d59a9..bf0f93c2d 100644 --- a/src/class145/Code04_NothingFear.java +++ b/src/class145/Code04_NothingFear.java @@ -73,7 +73,7 @@ public static long compute() { for (int i = 1; i <= n; i++) { g[i][0] = g[i - 1][0]; for (int j = 1; j <= i; j++) { - g[i][j] = (g[i - 1][j] + g[i - 1][j - 1] * Math.max(0, near[i] - j + 1) % MOD) % MOD; + g[i][j] = (g[i - 1][j] + g[i - 1][j - 1] * (near[i] - j + 1) % MOD) % MOD; } } long ans = 0; From 3561a0327877d37e2625cd3fe6c1875835a0b25c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 27 Sep 2024 22:39:56 +0800 Subject: [PATCH 0196/2029] modify code --- src/class145/Code04_NothingFear.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/class145/Code04_NothingFear.java b/src/class145/Code04_NothingFear.java index bf0f93c2d..a518a2655 100644 --- a/src/class145/Code04_NothingFear.java +++ b/src/class145/Code04_NothingFear.java @@ -28,7 +28,7 @@ public class Code04_NothingFear { public static int MOD = 1000000009; - public static int n, k; + public static int n, k, t; public static int[] a = new int[MAXN]; @@ -59,7 +59,7 @@ public static long compute() { if ((n + k) % 2 != 0) { return 0; } - k = (n + k) / 2; + t = (n + k) / 2; build(); Arrays.sort(a, 1, n + 1); Arrays.sort(b, 1, n + 1); @@ -77,12 +77,12 @@ public static long compute() { } } long ans = 0; - for (int i = k; i <= n; i++) { - if (((i - k) & 1) == 0) { - ans = (ans + c[i][k] * fac[n - i] % MOD * g[n][i] % MOD) % MOD; + for (int i = t; i <= n; i++) { + if (((i - t) & 1) == 0) { + ans = (ans + c[i][t] * fac[n - i] % MOD * g[n][i] % MOD) % MOD; } else { // -1 和 (MOD-1) 同余 - ans = (ans + c[i][k] * fac[n - i] % MOD * g[n][i] % MOD * (MOD - 1) % MOD) % MOD; + ans = (ans + c[i][t] * fac[n - i] % MOD * g[n][i] % MOD * (MOD - 1) % MOD) % MOD; } } return ans; From be5320b567703deba852359c2de7a53d82688b37 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 27 Sep 2024 22:58:44 +0800 Subject: [PATCH 0197/2029] modify code --- src/class145/Code04_NothingFear.java | 34 ++++++++++++++++------------ 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/src/class145/Code04_NothingFear.java b/src/class145/Code04_NothingFear.java index a518a2655..ece56b185 100644 --- a/src/class145/Code04_NothingFear.java +++ b/src/class145/Code04_NothingFear.java @@ -28,7 +28,7 @@ public class Code04_NothingFear { public static int MOD = 1000000009; - public static int n, k, t; + public static int n, k; public static int[] a = new int[MAXN]; @@ -40,7 +40,9 @@ public class Code04_NothingFear { public static long[] near = new long[MAXN]; - public static long[][] g = new long[MAXN][MAXN]; + public static long[][] dp = new long[MAXN][MAXN]; + + public static long[] g = new long[MAXN]; public static void build() { fac[0] = 1; @@ -56,10 +58,6 @@ public static void build() { } public static long compute() { - if ((n + k) % 2 != 0) { - return 0; - } - t = (n + k) / 2; build(); Arrays.sort(a, 1, n + 1); Arrays.sort(b, 1, n + 1); @@ -69,20 +67,23 @@ public static long compute() { } near[i] = find; } - g[0][0] = 1; + dp[0][0] = 1; for (int i = 1; i <= n; i++) { - g[i][0] = g[i - 1][0]; + dp[i][0] = dp[i - 1][0]; for (int j = 1; j <= i; j++) { - g[i][j] = (g[i - 1][j] + g[i - 1][j - 1] * (near[i] - j + 1) % MOD) % MOD; + dp[i][j] = (dp[i - 1][j] + dp[i - 1][j - 1] * (near[i] - j + 1) % MOD) % MOD; } } + for (int i = 0; i <= n; i++) { + g[i] = fac[n - i] * dp[n][i] % MOD; + } long ans = 0; - for (int i = t; i <= n; i++) { - if (((i - t) & 1) == 0) { - ans = (ans + c[i][t] * fac[n - i] % MOD * g[n][i] % MOD) % MOD; + for (int i = k; i <= n; i++) { + if (((i - k) & 1) == 0) { + ans = (ans + c[i][k] * g[i] % MOD) % MOD; } else { // -1 和 (MOD-1) 同余 - ans = (ans + c[i][t] * fac[n - i] % MOD * g[n][i] % MOD * (MOD - 1) % MOD) % MOD; + ans = (ans + c[i][k] * g[i] % MOD * (MOD - 1) % MOD) % MOD; } } return ans; @@ -104,7 +105,12 @@ public static void main(String[] args) throws IOException { in.nextToken(); b[i] = (int) in.nval; } - out.println(compute()); + if ((n + k) % 2 != 0) { + out.println(0); + } else { + k = (n + k) / 2; + out.println(compute()); + } out.flush(); out.close(); br.close(); From 1755d8291e6bc9199cdfe69970db9707d75edacb Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 27 Sep 2024 23:06:40 +0800 Subject: [PATCH 0198/2029] modify code --- src/class145/Code04_NothingFear.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/class145/Code04_NothingFear.java b/src/class145/Code04_NothingFear.java index ece56b185..280bdb292 100644 --- a/src/class145/Code04_NothingFear.java +++ b/src/class145/Code04_NothingFear.java @@ -38,7 +38,7 @@ public class Code04_NothingFear { public static long[][] c = new long[MAXN][MAXN]; - public static long[] near = new long[MAXN]; + public static long[] small = new long[MAXN]; public static long[][] dp = new long[MAXN][MAXN]; @@ -61,17 +61,17 @@ public static long compute() { build(); Arrays.sort(a, 1, n + 1); Arrays.sort(b, 1, n + 1); - for (int i = 1, find = 0; i <= n; i++) { - while (find + 1 <= n && b[find + 1] < a[i]) { - find++; + for (int i = 1, cnt = 0; i <= n; i++) { + while (cnt + 1 <= n && b[cnt + 1] < a[i]) { + cnt++; } - near[i] = find; + small[i] = cnt; } dp[0][0] = 1; for (int i = 1; i <= n; i++) { dp[i][0] = dp[i - 1][0]; for (int j = 1; j <= i; j++) { - dp[i][j] = (dp[i - 1][j] + dp[i - 1][j - 1] * (near[i] - j + 1) % MOD) % MOD; + dp[i][j] = (dp[i - 1][j] + dp[i - 1][j - 1] * (small[i] - j + 1) % MOD) % MOD; } } for (int i = 0; i <= n; i++) { From 38a1361034c1a5a5661907f0a855493587e11796 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 28 Sep 2024 13:50:05 +0800 Subject: [PATCH 0199/2029] modify code --- src/class145/Code04_NothingFear.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/class145/Code04_NothingFear.java b/src/class145/Code04_NothingFear.java index 280bdb292..ccd983339 100644 --- a/src/class145/Code04_NothingFear.java +++ b/src/class145/Code04_NothingFear.java @@ -1,14 +1,15 @@ package class145; // 已经没有什么好害怕的了 -// 给定两个长度为n的数组,a[i]表示i糖果的能量,b[i]表示i药片的能量 -// 要求一个糖果要和一个药片配对,你可以决定配对的方式 -// 如果配对之后,糖果能量 > 药片能量,这个配对,叫糖果大的配对 -// 如果配对之后,糖果能量 < 药片能量,这个配对,叫药片大的配对 -// 希望做到,糖果大的配对数 = 药片大的配对数 + k,返回配对方法数,答案对 1000000009 取余 -// 举例,a = [5, 35, 15, 45],b = [40, 20, 10, 30],k = 2,有4种配对方法 -// (5-40,35-20,15-10,45-30) (5-40,45-20,15-10,35-30) -// (45-40,5-20,15-10,35-30) (45-40,35-20,15-10,5-30) +// 给定两个长度为n的数组,a[i]表示第i个糖果的能量,b[i]表示第i个药片的能量 +// 所有能量数值都不相同,每一个糖果要选一个药片进行配对 +// 如果配对之后,糖果能量 > 药片能量,这个配对叫糖果大的配对 +// 如果配对之后,糖果能量 < 药片能量,这个配对叫药片大的配对 +// 希望做到,糖果大的配对数 = 药片大的配对数 + k +// 返回配对方法数,答案对 1000000009 取余 +// 举例,a = [5, 35, 15, 45],b = [40, 20, 10, 30],k = 2,返回4,因为有4种配对方法 +// (5-40,35-20,15-10,45-30)、(5-40,35-30,15-10,45-20) +// (5-20,35-30,15-10,45-40)、(5-30,35-20,15-10,45-40) // 1 <= n <= 2000 // 0 <= k <= n // 测试链接 : https://www.luogu.com.cn/problem/P4859 From d0a361da140e40761cabeab2e9b3dc82cb8fabb4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 28 Sep 2024 13:53:52 +0800 Subject: [PATCH 0200/2029] modify code --- src/class145/Code04_NothingFear.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/class145/Code04_NothingFear.java b/src/class145/Code04_NothingFear.java index ccd983339..578b71b01 100644 --- a/src/class145/Code04_NothingFear.java +++ b/src/class145/Code04_NothingFear.java @@ -106,11 +106,11 @@ public static void main(String[] args) throws IOException { in.nextToken(); b[i] = (int) in.nval; } - if ((n + k) % 2 != 0) { - out.println(0); - } else { + if (((n + k) & 1) == 0) { k = (n + k) / 2; out.println(compute()); + } else { + out.println(0); } out.flush(); out.close(); From d75f8335a29cd5984d57e6ef6bc023e3dae8feae Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 28 Sep 2024 13:55:57 +0800 Subject: [PATCH 0201/2029] modify code --- src/class145/Code05_Game.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/class145/Code05_Game.java b/src/class145/Code05_Game.java index 04ad8daa0..2ea03037f 100644 --- a/src/class145/Code05_Game.java +++ b/src/class145/Code05_Game.java @@ -30,10 +30,8 @@ public class Code05_Game { public static int[] arr = new int[MAXN]; - // 阶乘表 public static long[] fac = new long[MAXN]; - // 组合结果表 public static long[][] c = new long[MAXN][MAXN]; // 链式前向星需要 @@ -57,6 +55,7 @@ public class Code05_Game { // 反演需要 public static long[] g = new long[MAXN]; + // 最后答案 public static long[] f = new long[MAXN]; public static int n, m; From 5af1a95b45b7dd5dfc2e28b231bb3eacb853b16d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 28 Sep 2024 13:58:57 +0800 Subject: [PATCH 0202/2029] modify code --- src/class145/Code04_NothingFear.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/class145/Code04_NothingFear.java b/src/class145/Code04_NothingFear.java index 578b71b01..8230a27cb 100644 --- a/src/class145/Code04_NothingFear.java +++ b/src/class145/Code04_NothingFear.java @@ -3,9 +3,9 @@ // 已经没有什么好害怕的了 // 给定两个长度为n的数组,a[i]表示第i个糖果的能量,b[i]表示第i个药片的能量 // 所有能量数值都不相同,每一个糖果要选一个药片进行配对 -// 如果配对之后,糖果能量 > 药片能量,这个配对叫糖果大的配对 -// 如果配对之后,糖果能量 < 药片能量,这个配对叫药片大的配对 -// 希望做到,糖果大的配对数 = 药片大的配对数 + k +// 如果配对之后,糖果能量 > 药片能量,称为糖果大的配对 +// 如果配对之后,糖果能量 < 药片能量,称为药片大的配对 +// 希望做到,糖果大的配对数量 = 药片大的配对数量 + k // 返回配对方法数,答案对 1000000009 取余 // 举例,a = [5, 35, 15, 45],b = [40, 20, 10, 30],k = 2,返回4,因为有4种配对方法 // (5-40,35-20,15-10,45-30)、(5-40,35-30,15-10,45-20) From 9d6328c751babfa16008bc038db617c7266d7b9d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 28 Sep 2024 21:17:56 +0800 Subject: [PATCH 0203/2029] modify code --- src/class145/Code05_Game.java | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/src/class145/Code05_Game.java b/src/class145/Code05_Game.java index 2ea03037f..5acd6d5d9 100644 --- a/src/class145/Code05_Game.java +++ b/src/class145/Code05_Game.java @@ -1,14 +1,13 @@ package class145; // 游戏 -// 一共有n个节点,编号1~n,一共有n-1条边连接成一棵树 -// 给定长度为n的数组arr,arr[i]为0表示小A拥有i节点,arr[i]为1表示小B拥有i节点 -// 输入保证n为偶数,并且小A和小B拥有的节点数量都是m,m = n/2 -// 游戏一共进行m回合,每个回合两人都需要选出一个自己拥有、但是之前未被选过的节点 -// 对手节点在自己节点的子树内,获胜;自己节点在对手节点的子树内,失败;其他为平局,继续游戏 -// 想知道有多少种不同的选择方法,能在第k个回合恰好分出胜负 -// 需要打印k = 0、1、2...m时的所有答案,答案对 998244353 取余 -// 1 <= n <= 5000 +// 一共有n个节点,n <= 5000,n为偶数,其中有m个点属于小A,有m个点属于小B,m为n的一半 +// 给定n-1条边,节点之间组成一颗树,1号节点是根节点 +// 给定长度为n的数组arr,arr[i]的值表示i号节点由谁拥有,0为小A拥有,1为小B拥有 +// 游戏有m回合,每回合两人需要选择一个自己拥有、但之前没选过的点,每回合谁会胜利的规定如下 +// 小A当前点的子树里有小B当前点,则小A胜;小B当前点的子树里有小A当前点,则小B胜;否则平局 +// 返回m回合里能出现k次非平局的游戏方法数,打印k=0..m时的所有答案,对 998244353 取余 +// 两场游戏视为不同的定义:当且仅当存在小A拥有的点x,小B在小A选择x的那个回合所选择的点不同 // 测试链接 : https://www.luogu.com.cn/problem/P6478 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -181,13 +180,13 @@ public static void compute() { for (int i = 0; i <= m; i++) { g[i] = dp[1][i] * fac[m - i] % MOD; } - for (int i = 0; i <= m; i++) { - for (int j = i; j <= m; j++) { - if (((j - i) & 1) == 0) { - f[i] = (f[i] + c[j][i] * g[j] % MOD) % MOD; + for (int k = 0; k <= m; k++) { + for (int i = k; i <= m; i++) { + if (((i - k) & 1) == 0) { + f[k] = (f[k] + c[i][k] * g[i] % MOD) % MOD; } else { // -1 和 (MOD-1) 同余 - f[i] = (f[i] + c[j][i] * g[j] % MOD * (MOD - 1) % MOD) % MOD; + f[k] = (f[k] + c[i][k] * g[i] % MOD * (MOD - 1) % MOD) % MOD; } } } From 48951a6fbf323d1f53df47d7dae565d12643acdf Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 28 Sep 2024 21:21:57 +0800 Subject: [PATCH 0204/2029] modify code --- src/class145/Code05_Game.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class145/Code05_Game.java b/src/class145/Code05_Game.java index 5acd6d5d9..1cd124e62 100644 --- a/src/class145/Code05_Game.java +++ b/src/class145/Code05_Game.java @@ -4,7 +4,7 @@ // 一共有n个节点,n <= 5000,n为偶数,其中有m个点属于小A,有m个点属于小B,m为n的一半 // 给定n-1条边,节点之间组成一颗树,1号节点是根节点 // 给定长度为n的数组arr,arr[i]的值表示i号节点由谁拥有,0为小A拥有,1为小B拥有 -// 游戏有m回合,每回合两人需要选择一个自己拥有、但之前没选过的点,每回合谁会胜利的规定如下 +// 游戏有m回合,每回合都有胜负,两人需要选择一个自己拥有、但之前没选过的点,作为当前点 // 小A当前点的子树里有小B当前点,则小A胜;小B当前点的子树里有小A当前点,则小B胜;否则平局 // 返回m回合里能出现k次非平局的游戏方法数,打印k=0..m时的所有答案,对 998244353 取余 // 两场游戏视为不同的定义:当且仅当存在小A拥有的点x,小B在小A选择x的那个回合所选择的点不同 From f8f18044d00317464fad21239f7cd07ee055063a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 28 Sep 2024 21:23:02 +0800 Subject: [PATCH 0205/2029] modify code --- src/class145/Code05_Game.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class145/Code05_Game.java b/src/class145/Code05_Game.java index 1cd124e62..301935e4c 100644 --- a/src/class145/Code05_Game.java +++ b/src/class145/Code05_Game.java @@ -4,7 +4,7 @@ // 一共有n个节点,n <= 5000,n为偶数,其中有m个点属于小A,有m个点属于小B,m为n的一半 // 给定n-1条边,节点之间组成一颗树,1号节点是根节点 // 给定长度为n的数组arr,arr[i]的值表示i号节点由谁拥有,0为小A拥有,1为小B拥有 -// 游戏有m回合,每回合都有胜负,两人需要选择一个自己拥有、但之前没选过的点,作为当前点 +// 游戏有m回合,每回合都有胜负,两人需要选择一个自己拥有、但之前没选过的点,作为本回合当前点 // 小A当前点的子树里有小B当前点,则小A胜;小B当前点的子树里有小A当前点,则小B胜;否则平局 // 返回m回合里能出现k次非平局的游戏方法数,打印k=0..m时的所有答案,对 998244353 取余 // 两场游戏视为不同的定义:当且仅当存在小A拥有的点x,小B在小A选择x的那个回合所选择的点不同 From 2b907c006095a798c9a3892298f9ab67a60c4d74 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 28 Sep 2024 23:51:11 +0800 Subject: [PATCH 0206/2029] modify code --- src/class145/Code05_Game.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class145/Code05_Game.java b/src/class145/Code05_Game.java index 301935e4c..90a54f129 100644 --- a/src/class145/Code05_Game.java +++ b/src/class145/Code05_Game.java @@ -208,8 +208,8 @@ public static void main(String[] args) { addEdge(v, u); } compute(); - for (int i = 0; i <= m; i++) { - io.println(f[i]); + for (int k = 0; k <= m; k++) { + io.println(f[k]); } io.flush(); io.close(); From 4fc5e30c3abbe847587fd1965b88b305b5e8b136 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 29 Sep 2024 00:06:09 +0800 Subject: [PATCH 0207/2029] modify code --- src/class145/Code05_Game1.java | 195 ++++++++++++++++++ .../{Code05_Game.java => Code05_Game2.java} | 37 +--- 2 files changed, 199 insertions(+), 33 deletions(-) create mode 100644 src/class145/Code05_Game1.java rename src/class145/{Code05_Game.java => Code05_Game2.java} (86%) diff --git a/src/class145/Code05_Game1.java b/src/class145/Code05_Game1.java new file mode 100644 index 000000000..b1061243c --- /dev/null +++ b/src/class145/Code05_Game1.java @@ -0,0 +1,195 @@ +package class145; + +// 游戏(递归版) +// 一共有n个节点,n <= 5000,n为偶数,其中有m个点属于小A,有m个点属于小B,m为n的一半 +// 给定n-1条边,节点之间组成一颗树,1号节点是根节点 +// 给定长度为n的数组arr,arr[i]的值表示i号节点由谁拥有,0为小A拥有,1为小B拥有 +// 游戏有m回合,每回合都有胜负,两人需要选择一个自己拥有、但之前没选过的点,作为本回合当前点 +// 小A当前点的子树里有小B当前点,则小A胜;小B当前点的子树里有小A当前点,则小B胜;否则平局 +// 返回m回合里能出现k次非平局的游戏方法数,打印k=0..m时的所有答案,对 998244353 取余 +// 两场游戏视为不同的定义:当且仅当存在小A拥有的点x,小B在小A选择x的那个回合所选择的点不同 +// 测试链接 : https://www.luogu.com.cn/problem/P6478 +// 提交以下的code,提交时请把类名改成"Main",dfs是递归函数,有时可以通过所有测试用例,有时会爆栈 +// 递归函数改成非递归函数的实现,请看Code05_Game2文件 + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.StringTokenizer; + +public class Code05_Game1 { + + public static final int MAXN = 5001; + + public static final int MOD = 998244353; + + public static int[] arr = new int[MAXN]; + + public static long[] fac = new long[MAXN]; + + public static long[][] c = new long[MAXN][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 cnt; + + // dfs需要 + public static int[] size = new int[MAXN]; + + public static int[][] belong = new int[MAXN][2]; + + public static long[][] dp = new long[MAXN][MAXN]; + + public static long[] tmp = new long[MAXN]; + + // 反演需要 + public static long[] g = new long[MAXN]; + + // 最后答案 + public static long[] f = new long[MAXN]; + + public static int n, m; + + public static void build() { + fac[0] = 1; + for (int i = 1; i <= n; i++) { + fac[i] = fac[i - 1] * i % MOD; + } + for (int i = 0; i <= n; i++) { + c[i][0] = 1; + for (int j = 1; j <= i; j++) { + c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % MOD; + } + } + cnt = 1; + Arrays.fill(head, 1, n + 1, 0); + } + + public static void addEdge(int u, int v) { + next[cnt] = head[u]; + to[cnt] = v; + head[u] = cnt++; + } + + public static void dfs(int u, int fa) { + size[u] = 1; + belong[u][arr[u]] = 1; + dp[u][0] = 1; + for (int e = head[u], v; e > 0; e = next[e]) { + v = to[e]; + if (v != fa) { + dfs(v, u); + Arrays.fill(tmp, 0, Math.min(size[u] + size[v], m) + 1, 0); + for (int i = 0; i <= Math.min(size[u], m); i++) { + for (int j = 0; j <= Math.min(size[v], m - i); j++) { + tmp[i + j] = (tmp[i + j] + dp[u][i] * dp[v][j] % MOD) % MOD; + } + } + size[u] += size[v]; + belong[u][0] += belong[v][0]; + belong[u][1] += belong[v][1]; + for (int i = 0; i <= Math.min(size[u], m); i++) { + dp[u][i] = tmp[i]; + } + } + } + for (int i = belong[u][arr[u] ^ 1]; i >= 0; i--) { + dp[u][i + 1] = (dp[u][i + 1] + dp[u][i] * (belong[u][arr[u] ^ 1] - i) % MOD) % MOD; + } + } + + public static void compute() { + dfs(1, 0); // dfs是递归函数 + for (int i = 0; i <= m; i++) { + g[i] = dp[1][i] * fac[m - i] % MOD; + } + for (int k = 0; k <= m; k++) { + for (int i = k; i <= m; i++) { + if (((i - k) & 1) == 0) { + f[k] = (f[k] + c[i][k] * g[i] % MOD) % MOD; + } else { + // -1 和 (MOD-1) 同余 + f[k] = (f[k] + c[i][k] * g[i] % MOD * (MOD - 1) % MOD) % MOD; + } + } + } + } + + public static void main(String[] args) { + Kattio io = new Kattio(); + n = io.nextInt(); + m = n >> 1; + build(); + String str = io.next(); + for (int i = 1; i <= n; i++) { + arr[i] = str.charAt(i - 1) - '0'; + } + for (int i = 1, u, v; i < n; i++) { + u = io.nextInt(); + v = io.nextInt(); + addEdge(u, v); + addEdge(v, u); + } + compute(); + for (int k = 0; k <= m; k++) { + io.println(f[k]); + } + io.flush(); + io.close(); + } + + // Kattio类IO效率很好,但还是不如StreamTokenizer + // 只有StreamTokenizer无法正确处理时,才考虑使用这个类 + // 参考链接 : https://oi-wiki.org/lang/java-pro/ + public static class Kattio extends PrintWriter { + private BufferedReader r; + private StringTokenizer st; + + public Kattio() { + this(System.in, System.out); + } + + public Kattio(InputStream i, OutputStream o) { + super(o); + r = new BufferedReader(new InputStreamReader(i)); + } + + public Kattio(String intput, String output) throws IOException { + super(output); + r = new BufferedReader(new FileReader(intput)); + } + + public String next() { + try { + while (st == null || !st.hasMoreTokens()) + st = new StringTokenizer(r.readLine()); + return st.nextToken(); + } catch (Exception e) { + } + return null; + } + + public int nextInt() { + return Integer.parseInt(next()); + } + + public double nextDouble() { + return Double.parseDouble(next()); + } + + public long nextLong() { + return Long.parseLong(next()); + } + } + +} \ No newline at end of file diff --git a/src/class145/Code05_Game.java b/src/class145/Code05_Game2.java similarity index 86% rename from src/class145/Code05_Game.java rename to src/class145/Code05_Game2.java index 90a54f129..7606cdc75 100644 --- a/src/class145/Code05_Game.java +++ b/src/class145/Code05_Game2.java @@ -1,6 +1,6 @@ package class145; -// 游戏 +// 游戏(迭代版) // 一共有n个节点,n <= 5000,n为偶数,其中有m个点属于小A,有m个点属于小B,m为n的一半 // 给定n-1条边,节点之间组成一颗树,1号节点是根节点 // 给定长度为n的数组arr,arr[i]的值表示i号节点由谁拥有,0为小A拥有,1为小B拥有 @@ -21,7 +21,7 @@ import java.util.Arrays; import java.util.StringTokenizer; -public class Code05_Game { +public class Code05_Game2 { public static final int MAXN = 5001; @@ -80,34 +80,6 @@ public static void addEdge(int u, int v) { head[u] = cnt++; } - // 递归版 - public static void dfs1(int u, int fa) { - size[u] = 1; - belong[u][arr[u]] = 1; - dp[u][0] = 1; - for (int e = head[u], v; e > 0; e = next[e]) { - v = to[e]; - if (v != fa) { - dfs1(v, u); - Arrays.fill(tmp, 0, Math.min(size[u] + size[v], m) + 1, 0); - for (int i = 0; i <= Math.min(size[u], m); i++) { - for (int j = 0; j <= Math.min(size[v], m - i); j++) { - tmp[i + j] = (tmp[i + j] + dp[u][i] * dp[v][j] % MOD) % MOD; - } - } - size[u] += size[v]; - belong[u][0] += belong[v][0]; - belong[u][1] += belong[v][1]; - for (int i = 0; i <= Math.min(size[u], m); i++) { - dp[u][i] = tmp[i]; - } - } - } - for (int i = belong[u][arr[u] ^ 1]; i >= 0; i--) { - dp[u][i + 1] = (dp[u][i + 1] + dp[u][i] * (belong[u][arr[u] ^ 1] - i) % MOD) % MOD; - } - } - // 迭代版 // ufe是为了实现迭代版而准备的栈 // 不会改,看讲解118,讲了怎么从递归版改成迭代版 @@ -130,7 +102,7 @@ public static void pop() { } // 迭代版 - public static void dfs2(int root) { + public static void dfs(int root) { stackSize = 0; push(root, 0, -1); int v; @@ -175,8 +147,7 @@ public static void dfs2(int root) { } public static void compute() { - // dfs1(1, 0); // 递归版 - dfs2(1); // 迭代版 + dfs(1); // dfs是非递归函数 for (int i = 0; i <= m; i++) { g[i] = dp[1][i] * fac[m - i] % MOD; } From bf68a76fa8a799faec4b1371f583bbc143627180 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 29 Sep 2024 00:09:29 +0800 Subject: [PATCH 0208/2029] modify code --- src/class145/Code05_Game1.java | 4 ++-- src/class145/Code05_Game2.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/class145/Code05_Game1.java b/src/class145/Code05_Game1.java index b1061243c..87ea5fcc6 100644 --- a/src/class145/Code05_Game1.java +++ b/src/class145/Code05_Game1.java @@ -10,7 +10,7 @@ // 两场游戏视为不同的定义:当且仅当存在小A拥有的点x,小B在小A选择x的那个回合所选择的点不同 // 测试链接 : https://www.luogu.com.cn/problem/P6478 // 提交以下的code,提交时请把类名改成"Main",dfs是递归函数,有时可以通过所有测试用例,有时会爆栈 -// 递归函数改成非递归函数的实现,请看Code05_Game2文件 +// dfs从递归版改迭代版的实现,请看Code05_Game2文件 import java.io.BufferedReader; import java.io.FileReader; @@ -109,7 +109,7 @@ public static void dfs(int u, int fa) { } public static void compute() { - dfs(1, 0); // dfs是递归函数 + dfs(1, 0); // dfs是递归版 for (int i = 0; i <= m; i++) { g[i] = dp[1][i] * fac[m - i] % MOD; } diff --git a/src/class145/Code05_Game2.java b/src/class145/Code05_Game2.java index 7606cdc75..dea9d7d44 100644 --- a/src/class145/Code05_Game2.java +++ b/src/class145/Code05_Game2.java @@ -147,7 +147,7 @@ public static void dfs(int root) { } public static void compute() { - dfs(1); // dfs是非递归函数 + dfs(1); // dfs是迭代版 for (int i = 0; i <= m; i++) { g[i] = dp[1][i] * fac[m - i] % MOD; } From 0296373732dd426ed48011f07537a384035a89ae Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 29 Sep 2024 11:50:29 +0800 Subject: [PATCH 0209/2029] modify code --- src/class145/Code05_Game1.java | 12 ++++++++++-- src/class145/Code05_Game2.java | 14 +++++++++++--- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/class145/Code05_Game1.java b/src/class145/Code05_Game1.java index 87ea5fcc6..1a93c47e0 100644 --- a/src/class145/Code05_Game1.java +++ b/src/class145/Code05_Game1.java @@ -90,6 +90,7 @@ public static void dfs(int u, int fa) { if (v != fa) { dfs(v, u); Arrays.fill(tmp, 0, Math.min(size[u] + size[v], m) + 1, 0); + // 树型dp的枚举行为利用子树的节点数做上限进行复杂度优化 for (int i = 0; i <= Math.min(size[u], m); i++) { for (int j = 0; j <= Math.min(size[v], m - i); j++) { tmp[i + j] = (tmp[i + j] + dp[u][i] * dp[v][j] % MOD) % MOD; @@ -103,8 +104,15 @@ public static void dfs(int u, int fa) { } } } - for (int i = belong[u][arr[u] ^ 1]; i >= 0; i--) { - dp[u][i + 1] = (dp[u][i + 1] + dp[u][i] * (belong[u][arr[u] ^ 1] - i) % MOD) % MOD; + // u为头的子树中,对手有几个节点 + int oppCnt = belong[u][arr[u] ^ 1]; + // 先把不包含头节点的方法数,拷贝到tmp + for (int i = 1; i <= Math.min(m, oppCnt); i++) { + tmp[i] = dp[u][i]; + } + // 然后计算包含头节点的方法数,累加上 + for (int i = 1; i <= Math.min(m, oppCnt); i++) { + dp[u][i] = (dp[u][i] + tmp[i - 1] * (oppCnt - i + 1) % MOD) % MOD; } } diff --git a/src/class145/Code05_Game2.java b/src/class145/Code05_Game2.java index dea9d7d44..4507354e2 100644 --- a/src/class145/Code05_Game2.java +++ b/src/class145/Code05_Game2.java @@ -105,7 +105,7 @@ public static void pop() { public static void dfs(int root) { stackSize = 0; push(root, 0, -1); - int v; + int v, oppCnt; while (stackSize > 0) { pop(); if (e == -1) { // 第一次来到当前节点,设置初始值 @@ -118,6 +118,7 @@ public static void dfs(int root) { if (v != fa) { // 之前的孩子,dfs过程计算完了,所以用之前孩子的信息,更新当前节点的信息 Arrays.fill(tmp, 0, Math.min(size[u] + size[v], m) + 1, 0); + // 树型dp的枚举行为利用子树的节点数做上限进行复杂度优化 for (int i = 0; i <= Math.min(size[u], m); i++) { for (int j = 0; j <= Math.min(size[v], m - i); j++) { tmp[i + j] = (tmp[i + j] + dp[u][i] * dp[v][j] % MOD) % MOD; @@ -139,8 +140,15 @@ public static void dfs(int root) { push(to[e], u, -1); } } else { // 没有后续子节点,做最后的收尾工作 - for (int i = belong[u][arr[u] ^ 1]; i >= 0; i--) { - dp[u][i + 1] = (dp[u][i + 1] + dp[u][i] * (belong[u][arr[u] ^ 1] - i) % MOD) % MOD; + // u为头的子树中,对手有几个节点 + oppCnt = belong[u][arr[u] ^ 1]; + // 先把不包含头节点的方法数,拷贝到tmp + for (int i = 1; i <= Math.min(m, oppCnt); i++) { + tmp[i] = dp[u][i]; + } + // 然后计算包含头节点的方法数,累加上 + for (int i = 1; i <= Math.min(m, oppCnt); i++) { + dp[u][i] = (dp[u][i] + tmp[i - 1] * (oppCnt - i + 1) % MOD) % MOD; } } } From 18b097060d65c7c2a2ed825a59fbaf59f1e58f6b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 29 Sep 2024 11:56:43 +0800 Subject: [PATCH 0210/2029] modify code --- src/class145/Code05_Game2.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/class145/Code05_Game2.java b/src/class145/Code05_Game2.java index 4507354e2..3420e210b 100644 --- a/src/class145/Code05_Game2.java +++ b/src/class145/Code05_Game2.java @@ -115,8 +115,7 @@ public static void dfs(int root) { e = head[u]; } else { // 不是第一次来到当前节点 v = to[e]; - if (v != fa) { - // 之前的孩子,dfs过程计算完了,所以用之前孩子的信息,更新当前节点的信息 + if (v != fa) { // 之前的孩子,dfs过程计算完了,所以用之前孩子的信息,更新当前节点的信息 Arrays.fill(tmp, 0, Math.min(size[u] + size[v], m) + 1, 0); // 树型dp的枚举行为利用子树的节点数做上限进行复杂度优化 for (int i = 0; i <= Math.min(size[u], m); i++) { @@ -131,7 +130,7 @@ public static void dfs(int root) { dp[u][i] = tmp[i]; } } - // 去往下一个孩子 + // 来到去往下一个孩子的边 e = next[e]; } if (e != 0) { // 还有后续子节点 From 14029d083bd02e2887addfc98694346e19bd4708 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 29 Sep 2024 12:05:22 +0800 Subject: [PATCH 0211/2029] modify code --- src/class145/Code05_Game1.java | 4 ++++ src/class145/Code05_Game2.java | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/src/class145/Code05_Game1.java b/src/class145/Code05_Game1.java index 1a93c47e0..70af89e56 100644 --- a/src/class145/Code05_Game1.java +++ b/src/class145/Code05_Game1.java @@ -89,6 +89,8 @@ public static void dfs(int u, int fa) { v = to[e]; if (v != fa) { dfs(v, u); + // 不包含头节点的方法数,dp[u][..]可以倒推更新,但为了好理解,采用正推更新 + // tmp数组清空 Arrays.fill(tmp, 0, Math.min(size[u] + size[v], m) + 1, 0); // 树型dp的枚举行为利用子树的节点数做上限进行复杂度优化 for (int i = 0; i <= Math.min(size[u], m); i++) { @@ -96,6 +98,7 @@ public static void dfs(int u, int fa) { tmp[i + j] = (tmp[i + j] + dp[u][i] * dp[v][j] % MOD) % MOD; } } + // 更新当前节点的信息 size[u] += size[v]; belong[u][0] += belong[v][0]; belong[u][1] += belong[v][1]; @@ -104,6 +107,7 @@ public static void dfs(int u, int fa) { } } } + // 包含头节点的方法数,dp[u][..]可以倒推更新,但为了好理解,采用正推更新 // u为头的子树中,对手有几个节点 int oppCnt = belong[u][arr[u] ^ 1]; // 先把不包含头节点的方法数,拷贝到tmp diff --git a/src/class145/Code05_Game2.java b/src/class145/Code05_Game2.java index 3420e210b..ec81a13c1 100644 --- a/src/class145/Code05_Game2.java +++ b/src/class145/Code05_Game2.java @@ -116,6 +116,8 @@ public static void dfs(int root) { } else { // 不是第一次来到当前节点 v = to[e]; if (v != fa) { // 之前的孩子,dfs过程计算完了,所以用之前孩子的信息,更新当前节点的信息 + // 不包含头节点的方法数,dp[u][..]可以倒推更新,但为了好理解,采用正推更新 + // tmp数组清空 Arrays.fill(tmp, 0, Math.min(size[u] + size[v], m) + 1, 0); // 树型dp的枚举行为利用子树的节点数做上限进行复杂度优化 for (int i = 0; i <= Math.min(size[u], m); i++) { @@ -123,6 +125,7 @@ public static void dfs(int root) { tmp[i + j] = (tmp[i + j] + dp[u][i] * dp[v][j] % MOD) % MOD; } } + // 更新当前节点的信息 size[u] += size[v]; belong[u][0] += belong[v][0]; belong[u][1] += belong[v][1]; @@ -139,6 +142,7 @@ public static void dfs(int root) { push(to[e], u, -1); } } else { // 没有后续子节点,做最后的收尾工作 + // 包含头节点的方法数,dp[u][..]可以倒推更新,但为了好理解,采用正推更新 // u为头的子树中,对手有几个节点 oppCnt = belong[u][arr[u] ^ 1]; // 先把不包含头节点的方法数,拷贝到tmp From 1b8147c9f4eeb535f3d979ce3c60c69c15e0522b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 29 Sep 2024 14:34:27 +0800 Subject: [PATCH 0212/2029] modify code --- src/class145/Code05_Game1.java | 34 +++++++++++++++++----------------- src/class145/Code05_Game2.java | 34 ++++++++++++---------------------- 2 files changed, 29 insertions(+), 39 deletions(-) diff --git a/src/class145/Code05_Game1.java b/src/class145/Code05_Game1.java index 70af89e56..d4134c9c7 100644 --- a/src/class145/Code05_Game1.java +++ b/src/class145/Code05_Game1.java @@ -9,7 +9,8 @@ // 返回m回合里能出现k次非平局的游戏方法数,打印k=0..m时的所有答案,对 998244353 取余 // 两场游戏视为不同的定义:当且仅当存在小A拥有的点x,小B在小A选择x的那个回合所选择的点不同 // 测试链接 : https://www.luogu.com.cn/problem/P6478 -// 提交以下的code,提交时请把类名改成"Main",dfs是递归函数,有时可以通过所有测试用例,有时会爆栈 +// 提交以下的code,提交时请把类名改成"Main",注意dfs是递归函数 +// 使用C++的同学这么写可以通过所有测试用例,使用java的同学有时可以全部通过,有时会爆栈 // dfs从递归版改迭代版的实现,请看Code05_Game2文件 import java.io.BufferedReader; @@ -19,7 +20,6 @@ import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; -import java.util.Arrays; import java.util.StringTokenizer; public class Code05_Game1 { @@ -61,8 +61,10 @@ public class Code05_Game1 { public static int n, m; public static void build() { + cnt = 1; fac[0] = 1; for (int i = 1; i <= n; i++) { + head[i] = 0; fac[i] = fac[i - 1] * i % MOD; } for (int i = 0; i <= n; i++) { @@ -71,8 +73,6 @@ public static void build() { c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % MOD; } } - cnt = 1; - Arrays.fill(head, 1, n + 1, 0); } public static void addEdge(int u, int v) { @@ -81,41 +81,41 @@ public static void addEdge(int u, int v) { head[u] = cnt++; } + // 递归版 public static void dfs(int u, int fa) { size[u] = 1; belong[u][arr[u]] = 1; dp[u][0] = 1; + // 首先计算不包含头节点的方法数 for (int e = head[u], v; e > 0; e = next[e]) { v = to[e]; if (v != fa) { dfs(v, u); - // 不包含头节点的方法数,dp[u][..]可以倒推更新,但为了好理解,采用正推更新 - // tmp数组清空 - Arrays.fill(tmp, 0, Math.min(size[u] + size[v], m) + 1, 0); - // 树型dp的枚举行为利用子树的节点数做上限进行复杂度优化 + // 之前所有子树结合的计算结果,拷贝进tmp for (int i = 0; i <= Math.min(size[u], m); i++) { - for (int j = 0; j <= Math.min(size[v], m - i); j++) { - tmp[i + j] = (tmp[i + j] + dp[u][i] * dp[v][j] % MOD) % MOD; + tmp[i] = dp[u][i]; + dp[u][i] = 0; + } + // 树型dp的枚举行为利用子树的节点数做上限进行复杂度优化 + for (int l = 0; l <= Math.min(size[u], m); l++) { + for (int r = 0; r <= Math.min(size[v], m - l); r++) { + dp[u][l + r] = (dp[u][l + r] + tmp[l] * dp[v][r] % MOD) % MOD; } } - // 更新当前节点的信息 size[u] += size[v]; belong[u][0] += belong[v][0]; belong[u][1] += belong[v][1]; - for (int i = 0; i <= Math.min(size[u], m); i++) { - dp[u][i] = tmp[i]; - } } } - // 包含头节点的方法数,dp[u][..]可以倒推更新,但为了好理解,采用正推更新 + // 最后计算包含头节点的方法数 // u为头的子树中,对手有几个节点 int oppCnt = belong[u][arr[u] ^ 1]; // 先把不包含头节点的方法数,拷贝到tmp - for (int i = 1; i <= Math.min(m, oppCnt); i++) { + for (int i = 1; i <= Math.min(oppCnt, m); i++) { tmp[i] = dp[u][i]; } // 然后计算包含头节点的方法数,累加上 - for (int i = 1; i <= Math.min(m, oppCnt); i++) { + for (int i = 1; i <= Math.min(oppCnt, m); i++) { dp[u][i] = (dp[u][i] + tmp[i - 1] * (oppCnt - i + 1) % MOD) % MOD; } } diff --git a/src/class145/Code05_Game2.java b/src/class145/Code05_Game2.java index ec81a13c1..36049959c 100644 --- a/src/class145/Code05_Game2.java +++ b/src/class145/Code05_Game2.java @@ -18,7 +18,6 @@ import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; -import java.util.Arrays; import java.util.StringTokenizer; public class Code05_Game2 { @@ -60,8 +59,10 @@ public class Code05_Game2 { public static int n, m; public static void build() { + cnt = 1; fac[0] = 1; for (int i = 1; i <= n; i++) { + head[i] = 0; fac[i] = fac[i - 1] * i % MOD; } for (int i = 0; i <= n; i++) { @@ -70,8 +71,6 @@ public static void build() { c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % MOD; } } - cnt = 1; - Arrays.fill(head, 1, n + 1, 0); } public static void addEdge(int u, int v) { @@ -116,41 +115,33 @@ public static void dfs(int root) { } else { // 不是第一次来到当前节点 v = to[e]; if (v != fa) { // 之前的孩子,dfs过程计算完了,所以用之前孩子的信息,更新当前节点的信息 - // 不包含头节点的方法数,dp[u][..]可以倒推更新,但为了好理解,采用正推更新 - // tmp数组清空 - Arrays.fill(tmp, 0, Math.min(size[u] + size[v], m) + 1, 0); - // 树型dp的枚举行为利用子树的节点数做上限进行复杂度优化 for (int i = 0; i <= Math.min(size[u], m); i++) { - for (int j = 0; j <= Math.min(size[v], m - i); j++) { - tmp[i + j] = (tmp[i + j] + dp[u][i] * dp[v][j] % MOD) % MOD; + tmp[i] = dp[u][i]; + dp[u][i] = 0; + } + for (int l = 0; l <= Math.min(size[u], m); l++) { + for (int r = 0; r <= Math.min(size[v], m - l); r++) { + dp[u][l + r] = (dp[u][l + r] + tmp[l] * dp[v][r] % MOD) % MOD; } } - // 更新当前节点的信息 size[u] += size[v]; belong[u][0] += belong[v][0]; belong[u][1] += belong[v][1]; - for (int i = 0; i <= Math.min(size[u], m); i++) { - dp[u][i] = tmp[i]; - } } // 来到去往下一个孩子的边 e = next[e]; } - if (e != 0) { // 还有后续子节点 + if (e != 0) { // 还有后续子树 push(u, fa, e); if (to[e] != fa) { push(to[e], u, -1); } - } else { // 没有后续子节点,做最后的收尾工作 - // 包含头节点的方法数,dp[u][..]可以倒推更新,但为了好理解,采用正推更新 - // u为头的子树中,对手有几个节点 + } else { // 没有后续子树,最后计算包含头节点的方法数 oppCnt = belong[u][arr[u] ^ 1]; - // 先把不包含头节点的方法数,拷贝到tmp - for (int i = 1; i <= Math.min(m, oppCnt); i++) { + for (int i = 1; i <= Math.min(oppCnt, m); i++) { tmp[i] = dp[u][i]; } - // 然后计算包含头节点的方法数,累加上 - for (int i = 1; i <= Math.min(m, oppCnt); i++) { + for (int i = 1; i <= Math.min(oppCnt, m); i++) { dp[u][i] = (dp[u][i] + tmp[i - 1] * (oppCnt - i + 1) % MOD) % MOD; } } @@ -167,7 +158,6 @@ public static void compute() { if (((i - k) & 1) == 0) { f[k] = (f[k] + c[i][k] * g[i] % MOD) % MOD; } else { - // -1 和 (MOD-1) 同余 f[k] = (f[k] + c[i][k] * g[i] % MOD * (MOD - 1) % MOD) % MOD; } } From d684a969f88fceb42a293fdde4ec743d33448903 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 29 Sep 2024 14:43:39 +0800 Subject: [PATCH 0213/2029] modify code --- src/class145/Code05_Game1.java | 14 +++++++------- src/class145/Code05_Game2.java | 10 +++++----- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/class145/Code05_Game1.java b/src/class145/Code05_Game1.java index d4134c9c7..f8232ca3a 100644 --- a/src/class145/Code05_Game1.java +++ b/src/class145/Code05_Game1.java @@ -50,7 +50,7 @@ public class Code05_Game1 { public static long[][] dp = new long[MAXN][MAXN]; - public static long[] tmp = new long[MAXN]; + public static long[] backup = new long[MAXN]; // 反演需要 public static long[] g = new long[MAXN]; @@ -91,15 +91,15 @@ public static void dfs(int u, int fa) { v = to[e]; if (v != fa) { dfs(v, u); - // 之前所有子树结合的计算结果,拷贝进tmp + // 之前所有子树结合的计算结果,拷贝进backup for (int i = 0; i <= Math.min(size[u], m); i++) { - tmp[i] = dp[u][i]; + backup[i] = dp[u][i]; dp[u][i] = 0; } // 树型dp的枚举行为利用子树的节点数做上限进行复杂度优化 for (int l = 0; l <= Math.min(size[u], m); l++) { for (int r = 0; r <= Math.min(size[v], m - l); r++) { - dp[u][l + r] = (dp[u][l + r] + tmp[l] * dp[v][r] % MOD) % MOD; + dp[u][l + r] = (dp[u][l + r] + backup[l] * dp[v][r] % MOD) % MOD; } } size[u] += size[v]; @@ -110,13 +110,13 @@ public static void dfs(int u, int fa) { // 最后计算包含头节点的方法数 // u为头的子树中,对手有几个节点 int oppCnt = belong[u][arr[u] ^ 1]; - // 先把不包含头节点的方法数,拷贝到tmp + // 先把不包含头节点的方法数,拷贝到backup for (int i = 1; i <= Math.min(oppCnt, m); i++) { - tmp[i] = dp[u][i]; + backup[i] = dp[u][i]; } // 然后计算包含头节点的方法数,累加上 for (int i = 1; i <= Math.min(oppCnt, m); i++) { - dp[u][i] = (dp[u][i] + tmp[i - 1] * (oppCnt - i + 1) % MOD) % MOD; + dp[u][i] = (dp[u][i] + backup[i - 1] * (oppCnt - i + 1) % MOD) % MOD; } } diff --git a/src/class145/Code05_Game2.java b/src/class145/Code05_Game2.java index 36049959c..341b6133b 100644 --- a/src/class145/Code05_Game2.java +++ b/src/class145/Code05_Game2.java @@ -48,7 +48,7 @@ public class Code05_Game2 { public static long[][] dp = new long[MAXN][MAXN]; - public static long[] tmp = new long[MAXN]; + public static long[] backup = new long[MAXN]; // 反演需要 public static long[] g = new long[MAXN]; @@ -116,12 +116,12 @@ public static void dfs(int root) { v = to[e]; if (v != fa) { // 之前的孩子,dfs过程计算完了,所以用之前孩子的信息,更新当前节点的信息 for (int i = 0; i <= Math.min(size[u], m); i++) { - tmp[i] = dp[u][i]; + backup[i] = dp[u][i]; dp[u][i] = 0; } for (int l = 0; l <= Math.min(size[u], m); l++) { for (int r = 0; r <= Math.min(size[v], m - l); r++) { - dp[u][l + r] = (dp[u][l + r] + tmp[l] * dp[v][r] % MOD) % MOD; + dp[u][l + r] = (dp[u][l + r] + backup[l] * dp[v][r] % MOD) % MOD; } } size[u] += size[v]; @@ -139,10 +139,10 @@ public static void dfs(int root) { } else { // 没有后续子树,最后计算包含头节点的方法数 oppCnt = belong[u][arr[u] ^ 1]; for (int i = 1; i <= Math.min(oppCnt, m); i++) { - tmp[i] = dp[u][i]; + backup[i] = dp[u][i]; } for (int i = 1; i <= Math.min(oppCnt, m); i++) { - dp[u][i] = (dp[u][i] + tmp[i - 1] * (oppCnt - i + 1) % MOD) % MOD; + dp[u][i] = (dp[u][i] + backup[i - 1] * (oppCnt - i + 1) % MOD) % MOD; } } } From 466e355bf03dbb6971a9bac540507af9fe4ac75b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 29 Sep 2024 14:45:41 +0800 Subject: [PATCH 0214/2029] modify code --- src/class145/Code05_Game1.java | 4 ++-- src/class145/Code05_Game2.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class145/Code05_Game1.java b/src/class145/Code05_Game1.java index f8232ca3a..f1eceb5ac 100644 --- a/src/class145/Code05_Game1.java +++ b/src/class145/Code05_Game1.java @@ -28,6 +28,8 @@ public class Code05_Game1 { public static final int MOD = 998244353; + public static int n, m; + public static int[] arr = new int[MAXN]; public static long[] fac = new long[MAXN]; @@ -58,8 +60,6 @@ public class Code05_Game1 { // 最后答案 public static long[] f = new long[MAXN]; - public static int n, m; - public static void build() { cnt = 1; fac[0] = 1; diff --git a/src/class145/Code05_Game2.java b/src/class145/Code05_Game2.java index 341b6133b..58346f231 100644 --- a/src/class145/Code05_Game2.java +++ b/src/class145/Code05_Game2.java @@ -26,6 +26,8 @@ public class Code05_Game2 { public static final int MOD = 998244353; + public static int n, m; + public static int[] arr = new int[MAXN]; public static long[] fac = new long[MAXN]; @@ -56,8 +58,6 @@ public class Code05_Game2 { // 最后答案 public static long[] f = new long[MAXN]; - public static int n, m; - public static void build() { cnt = 1; fac[0] = 1; From 0b785c988df1529d16bc221707de2e91b5385ebb Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 29 Sep 2024 14:50:27 +0800 Subject: [PATCH 0215/2029] modify code --- src/class145/Code05_Game1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class145/Code05_Game1.java b/src/class145/Code05_Game1.java index f1eceb5ac..8ef36912c 100644 --- a/src/class145/Code05_Game1.java +++ b/src/class145/Code05_Game1.java @@ -10,7 +10,7 @@ // 两场游戏视为不同的定义:当且仅当存在小A拥有的点x,小B在小A选择x的那个回合所选择的点不同 // 测试链接 : https://www.luogu.com.cn/problem/P6478 // 提交以下的code,提交时请把类名改成"Main",注意dfs是递归函数 -// 使用C++的同学这么写可以通过所有测试用例,使用java的同学有时可以全部通过,有时会爆栈 +// 使用C++的同学可以可以全部通过,java的同学有时可以全部通过,有时因为递归展开太深而爆栈 // dfs从递归版改迭代版的实现,请看Code05_Game2文件 import java.io.BufferedReader; From bacf9c0279aa956b2db983efd436d605c4b81a33 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 29 Sep 2024 17:55:01 +0800 Subject: [PATCH 0216/2029] modify code --- src/class145/Code05_Game1.java | 6 +++--- src/class145/Code05_Game2.java | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/class145/Code05_Game1.java b/src/class145/Code05_Game1.java index 8ef36912c..5d1592a39 100644 --- a/src/class145/Code05_Game1.java +++ b/src/class145/Code05_Game1.java @@ -92,13 +92,13 @@ public static void dfs(int u, int fa) { if (v != fa) { dfs(v, u); // 之前所有子树结合的计算结果,拷贝进backup - for (int i = 0; i <= Math.min(size[u], m); i++) { + for (int i = 0; i <= Math.min(size[u] / 2, m); i++) { backup[i] = dp[u][i]; dp[u][i] = 0; } // 树型dp的枚举行为利用子树的节点数做上限进行复杂度优化 - for (int l = 0; l <= Math.min(size[u], m); l++) { - for (int r = 0; r <= Math.min(size[v], m - l); r++) { + for (int l = 0; l <= Math.min(size[u] / 2, m); l++) { + for (int r = 0; r <= Math.min(size[v] / 2, m - l); r++) { dp[u][l + r] = (dp[u][l + r] + backup[l] * dp[v][r] % MOD) % MOD; } } diff --git a/src/class145/Code05_Game2.java b/src/class145/Code05_Game2.java index 58346f231..61bee2290 100644 --- a/src/class145/Code05_Game2.java +++ b/src/class145/Code05_Game2.java @@ -115,12 +115,12 @@ public static void dfs(int root) { } else { // 不是第一次来到当前节点 v = to[e]; if (v != fa) { // 之前的孩子,dfs过程计算完了,所以用之前孩子的信息,更新当前节点的信息 - for (int i = 0; i <= Math.min(size[u], m); i++) { + for (int i = 0; i <= Math.min(size[u] / 2, m); i++) { backup[i] = dp[u][i]; dp[u][i] = 0; } - for (int l = 0; l <= Math.min(size[u], m); l++) { - for (int r = 0; r <= Math.min(size[v], m - l); r++) { + for (int l = 0; l <= Math.min(size[u] / 2, m); l++) { + for (int r = 0; r <= Math.min(size[v] / 2, m - l); r++) { dp[u][l + r] = (dp[u][l + r] + backup[l] * dp[v][r] % MOD) % MOD; } } From 2104f236023dfb91dc0374990217b1280bfcd2f9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 29 Sep 2024 17:57:37 +0800 Subject: [PATCH 0217/2029] modify code --- src/class145/Code05_Game1.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class145/Code05_Game1.java b/src/class145/Code05_Game1.java index 5d1592a39..952089f26 100644 --- a/src/class145/Code05_Game1.java +++ b/src/class145/Code05_Game1.java @@ -110,11 +110,11 @@ public static void dfs(int u, int fa) { // 最后计算包含头节点的方法数 // u为头的子树中,对手有几个节点 int oppCnt = belong[u][arr[u] ^ 1]; - // 先把不包含头节点的方法数,拷贝到backup + // 不包含头节点的方法数,拷贝到backup for (int i = 1; i <= Math.min(oppCnt, m); i++) { backup[i] = dp[u][i]; } - // 然后计算包含头节点的方法数,累加上 + // 计算包含头节点的方法数,累加上 for (int i = 1; i <= Math.min(oppCnt, m); i++) { dp[u][i] = (dp[u][i] + backup[i - 1] * (oppCnt - i + 1) % MOD) % MOD; } From 28b8fa5525e68a30119ef84f4de5481fbd79cf22 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 29 Sep 2024 19:57:10 +0800 Subject: [PATCH 0218/2029] modify code --- ...0\345\205\263\351\242\230\347\233\256.pdf" | Bin 0 -> 1262880 bytes src/class145/Code05_Game1.java | 9 +++++---- src/class145/Code05_Game2.java | 10 +++++----- 3 files changed, 10 insertions(+), 9 deletions(-) create mode 100644 "ppt/\347\256\227\346\263\225\350\256\262\350\247\243145\343\200\220\346\211\251\345\261\225\343\200\221\344\272\214\351\241\271\345\274\217\345\217\215\346\274\224\347\232\204\345\233\233\347\247\215\345\275\242\345\274\217\343\200\201\350\257\201\346\230\216\343\200\201\347\233\270\345\205\263\351\242\230\347\233\256.pdf" diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243145\343\200\220\346\211\251\345\261\225\343\200\221\344\272\214\351\241\271\345\274\217\345\217\215\346\274\224\347\232\204\345\233\233\347\247\215\345\275\242\345\274\217\343\200\201\350\257\201\346\230\216\343\200\201\347\233\270\345\205\263\351\242\230\347\233\256.pdf" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243145\343\200\220\346\211\251\345\261\225\343\200\221\344\272\214\351\241\271\345\274\217\345\217\215\346\274\224\347\232\204\345\233\233\347\247\215\345\275\242\345\274\217\343\200\201\350\257\201\346\230\216\343\200\201\347\233\270\345\205\263\351\242\230\347\233\256.pdf" new file mode 100644 index 0000000000000000000000000000000000000000..09de3374beefd1729b55a4c9c4aa18b30f705320 GIT binary patch literal 1262880 zcmb@sW0)mDmo-|pZL`a^)n#|twr$(CyUTWU+32!u+pc^1#mwB9dG7c9xPMOO$&8G> zGa_T{wf72g1yON2CVCba@_~cfgR@_E`O^bKFf2rjM0SRjFuc4(4B{5n&L)n4qqTvv ziKvN@ov{fKgN%u-nX@?&6B8375kEhSle43Vfenm1aHsmHEtwcn=aSmK!=a$8=q0sA zDi(`Gym;e4TQdfT7wZt{?f~X>l{W}dMw6+@;%xtJ>N;J=>q1mGCIiV?MyJ^n+;K?k z97Ao7@9DDJIjGm&bzr53fdcne5u1o-C+nxC-^$!BP27$X@Hvw{U;WieO6SX?(L=z- zMjeM9d!BDK0mDX3-g1S&*X!Za()nj@=f^3rHXOlSMm{L)VP$t-(?kHZVjy)U<>O;t zG7Ki1T^i-?(TjHVIRaYE)ye_nFR82nkz-(m_1E_fwM$&+Vr*f+{5IHR;9D3!>RL@pN!P077d3eD?uwFT)J9k>fy zIrV!kb*M;*mNVE~OM6%dQb0r+Y_R(MVU>FH>R_XtAeLcU%V(0#!#ynW2)r) zkTArm)=@joLa8TnCHTc!8n$Lzrjigo7@il5m~FSBHH@hFvOVrsk3h~BprLMvmA(8N z`BOJy^sFI}MRJ7${@6aPP+iYt8QaKeSytS}vKIID14U#i7=2YqD$UiT`s`bY7xPUwxA8GP z6;@4+_eix&SFTc$le6gaHaV+L?oV@AudV@R%uN)hcqWl|4=h`4r7C-E;+b&^RpQ@ z*hFu3Z6Q2+zg(m-L3XwdH;CN-u4}_)#h{^UG%u`60pj**m{wWD;W zQWSg}56)EziKzf&my`qL(dKV7W%Zx+0nbnyd6|+*C!@__X^G+q80^2o-Gd>f@Hx!7 zxfTq+%$xlmALo?0`NPa^Db_`q+3Q7{A&0N{50UAq9kKWmY-+}N@EhPgR=OQ0VyP9e zccCJz457?iGgPCC2wY1jin&PHF4xT@V`!Meos_f)W+%Vf0Q*GEA3G#&&o}Mwki$rR zh>X$;Ssvu^qMexu`IK>5ht*}iH0+^emrBK9xUEFQpk(4?=i+E&;zY#y&kG`U zw$6b2PDFp<4bVW=#Mr_>*v_3uixF^viHjNV!^p{~0|P*`e_8tb0y zAi_k%{?7&~DojKi|8DS~Rso>;pJwF%?lK7d#b8?i0248Ynz&jRnJ7sJ{|5>)vokUO z?>PNmp*bhjO+|SHBW$XZqjMUCgoyke#}k@pmghS}L%#UG>t(Bver4_R)pQUynh4(

    Z0v$Y2&CNY$%K$N= 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

    p;>$~~wgrML6 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%0DSJgf??>NS;SL!Ej-$cV+8nU%NA!v4hz~8XLW?z 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樃w@O9iuffIE*N3+qB* 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

    $gjhyJ>_%yoG5H4+C%jwu@wLa%l@I73;q2%N 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�##V>ec-5|eMO zyJ%2q2LXTiKpEAux*yo(mPRXrD;d!Zsl~I$R=u$~0 zA->2rHV19@_AH5VCJcgq32z0zQ$I8u4D{w0`Q!#Pe$vw)3L?`Ftza>$};L$Vsh zDz4UR)Mu%!YI^?i!m8yzvJ~s*?B;{vcrX*SP^7Fg?|g+{`T=Y}%&^Ec8*N57HSNAA!M`(fgs;B=Y-cGmfRlc=pr-p8o< zk%uv-w|!od6X`Z9o7akY@gpM7x4wYmPm9-2E&$`l1vLS$qd^2K86Ob!Nc4ibiUBuX z^)@B+61KtTfT7>_N_sr09hNG5G2JTyd@v96+mIYleU-znie&-C3$X5*YYs7L#2UYIxY!DM|_0l&^k>MQ3@?X&`ENI`e1bS zZWnjouCn$C=Db$bj^jQEF~+>lZIzzl1eESkwI6dZe-R3Px8jT(#E8BtZ&_Iq(zRX? zBT&8{n{2!QgoGn{nD1~Dk=f1h5S)J{J4yPUrJ;~HcSC#N9J6@@Ra1s9eKL-Bu(z)~ zo3`7O5nwDS>AiSS$v5RB1n&tnTh+5zhVa8hBMdCH$bFVB@PvMZpPu^Co;B;l;Ze)B zlddb9f`~F0wg7)l71G-nN~AT1$zY3De7&wYVtLy8NPB*E*dwF&HvJ8RyWk|_cJgAc zJHA_%D^p1Ga1f23@1@w$El)H3WO#gq?fVL;x|HuK36swx$~3W(!ri+WB!;*!_rAfY zy#0V>#XZ@OV4A)w{Ytz<@0X`10b)mbh%Uj3Jz+9McQ{l;>Pi_~z1Rs#3YkQGqghfc zQvFhTG%K0ZG2G{ifi+^_jkn20&f|WPQUU9h2G`oExSl1t8sc;aWU}eZ#=gpwWDmJ! zXal~>d!DY&Dpupcvu7YuNUu(}VC-H#0%Z+$*TZYZy<4N=Fj@+M&}&FsBVtRj{wS)yL=70`#Vc{hOq|C9Sl#O#`jMlgmkGrVdo^bY2M zIh$&}byqYz7RVlCpI=m{O1!mOmSRn3%#1R)4q3kzAxcM9XD<)#Jq4-I%CZtYj3B$~ z&VlYJj{s8T8g`*gMq0I>8ZjnY*-6{PvZlEwluup$7k==bv1X_KY){P@->Ok~nKS8!I z3)DG@iLOQ#Uyj*DLVsfx`2-j7h}8Jtx}@CKgguYMZ6I7qkhwrnSBQkZe7CVIW(Lg5=3^2!?#vW8 z-ij!9hv7C_B29W*&M!+5E{YNB(lC?nijRibB7T-3(e(uJ92gEd+b2cREw6@4f6i95 zNiR}fNATWXp+qF;^Lwoxmuj#M!sXz4pCw8-eqtYdb+6 zp`QKyroeiMLVAKCt~qZ?U0rxD8=Q&!a? z!q-h5l-fg2%o2E;C?JAu4&A9_|2FJ%Ei0GqatpI4xF=B1s8!-bCFRPeN?hpmRJA+$ zQh7yKID2sl*h70SehWI>`2QxL7Su31G%Ir}w`TTXtxBDeLL3r7)3VmXj`Rq#7W}jp zhV)I%x|dP&0`t-1pVoQVDj{)=om42Q7j6YQHKvie4)b^0J$!(!3SfchcvA)+_V8 z3LUX`Sg4Vs+hdraRQ?O#I-iPvt`{li{2fS(at*?Jn4QKB}ZQ zgqLY!K=(!NgJG>nS({;sV*0a^Pv1Ws)yea8^7c7^be@+D+gjDC)Tfc(BIG^sC6c&A zi>(-{4rHJy@U3EiBL5)#SFw!g2B+%dH1Yx!)X9vI)%w;=LP^4G%5JYk{yq%md=vH@ zTYZnz7Reij@vo)^8fgWi4YkV#^s*#e1TlSj;lv^ySU#r7jx-7)cHmB3I;bgQ_~G8+IC;&9`|flY{Y$BYEVbh#Wj7(2=%sVs%H9 z0>V7du7?-)FukZckP1;Z6gj&7N5iJ?=^9l?PYT`+r##5st}aJ1PoG$?@*qY3{HURM zG{BwFaksy9?lY4PJEp}@10uK3tQQaa%9h*C`>}_C7GgFv3b*Gry}=|`ukKED;;7k( z&Uap!?dWUsQYQ*je!dFYG;S()aS4yj{AI$^Nv^;ucgwRlO-IKlEFK=|gt~*;o({{(HHr5F(w_}*fL?;F3vV41qevVBMT2}1Oe7WdCJ2f}qh<+wsf zMg45Da!x8zvjkO9Gndt6oH$&0Cj~qpP#=ka%Uk}MVzU&QY=mDUC(f1*N2QVqmBOAc zcwCoHBf!I6cH+lK?Ln}M35*7|>}}%YppRU3)Gm9MYO)BDD|cY?@ea}t*gTKsgBy~k zp;Lrplkw2jW#5Xe1L=0Y^~r8hvyBQl^IaIy%L2A9anV1l@X=zK=rWv>XT7O&eNOme zrs`;r^ivnwg8A&W+)Rl|qPRM7TtepkBo%FCgniZ=r3j*0x$=hbyJ9X<-%I4$>t4({ zr<*7EWu|d8U~V_#5>(_ovZ41+dMZ7A3#r)QmE>y#Bo_Rc>qso_!!HfrtkDZc#|{|r z`i{ujHi>jX%VX&MjibqKo56TP$JqR5xo=7Wy^m=(gRUl|Tc)e{w zUlx5S0fnUsVSlXM|M%URc{b6O#=T@&ai)Md^-!=soo(3kMuP4wkFJ3UVqq)uVF<%u zC1vmjGmYJm@lh;ZeT)76aI~d$)BET9Wjr$}b6A{peR=Ca7Kf79^4(O(F9@(N-#HvII-1(^e)MP} zZcN;F2vfa!d!k*Eq>HMi1ctq>D31YV`Q0A(E9flBmn+V}E9y{only&4d5a*Kb*i%P z*qTn^_&M4ZE*oI?1!{oaHvJ;{k)oFbs{R8XL{9AX{N{Mk*s#qEhqO;9?PsZJ z=P}ggDYUjRuw`v+n5(B7d9QnO-)?8gt61f~4f*Hkzlz87Rbi!t<4sO2Zk~!n=AJEW1 zuc)4p++@Xx5ZAbJL&itrD7!zt1tShIc9fu(X(<>cxO+d?3azn!otd`B_!g{{@7vp} z9M57Xg=TV3JF{{95TrvR_$^8$O&^i3B>0mPvPv&-qhsi@J1(&K<6tr!+ibYl?p}k` z`lO5}gq6V-|B}NcX7MQ)E;72T9;vM9MI<@@vy_}gmrGkqFNSVDN3Uz>Zj0AS2e{k()UizokiHv!!xQLR+w zlsRJX<8vko*H59Y@}#VtAQCz&u)e^Hk2pCKotlZZ8Z@pnZ8$5}Glba*9cjy7Oe2RZ zR2lf*GU&wM;o(zi3nbMtpV&ptE|vDx8YDV5du{qwTa-*vkZth1czRi|7lfyXr>s_%bQ$cYD<7vhx&O7DjHEqum|PyfX!C zKglyCj%k#OO?xku^pNee)H*?yycF!Hc)PR43=(%)zjDk`IWrxL?*ug!jEw)r@XLO-{qf zEWSMx(|FK7e3_=+E)%;IUO76P8x{qNTKhAk~I#$!Iq1SE!A4*>&t=>n9Qf zWIO!n9&2XJt#vf;tpLc_F>~pet%QsH?Y011|MvL_)d`~{SC{KAN|XXZ3JuN<1Xn5y zFCGASGW^0LS>ak#cF2@hFl7Tel-jhm_E2O(EEtoDO$D(=5WBf`;p2#&7b+3n zq^TJh!kgiNUi1J+XVc9YpI#OhM2_Yo5pl~O*v;{8T^*2O)8 zAQBs6)`(Wpm#lJ?ICeb>Wv`I;9koXdTT`JulX*y6z%CA=$x7Z*TeGw&1MmrxNdS<^x@q5(+VYV6{!f3yeSz$ zUb9V%Z%}sZDDSj~Mn$x>DUhWZl9jTjM0jlT8{w?BYCi;VH5JyyQ}^+aZ>@hAJp_1X z$(v}Rr1q9@iLTHbG*-`D8jTFU@O?25qm< z!dd|t{7fG6oJ&qdv|&3Gs=iHjAnVc2!_NcB3Tza8lULu0WIDnVUpS% zo+Ud(F=##!5fttjxxPnOqF-fXsGo?pDH2#MEUV|&D4|I^7;|^cASIYmQLNi1dy+{v zDw}pH6RGDUdkuIA7nu=*gT|i0u6Sgw&Wq-%QRpRSv7=)8IpFpPe40pz7wHj zd|m({8Mf}jRhs;ez9(J*2dMWL>`V`*saSq@)gt&+GJNzv9a1Dlck?vsqIrAv=qop; z$F4@1*Oxs5l8m@fJR1Cb^=~gd>)1Nb5EZURWY+HpC|zB`nQp#;@n`fes`6^0md$yN z^n27&$rH1cnJxQpOqDHUFZFe@igE0wrvx(MeI$tNYoHnJs-LH}zFr<2K6MFggUOYd z<<_&*9TFoNDH<-p=%a+Afk$!N9i+{f3t5O-_<74QQsEwp^AkgtAC_s?7R@?pzUm(m zd9%YDzWpQiMxPnRK8Fpx@GC9B=Rqw^4n!SB*0U9Y8YG5wO33B>kd>Z-&!0IS55<`S ztX_MJT9x`w<%Oc(8)=p^;fjZ5l|Y)hg&$|HXd;QJxtFKr^@_ij>2*9}4iU(G7}{aE`od31;6PP=B*o zXIS7S0mZ_zXY?xEpUV{lYDP}VYj>;cHR?3=)!v9OOYYk;6g?}%pRt~{v0?kpD)m_E_JR~d`9pHfP_uVq7m;4{W9B9t`dkZSGS0Q z#I+-s5G;6+%4y`Ar{v1xb6tn&RRckVJ-@s=5PRrRl#AyMZ;hD5!Cazm2XJ6Bs`TA9 zIMyzy(%(x+jC~eR-yX1bfb62|R;~q)im@;&PBIddcoCYDqK+@Mw36TJs9oiA4pAfg zg00gQRv4w;WhP{@Z;^D_(M%TLHPM`#zz6*uTxhP_&CesYEXT(dSX;u(n9e_Fh{!ga zF=T=g1dnC2%MQkZELcK*N_%!OMpi`0;*{#$3|~A5JW+gf-oVa9@NZq5Zf5Sqlq^@M zn)O?os{#EJ9NDo7)c9mwSN5zzTI%l{yft6G=Di8%{o=2rH`_c<9<7>SK)qsDOu^?} z%1}Qblhx!L%V$+j9G=4OXkFVsS6?p{Y)gmIiZED=>!_=jsw*YVQK9pA&gAps?Ag%b zZzj4(RQ@UL4&34A9K7!cG1C~jT|~uNVRtb^oZl(mTRN3Yzmp-X8b(Pi+@PJ?jO?sF z`JPN(gQLRh!UHW`8lSp#Wbf;bSdu&fv}S9p2g?&*lHIv)qFPi87P`4s%$O?L#nVKV zfncbR!^u)X4sDc!kV$6mB0y7D)*OstmBS@Gq?Ff7U%pBB)yigReH|c zp_uWa0A4$te9VC@!sw>KR$)|L^?`wNTQhm0i(>Lj1{tmr0heyav&3+y7r*b>_xct3 zh5@y@99B6a>9OQ6zo;}Am&wk1Y4oL5>Z{zucLC>fiqo}}wsEaU%~#A%jqGWriHWI` zh%c7(139MVdH4af=ccyi;-oY;wLG~ePTW_bRALq`IesXH3|EXXS8K4)kh}ebc40j>>k$Molw1G~Ij22DCzH%Di}8%{tK;%=Yh7?I4{ zfTuiB)aQi3%E;9&lMGKEN|tmXJxuzIrK6W}*?g!op91 zCQwYC{6@R?lQDI$#Zdi0HO78lDm#f%x_KlQziEA&>xPsiRCtcQ93LIhu*?DpJJ@C^xhdZ$>SEZf&^^8 zH8T)XB$nkSJoU8@12_^5-CX0w?N_g7>mGH~y_cs$8xruUhte)2GWN!tA111m;|`qjCgw?9wHXg&J)IrinCrC(mGF?4!8O~n$4;$lD?TY4V^T4YnIJ}ooKr{;hgU3A%IRM;19Hl z+abedJNR!tUB+{3bhL%18hS3wTqZQD9tI$0p^oN(J*1i&n{B>Fs;^5rqkEG} z1m=;amh?xWmJpbODEn#|(mE_xyaxYiGg;Ygfa*}n1I=wZnz_kAg7A`7)wI0rO=g6A z#XG61%fw(B7&=&!AT;XZ2A}ERI3BAvKsU!9TObE!Ph5!xc&Hc_T*b`udu5(SS^MXFclexKo!ct|I^rjxd+>skdi@B{ym&~E`_2Y?2H2TG<8q; zlW6tkEc-M!&GctWFa;m7`X%@0U&$~NmO{r!+t~BIu8~iOQh$D+rS_w?aQ-W`JeJ2n zlvtq@vKcRT`nlsC4B^`M>oyUf`W<*r(^t6P-0dkWZ8(6-+`@``E-z5SSS@i=g8f<2 z@T=^|t9=7G_jJAwm5Y7u)e~9U?pnPLJ$O!`lT))a~i8-pU65ssZ zE3MEARk9q=wUzyyMz8IU!UiARQ#yjTJdBpQQb?Hn#9vupzc6GtngB)uQ@`$+2YU}FM_gP2lZL>rk0_icud}sWKUCoA$a>Z+F`qyMKeP1~xjKr1}icnPDjb(SB znheP3z6=y}64pf6?WiMyk-F1Qz5U z`fdwL$;h#!m9lsD!9i|q*OFXq6JaZCo*J9vA8~PMR`2KX5s1CDz_oW4iWYpGw<7k! z*m*t`J7MG#QyEjUaliA8aB&Z$ZIQ}o@V4bhZ=f!Q^)*QSgPde6lg;u}cSlP(oLKu! zjs)J)-0!%`v1*jHphm|S$l7rF#3vdFpx)&l^Ieu}S}&?F%!!HD^1RF=Bh80MPHPyp zL$%~x`>!?vG!58ud*Q#&IMW-`zO8P7RiLonFqS z`XH9F5PRWlhL8CIIpznLo)z5DJGYMvh6!@6b%9(PW!}#PGV6>(b;bHoFTtdyPtEgD zxXpK4PF?fFonRD1?R_j5Q;>?M86gD|x_T0C_;Jxb0zG20q01m>>#*8}g`kBHr@NfF zmD)jbT&iXKj8rwqZBs5IBKqPEL-%Sb8YlWYA zp`;NXpGJNvXPd@(uE9OuVv-qi7(75bNhcdJy6M(eKJcqR235K@7a|g#r05QCfPMMBTRqLUoyVJZZBF(*%KMq@_`UAyS**SZ0)Ma&3_1qKNHO8UNaLOBrS6* zpu{`8wI~czCVmFZr2R9z{%LQBX+y_)g1sw>s^%H_2vrjczoHkYWzIKR<(7}~$djS! zEDRF?Xa%XGSG}0p`2JtYe$XKJk(wA`kP-MtYM=NS&6bLCd{cg(>73sI zhH|8RYWXIuBjZEH43yk9S zyg`@ziRk%TlwUtOCd7ttgg7JIFjDG8hNoubw(~;uX8G{OAl)sGJ!;KBa0F_q?0&o# zhDmzVEp*A$(Gxt@m_abnw>Hain6K@i>K4!BoR4_l0i=wXSW{yLW6=gtE?^3heaW2| z{sj2ExX+|bMTFFI>N23jJa*7!{2ws5SOmBcOX?|}1xq}+NvZYcX%*&N#U{Ls zDGDi^+a!NTPihkcQ7vU(@1socX^kUF%Ai z9J$0@5v0^^GUUsO*80}*C92x1(EbaLUQ?x>>0h%@qN#{%45oA+Z1ZeH)W1PtFD$$% z{v=9JmeNoz*?>7z?Nu7$`cQ+zFPxd0$J4ZR>-qE(O71pJ*bh;HR}_{OR@2VcM7OnH zzNazWm9{#!2?W;mb71m0^->_6%*#a8IYvb-t1>4xb0}U@yo{}VzJ-$PTF0IyidLVv zOg=J5bOHli`6N$iJc~iWaDXZDYt8nmS9J(6Zm1OQHwV{PfvXfsna)|uw%f0>c?Air z>!Pp=!Sr)Z`_?20rzdEsWqY3R6Tbs#M-D`^2OWzfM=27HlQ^pN37IRLq*+iqE7};% zY~u%~^|U?I(4dZhBn&iE~$A>{q9muMOGJ zh>go#u@ylWF2a0xhLxpw7G5VEEc~nF*GIz)vk|gVg*Pt+YT1;VLgLm^l1=Km#|_){ z00QM+VG|6`q!$6r$c@H3ybuGmj1U-m+QQH}7Yn<%QSzu9b7{b}M_;8;Mps+5xNKA`=CiI1e-g zO}K9*xjWzlUYY>r`9tT6w3uHe)qpO0+TeTjg(>KwbTkh&K5;I*S)qXr6)Q3uef2v> zUog4gyo2s_l07Q2z=B~XdDa7M`3xrzcIT`%B1m12iR$j}JRpYKW?PZEZ zj}qI=F<#QIqRi~Pt~u8XprDjko2Z^u7hVFGA{+hBy`MksD&(7-K@se=b3}rd%;*rrI{F8OJ{ED?V0UNI8?1@rKU#W}~Uo!aK1s9_lT{=3yX#6j!KAe4jorgx7g_wDfbuTyZkL zbo0o%!Hn))8jRLLrOj$LC9T=Cphj&i4#SZ|^t^d$47<#U^X12)v#v@g4XMj&aJ*4S zN#I6b>a61Z+nXgsb!|TmS9aW&1=lvOnmyTF23fPE_n?AHCKHUIj>_ZT?~CbsBR;K6 zm{+6;WI>ntWSZqo41815VEX9Hh*N9qUZO3OQsdqd3qf&6)lkp2-WKFZJB6Gd1YA7# z0yWS6_a76L1j^h{7^y=Iy@kRxL>RF8Y-CV`tqV9`G&djbNx##%8QfmBEmv`B3%ohW%4nc@X`x6=7qTW6__LTC@|M$RFqgs;de7^ z&RHQ~(YKMAZQpQcA0^eBJ?g+6dbWn&dL22tW>jI+B(fvT;;AUHmiZtR!hDNli$yfiLp5Mgsg?b<6o*Rq;$pW4k!I$^gxLVfIY@vCd`G65bM$XU& zv_5+R!=5&&^GrLD4s@b~3s;COn;WJ#Ki-2|Wq+noJoh(&sHBiz-`cJ|+YOByh3&=N zOz27S5|VMI<3Gr2;b^j)jBE`Mp{)!!st}fs!lDUvBT`B)DaKaSG6rphoRnJd&b0L; zrZwJ!tY78B=KH)V&+N^~7j6pUN0BRes6A0*H{d+`ByoPH!u0tBGJ*QSO(dx}w4UZ5 zmVtz2iLQB6%cvxDgyz6Fi@Nyi==t>MX41nB{VPv)+|y=>U5Tal`FZh?kti*n2K<Q=ul)#Ot88E7n{VMn^(Atd0m3Ff2Nc&e9N- zn@)$Tx}cTh+RJ;YdjyZ$^@m}&vj#A~nOmFOsIv*s%(?A{fOumu_2_3|*=Tf5ZHV(IwcS58U~m&s_6og=}6@XURw zpPm%LPh(I%DiTw<2!som71^{XX{e?9Nd_3>8pkT7#Xzh|_=m~ZLIw9>d#Pq12B=QN z$A^xO0y=cm5=jQN%D>8p_9mQlo0p}qK4gFC6w~|+7aeg>c3~|)76%#df3KI4a?U#Y^htWsL1;J(L&hvnO-9PpK+qs836*Gh-^PA86LB*qrQe^T zXYKy-%5}dem4~6{!cP)Pc=dXQZC-z{Lfl38Z*nGAIDBvCm~NSwMiP51U#~KJ0e5Q@ z|FhRsjdR1Am6OfOJV>fCj$BSG!jU5OZ22AG&F~k2688GIjzFbtXZs5>y~y~j8O-~4 z(V$;u&wtBcGZn`pJO?H?b-B2m?&_a=gMt#5S&|$v9G;(oRZ}v40(fAylEswTj2EMf zKrmJ+3eOhupqJ$6V+^V$I6neiR-l*+d3J$IGwL_(Yf6dK9K26Sn#N~IU4`54 z_vKyBddcxUr2*Um?;cmqe<*4lm%wt2=L4`})>0on5 ziw51nrsw?0;jOU*j>YjjHdBSea1i3!Lp)S9Z2h;3wuLvl!@aE*`i@*zpOy1|&k;N% zUK1~HI4thAQfmKxfYEV-$Y@q*;|!ke(qQ_XHyLKm@86?_#wzNI4siAY%OR{>gjBj| zR3YT=xG!ifFJW0}tlRcW3I=R50oI0&Jm8IKQpa84_e!Rug1(^g+frUclN2EbOderE z0oPx

    |ae+2RFx;Oat;6-^(F=i!rS7!KD{Kiv8P;EKT`P5M-SUle_|GA`sWw7A(; zottOTx*%?@nsb6`0ivj-h3l2oy|4D!U_H^j3x4;$NrwEW=?q6)y@6jf#$e2aGxe`~ zzYYLQgAca==-2Dl2IS<<0Lk~=|2Lta=h2(BuCEV2ko(-Jjen21ILfTEPIX zXSsfqY(2C6SoI6=mdc_ls^Tf7LmJ+p3X~4~KumdMm1Y_e=LrVR8|cQ4z`|rjH@QNT z(D8EU-o+sy^dssZULi3wp7x_RbaXFi?d0+(`F$++S<-lTZBPD_c})Xe4O+XvDNe*> zVAbTD{`W6`g4=(oY69l$qDra^TEarMdim0K``RTUx&GLKPxu4y3$q;Or@yp@_%O>9 z%G!#x-E(rEh+FmYUK#z7>F)i2<5~6E(s5e>a{Q`>_t}?m)40De5D;zbubb5vfBvP8 z?51=+C@UGn540=M(gW|0B>dNZi2Bn8@L%C8CvK$f>NN}!+68CL`3(cw4E0M>|0i2e zW3!+CVwQoa50f3HlU9f=ZPp?8ih^`?@nrg6BI74dpxYe>hLJ5Ncl9oSMl~du4A6lf zZj}fdP2>rg=wVmgaUsSvG9g*g#JK$q#__R#@0arSMJYa|9TrxB7BVrDWA9< z3jkwLvzMgoW-n#BwS>MsabcY=6}6XRYM2n0(FY_7h@ZSvedb>@#3!(UkP>g`i~HyA z;3b||*<@PRQELCSBZGwv8w;^|Bv5Amb_38pT$62(i9)R)pndeSc-4&iB7n^ALbYJZ z5ok`)-%qAV{rneX@d;WWq&_qlSyA0q9HP*s6A+G;?YcCSQhRK1H+!AD_3K=cK#B0dcBc1k-QyMdLu10pvdh1x0`EktlTFu0Rn? zpvVCU42l2%esT7F#*ikSw5}p}M z5IhM)``zCl>1z0#7=a^4&AK47!h;%*REh^foLNdZGa@WrDZ@u!l2-3+WE1W`dlVuBx)%NmIiwOI zo%PgQCj;O@p!@vOXaqkRIs8e);q)d%Ik?Z=9 znbKJSwnoVWI9-Z55|RO?2~4g50l*@VZ12G>dP%1_z5%F{bchcg5XsR>d}{+pfO?%Y zpbhUbF{37;KwnB*R=ft5)P%$H?q>gf-nzTV19lDo#OfFj3~kNbw7}R)u>?exkq}OR zyDI~VJBKkrSOa-B(_>?^E$3YTm*H_k&Vj)L*?*a#X=d@O%vcfZ;*QG^9~JiHf!ERu zRUD}m;4>braGT;WBC=0p!cFn)0?*osY_NHIgw_{9)-JvfT+5H{8B0hg!Tkove90dH z4(sc{>%C*ZxRZ9tlH}PyubE`%0F(09AFjMj3YHZBe+3(TT@+mt3HwOb+$u2}a4y{) z0ky@1XX><@9DKzn8aRO!ivJKP#AE^(14q?7K~dOXsg+0O9w_7EBY!M|Jz*sUvladZ zTyyto?91P0ykcT$8T$tGa-a0wYN!A_VlV)7X84h0~N+`?`P^m5Fm?QeBwx?LR%`(Z@<8crLNwS z*Tvi=z40_bUl)G>U#z=i)KQdHZ~MzEV)-zHKQLj8;0s88m9czHeJUvCV}RzjP@Ms6 z91qzg34qb963yks=A__{_C%kV$!5@dK6!WRIs$^@2MqM!GM9G&A6C zF#>_(Vc6XlreU4B$>&1A&F{GUUfKUv9S)*O;t$j@kLkPs(@y`_|FT= zxcc^Dc&~@)OA3p@1eL=xkHYwCAUQ-p^g??{{-A(~4{aa*(m3L2+cM=EDizETJBJP$ znaDk`!?f212koMy8b4&o+|mcuNaLxeZpFUHAs7Gxw@il-5H;S)9pf>IEL*u;evZ^< zaC-Z@cSKVrjl&X{sUc|v8M1|^IK-Gj)&U7c_Y>`-@;vO(!{8H8__ZT2=^(0kGmJov1Q1Pw2d`A#WU;{pLb#+tMmqwok2Wg?)L052 zW6%m(MjEx`2gI1Icr8>{3ttd_U#P=?mGlFM&SiHXzLU4SOlFO$+P+}?SDa=p*3FsJ z|Nd-GzEL}ia!dcu>w|A6hndD@gE@_OkL!Y0ePmNHq;Y_yn{Do&7VCgv=j1DJ`!o0h(S%M# zE8zeUILl}I-yaqtYG~Fo8}bCFOWZY(A(PX%LWaR934I*^j{}Tds#zEVU_@Hc5rCnz z3arn>UPC~DtzLgV98mSuoXC7{0*uv3qy`DqgxFn^?fRbTix)!>=EN5fVEx?B0?tf+ zK42RPdj>hGnrgsP4oPkxXLtbI0VYIHmnP2ySRgJHmY`zS0jxGD@Nf-TtWV#Q{IXa+ zs;vJi&ha?s=FzPUf3}P}IsoYy|H-QGs`sDR41f=W*C0^9-{RmNn`@%nq z^UwRJBy>Z>$p$c=HTjH;ZHkhCA4^XH!3b3!K7B7B2b?D1m&mlHU3~d-b06i`A>Qe# zZeW7F0Fm#yg6nijZd%96l_snJ$zCLsm>6m@)%7SWGD3?gQ~O`v1dMR31H$9r`VGul zml8O5n%ufYP-p`n@dB@Pi)0ux{9KL=$MoeUHXXRwA3h?~96}JW)j;>fSXm=Jb!@L~ z2>~2|$vh8$Z`fEQzxt@_v8lZYz(BUCzB~WAKadFK18T&S>US$_`())TzIgtr>$5G0 zhd8QuFOM$RA*kR~s=Gx-A@qyzOIKu~X(MZ`ERdOj8EggG2$kZ0KYjnY1^@HP|9U3> z?_dA@F#OLp^?#S-|1Qb@Y*_!lo|ZtVKdxf2z?`+96%soB_p3Z4bpzHHAitjyyvjNQ zyX03M)6M?yr(D-LX7 zfY)Eg$)6{PTz(y-dyxEM+6)3)eFRJpTEK{ETC@YnnKHfGIKaW4QSoFWRs#=XeZSvw z?8&c!Kr%DtgY%KZbN)G!D|K2agmv@x2Xev)1~@Z^Cw~Ls=^Y52XE5J_qqxwbaSAfcBIziyqVA&hkdZpnUj@;WdT7O?md$Hz+y@_Cm=KZbwaU1~%K zAH&+?d~??XsO;q8W{GJO+&=1To;A-2_kcnHb5RfSlM^;Mo?(lBtgNn_#J?;mX~azH?8@^wh9hF6o-<$0L5rXYw2Hvvj1Ft4eGe4w!&Z7 zfdK7iywG3u5$?yQA0jh+Z&m;nP*tU9Ak7}0p%4BMjui~AaL?(OgJ~Ea&?&2%<@pC* zUlc|Yv7rT%n8$v8=J#(#JKN&&Q$5BWp!L7mi1-H79Hjep*@#*WN%8;q7E~&t>j08C z0Bh1dC2MfQ*^@*K51FRdFzAtUhEx|U(io!Kz2jw;QU3e6z}zDY+-B`OW)zD-^}lVfgyr>joTiTyh`6 zlh?tz(N~cJaOzUkg3TmnkSw({Y;uEObWr^VBChjg{6CgSG2+FL+-U$TYFMMunXz_| zqJO2;KREL$q92sCfkY#rXj@umRH-x|5b`5V9vw~j#!3z*&o!x2TvCRLn0fJ#x4Ozu&gWb%)v36d7e zF!pT!`T>jzmQW=J{5?@|}@wIekj*d*y(fO$x{UIhnZPdULq$pOsl6_l&IV9Ko;0#G;!j?||R zRFYS45g`lhTd)TKxa%|d0U$u5pQ8H7t&14)2g3QEXH@0`4h-;o5TbSG9A)bR%Tee3 z^9WJTXF4KTs95}u=KMp4AdMKCjh5)9at7uT`}^Rp*_-u&z=)%m>o2_P-(SrT4pL+Q zRvB!vc7D`pFEyW31HTS%w!}BCf-2@$L=&DK;4PVE2#c8msx(vl<~&8F|GfUztPpG` z)N4$|_D-;Wad2;(uY)aF>y5-IKt1Z6cd=HcZL&Us@9skoSp28X_qW9rxJny$A>-3k zKBw~USpOdn_doXYe=NHqg119uS=GI^?6qXt?#LCt*= z?k|Sn->z!l3Dz|TSN!jm)=)_V8jdTPXmh;GfawY!0KvAc(f!37{rfM#z;xZM{3r$? z8=yy5kSk8dLU2z2QhyTbe{VjGISR@D{%c7eQ#%h5ysA+X1Z{yuMjqKaP<)&-d~K+e z!Mo~Z9>Mj$o($0KbrWsi4Shy5=w0RJktX1A0A70wq>jG;%;@;9!r|ZddeCBm7&*vy z`r{r_|)4ej2z8;6M`1i2cUy7*Ik7t{X06 z^&iYYuzC!@fr2(uR51U>kN$PT0-==ys7VjApG$;bH@JhXonj2s*9_x|1!Ey*F}A(= zWyk~Ipm+^os0@$*zYu2JX0Rhsz5=r$mDI05XMwT@a7k^c>Bz=aZ8Us9H;XB^f^P@% zx$AQuq6k@9w-X?3kgEP4UBBN}NoU9W1_wbI=|@Nt{zD}sM^C6NXO`IoTC)G#85A!V z{2>cRh_4B5gF7G)(LSq44&pNO>UU9A*aG)=p9NbQ1JB6oIrUfe&%}@eeww;2A98K~ zAA4{4mF3!ffhr&Z(j_G!ozkI5OLs|wl%%AB2ofUQ-Hk{|BPt*r0!mAYq=0~kAR)q8 z_kLsJe#iL(&N#m>d+=ck&vVDR)|zv!Ib*f@&~WZXZ8Nt*-!tpZIvD|Yi}bW4V=D5u zINy;bw;?XBY;}+ls>CySj@x%C>LZw8$B|IZ@6NJ_aaaqX@&c!P05{2)wF4H9&U`Ft z6v(_XzZcPLB^m$yqeR+#d+_CgwYGeS=y=sP)^e*8=rTFvgtHmJ@!op%C8p&omu!UPLiw~^X}NsOkSrxh!P;&A`w5M<2^qG4 zMb^o$xzqPn5ihBxGgBWHKAnd?H#zjgR}z;dKN8HyTTa7o{(x;9_T?I3#_xca>K(Fl zcI-R^4obB?NEkmGJ`n;lCj6P0hK}hEs^@4{err9fDM~FHRrE{4?ngrk%$YJbhw_&2 zi$<)hmZ5?AT}Ay0Jk4vs*%TgG8l^_)k436$#;s>vz~kiIMX-IbfE8iKdq{SvTNO?RJ=fjxna|>-|2{6GGJT;<(~nco;H+Vv?0YUOnY} zNgHYkz6Y8Mul=95gEzUh0He^!RmrNhyGxyK8A6ej+LFAGj&%+BMKr-e5%94LDJTR& zMElQj;@>J^2LG=GZ-1zcq{VH0E0SS&Lc}iEUOx)C)eWY?GFP4}$XzNShAt+%n^8=g zi#?mPgUYpsPP<|JE0};sH?Fai>nbj|y%e@!6o#3NB*A2V2prS>mrB?r%c8r!+mE&L zlGbR9ArE{aN+E!s;hxQ^tkw5umujmC{|bj<{eh)%{QG3q_md_K$AIh=VYH=&7&unMYX*M3pTKm~l?nf#4u?y^AqD1w^rf3$vsYM2i7lh*xCAB{a` z1CA_2+mxC{HBKbKoiQHg?9FSzVbRKL8@ORg21!So<-M zJ|S0y(_aw(IdcO!g19lT-t#ZL@!roIw|}m_7Pkn~r3m}?O;QRZcHrea{`Y3Ow?zXSUgLJWOjtM(J-m(wYmi+nDi;O|O4KMYRLgk?K1 z&oxf~6wTi?I3ZxG!PoL&?3v}i_nht!s(uBVe-E_HakNDkX~vl56vUC;K_ITkN*RLkRM{C za&>5k*RE}e5xdHvXHoY99AL z)L3th24RaxYOMi%Oqv3s=yi|q^4=bsQUXl=@$ zgCC;6&whi1ccKT*?~lbQbdr4>EoFiy@*+)m(A;6DPgnQwCnUH2>o^O;`8uOFj|fl1M~$d-ta zK6!vVAYW^7$mm8lya5quk=Gg= zbQ=ui+BD6@A+N!8NGW+IK_Z_(Bluj6{^Tc1A{?(xi{Kz9HV=x$u3Gvv1u`^? zoC5|jT+{2(X#TPf?>hs*^q0Mlx&ii+krgfn`ZL|2fArP!9PU-3vbn4Lr`$@nYRnb4 zR5vNt+YgB}kn_Bb+$5X_t8Zs`%z4F<(xAB6Gpt_9BTh_a8S?+ghX;d7$hRP&g6uYB zLK$(Cn=OA=xB&Yb(${tYo@~!hqRzk2HM0p=+t-_ZRv(w(+fOb&JXOlcUgaB0f+FIu z#6jU4K5LQ9n)UL)lJsl16}ID;nXt@f%o1nC)DL z>PsTR&blNtGm;i}X&e!LbwRm-Sk(vKEt{%lZKflv7k=}z!A-2#I`Z@trp1g!0Fype zMyF|8AJfFK%;P!9C{)5J%Eep=3;oR#&3}!Q{zc_LWO*zgo%%Wyr0hXm1_n(D0y-&1 z6k$vuRL$WN{UN!ec)e8oShn@{@=J0`*v;pi^|CGT`cr3MRX1e$>*F5-Liw)H6F*yl zJcS-XN35P#;2SwrTN`#@iRcXNIEah-V8v=(z3|7Ts$K^P9d^ZR~xOiIUE zjXK6Vq83cgxeIOa&+~E-5Z6xe*jLV24GsaJ#`W5rmtL0i)>N&_fwE4*xi}G{k5V=P zJdx{nHHeJt%j<0XmM?vqjGLJFAPkX`3F|+Im8k4?fbTzs8g`fQ=^fjE5Ue*0d>pS5 z7YriO8TTS|D4K+c-ih*UpmJWBJAChfa*0wzDS3g|W5mYqe#I#5fG-AKw`$`}3-ydZ zdQBEOX{C|ve;LL9XHvjGS$jcF%Fo-8NPM%Fo9a|ACLcEt?-MjIlNXzidZ)YRJ#HNk z65(Vtz~~bdU~0bW_?E~Kl2xO)G97fPzQ+hEb6m7zk*U9QHH^QO)mTvlzmp+aeUR+s zb4=GKXneV@a3HWu&N}B8Qh(`>+ZF|Te;?Zx^j^*9@pN_p5hOf!)J3Way9RB#9Xc#* za9sz!cu!rP$h(0JD-V8iD|Nqg+ik-S<}D?#j_r%@Hx8ugGSyF2h< zs-Nyev4!-_BYMKY*c)}W`IzSRQMNf8a_Twikx05NaeA&wzEzQ0LdS-=Q{-x#s^X2Ei#icCgT;;hpyN^<0vJj!zE zBL6P+#5lup98B*oq!>bK(nl~HGDjaOnC zH>>$kvE75QpNL7L^b|U!gL+fg4&m*p=4D&~BdjVn9ZETsl_{1Zst0x%drfu$?%1Dg z=49StiZBS6)gz8EVVtBGxkUR?GkxYamj@%z`>$%mVR~=eTPLcYc#zxc2UDv% z4wAtmh4Cqcg#eHed*)ObkI*6e5!wgqW5G=F4b%?L5XwT!T9_-&mdCzYB4=oDIdvLF z3k|G2K6e%TYlGMXMEnOG-VtxDREvG?K=@U`jY%Fw0@pA?uVJ*c22fjcc5oZv&N7h^ z$%^StEiiDNO{|6<;xkM&(MvuPQ;H*9B1CS`;^SsRkJCIydN zWZe4^ITHFp{03fUsXlIb7`m~L9nX(i9E8?lrMpzjYyt_?8lld+&la{C9jKlv=Svv9 z8!ikQ5#w(ysYL=pW(2OQ?rC}x7%}Q$Wp`SB<)?nZ)UzKj+|5Fz7dUAV(nV237K{0w z9JgysVSIcBu!-DuNDq5fhm%*$tP*pPb+MI~hk8T#syJ~vEd~3uZI!6t^A|Y#3yf#s z0cBT|g9EFb5X6u8ffyo_ad>9&JDV$Eh%hqLGn%9Rk!xZ{dcwJs-L|$AC3mblKd>@U zmY+s!*Zt@%_q9o=!>Q(t!=Q~B4c6D^SYm3$$O_er5VGdcdRXO>Kwpo^rsg<0V)yI0 z!X^pxm?*D|9Z$FnGbYQG*d}wJH(BcFj%``A5X2tQSl9&33pn0sA4cO*U&y5pYge~A zA$Qz^n3V{ZVpHfG3@I+YDpq%L;qqC{4OZOO5#3ZEk|D6B=wbLldjYq;wJZMyu}Y;d zPv2Q+?|_9+82WIFV&#c0_g@^JFzolRarM9ArCwL-`6Md^c3>_iL}uKS(llp_tG{GX4{ohK2?slr{w8`!uggBhvQrg1v{W5K zOBZ>h^LKUsyeQ#k?0;v7UfC*$k#*KHNP*$Du_J?8nN;z}n3q`++6pUf;i?})oEa`; zu@Bl7Wp-@|Zdg@CTssu9u3(9|pJ{D#z3^z*wxd>(bDemc@WNe?u0|3ZT7ENRmbR2< zs#WDjSF$Zz85u>}=b(DCS#K!+wFHxwz5b%C1$J_0)dKY^_k~bq>zj7;ukC8_KAOJM z!`5(}4xCgFA;wsKSKoj^8IF$~uu;6RTU+TCkAKrOBgZHwBt<(a%#uy z3#y~1?6gCoSzx3$C8%wUpEz~wm+7VRRln3?B8*kwTicD*oF{qYv6>~W)#zi1Gx!rF z)z1vf2BD681!9BtP^#v9cr!!;T^_6c$Pt!{nWTxIci3e-Y8Oyo-~CL%wFPL4U#lEL z)x?D5yiAj)`Pbj=2Mx~dv6a1 zoOUonn?VfCJAG7wtt8M$)iQCrpQm-JGmrh6YUez0n4bHKx5vxZ7%|621k*kPs!FA+ zbdP(+M;h1i>X2wrF=p45`$yVDWsfh6pF#E_C{belqt4}KZefsMKDqKDWvm0O5Lg;L zZHtfWWBcxDsc7WH=^E0e+M&+)<<=Tbs{#jwK*PsOZ>%R8TzRfbR6zcaNZ9Tr)iVO_ zI+D?sagz9sv860xnVPTj2MIo3$o~W(H`f7KD|)Vaq4sTxD3+^%lH|Zv51^98UZyw# zDNE2QjZt44a8N#K3%TC+UcJ9se@@*dA5)e=4|~QTX@h}HK(hAR6#dna63hoEHfN6T zmIK=tj`g~Go zGT~7lV9H*J5s#R&Qjsk1~Mp5tm= z4O$`<1pwZe<pw6@WEQi|?LP)#u1%Q-bNvzFh{P*Jr#PRW2m+*!mC|dpi`{q@+`c4_aeGA_LpyOfPR|75wj+h}3YA>KND|S>hwJMj z6VDbdNMAv7^&mSkE4DaD&ae!eH<+CpbJRys5 z=cwcE>@3!##Gs(!%(E;K>N6mCYtl=#=Eh3yxPxY^k29$GFAYCGKnm$^TcLa3kqCfgOVpxqS7S;ql8cAc1 zIr)4wEF8EeO(muA#~1NK>ta98&nh*TgC3U|W9$#BKNnfCF?t??DDNW^yF>dtU}JO* zjF<#oV^^m!if}^Nn<^={yVzz%q#VOKmL#S;r}kl|L-q} z|96$oFnZ4drU&~XD-dn_8?sy|g?<6H;8ZuJ3%h08aEvxU1l&!?-dare^I$#$Q^Aj) z7iG<0#T7!VPN{&SL&5|*FPkbeDlRC2ZrP=M;rCep4*-0! z3N-col@yC82$nmAj7+Ju#T1xdkr}pe?kTB3$U8*hV$bo<2et)Vr6Aw14}`I4h8XFe zApi#H;z+;QfM!^l2>$M+@WiBlR*uj4N}tp0Um!za>M2M*!nzO+@$$C|;dF^qL(e>I z%MwrbDtxP&zJtJna-jpjfN~_mHw1-*@z3vWrc7|~?sjuP*FG2`z7{S8zAyM4?1{Y8 z6G88TeHw9KEz9Bicr~;-;)1ximpS_w!Y8Pnyxd6m57hGSNeWvYNuo_R4`Wq7QcN2K z?Y+{n>WxkQoMVE`6Ohbv!0FfjBSA}*d`kk6_`=>19|P#On%fi0AZ7Ot79>7H!hsN> z{@@f zpvdoRDY#k*utLs;_x_tXPSww_2As14+=I9Ff|#OasQD8G6IrKD)&vCvvb%NVK?Bhv zkoA#*`;08&uNTa&|5xzqnJ>#k=Rc(q05O6h>mNXh)7^pm%MU(VZb+^%^E^YTG|hvF zJN?c;!gcZLHC^vW10Xl4AWTpGbhk(xN24t7%r8TJRAxhw>4{JY0QI)B3oaWlDV{ucy5#wKT88lLXNrd3ru@>k?@~W=*Tjb_P5UB56CZt+ks@p zUVpF1UalP{y%O>i*j)&=Wd3-JNFrZfw^cKJxSaUGdxcN=*HXM1bzQ1M?T~Cl2=n^$ z$W@7d9Fek7=TxIJe@@N_t;m9=reGqTBj%A`X(f-IToiOv>XSks zCUJ_OKz+nG@6|&W+z%3m4A%^JEF3#z)A0lJw*l+2o$E{b$1P+S%xZx-T+Tpxw+>d| z^0eB*^JgGFLlvwo60T-DeUj9>HMPr5UwVkqccU!^hdcK9LIiYviF!$78uh;l5F#qVcCoz zj5-lfl+@iAZ?Tau8eAV!6+q%Fcc*|Nzfo89uYJ=qH}8nv85+9a_qPV$3lefQd`6i% zg;ey2E{Kc$nEz-!=oTFkHL=K+jVz{o*K|9C1?8+eLFB7X1195ns`Sfl|MQN0Mv`XH z4rRW)hT=PYj!vipSzobHK-1u_8{DIQd@ygfk31{3_g>S2~N2)ZAQARR~Jqbcp6IV70{l}Gz}0=MvcDAYqaWa_n3)%EBXGM0#knjTy< zcf7{_kL!UQevYYJT_G&HU>KpfOxGUd$PaHo)iE1^INO{12p12lVX#8PKRwrzEZ2oL zTs;S05lM#Dkh@X`SEn3i-nA-yDy}}jU`H#r>|tL9yXq#R?}s5CKUt5wXlpA{B;=u6 z$2{!k-BIaQY)m+?mBQ-IzN2u!nYm-cxI{N%<|Y!0BL^};+PNe8DRPl#{>n)CEY$uEQ@ z`=EnaQE?JzzE<5g^SIh^LD7sNGjET^DoBGr0UW3}a3qX`Zc43Sv6l_X?IT$WuNP4a z1}IK}VS2n1pB;gYZ2a^fu}jUsG@H{oictL=Y5WTO*mJ9E=@5)^_V1Ei_2<_p^pd&* zZBDDWdq}=J;e9w`5W10vU$+siW3yIY(jLI2wm{lC_i=Sv52T}w2qaiO&1K$s1vYpK znuf%~brCCM@uHC2^;)q0UkSDUEs*}Pv=YNj>dIl+Py@#0BXkl&BRO8KjIDeteXyo2 z%^Lzmj(2MTI*#?xvfQl7;-TM&bC00XO+>{SR*Dvx`x}~v+m18pHGoWavvk-y+N}Hm z>B;Bdq5QtEyLuh}5I5x9WZk6P^Hy+N`wk6(n0x%f7m(}-UH51eA_@Ju0xgbYa~(W8 zLMtCk#2-lhy#6plyhN6(7www+kSo)r^>=mgk0$j;5`dk5)93cV_SbdOgSN{jkcj!X){p-~k_{(0D`Nt& z7=07CWz2HN_zFZi?Vyk{=UU?(z?_;H95EIdjfC%=c zVV9S{cx@`?qe&zf8ATjPgK?bl)t-U`^0)GP43`j`3~3LpzeIA^38Jm=gL|P(ydf@A3ANG8#qyFF!y8(rq%S zY2ZLS3tOZH_16R_E5w6`9lg$g{oFq>Ki>;hxoCm&a7)&v{y8?*uH_H8Hy;?DX|^LS zprlCY8rU+H2^OG|4IRd~M<*WdH}5yuz3?Zv;vw_YVovgjybs%@D$aW{!MO7+3_3o( zy7C#6Zfz{?`P|czK@%YSHLrJwq>@qn=>yk@zP%HMZbkEOa_f}yhajqw5PVL0^7G}} z0WeYMxL2s&WKeSFl*!-aF(CLKt!=52#e)gYtDUKSUA+Dw?;6^1Z$#`eROR?=+M8Nb z&1N6k78HGa>Fxe}_px#(7Rh2LbJnWi%Bs8NlRK&@o(1`QHgoxwpQKleN)7iI$iq!K zOqWx=LHaSsh1v-x=#&C3`aoflL74S~(2Y9QaX6NS>1uS}P{Ccgdj2ekY?0Igj%z*U ziJlQqTz6TNd9|aF-5a>!xVa<;*1=< z#v;sf6Rew^p1(yB)IHBWuj3f_593(4IQ*(iBc^7efclcPoc|3n@u;bsd~SS64fA|` zkVA-Iy}5SrRh_ch+l}fz+^cupkC2n8_a~^6C@j?->X0oYX#)nKLvY2H+)Y7Gg^+6W z&9$*lJS6*OqQU7nA&Yxo1||MDPvbLM)E@5;k-j9Wk#%EQvOMiz7He&Iv{BV<6Lka2 zA`?^>xkkj|3fYn}$r@x$(R9{O##7dT1B0VMV@t{=-_xZvqskhW_XvhT3ZW?LkD96z z-iN)l4s+F$!Y3lN3}$E0CVvekiP~Q7@QCL870~_lT+i4I$oKBc=biz-0SY$R@A0$@ z7TiW`T;U=LdFYWS8Lh!Eor;*hN3$T8G0yU;f5k z3-wBo7T*Ka`vcv^8;@X4=p3}Xb!|L4dIt(D9~|37aU>V)03mm9R}WMP-;VPL zyi|<`wLo*c8#Tl62K48ot_IJ17=mfx-r1TL9)WP@zN01E1sqZ!{sucISxE+^!f`2-j}-kb8_2Yx^P8;qLddh_8^y&4s&B znV|yx3=VEQj#9h)wH(F^hjSoQ0-f|M2tY61cZE3*iw=xEmSFn6we0csmvM8QW`!^# zmJR7rBv zk`dfqctP;IuDa}Lh)UCb-7JZ*!^z#VRlELez0gIy{Y48Do11>b;&+4}Y;A$GsQ*=D z$Iq9s4I>CQA#&HDVl!CYk?YOvOGtSyZvhmApTa}n&X1ABi&CnjkFVGS>`LvICF++@ z&A}lw@W&xUj56^VW1oP1%=GvAZPs|t#MoEYxDq$6ATs1pWTYP88Ury&qr~fAs2op~ zQq1x$b;)3}WFIdvYn=N|5ovPJW<~o>Q2#Ahj~vFxO7yHZ3XLr=5WG}`=4PK8NA^_lR6&pMaJ1`+C2c|-LoeS>EdEp}(ufGrg=BaGdn z-a)Ki$PfnwN3z)6T?YIPE*eKt6VE$dxn%V`Xm~qrHYst*XNHh2p7XBB-MonnM1|8G zxG8-rnq4jOQC(vz@=S=%F6vqA0p7Qfgs!9db+raSZEii$QWYuWk6*X7tS!3vb$fkm zB@KH&_Q%>A?!1S)>Nw|g(kRpR@}tG3yr1N|?SZe(o%ftnp>lU;BxQSxGE)&>*x#X$ z5|g>mg*d7R5^}rA{jyd}S;Vv{F8FDE~SH3HJFN>;k{o zg$SdD8bmTZ>gWYH%CFgY7$KIGKAy*09&g{kdcw8C?UqSA0n(cRiwNX>#au5j#fZp& zG-t|MXt{D_P(gKQWCxmwucHpiV+cwV8hfqw?W@A`FDzNUG2q~RAlrp8cWrb9aQ{M; zuIyGXGGqBiLrnfXwBo_4TGeOfKeI+cS_u}`L-W={#1YOb-9b03RF7Tpwl8?YbTaan z3>S)a8px&dQ^Y;sew{-(&UFv*8L{!(N|d@z^7wd>M$RH{(%p^^cfATH_K<6<_8`>J zK5ov~jz+mmvO9I@2ZyTP7f~KT(bt_^g}l*R^U+d0hzIIxgGUsHC#!^A-=_qhKi7NI zJ4Ak)kK3v5+L6VM+w)s@&%hHB6=(>&W<&!2X&>9#SP4hh>DH(}>0}foE4`8*RPL)s z;zlzk)ciei)fF5CwcilayZ)uOs&(p9y^m{A6EsnteKcCMlOBd*l8>___eD0$MOd6I z^h&hwLI?wSY`B-z9>6@$0+SxHGy|U}mkg89TkxG#6$e<hS52ra*Ycmi0g_6qvM*y{f)`2DxULb z)^pr>1p|ThG$L3Z@*{D$e~C`FtwB-utKFO(jy`(cZhxucLqU(jhTl|aww`A=?;L*#p2te%yoo$_nossBZZ8)&78c%N6vDh$ z*@~`X%OVh47bEZ>otRKwK7UD$(N}Ws#iNotT6d?M721SJ9h}Jtlg^^~ zO1R*(M(GcRa&Mb}I*sU(&EnpcEXU?L<$9^XStw?&bj|8^7Js@uC#*cf7y-~`{BCfkCwXs;pard1>QGbRB+7l>sd(wi>(YdF-8unX+7;vD1@`7N8tjN>x-Q6lw5>RE z+b>c0D`M)Qe$_~U=B4Q8)w)?ke}6E3kg=3bYJXR+oa22eS>+hIvAufx;tNBAc7g`b zm&hc~U`}u=8thL^Q^gAQe8|1Sd-g_=`JxR5ncr6o+Fzd~*jOIPK5^%7sj8WxRS9$C zpchVFVQLizOjySj47}_j5{D7Ml?n5bmwbc*0IW0b zhiBSstQvtmkhJ#&?>G|+hAppEUIe$u;QQcQv7i=bqSRe^R0cj(xqN?S}H+qbmyT~`5Xm-FfV;r0RUB1cJ zTw~(Bsv{9%rELC<(sgc$nFo znSsoQ$9##HZcI#?6+h@itY>)NT$tYPjOO=>ZO?o45iosXPF9&d7)0aKUJ!VRi-`wY z`|%!SZob*bZ(*(GFxvpBdMVWqz9r)G16UA zyLMmVH9S(>XdZX28BN9OX6ZViERDZsV@E6jBq&@|Fo|m0u-M%<_r4#BF#G{oKEZFP z;I+`_s2kNxp<4kJZoeAK6$Y+o65I9{wNN62rbev`KZM5Wi|O=D)d?jM2q)l&FD2iN z9H3GaSx!h$=PcNnFum$m(o&`Wq?~llnAZ2J;T+1MUOGc_)c14SB6hKE=z%eBwkvH; z;l$a{nSycW^2`29@mWU*!{m;vRi!_wn&n;k;Tj}F2b~#}*f5LNK$92~TuY3z*Aj40 z4GBPkooZxnnbJ#BZ{a@+7J3WOxnypju*kiMSlNq|3a22(u`6VPJa^q+n=m4f_)xMCNz-F`WG3E4M&Wv~mWz_0Pqp z9g;4)mF_WLHNrjm5^4Sh76~&EZ!ZVcQWfVEh`0*4>4KQq)$qRvik_3Z^=sAZ#u&QH zB|s8%4oJm*q<%mg+Q-l>a?#TbHb|_p8l}lXSzFK7T*I?;Tk21eUhK-~x+m3LyOB76 z5HAPDF^4zV4M{^(iF~G)<}6X^2|VQ!Cby}d32#9+Ozbp%=G|%OA)t-bFEe;^FX-y? zOPqJ1b4N5$ODkG&8BBc$?B;GelW`BYH^1MbMPhq!9!4#vD>^Aut3`E)(laozR2JiK z(fn{1o$$7nPx@)jC#AY_-F7Z{7azfq$X*ty^Eod0Qa#3X6rT9ABy*^6M3hEWwZ+`w zChZ4+@ll;*)e1-^BRL<#vYczxW0}4b+Ei**3_14%1r~2`)>}k(8E68;iFuxX3Omzw zqj@K>qSkg!D;<-Fsl%=3i#osLPvd7Tf~~4NURlt}H{#v-#l{yc#Gprlq;_WAW1z4g zg?s5SyZF;k7^ZqYV1MhcFE#!KjbpApm7zn` zg>TAv{Xd%oEyn6YZAuXcuJx`R<*tE9voCJbaOD|6kOZGUkjyv7YYR{~f(ly9d11xF z74sLEbYzTh6nF~shb-kv6tRrsHATdRi177JIS@5Tz*FA+f`5NIzD77J2J781MzP*sJEls!Q9 zc7A!#$NQ8D{YyUDnI4_cA2|l8I579WFVdWnb;j&D2A$BFisC35zs_3N?z&E{VQlzw z)-TYj;C6fQ9v}njhCL~pAp(LKcpvpFB8QZ(ggl~iv4xRk{-noD|I+?bn=*JVs~s&B;rzV9&AYty3>!GL>i`>o=2_C$%q%HPh}2!{r*--#S|e znlWQW|FV??4;J-vp~t;q94M6tDS_DM`SMm(mchwa=2QU=ASVp&o42-Hla?J(eB4O{ z#wlWi=@W<>O)h>En3}tC<73asxiKV;&8Na#=~$575?@M|#oNZELGs;mGc9GF3qKsh zb*}a!5b0;7d0OYyO65<&3yAGwCh*4?4Ws*4A{Voz=ae_j>?(6BVC1xU@0FT%-seN% z#Pz^sNqL@{zac0xW4Ou?iAFVXT|;dUcfx(LcyjRTVe{ZD+2zXTqCS165Mgs{x@=e7 z>sdPZGR98s!7z^fBQuP*&{SAtc_St?V+3+FL8EvFB0rk;@19=i77rdeCZ$sPyOlQ6 zLxahVlNUQmW;F%Oxw2{5CMtsj#(1t?w7Ls^jS@nsP~A&hjO6acJ%5ZOirL5_)|#}a zh^r>u#Yk5c^no8A#Ayo2QV+P1qY(jqX-E2+nKPWF`r|(Uk;3_vS;s$w9}qs3!1Oazp>J4-4az-}PVf4x*0S4vRlL1g1`Wy{1Zw1xD>3sy_ z;_9Qge`?(ZY0hh2Bz?K|G>BJ0Ok)Q9cD0|MFYBwRMbaZxnQD-zssi4NIQXg$aBL$2 zSl^8BCfw_*IVqpmO3O6M{@7bWt{E{#%=MVsm3WzNrMTBSjJB8Zu@8Ov7+z764jo`| zPZ#nruQay4z07OfwTmqJw-&Pgv91Bmc#lvDm`nkmEv1+&C_yB0(`wDHmJvyKLwF~t zVc9FI^ir8Dur;Q17-@cm)7+qN0Km7+y^S-~;jatb&M1+h(iRw3HxE?CO|ZWm@=%2( z?Kwc+3trziXa) zn0*2sOlgYoiU0k;erRzmP*cgVK0?(`P4poK?zk#O+C3Q=pYSj{xhC!?(2}8O#D^zy zoE6mnB^~iYLl8#w26Xqe82}lj-mAO5Lm(A8N9ZwqU{?seQSQw@|CK~&3*sMS_YovT z+OJ1fmpuBS}@@N?>dI9=QQcpKa~7`{b6;Cm~rk=F40@R zh&+GqeGCo+I|P#M_xRPj!%D~^!8hs8@H&cZ){b0thHcr$u$}!Y#_aOnN5j9KBCq9aM!=nc25kP?0CxNs%tECySrt+X=OB@Yk9=kLAMX*oQnd_~ zpw7wnoliQ1Ca`uRZUA{}2hpk)2xQy=BZ3mOMhy}xhr#9;^w#{S>m@$d&hkBfeI^MS zGz3o?TtTd0#9kwbgF~5WKlcgZYVqihwE%|b6p$JSVEjBk$n{^$;;$q-NqrC`S7mYdbFZ=8N7KD~ne1K5s5zxd! zopQ?=5q2YH4%n7_5Ni!kh#T-G*tZ{-*CHb(V)1y{LdJb?N|65cL*TuYc{+(Bnqfwc zm|;OoaR2*z;YV&-f6!Kid8V^mTYZ8W#`fTDIF&hoisC!0jZnxgUUA2l-hfB2Q;=Re z3oM5%oz32U!obmBC+&0tr_cq#w?G^Jbkr7?xvIP8y06^;|g~W{6;rQ{SYWzvoa8utO03Hl}lG*4i?>(=*TJXOUXim#O9A( zLHNzl`2Gk=ow*7g-2eu3cx%U*@SP-b%p)tk250l1?bxX=;QiWF6Z2^k`w_s^L|l_RchJJb5Y zx5&j8hB+hDc?Xm#p+@V{1Y}Y_!ElOSOv*;rN|yF=TaWg&NOhcIs!A!u=N&PSz`)_T z(}tFS;GvsPO~`ZUi2pVl{p+@xv7jLnBD77r5cZ}AdJc`5o_rzVDvU``IuHmC@Q-L; zAXIs(gkTnX!#!hxt@mPYkv@bjJV@*vnAWPIKja^vL!mliAUV^nAV?9IImX;548Fi=s?%io zj|cEPW(2Okj;{WN@=e%-BwKKX1xh?#1qO}8!%#Kv03`s6AMM2n{80yxcMS_|`>W+X zRjz=`0o8(YLss6F%Q2`P*}^(EdYnfQ#aE}-Szh(8U%+jLh6}=w-D)sI%_7hk;hp~l zuuzTaw{FnUQ}8iAob%ml>19G(=EC-O;2PZe4M|kD|L5qH0HYIFAtaR$pwC33H-RSu zIlZud17MW7vE4*16CJvRmO=N5Iu4GNPYX?=0Lp5=2RSI>@>2Eb%nbXlix`1>erGN> znP47>r8&zEo!iEH$f+|vh`1B}EHJ0KHZ>)D=xa*?v=hb9}@0%m`To*$sh zL=*G|Nvx*O;YL1q1<<_3iBj|kf{B9H8Xf8{M1RrYPy7$zC}f`y9IUDNULVue;;iZ* zv~gUUo{SF+>Ox$Ids$Zi;(+Vq23G26Fr&E0T3s}kzI^Q;ik6rb7W@|N;0L-`J0fK+ zp;FRJ9^Nu|B1ahv;bc)V5CfYxV9+!8S3o<$@vfHYVyAO z&7dPx5uCIH*8^qW+0C;h)Zaz=GYJ1LVO{C7h=PW~5k$DHA~lCw$k718?H~M)p|MXh z{OPj?-jms&s)uS!K6`j%E&Tra$rtg{Ry`y$1d*J7`!(+AQU%uAJ2u9!hw5{wD*x;g z5AF_G;57u|l=xLYfH+q{RL(ZNf=n^{uju95yM)05zfh2mpzdf3h zzCdP_MhO3W;o$_Rd!}Z3pg}=wdye7cej(VEg}6C*FA!xvZ!&OnI&(<3bcdar>PB4L zz;n&B!Q*%9MVg2!P3XURklRpOUI7xRgIRDkGfEIaHtB-iz&Mp@TLTIz{#x>PjCwpg zT}MDih!Fc*$n=2Um+yA#MIo|!U=f-K($;}^7ztiNbi3jQt$3=!^MPVVxTSsH9`D~U z5v!E0j70qbY6KOFEUHfqNEbaOVgxgrQ6_-yh)iOAEX(fk_i$4xkjlXcrB-CZQV9>s zB4Q0uEa`aDmvQwzJRIXDg@is2-rz;U;zW?v<32g+hnDU9nz;KXV8gZnz3V`l>V^7q zG+-Yk9O+@FUXDQh5ze2k>0FDH830j@N3&cM@RAOzJFj9v6tW22GSzF#3;)rwad%;Y zeaaOM?(M6;0KDrlutD;4z#l*QB-Z>+s_1BNEcX^roC4pp5I9l7~$$Pa08Mg|$g`&Xt)n&7G6OPDg9z{{yg@mK#{v38YBm=x-+ z9DcfN;s( z7X8@gx#M8*4$z@_m%FW!jdiEdGubKd(Sy;SM`pZ-KWFTrj;Mi)mSMoxXRp^2f!jGk zXjQ2F>3DHAnqA0&;Dae1XAW!AiSkdswGg{}VPh)y22P zgCRX&B2+Te9l}rD4<@dlllmE1mwRC=L-MoIC=faypc)!nG=svyK z4Acxg*6ik~?&)dGddVKLsAA7yW`}B#r#~7N_73Vr(?I|9%SlipN%5AdXmeg|aeg=6 z7}U80FPuuch8EUfrnHmY8j)V3hmqdpE9XfZQeWUKY+ov_f(gZqoQtzq%*z9tj4yzO!F6!YK}sNpz_q z-28?fh#<;t;=<&{{Xtk~PhPtHb2UGDC33d}GjA^kl{XmLcjl++pPh`A>key}7wIiJ zX+DA6MDQ^$vUmlye|l6eUqzs~_Xb(O>}}qba)ENnxp?<3-9=*{eA2$XoM(#~VD0{| z*Gaw_ZIX`O9kT229SXV$PD8;yA%vvNvy=XXu7IS>ck_%wVH`axlFP;}Pl_?kM_H)p zoEy?;DY({U<#Fp03JHcRDAdJ4AjWeDO(Z`*J>KgY?l9KC6Kg<@Z-bK-}x2-l2Om^kV`$-lZ)`} z$T%lW)X~m%>lWQ^#k^gBgJjqv85$0pk826{S&b3e$=!~daIf(`o>9|_iOJcnkE3(` zCN$2Eck^iq1BdP2mS9$!Mif`KIjrC-Z3UG*aHuhWjhvKooLb}@?>dZnB<6l^dARis z%s8uC61+bVK2{2k47W=7UAca>@hFAFkhCvemk66?19uyA8G40k-5 ze_Ua30PKggM!Us09$l2J@MuMgifOHLs8UTtKyv1z7RBS)mm^U}j> zV{P*G0f@`tgTs?3Pl4N+HUFI;BT)Q9G<%L1J}u$hCbB$1bZ4IYxjH0~7liqEZN`XP z8TeZ(>v*WPEFELaldvew?|V7E#v2YI=T#fNgnPB1sM%XGqG!m={JC8~OsEMC-97GG zwJaf%LK5$)E_mMw-&(>LAA+p2Ix+Qr!2@;B9A+z3O*(e`{T>USYdexIya&G zE}OM^a-ndF*GXeSY1+A?O#KJE?7jR#e=nwc%V6fDRV@cvNtDP-e?+5eU(ZbNzLie9 z*k$jSQKq;mD@CNN)|M0%0P9Ga9Fdhn3D1Ovi|)L+v#aq)=TkOQ$ekzw@gGaS))UN8 z)#_XH>^IosmaK<3uIndZhK6cfqsB&C$Vn+Z%8Qxet>RFxn7G`fv((}3^?PGFO7}*g zYNDrlcL&8W!;QU7gJ@E!N3CGeU-}|49A~( zdkmT!PosK6cqZxre)PcZaL~um!8jbtQ6qam5O9-AK$2?KHZ&aNNnT4=*~Du1N{6s( z)~VL_x2H)f5!V$`=%f3w{Dc8SCjp834Yb*_=X+J8>k~Mg964>fZFR=?k>Ii zZ5z-ZY#-+DDVZ>eB5gf?&;1^0c-2o2qRIxft3Z|7no% z&1MPNAD(2ZL~`&;+UYrT6NCp&Fo$%8C7;5H^PqZV)YW>gXDT`hPBPCr$;S1&nWk6< znvRp|?Y|y6&>-$-&(0sCT0HCxvFyfpbpGWyzP$^;JUKkSK2ijICagbK7RjM8Q6tOs zBu|{IIfT-oQZlgZ^Q_onJ^wYr%dxp4FdoFO4B1yKboV@C6WkEh@TfGuYoWpV)o3n_ zmZ$;Ly6yFSIJ$4IQC(Uz(VH26U$13l;F$O5qgr!?YMxg)&4QR@85x?&GIJ0mT@WS8 zSeKws0Kxoh^5aAi>FSpqna{#vL3#t`VWG(+-?e`v)O*)n6=9P8ymFgx!kI!`XJ>$9 zdWo;yDV1_QI708!OYLm`Rgwx_z2VDGbFKvIu-`s7UXN`Lzwr3N5*{{1q1xm3Gd-}h z*Ju2L`v)b*y8mdS8txspxkRn zF)w)bsH25ShA5CBl!KlY8|5%w^L`SSY7noQl&pPgNAFKN4x2*3hlF!241x0zseDdu{XO(r+A}_-dIS1W#9_lYDHx zNWJJeqoC$`X5c`_wc#Qs(SWKH20t{C5ZlxE7RiT@Wn}9<%#wB7&ps?OLkzBd7uFBU zgAwdJV=E_!>P|$(+(T!?%fIN>alcgb`Cf5B`}e?tbDC=zX)xq{Kb|S!aC$9vabY&+8)2my;=9(=A`B%?6v0 zCDQxI20NXHaGPTyT+AnZ!Fo)g<*NFJmIx-*CI$zGvk-i>)AHqFolFSTrOqeAW1k99ddMI5l5tWITAf^8qD6d%V0OP?;fhsL$8WS74qL{;jb5 z_J)r8EDgp7$uZdZ`b^dO&T*>V{$Q$^HC!k)QMRrcg;Dd5lN!}T9Ie$~Ny%Jrq4+h_ zYmDnzex#GQU`|R*-i50v?ga}aw;UL0_U$6Bk|JX#fRKsUa-}J60$RpTS$J2pnr_W0 zpNq!aUpBx?%YMUQC_zp0_J80`wrx%)&sdt|Pz%TE+OZObk3{Rbje`9O{+vLY0CzpH#M>!Mkp*(w1!r}@~XQGC^BZJ?H>BzUH5dQ6d{{uYO@+~+4W z`;xjnn^#Kdri(%M!Uy}L{jXv@4{iU{S$yAig)iXUvM2aL)7ML>E(J@NiS_5=Xkg#h_9X zUU>{>{4#xgCv9A~kgX!0K`U)}s5CzfI)2Jkt!2auY^l^1?-b=N+J7xVqxF5`_H>8z zu&^6t`%8ln%M=L{*|O0!F$dM~tc5X*s-uo{h-n--M6$l(!&i%y=EKzxl~LfaTSm*f zJ~lOjNe5$NY?ygyG=fVR-T^$an*M=V16*0A&oF*iwA9Lsy(vlk*DR%^sC^AfO)3HY zgd*F48W7fD8C;E`J(#QM`&4_cfh6K%X3C1)rDeeO`K>3LC3OH&V)70XtJ#>Vl+he{ySFz8kcgNj#czS zTt48Ou^bPYO+1K`DX_1deI~FHJb8<;Ge59gzDFL$$-QkMf*-dx^aq*crwiBX^UF#+ z;<5OHF{GiO)k$S6S^dTcN-SNOGsQ@Ju-KU#mNmzb zOe(o;Y97_&VKCOGM6TI*0i_Vey^$B!RGboc8T9DmVF@wd{c#TFDxN#I+!qZ8R zTrbmLbV~Rs0kmv1>Ke~gdV|DIbF4rh|H3Ijh+N{WT$Rzw7?^{R3#^^><)Z!PXq%4b zjLgGb{B^rRTv5lNG#sZ}%j}+(Zx5Y&%UqRb$~S3|&LSL;`=FSvVfRnes;B;RR1%V( zP%%E>hDj=Dra4YQYglbysJ_bO_x7!CRGx(%g4T%~UMP-Kmlfvem<_jnANI-y7#u`O z&3!XdRn+&$m2vk}UA7B@N!!PN-H%J=)MJ3N0tIB`uAi})XOlH{#XSV5EeSYOSJ zJnG^GA!}nZe@`LN7sJ~iwS-qJ{)(QB^%Ey!TOp{#Ve4lfAXA7Up&7>Zmt(o`=h8WZ zM-Pn;v!wNf)_-b!8=4v8S?gI?2M4gNRH4r?l4|E9SH&?Hb!{mKarK55*o?)v&x#Gc+?0#PYI%Qk|bQD2#Hh45*-22 zg^+J;Dx6)2N$=?kRfY)eN=83gDCjAhWX!U4PfFw>oK5jZiP;5kEL3l^IlE4lsvU*F z-fHU@#fkC3G0YXx4eOQ|cx5=$QsGvciFZ?}XAvwfHW_0t%*xEBYsyufdHIXo*Mmj0 zATqo?h6qQYfB4ueZ8k zVgEwGeh)03{R&vxmzT8fVyfmR^gyGHPWmV>^C_Gmy&M4?uCakl-@37?@w8S`nog+e1usBPPNgI_%R6Et+g#N;AY1d00Q?^j5 zL9U^@Tt#uvQoifkos;~SRu&^HUoe-dZZS&xF&xjc*ccnmU7z1Dm`7FZxpRq>Tr85A zTd(zHS~|(GZ^rFjPzU*%2?7E&c3P!7-kO+gSNU}#zk1f@LWmgpDOqG(7 z&ouEMWYc0=g`>j5*x=TpuWhI~66`Wyo}mfWBiFS*B19q!5aBFC`u$bEKsG4C+U#zk zrZMp~+JlqyW~)p1P=X#4z2Q%NT3#{T&kCh*!S#IkPQS|9+aRDIazUkoc>`-&wdo$B77)0Bi^uv%`n7qsE1|j1+#|nj^O%olrxlGeHD>KX)ALq-mC*< zBA*Vs8;Vt>@cO5pNC&qxWd;9g1;>iu zzIvs!grLf2cW2Q(9R(5rd7%3n@LlMpNkXd$K7D91i%r*qFJr6&sea4SWhkkpg}-`& zP>7LxwIN4VRGKHnN>^Ch-KrmV>pB6M&7@%a@IxhO&a8z$u5%CJ&{sw+XF8J1m-8F8 z&-sTM|5wL$UQIaxX!RpHa{|@gdyihp7|{F2&{aYhvK?cgmpJICGBgB6kZC{$ZT>Lp z_c8Mt3<;V`+p(kc7YF`ovrZ(D{9mL%7v*JHgQ*+#l=R4k#Yh=k$u-?l$)&{yQjRX% z>goL|4k2RVx|@mPvhPxNRY?h_flZnO+0*CkvmHhHChUizh$F)p$ z=2xz(qDC22SI9CL6i^l?0+#gTMEV4Bv9=*PxvXvqDY^k0cW4==)hBGIF?iqHikgox ztnLCbD}_qlYnM}np0BvduYFz07#@cGJ<3tiT^sfMpJAdOB;dIY9xYCkFQoZnk?U@7 zizbjC3Y11iVs<$+n&CuDT)1ZT|J2o0GY#Ga{)Xi-%d}3U9HLAM(s7J3j1h%jO3V$# zch(GHwcoH?iAjq*gO^}iLgnE6W*=xMqR~@B$E7+Mq-q>)p@B;z7mG!15+oa?xPq6c z2*Tm~v-k6Zuj|wGhMeaFYdzys3qx7^xcVH{(;+b5mv5ogT^02b-5M5gv5?fG-Vx|& zMwQaEf;vt5N_7SvquXug>_czOAw#gt&S@mQB7`ik#aO!Q~-uEI%oyq>}mL1sa0AKsQ8BV&EX+_AzxcSC28D21P6Ev z+K{#epQ{VnYReLINCh05K`U1n+_{G3mvMm@t0ySsvB`Jq=s5JnY6z`b*?4iEOMRa4 zoBPAwgMN?@bL1e>dxIa-Qx2eGRgP@^r#0w>0S<%9btcR5t+ZudhLyi8YiXDYsD@}YWSs!yr3;}rAM7Z-|^d8s}#!# zd6Rq}e%RaOnlfsBxO~C*UVSWUbrPp<#OWk3$OgP>DD6<~7xAP|1_V++a2UZyV1^tJ zxen-0NfX5m`0jf3|9CS5Xx~pv9jVgNunBZ=CdzE(ScF%(pp8#dF%Z`~N)oiFH#9z- zX4P*hUEK(uP<5fAo3!tll51{t;l9T^^;E>LrAQ~;*Fspq|FEQk;AQ4-CW0Fg!Kc%T zLc1GedN~ujOi7$n!7jz@-{c~|ZWutYDih-vj^9ibnj1*GbS@($S5@fg&#Mn#{nk!B zoy6{LnrIO>K#Om*@RPN@YVJ z+EkgrKD2bu1T?>KGBam1q(<>x!u5MjNiVj%jUQXJoU6AI)qCRuHcxaW@^2cs67O}P zFjWJNv4Rx5H5v!ZMc-Oi!J*qjiLi4;r=kSKcM4FV@YL=ijHN62CD9eJzTIvM6PGfK z_B>OxSg{K~(hJ1DWo?+0bQqvKCee6L7dYP6636j53BQ+Cyy#K>q9;Rogzaj8 zwz0uWEm$!rni0cNd;ox|30dJ=Y3}UW6ZD1Xb-o=Y&M=aOy!D>E=g}wa8~hlft++SA z*_C_Fux;CE7~Cx^S4)*zEG98Vl^Pf1+yAl@LdN3HKmfp#hC+dz%vcgMab%GU2dlXC_ zj`7hdk4?}({B~9KQm0a%jMr&X_LI}UJmAFr>A;S&$z2N7GN%XA7gphRr6MKyP7ajk znImnf1r=4R?h+fi(R8R2+1d@Pxcf-eb3<~f4hU0`Cfx6wmAvye0WjGl7m3fnwuH(U z_Fjx0{pX#-gh9^TT_1-lr_e&KK}PbfaBOau-TOigAx&9a9cls;d91;cdz%UlZc-56 z_?*Qg%_;83W0LZ_J28t6&6IhxS?GJ-?UOKmd-Yz|-)UFs)6i+?Oy31|iaof@{CP~E zow+{si$utLsLjEP(D(e3g*Y~ru9si&M)>7qwe;K2!hc${*V5SuRO)O4`RZzDagX%B zzwak3KxJvy9was6GHTE!S?S}#8{i2 zKcku}f&jzUSQ&Ei33^_{p9De%1*+wWBMS&cQq+^ukuK^=sY02xiyV$0_%3=eWcY)_ zO9+3!B9(kVh)R8tjW1Dm5Z(_e@U=#i9-O2qd`4*zyP96*QN_L@HJw7e zAsgeazuhGa5>C}vED>M9q8dF4weSx%_(>yC*T1A4GTX0_kgjLIfW2hq|HY|p&Lq%a zB&xOtEkbo+D=tPufZEqDiH5IFh!!Ux0xB)tm8Iq#Cg{8D;Pp2T+wyXIv+=304zM5K z&Opml)|RA`_;kXdhRdaq2zV0tA#?v;pq8Xu*OQX0%dyWN?1IZ_dMZ%SZ(2(=Xe8Wq zHe{Vgv;HTw2IsvLMsHKXQw&#(akLTkm0SxQ7ubdPkDqXVsy7Y@TnKgtiW)^~6K}r{ zd_fekk2*+=?9pm1|DsCJCRSBi(vWsdO5=bc8PEk9l|S|#q{@7sf+@;X=X$+ootrk7 zjvR3U@k(Ri7!Q1fX9Gz2jD^#Bn$RWa3W-(6Dn}YvAwKU$zbN~vsXQqgts}MYQiO$P zOCqEo4;aO_EEB>r>;-a6rJtf$Ke|Jnt}NVnT1rxV0)+@W8{HTRFOfdw5Jgs^3qtahRc z&T0q`jpP2wSYqz4YrGAE)HI`Opkh)UXb{kJ(Gif-D^eB@ z_X}Uxu)D5J)z^rf=Zr)e%*_X6cUS!7oTHx?EI=R~@8k5lsU(KOWEhM_ya);%h_q!K z^AwBG5D&ZWCGVmRXVe`#pwdt1HfQOM5`Q)}hQH|6_udUNV8}F|CrV*|dY9994n@L6e ztongo>eM}*dH<(Y|G<&Wb#-j-@ZprP*!8YOn?1ZCcgB&^hmMO0ssM_&;%kIuN z_;JS8WD%p&KMmE_%sgt(e>!zUTo zD=)Lb%!%S)c_^h<30=6K!Nl)1Z4SMeHsdcdA507z%)0aikvBbWvL1#&fO`oa^bUTu zLsJ&^FXBvhN^UY}X!&%25&!Q!dxCSYK zlTJiWzB>kUmiY6>vy|=5Va4n1zWf%ztla+ijy_GA`1LhHb2fVoH>!S75wsO85wI?K z#{Z65Q6uJ3>Bte@P9;g*)pREMSd}hY{UT}t_fy-{XCe8;R_ul^dy*aXB6|6T#qX!) zEVWE13%F$;ANn@jOi-xIH7=EYLRB(IqsUe>HOtNUd7*nHkpaTSCI4siOY zy1yz3x3CY*NfE&)KQ zN8k|*iZPha^3@TmH}@^3Pd>7~4&s8cX6J*J+=~55ylD^~uoaVD5zlyH4~pnbvZ>?| zxj&e;W$-?*u)3@xp8TZ%0gA*}YBIHLt29y?_@O?Y6HJNRUpj$8A=w3YclBqp5;6i4 zlG&YWG=%p*4s24SB%g54xZd8uMCc~+w2KpZ%eKWS)a+8gO-th#*dy-hhmr^&wbwA3 z8vlh91G)+!D67eENs_=+5(b#%XK)|hwUk!R4`K8tIQc2MmNu;l1 zy!4-Gbi?o`LW5zy{Y;5oOo{~?_Zh;;c|T2_&WhhfLMAQaic531GndBog6icWonHeG zOxxr z50Uty?e1-d&9|J2`qH!r5G>sAahetF%fY5?NH$7X#0Q)F%`5>8XP}UG4lur#42)g` zqrVWPIa+w@lAVMu{!eIEI+hPFon{ohWRqm^nxx(trrnYb|5tqW{|4~?sj~b(#m4`x z`}4;Ik24?M@Vtv3%q)|sMh?hi;Uu|F0z$bI^-y_3NkqA%jGjWtRzVA^Ly5v92$7)T zC43ks+s{OU`g!${`9|>9D0>S(e~Zi6x8T~>47IDXv#X|i;T6TFbpP*J|1%=;pECw% zmZzcnqX@VmY9s(10Mx73(hy3ieoyelhnyg6d;!<`w<@aL-)tL>;Q^J zz$PT{xjXp)1_mnXrlbJ_a1apU?g8M38Sqpf?g2pUH2qxSH1_{q>e;+dzkb~GY~?YE zuY(cw76_RW%+Jf01S1nkZvxm}vUKbJ{l)!kHN3@#=I+o;8p+D89arXAv*`Swf^z10A=_* z0(|McpFk~{fpxmv$h-?ix`i4hj@D#1z?3~9kKG0^PPv8%bz^&g%-NL7}kZ zKflV)0P6U$cZ-0-OhN4!2n(}gQA}ZKcXhvOLP79lzE7XIQZO|i<%ZX*|>d z`K)H}0`eZg{PHQ{uW$dggsFk%q2K{VK($bS^|W8R3*nas6@K#O3u>}z2lG=_<@0Uf zPf(s@2)hvjF#n4Re)H3H&nqNb;sfL3h3c%CAd7zjiT`;Kek3eF<~g?pfmJ&PJ%X2| zGzi}Nno#6P9-#D9^|~|qf$8&v5WkdXt}y&q-2krr)_DZN(S*3g7dq!V{JoH_9iV^= zf+yl(g|rJyk)?Kn03DkLqC@~1IjQk3UF4E^`A489C2bod{4hHC@%$s06-4^FrX<67 z1H>n{ntSrve`|KKSszVC|NSN>mSIPMngU{n87EweL2bGM;PhU!ZdyKs>~$I6eY>;bB1rvhs{!$#h^x);|J^|MN%NqBRuNzf2RVla-b<dS(Mo4z^(*KxKwB z7ZakMFavUoJQuA1{-78-fgGHe%y7JxZCichI7KbkzU=5L{-BksNp~&$-|yxNttqJo z_BoiUXX$^};r(lnOi}y_(8^iCnggct4#4UpZxg72`%L8J@q^JCAx_$eTR@HgIYsI{ zA>1i83z0pbS`Al&C}i)|r2qS*!0&g1Qn%K3i^5|skSzt63$oW>9|S_oPt5r3HagqA zexh3k8=*=K0n7@Qy4VMJh& z!N9W56aU$pkS`1i1s1zZpmWz=Gq@E-^u7S_6`D67TZp)Vso6d1PeueLNuJ=}iX-2_ zoON<}iN`CW!C12qF&+Kqf4}<)8CY$nSyihk2y=~VK`#IZV0=1#p8_$_8c@*uEL;~P ztPMv&xVhFSofbsudv-|4U8E&@1vG9bmIxkIM*S}wL?HZIR(`V3ty%;m2qtSc(M>wf z8OX~j%NUv50O}-{QMa#Hxeyyc>u>G3pRVu*pcjWbIlQ~m1;Q8n@E21ur;78R_BKOa z5`RUBQO3w?1JkOx_kiZCP=60L&0^hea0n&E=1;bMYo9K8rTJI7LE`sO&UXTwMywKL z3AO94`t3#E?;ozdE|z=;jP)9~Gk_e0z)K*CEWkm*$qKZfAnF9-{jawj;4JcbxVt$1 zVd$az`1_YBP~life6bAl;5sMf<(Iu{iis+CK){D+;yBj9{YQ6Sb>j$bB?LdKHKYWZ<*h$?TvCCkr0=#|jx-vHE7wdx3Rk`d=&2;yi7 zFRP@M!cQuJDy}CB`hs#7joj8_r56AW!eAM938#L-)$Evx>mg=zn=M$!ELY9+!tuE1ql!yfruzyz8a~TAzjU^2N@k=r}qU1 z+^)uMuW)bdfAW}WwyVbXy2^$?1IT%w%10*P@E9}E0TyCmcQBLd=+v{|(&n57_`i?8 z>=zg$Mgss6kfJtnxCP=0+n%z;_sx(KMm~ezaxU2ZHkfJQ^$>wCnB*;fFbd-7Dz-ajbL#fk`>A9ueS@l3GRB5gAG|{iyLy{Xe(x zH8B)Kvd!CNSfAN$KPLdb>xthvP#}KTOEWF7RQnB(8#*3*^(n~cB+v(l?4zhCqZn@m zCIcI`MEuPyY0Qs$hJ;y{~7{pxaz92d-C7~zTfQ#)y!px zRA$=5o7P2Xq<|MF(VG5?N-|BP=-QB3CGQB#6tuP1u4y}uO~mcZj+URFwk%hUoW5w@hWu4*95?t0W-^9Jd@BJ~69 zqE`B}9{r#7FmVFA0gKD)ume#1{pqm_@uEdd;6HvFH<&3>9DM1rV(&zmfze4{y%|hU z(*R*wW=v0TYIP+`^HI6!dv9-%p2<8~1+z zOQBs{hD}w18xxZd9A=D#x67Au$cwtI|3Xi6Lf-I%0j;a5{|m@!Hs+OJy9PY1X1zd$ zw1qY)$I$4q7WiukEZajIb-kx$`2Y!6Q(?!A4(np7xijz_;jp3nHPG>Cm3=fY&~MOV z#fqpeOb&>G@O)O=w@#i4z{M!bq=sE7*f&99M&!%8RY4GnQ$PUsO5PxR%a2FaMZ{$x zAyl2sj79L84DHT(skkV9OfB|dfn@++fw3jm+1 zI!_i;@;E~jpkUu{3$*rm*&p#fAHq=OAdM@J-n ziTuQXU^(duJ{95*MW){l0-bszP1SM#%&w|Y`UY98Ssjn-jX*hj0fP&|bqH?K14f}S z1*8B^U!ze&<5}ozj$`P3+V2g+ut(|%X~Zz*1HZWv*;VdhLIg!MY2Zr(z-lRC2?`NP zeK{|`>pMUmDYCc{N2uPz`1R}4{IiU|r5E-)-wXoeX--V|9FIZbs| z>HhqFhVnVS(Fz!!z~@7Jr*>mqckD38Co(Y_lyWHl=`TuVkD!xi3yctt-=SI<0*+1; z=hRDJlm>P7L=d@mFnKLl>cZq>o`s_eh!`4kS{j_X++;~!oE&o(uPku|YZ9T2a5#+0 zB}}|LjyG=E14}V7CT!XoPF_kTR!U!Cx1bQq#n zH64wo_X@#@$nsP9C6uAExElhtfMR95Y@#pm@6Q^8o`T_R2%h59da6MJvA%dNkv0`w zpDZz3#0l_%1MGBG3B=e#n?Q|js`~|He2&Xi(=sR8L4K5#?)DB1CSSdV-6DqXTaljs zr05-TG)Mo}%VZL9LThtX&u-Q=za4Z7RN;hRiun;aYmn=;Qqw--u^NcVi=;Xc8jU33 zJW!A+kG83`rua9URJwzQXISTn5nAx-8HuO8NSNY+V0cF=+NJjFuyYsjHrV!vX-qYo z&95j<{-HJbt%;LZACTD@jQ#@hZ^mfrPzuX@2vykHFvx`s+oLBK$x^HEf7lVAa^_utiq16wU&`>}0_U4^ZbgPlMhMz2|IUNuLuSb=Bn z;lRwXm1!ki@vhVjW0$8KcM6Ea?aU0R^x9X@*MD6DI7!FQ}_GH<4+I>lL`0xns z+E>pI25eT%s-uvDk)~D{HomtuzKzON_=ltJM=a%APvf1eZt?r)`Xdwj0GNeBazn=Y zecpp&yrV_gb8e6cLC%&sI-|V;f<>~zP6Ow|3@oQ1{;5lijT2*B*F4RNFT6ox8va)J zh#58j{8PMi2H5Yz9F1U(-^!XNbxKXP3^88X=y`fOF`E(Ws{JJzQtHB8Rrss3&}x@B zstZ7d5lKI7&O(A4#(zddCqwXqvP9MKT`N-4mpIW(vRi8I`4zQ)moz;F39NWo9*;^N z|9P`WpTo`rrkpzIJeE!QleM%#tt{v22DQh!*?yD3CbUIcg?YY#8MnOMK%K~(UHRmK zft5^3Nf)%NB%@Q+mI`-Cmhs(c;}j}zxuRHWB~b)zfAZ~94l`+3O}^mROp*O6;u2U*WBwC+HS;`Wd)}**fC22We}MH9 zByj)YX!rwSA;~3ij^wu=q7FKuW-esBJHsCRZ!?vMHokV8x=J@tenIpCS+BGcR`8P$k%*WVCO7%le2kumH9y+^ zy~?bqIxkH?B-GanF`oE&dqQBzbz5Rx-G`ls%48Tqv5rm@zc`$-vx|ai8C7@I2paUnUY~<9f;yuqInlB^FIhVQ1%((d=080+SU@@ z1{xUgDXvLo$Y1qztU-h&?~cebtNyN?9yTz6DR{Maoi_0p1DDbFO&jHkOoc-r<|g!-y;(%7OhP)Rh=u@{w`G|sTZbbV*;3Cd)$sI< z{|%OLs5>p-2M7^#1S1$~BpE)d(~7~7PJ>`%SyP#$MQ9L*BCC**U~@rZV8pY+t@-+aX@6+GYU0ad-O#hY7M~ zvekI>;)3uS!qwvr6tqutnCQ!NreChk-l(jCgy=cZrr+-K5l}`YV7v1)57JjZN70$$ z((Cj+Ap6ZJv-@wc0#sXl6L_izH#4BMjQ7w>Idw~LU?u82b>~A6C32ORlY}H)#a`B< zDObN?RHe=P1@iUx3>q2)Uk;}w`5gS-){f%WI3OBJFNn8v!4Rk*+kzFvINch+b_^d~ z0dd_xF0s(RDqs}qN6oQ^Sdd^x7h0E`=ND2x)hf3B<(yA`>s`nSvBEP}X#+{(-BWY1 zVZ=2FXmJruRg(6!&ZWuHgKy+bbzN&jT znMsl$;qsaK2DHCLiKZ@QG&`(=vzIaADriG=?~=R)K_Pe0u9H{#oLC&AMrTJLvRLZY z;C!Qt^bsHeO-KGZh*r}(2jj>M<9d*b*f8`rF*mUn%hXBUT3^!GH_4sO}#}vepgJ=%Kl<`ST4D%J3aVa z;_5hfN;^iq0Gx1^(%!@L(Fe%u#_~1azB;n~@OwdAM5p)HJBo%TbHYE$1?BUm(Yv7q ztO%N^I;=qqYx2(_8&>ihi$G*o!bR#K28+5_S@NcVB`p_BBsw&-O6V58Dej_f2eqYN zm_haICQ;Mud}IllI=@zSeH`zU`>hihgp#kFB$6;B`-Nw5(0Dg1ZrKS!YSnnwE4WNP zhF5ZAO!*`UaCyail}f-0}cI z@hFvQ5P0QbOgv*HQu(JW^X46u?<=e$n(n?tJZk1O5pQ7jL`xonxJZ@@mo`nGk*{nn zYD<$QNrvs<_2asDX0AtCouZIpwJX-P`^(PddcE@;k9{t)0KXF_#Ag(#><}S75|d%u z5Ye1-e6^ClB(oFXoQMsNtXwQA){`G(kr@hn#ir4-vdRM|-X7|cyfmhc( z#ABy|zDvnhQl;qHjLEGjv49&A6(;b}P<>8^05behGY5d_RGHHx`}Ybae~K6tiax|w zxPwNac3e$E#$lF5i^2HXN%1C84jxBYNgw}7yD!_bgHtwWTI1J7EHP)zlb8HF#<>jQ z5<5oBdEqShFI|okRtBE0I`yLW`Vg^qzf_qJn=d1aRBHYSA(PG%8ri5Eny_A$^y{bz zrZqo^DBi%t-E+V~iffC(_E|PIOAi{f35-&gxT%Ym{+5~BtWQ>UpBt$CVdeSRh>}3j zRt=K&c<2<$roR(4pdd7(qivE5fwt^BQujEiH%#KRm??sKRZPcAxpsS&0+wdj>J|0yzp%F}<7Ys=HpMSwchz|i6QCty@@*;|lf#C7$YsbecH z){=_&tmMpj0e0+u3$-X+p7r@H!#2xqn{<&u9<8}!_={u|Tqj?iTxZX`h^QG&$Ror4y`jAQ-* zQm|RbMTw4N`&hQ}B>m?-sFaB%5=Z*)ad6CpGbRe960Re09;<8`!C@CN7xTe5__LE6 ztf`fsYz2t~BZe(^ai154qMQ&bucMPU^4|MmS-DD40>sh`XOqzAh%@XpR<#0@C;-5eoK!K%)2 z4&uP1vR_fAgn4VI_P7!=8oeessGDk(EO&r;ITuA=OZrs2lrt`V*Jvyi#3N~Ja6H35 zt!3yc>BJSHNiuDuRjavhsANzdo$_=H1=z?h^|+R*=m!g5D;2zMUZ#E?9kr5E~ zgp|YkE_d7zH%nTeXd*SaP*i5wtrn_KA+@ej_c7o}N?a<`I?1q%)XQjg8{lg(^*V zDRZb>Z4OMttFEnn-{I|K-e^~VmQd&^8HMevBcoaa4RKZ1WK$iHBEuWGOPtFuQBPr% z)pas~$Y-4v?M+@ZfbI*-hxQ|UGjk8q9}*JXc9B#+!awB#iis$|s>!UEV_4u}QTN_~Mh{bixCYyo)?JsR z2MaESS$WASiYyj}pD5dXL|8Yt_6Bbi`}^9eC3xJX4peL!gm@I`w)>7v2-hQi6Y_HJ zCMP1}DF@*ygYn~ONr+Q7dqTKpsv=-N0kAErcl*c--n52*w|fMJR5`L2dP<`-w{9ks ztaA%WANRcHbzF=sr*EtqSFzdhDTKH<7Q6pG z@`D=a&>g%ZvP=eCqTPWs|IVsFdYir_{$>(t&Ce7+iSv>@{S`;V*`&h_4g1rGl;l;A z*wq(hzB7iY#H1P;BfqJ4P9H*1b-`O-^0qYZ!KnpBjlSvbh8^7|F4VnpR zbI!le9V&Z!?@hR!=3laqL&D1G)T7g)otK|LK8k)1(qo3Kwq1XWHYvD0pYpMV!yt50 z@rcd*<4m;iM4gG_i;87BB3UX#`D$;=e@}B4(pWO3+q3nK9M)R@Zdao?HBKZ)H7to` z14b9nfiNAJb|OS0%N~$;>D7A~=?K@GPP67;55ncV4}kw7BkjJ^2SU6~4vi;o6G%vh z()dA0ZXT4vT1Ag?M!|0gCqRIrq^~rEqoM{UtqQexq81qx` zryV6!>dUS9q6f0*u96QScHK>^py9-Cn%ubJAR`~ZR6EMHiDCL9-)`ARmxAEmr{wnEO!+xJ~4N>q}uOlEL>JUqgI;9)+Rq+UBuY5 zB9gK1_kCYe`?KWpBjAteBL)`fKmf16{VfuK7)wz5T=e4h$rWmd`KpL6E~ae$Pn#1D z@VB@1H!==b>+PJ1FC{s8e8bqa9rP9s7knw=JNd{$zsd^I>$ z12mja#d;7KhES{vs2JBc9D@cP>{WcpfUPi%xapq;*{iT8mA!_FGlBEwy`gB64Ll(@ z^?;Js5&pGlQ-7y-9Z=iUU2yQu;jSe*dJ~w_9CG>Bn7P*3gbLtx%z3<_LfC@iHOLD$ zc_Lc&9?S)bz%J0KHcBb)D-1SeG!aU^XW}2{U_rjGapQ-PJxEnqJ9zFM&)jsUz#?Rx z+XBLq8XIOSSE_U5w5Rteg%vDN)zkGY3me8J`H}xT`?ky{XUpV*6hem56`?h~lDs$s zq7u=BX^dybN1^iXUEW!MK3LFJe91Hsb&gf{axYgm2k{R zDki}Q*_#*u=vVbq$51sQi3$Vr2J~_qjeji-GUx@9e%?GuDe>?f^-a6*k}sQL>Fn|+ zSTBz(<=tl0c#wK{FG0=Y9oE5VP+8Anb-x$sdKX8d_W58LNSzT)z(YGJ&`T4xLV5-A zu$Dtig9X}8I@G&28=r#i=6!Y6iC**>5-#0U5FBHYSIkMZVR9sG_d7`heN8z%7n_?> zdncm$RCh4DVf0A}SEIt8F0kWssAJwpMlH`;^D9UVU>3h6Kb?U1Cp)>m%ku3iT1yP8 z%alPAFD#=~AE3*J^g~BnX*X6)8>m_>KIc)iY(CW0_77t7MkXjAr0lyosi~(up!Bh4 z^ttFx_O%n~DWOc(gXazu{=G<>Ep6SzProj4LG4S8gXF1%eFvqg{;RaC2ELndrGLl} z%}wR$l@JR4_ww0$22j6qRZi6?e%I z#qKy{8on_ZWIm5z2@@41jkH(}j><@SfiCy#wMUMX3+*gFU&NJH88CPmJTFFMNN{*e`aU2QtJ=^q zAO1Fp$SCbdQh(^voB5#<4U>i8KkaEh!lz1Ny}1!Cdsf+7i7(sZ!5v3MJvZ?c%r>y; z9==Uw$;k43Q+Aw%Q<+2ZumgM{KOI(^OOu*}F6inI&>rd8(8Ox85+uNL?a2pwxpQjqKMhBd#Uw%xOcHs<`CfCdy;&Yl6%vOW>>*{)51*n zm{L_$*=)m6iUht(@)#I|^5K{801(Ox$(gbE;KQe$0v*#22L^6D$37-VUvIl@(nVOf zl?5#I@h)^S-;&PTr9VVcbGdnPXy>4|GDf!9tI z*$~^%HlO`g?^Z>Gjv^IJay}HXwc+ zO?4^X@Ikzo`J;$Z6gz*7YC*S+SJ!E;IUalCkBH(qk4i>KXJvh9HLzqVPOBO)ah~=IAxO2a&W+_HQ zQcgqf?&^}ClPCf0d{1kMfYLl#J)`Z2^A;}kI!~5XMMtD?gL348N5G163Np@{K)5sjdQu3E>gFh#A%~PKrI=Q7;R_CSZ83JCmtoOOYrceue&(8 zCo;9PPL5LN$^cA_+@-qfs^=^SN4f>YP1SXjT_&T2!Wks(%B4gSa5HK6L;NA8-T4+` zb&igGXrkXKmqvhaDZx4LMSHUE?w^V(n3gb0@7x(m;2rEwcLQA|tL04zB}gE)W}edy z6z)wc)<2LNzHE}m2*leEdN)RYm#-@VE0G|}^)p<}50JsTXj9{Z$v6CMBOjAx;^X8< z?SES<;LjgeK?REJERZ9Z412x!D00=Ho&guALBQYP6+tz&{rdogT^kTi3&Ue;U2swps7D^gRw2%VHYqoln@=|xB&e% z63ctmcFSCr9`<&b&<|q$VMF=5WsgIY{!#&A+CwWxT)ZrD0vPpcX!Uho7kxM)SW*^X zs3HT|;=kX?9r0^>O!g`BR~gC-E8KX@&WO)om3=P^a`YD ze7l7QuG$4?O{{t!uHvPAY3r2CS1)vtI!cVw=)x4?+LaEK&M?1Y>m;T*Sa5Vyo zV5~bbXOgP=`WACklvfQ^nP{bFdl#&i&@&fNd*%$ea2wllh)_j$ju z*80?ZFC$_60zv^3MS@#QQ%`}d(vM5aCZ(2jo7eNlhHc&We?IoGB)X{|<}%xAu!GzI zlEg9ySkbEGJ`4pBsvKmXSW9{0uQkxIkc?C>_~B$_|6h;cfllerz`Z+;#0o-2Nw!yE zB&0^Bv=LGXxmdFOcne01uKW$R{PlfZAaI8+zb&~v*d~vz4W{dh z>=gr&-zEIdJqE}z3VREVCZA=D_4ydx`1BfRrAO6=1X&Dm!76uMZVb`1BrG<~y zf?;wyne^GDRY1O$WO!+xD{>c&K-OVa$l7mo4&AH(B@@$BTSUN!0MQW z$NwHS!JZ~V2kMIXE#;LiIPdDzW9ZlSVOS;6R0r<4=c|ypBb<~7ORlCgRO5oWC^aLO z{ft0*29jkOg2GpRDC&LWE`(Sqrzo0?xHR+qPS+KGPUi?W_@Y4)XxIzQf578Kb41Y6 zKzQ%tQTY=7_^*g(_SNmIZu|+D;@8zNhB~|rb8lHoduZTkOW&jPNXGKo@5^f=5Cu|d zDvgi8`*=G2qdKzo}0Q~UGZqQ;46tjUmId62`i17oU0bCnixUmhqGu{1wFtSYo6*W zanW_-I@3p&xeQx2FL;-Jqp#VYC^Km%L`ahrLUqVRnXd!Au@k%zBNS2q1A3QN#Y|au z6@1LU4^2OuYPa`&_c!kejvS^lZSGE^pWsfeY$;dxr8Cb?b#4DhQX{&#D?0b7iTl%F{rmVEM#*{gd1U2-WNV`WvDs;GD`vY#Jrc z0;%%HK5!WB5b7f*)bx#gkL*_wjKTU+D06 zr(hq-KEx9{as)bOJL9JNH}|t;`$&vzQ2|1TZ39}ADb8=e%%AVj*NsqMr-y-iuml*0 zz;|$oQ`hi-8K&;UA$+SLJ4l!4asub=13AahY)f^>Oyn`^gYpjXI5&C6E7S%xkOwqUAa)vt^pgoo-PQm6ONKfG6VU8H z6ZZ?QqWZcs!;x#iX!?SvN7imk{71^#6V#NvA<$fr6hS1UCc;I?Yu_;zNh6`YW32n% z_tu#i56FFMhf8!18o#kG5&i+lc@C)k9z?aQ2Us-$OV$_{31%5kKe+eLV@&)lvma8q=wWzXB&1xFJ@Qf(QE92$OyA#!;$aA4Sde_>dAN0W8edn9=}dTfAxWGH2XOgs z;Q8#Ibz7Cf6IIimzTFGwuJdMDcLbcHQo-t!O;Gm&(WxJ%{z##vL44(Y@P$Vm1hPn& zyoBz7hAUH9^6T0q>@IE1^6VCfXLW?6yS3eUmE;>CXVW2xQ})VY-Wt%!@7y&~*#vGb z!hdiMJo&w1e1hu37XVEXcP!F>D=Z?jv38gD=?}Wd#Z=f0+I`WRd6u8{`ai=kNYH&>2^P1hjsceyF~FOo~!Fs5erU(}Mz@Y7h=;Xx!NW z`AJZt_KwmLtl26M8oY1>j=*BpCzjcSf~rePJSo5!fq!bIK&n7T0ASABk6;p_f!*-y zQ{kOQK(AFFTT{3wxPl+Bo@f#Q)exQTt?Ao@^`_gmkikl9%X+jTXRpFo${IV4CXYD2Mv=5bK8;%>G zYt_})B!@d(O372+9YIm_@{H~pEbWqlMIfKy`bKwC5`@yZ9z6=>sLm5&#J=ovw5>R4>D`;^ zwfz=~Nlv~hL>*8(bwzjPW!3LR$VLQe4i1*pc-@Fs?$4s4D^Qb`H6WSn)OidjLovna z3dp-~fLY@H!VW*{-jSZ*<$K-d#iM_fa&N!n&AuS^9#$m0Tjy>XwM4WSRZxwI?;%N< zRyZ{b==)PnmyMeZZ#)R&wqXSB3t&_0a)!=N` ztLmA5R^zmav~5;PYoU_tq#7f(_8q)ZPNGU2-o`k3FtwS`3)tyNI*YWxbT=a>K_66Z zE&MZ?n;rC|F3;ko$f=JZbx`sEq$4AdJ8;Z~YgFAN3(5Qf^07ju7>>8+ES2LIfYJM5 zII_GAC;}2b>WcVm>|yhWYId5j1S-)VWMm}+YN5IAhzA!{RetFwjPC28QzBtRB>oC# z&>I4ribiZX$}E$EDTyeS$YnS*j5I7>j?b{p)Q4B!{TC2s*>{Qa)N1ATBBqEh z;|+YG3z6CIffZQ3+Bx1!$Vj2IOH>feM0Uu*+L0n7FgWvcBY`d>+;?&^p7y&Cygan`OjP0OU^^TtJzwW# zMEymcjWE|4nrOXSEWhX*R*C?85Ox$$k(s56E?ssAyhU!Y{pinkx$DHb&n|($3*y3-b<(D zbrxC7Zx9=A>oHN$VZO+2R4ww5x|heeudZNUzH}_lEP>tV7L45l(xqs6Fzblay@)6( zt-lupV(}d6SEQ&EVvk>4$&Z-ZzBwLU_74>;u*X1x*qfDb?7P2Q9&fms9etjKV`Ng} zS$#3sU1Q~FrwW+V(3xXS-=4I5=8Y@GbI*|*y4BSomJ^7)2tD&2_>(?_uUB74_y;GE zKe~hIfT zq?%|QZc#OwzWxS-tvfdEcOt~MT0L}Vdq;X)OnD-Rj2(>CjGNz)PAhmM;qx<9svn#C zIAz>?Ore0=dgg6*fqMXk|GK{P71pHUa`Cu-v`>I>2S@S1u(bSZ=UJ@}ge!V9y@y(j zM4F7nW!lpZMSN-9&U9}N_nx$GHg%LLWL@)8uWJvPkhpWpG73Fg`b;OGAoRvk%*M-x zWHN1jenI@++u!%4h4g;{6^v$<&68ZG)C#hXUSwM3wrmG{f?v)n&$nbK$?@3lZok7Db5^cr{&m+^-jI?v3`*4n)te~XVU=Y|X z7A&0T&f9sj`@Q}y{lFJ}x5+@xll^WnKGJ)bYqm;_u(E0}CX(2wVf)QxIfd1NEUySxr)S}l>b`O;VXRi*1Yv01j$ei=hXkrrD#lDlow!>4Mc1*8 z`jZ)wRK3EZY)UolTk^eM>Y*m_-T)4SZo#e!ow;oX!PPBWNg_RWY@WpBmdtfdXZ5RvY!RO;Xw z1D#;=vP=9B7rwZcS-KNZVRAjFW;sGw zGrB;k6$E*Z}%NoTRy@X*wb>E7Z1gzg*v3^ik_ThSNxGDBX z>6o^pNJy=;pr35OfbFz~w%-Qh73DBr|L{ppkU4ZkrGT~Kimm$BvE@u&8&;wUY0!M#{vE44oWS23mf`Q1h{V$fJ%Gs_iqY=3JM$=S zR{vF~fmMYH&Hd!MyMyn<-0LanwA6J};TR7v#UIJ`V)m>im5Jebiv6vD6$*dyt^y(EP;SW9#ls^VBN3av}jgTGw9*lK&y3O(2LSm!&1ng75WH>yxt>!%Qq*fLJk zzcy5jdS{?){CuIbutVkK7a7*gK0OYVvOM}nk4g&0RP`j`S+^qJXMfr%aEoPc)w7cp z8r1Q_G&Jn8>W0dhnN4*qkj$C`C)N}nvvm2!x&&Y%SE(Y@#U>IbBc8p!6OkFtXFnW( zMTCEIHTK?q@A+$#s)`T3+uFg#u_K5M=8~Qa3O6`U9^tl@+C#AAhD`5?X7g13(Gw2) zW8vFB015arS8uPUOg-GOrU!H)Vk^n>uV?GMiMMv7(*U?ZPkeQ&66#aa^mV zx#{ITkj&C7KJX7u92Z%1gh9>zP+JbJ@j<0b9yi26f|^FC?ZL|0L?x44decV2<1oRr zqiing-s=Y1it@FW`cbRD z>~kM_4Q`9{i!Vpg#ygogD+q)M!i1QvJ$`(q1kAZFA?U>ehT1$PlYd|iZ&-bi8*=q4 z0Ne>)+;Q==_ZV(i7CoE9NKUhQ7jKvyDP{5M<+DIf_rAPh5k|7cTt`lIYKuvNoc*gE z=JE%J5Ybtz!)IQ34Cu3QQ-@ryHCvN?8+@7+K0(UF8&8SD_O8Zd<7}40t;TsSs0BtF zDFwBbbxb`BQIZ|fxn42h1lg0`pA8bqPu04@g!@m~nko?CgL%?577YlX8NOEcb@!&%=cjp)0Xa&iHo|xrw zOn*Q`8K33wi@c>n5UDCWHoIobh525z%N3@{Px&|{r8;CE11Yl{+j*R|QCJt{td1d; zQh{>DmVemuWZPt|@4y47-yM1r%6%A7x_7Ikt#xg%Bxzn=d()18mh{klnWa7$>~+DH zl=qy*DB+4WcFin;z@!Pkr99qQI0hhaa;Ns@m&$j>YU<8WD=RS%_yOnCQ(slZy?Y`g z_dTjYiH(WlANU0xE%g1StCt_~guL4UM5j|Jr5dIE;Tn=jwMeRKTb3P;6FuD7mhPZ( z&732RefpBdt54=_MT{5IZj+t6CX5A3^D%mix!Kj%_r?wphmi7W4f%3Z&1rK68QQr! z#X*xh!Gq|ZZ0W|sM5^mbfC9B?6aJ+tph{klNY@N&$$CXiKS0X}$T%)axN9(G?{@NIn>5qHN4;S1EEit&b(gO6b)O~z3~siH+w z(mha=Tm-?n60w2eZvEXhYP!cX;zIUV(HBoj+b=G2O3OYem~lWXDRR%c1RKRWZIn;g zXv`6szII5JL*zd(LtCd`0jbfZ-PEJzG87Ms(Ij$pu(a+c>hC{Kv6G(Z>=6{$92Nu*lHeqwJ$j~E*&r@qqd~fAWDeM3{#0`>xmU(eEBPC= z#9H&NDOdh6%b`(yF+m6>BiAN1y7Rd;mQ8i1!NEgY<$JGou<||nE7(b`QWj;d^7gg( z?OXZN)agawK@rx%-kYL5%qS>?lNGCGmyTSm9|m^lq^_hRrLBNSq9SXTm0LHvarRcC zO-WrMyD42oM;9>E7(RXWaku19mZbP@HIakEv z7}&2I03UO5mO=pm<8)FYac*e+?ttY>BLkm!1x-^Rx4inS%|{Ihxg^vBCt_inQc)BC z4UiD&et5LeDq!rEs2T1#X07dqumClj)lHHrpJ+#qe1pM3WZDRf>{J^rxm`y-*W}J7 zZ;+syHiCzl4}2Uro`E?<7Ka%vy7+)6Ij^;51pEF)I zy?p(RoHhCNLs0Mw*Ve=gT#{xp{;GamC+F+$JeElDYjn45vCz-pky=a&ybT;_l@P05 zCkU^g6R`C!axG=snX0&HQFUK)9fm)_j8PngIdg^64FzaHGPbfJKsznOzI18HxILpM zSDab1bL1A^>#u;EqO9nwuOwY8_?27gIpLjTqx+e~Th;B$5?W`S8&HObj?JOYH|Yu! zJlw3{7AY$zAJRY{!go8DYbw<~yP#l!sdHxYs zH{I$9+cJJwb;lcN;-n4dg5;BsP@+I)A_s~W7k;mRVK=N`mj2v6CHHN947t}~YW=&C ze(ExU+KhdN&w~w#Xu2Rdn9)x8K7LjVcVuH5wZHQ9%D zWAHe09uL7Mv3rdjVLZ-9k-G}D%W?<(I!R%WX+D*BF`;o}bmsFf`4?94i(U=>mj{s? z3iGPuC)9vA&%BXa)aDb^`HpjR1z78-7%eGM)HLG{rltm&;-2?77ecan^V{J_;UV^< z`>hfF<5&G8v@s@+^AUn;iEHQNuey)sBQ_O-yfyzt2vQ>nnqWScx4U?qvW?>g9#F-@S(azq1sEuc9w^g)_``LJR6~ zdc61YJ5=?Qe70m_q&k*#Sw>39H}ch~^JURRgId53vH?LSVD2t`0gSga9}P65{yR4p z7&_PJxS%Le=9>(V+y8&J##FQvP{xX-+X74rWRZQc)UKC&jWMa-09i85>eW9mvo{xg zy^ntxZFAFv-5jd~V*E1H&uKyYE*rP8@q{-^)s{eV#pSiX1tTiFi*PN7_|P^;NBu40 zfCK6cfiF;Fic~Xh;_d^Pt8K44*$qI~$?b1&4_=}H65yodYo_58tVn)G#CuHkAeew* z|Lmk=`-Ml>@z;MF#er85;-XOYq7fP)t>N;fV;DH5q}`ftdd%7kRK@Z@gFPq2LarZp z(YZ=Vqmma>RUQK-qLWwpT}?Sn=qJ#UaE`%y=!Oq1R4!KQuH)p%z>d}Dt96rh=6`da zIw{BQ-xm~k5VoACl2pR&(l_+ucXLg1bg`5DWkC19WFQBet1<(rhJ-$|H;gjKM%ZQ! z4Qc!YFP!ahZUAn);k!+n)x`Ok;nc^9n<8+BdSsINo2KlV&ENR)@I9;|7$C4;><%N3 zNn6+$dCAJiBlD*hD9~-mxD3%$JE04DuX9o0<-=(^{u>C^Rs3PbV+yEEZBLN#-_Yl* z)#T;0w?M&~lNg-c_I7pbQAFj!azZ$%{PcO(})j@^wtaBET~!z06-D83q(~j_alNkqZr*u)T01v z4L(5{qzEDN{*?N!2785df>VD3?LTbM39x)Xx7bTVxWY&fDsvMC;TPX^$2mgBxMzED zsN@OSTZohX!w>Z7rt{t5?2rO*Mm=}=Mq?PYaCOMq7h5NQFSu3czn%*RCYC6rOHCRB z>m;eL1Nj!%J{|&XG2YhC;}ML|=HYp(R_aHN3wSa9cB~V3V0Hxlc7^l+H6gNoOlC33 z{S*E~xU(!Lyc!uN&H*MS1Mhy1aoc@uE8&{qKXFp2z&cqRN+ z{HwrISsIT36nDcHy7#K`c3`103Ap7D)xivu@Krjl35V)7NAdq|)qLla{%{H{O9-WX z0O0VQTA<8HtpPZ`VemB5^ZV>(Slv_VR`Z_SfV~Fbl)3Lh)<`~x7OJo3fXEvDUyS|@ z0A?YurMiapD!|jWAyY%QcRES$OIHuWjI*xc1faG!tghS^LTRI#+WV_4CE5R`$83nA zfVMe@w9;~!ldLhUhJgJhL7Wi)>mCE*-sU!qUqw;T)ZB26R1bRQrn$A9Gh(rx_Oz{J zNVNe%UWZ@vW6bPH%kR~_%lQy(&*57K9)^7HttKAcKoIaxe4D@a3cp_Zw-!bmy)m){ zSP}+o6u3`O{SGXj12;U6Vq>VwfG1q-T%KyCYnd6yC3SbL$!*u5{Mv%Z!AcB*2*@8; z(Fet0%NWLs(Ij^DmW%`M_UbWv?FPwSq2bZrTI@egdTn$gSx1G~Wy8rGKD~Juz$9|% zpSBoM-o7z=%l0$IGWb1CRYpf&XuQuP!TP)BtuLnv?IZzWqIHAZ+SX=s>HN7|tR$Ya zrQFbEUzmS7lOII%yEh9B-M;Yq1)Ern3MQa%LwTGB4&b;IPa>=p;05HgzcOpdV%{hE ziscf3`xubJWXm~eqHmf+!?wTQJHDK^o=7`Q5O^U&g6Okga`_GWZhTDYS42rCuP)Cn z8KneMcSNmz^+y)x87Ie%FOyq# z8dpu4j-d$)$VoK{A{Q8|frH8P-kInGs&%zm(my;-gNBL-hA^wbOcV6oKFXlw9^9^( zG^c#=K$t?|$oKoh{jJ3)naCA?#I{$%NXmKJn>Rqw==XZmg%ut7*zU2V%YC@E0Kd05 zA`Wuag~c-Mz&yqwr8!gtUoi*olCmy}05nmU*8KYMk;wYmpT?)mu?r+#06_NDd>V|l zN?3!nte1XPW*&B(;5()3h}9O{Noq6sK#xfn$B&+SEfd1}JAK@@MEqa=t3l#`r1#YZ z0Hz40bsE+6^PDGKdNf-yN!xM*V}w14h(a^MS-%037kOAO6Eb z)$X86aUTd67QBYXNJ&Ar1w07z!e_51A1JU@hcp3f))_s9@YD&+bCqQF13tsPO@d)K zuqq<2(AnC~NH!tJyVe;hZZ;x56nWOYbeBywktsqVOhu5kk}0QJRqL!9H6-XJK46m9E)8G~kHI2|j)oR!_9R!VV}I{%De6w8`C%O+Pyj z#Wvhm7O(h6k&r{|3xG9~pO-Pl4Dc+>f+XyN;b;3dAKAfsu8|Zt}hmcy*xnzEQU|nl+74e$#Uqr~B8Z zi?!KktvZNJDe4vQXA^AIS!LQHZacw!q&XJPZnb!Pb@HY0zfYJK4+#yes6%T?wi*X` z`eVVqL-?EKcq%X3sk?V_>HEYHxPgfV1q(C;B^nfgx_%$i^z1VY1q}|P*9^U^SsovV zg4K1^IS>`Pl&a?b9DG3q7t2E=33>5U60 z%uxaGf>kTA-6r|n%4M%DiP0+Xz8sA^P6zIzeECP5hAkk7-M;cX^~qqqv9QM#EBaio zl5Uc@*Qw^eV?ZmIo3O>>J}V93xsCqf`-yD2C zuibP%?3cUypZ2#60Jmld>WZ`NokR3N0<)56DOYqB1x#Kt4{c;;@B4ML-`EN-e4|xc z8_(dXz84%p#+_Ab)NPaD`H7Y1*zA6~C#w#&Cn8sT;9g1#-S?Uwb zkA@0hXQ1Ng0E^_czYKIqE)y#0O37=GxzW$trr5gR81u{z0cY^Nt23zpC)-1Tn1=M* zEQ74JdBnnZk{AM$8e|Kctfro-{T5fnq&P7|p#bJVDVCB=a&ude2Bq0Ssamku zRVseh1~{Pva->zZD%-+vs=ol>U?SM7^6TJVUc2|b#F4h(z`!xoW#;Y=Sw$tBJ!h(n%nWIz`O zKAU#uZ7JPdN<8Wt3f3FJWO#&&##uIeId0O#b}{;s1e6GOBVrq=wz+8x=pU4PhkL=w z-o3c-{$M!WctPFu0zsyuBiN4hoz0qY3^me!-blmLSe2hn7wYONX!_$^_A*j0_LtZ$ zdxkK@TY3tPU%^)j2`1F$b&^xJvt|4|{(2tl-gT?0KVK?8GO>oH#@h3&!FZCQ8zVxO zSrS}))e1_ta&@zk0|sL;BTL%8+h#F9;gIE^3(H%LWVKR86v8s&qe$np(Q0oe|ALs$ zI;d^)p>T%O#dn=5BSBQPf^E_s3d`T*4AoE0N#RAk+*ksA4dW|Asa$2}vo;6EeIFfu ztRswH`e8RynS9xq9E6z_RdqLn^k0Xd%egc0Ii^bB2OOwtUnL6EPIgw|9g@cDYts+X z0A^QWYj?TBTkX?*SWw_Qk@=&4x4EFIPEzk_Q9hh26?lxkK!KWc=Aa7!ozN0d`&?m8`Q<1xq((OFK|%|&TCax~vpRt*o@ z>_N0vlNhrbhffRAcAgWTni4eRF|-s~SN~-n0EqO0x>3@|aN&ETm9FAv+Zt+dYQthF z4Hg26JRzxr%F&Q|RJ$O@#djEVOVfPWau3{rm3e8eM@4b2WSQinTub{Br;dRzP?aOc z!auwX#fjeojnkfaie1onkWu8fl+8~?CB5U0K>l@Mys!H~eldI&D9hWYJk>$fYdN_X zF{K4-OOhvi%jCk)p<2rmmRt{%|M)IfRejv3xH>=8NAzyM-Du|Qod`WgF0LqkT;JzueY0MZwk^UP<>D4GD45GDJnZB%q36n2;E}En>8wu zK(Y{4Nt0QX&)8djW>L3DjB1Q%sUZbpmYGf*9rGMf#+o0F(aciJh=xCS8YK0vT}N6tNFC^6<_-dr_WL3V7p3my3{=)BX2`cGC~vAzBra&aX3SVVhp(q@js znd%%H!m%ERf4KMA@!`q0(cKz05_4+pr~Dl&0M2vlvf}eZt&-=)C^Stty+U0f_8wvGlHa?~_@#u?1#T83&LImUyMYKJCcs zi9kj!o#3%kfB0p@-y@D*s7sQ&2~S|*$u91TTGHyQ&Sxb|=bN4#78G?BKZ&_$fzPI1 z9nN&KAuaDxi4MAq&IfGc-abd*(PkO#qe60%apwCj$|o-~6c#j$NEQjo(ByQ0{4>ma z6gyVU33?m)%aF`*mpkKHG@cDe|({ytx=?Dw{jubw`RC>{aTTA;Exco%O}5jYDe_}Uj>ZkC(%T*?(HRuhqA?O8L$eWSyIC5=yB}MFl5bbm)lnB+6tEg) zM3Jokuoi^7C{uB^%Y-A)v8|Tv!Brzq;OrmxlbQ6wG?_!MUd%S z`(o{H4#*r-cPBRGJ@gjrZQA@S7xO+9w6Udi9Rc5PJkFs)+~yl8o`(`##Lty;@3FSp zY1$a1rrx66JFlfEps6w%vk{TDTQyW|k}5Nt$yweh%8&7{>L^Fhw^AaaI1@MM)MTew zGhXXYyX5LlJ2EkE5iqO&&~DtS53=&I#9r@ZTRZ>Us)be)O?83Jo|08kWj z+tl(ikTH#mO{{NVl9NS*h-zR&eSg@h;cPF{d)g%Q3-T4|HUgeMEazfkPs7N#>2v7@ zgm#72`f$7nqgd0!b)v*@rmCBw{+zbK(ZVstAHI{p%!Ib)*yzRQO(LUo-!3n?u5?b|gX1N&Y~CRgaOx z@<8LA0wMA_;({E{%XW&Pv*sFn3d9k)P5pkxV{o~X!oPz+M0w_O=RKRnA+$L2YBnE2yG*HLmyUEac zE?;N*q-~8|f=9p0{|!hP)To_p1yaEaUH@b7SM>_@N5gM*Yg7@T-0zip z6Kp0t5V{PxYR3v);QbF}1oP=h^SvvWm%!2mDT3Bb7d=v(5TqS;** z6G12MXUxhDAFYz<{<3Z6D=xs{ThY>+3Et$-E5n!)nF8lru`Y3v5Wa`{h4o+-3W`o|J182~;Mu|aq&GLC^hl$qo@qJO z?WAvCw`0U<+inDYWTl7O;+w2Jod+~iA~bJorU;cX2_A^A1PxY@9+C+XrxZWiH1CL{ z!)gQUX0q*-iAZDW0KL+A$`5_n(yhm7G(nIBCL%n<`H0%r(|7{I=Y*PE>|0TJ-7P|T z^f@WT^7zVz&a`| z6~E%IdHOIV=9Zt!ABNAgeh&fmFez>`0FT^zlC@zlHp?92OvWsfi-BRun?&MA-dnk} zAts-L86sM);(E-XeRqc9G~}IDhp*8WeJ2aeqS289xU??q%~9K684{j(yBv}IP0zG{ zD1GW`VUgsxe&3A!6d|Lwmtn`5sAU;+o&r8lGUy4Wm?S{L3UnhGdf%b<>Hpxi!s4Kh z*{djnd*i7^X-T#7kRXfbxm4>Sws~TdmTfNg!?}6ZxzP!_$X`o-WU|G|`XdtQuxo88 zXmq25^NM4V`5!lL#Z`#5q9_Caa<6`_NeNNA1P>Gn}0(qRXcL}yz%=< zLRQbo-u;D=(9aYtn_y3YlHmSKZ!C_Rmq$igVXV~|c7^%2Qqhwu^7yy7*Hdp{Tu=P| z=9yr938lfjg=mK8>yzDqA8NUE&fgyI;Yq2we#kG#eN^lED^)1hI#4GN*o~N(G44;_ zWlEhNDC#gMQNONXpJcg39})Mt5Ht7*@>9u=ZvSIjU12joq&Zuy@R=D{j%d^s)Ti;& zg_8K>YvV>z&3r=gDD{}0bNPgZ96X`gJ$&Ib^(zyiSp=&s9%o zzp!66?dz{SyYGH$FnKG?O;%xQCC)B2iC2Q8@LYxUGmpw3os$5x*FTAR_%LiR=8(ax z$m*L@uf$s)I)XjU-Mg#1^nL&A5hRJky~i}mP~l5n83M9n$)waAvyXAfhgh~HQsAv@Y)p%#V%uZrx+ck zgkl6RH*_+gV`Vf@K3{W{)V<+Lm#%*$TEk-?ksGT~v$3NngJa{$+tJpZm!Uo>>=}vn zQa4r$h*Z^sIVOZ=!EpC3FME}fxpL$kZSm~6#zzT4ZP5X`iI3|UI0$cEX>Z8VKGoW? zh{T^j@%w{g2zly;g_B#I_+p@1g)KWDU;3h?DG4Xz+vB$Oq|;o55HEOmBT!=aaPt3+{6Sii+}-77(jlL8qrhe!hgG z)w_FP`~)p(fYLnG&9b{pYSoqpASX)sV5Atkcb7cE31stbAB?Xu2d_q3REhxsFUCg0 zpqRpG_%qR$Es`)tv1tX7j3z!fi2 z!*IMrKZ!u4$BL3q>M{Gr6UNf|Qt}|Rhq(LRhlz*+=grUWYKCluugHJWd_k@IiWrAl zhvGEivFoj}7VL=&2F_fIc9>Fv#*_3Mpn<2i&n!ZAEkn>ok+8{`GjYhONhq1y#f9G2`?2^u>{ft4#@2 zeCN7kmYOY36eIKte#M1Uk{@BXF;*S^> z$Y1OW)9^eT8zr$Pu;>i?$;UrAZ$oIRd4Vz5_3hR7Q+EizU|KL1>XC0S=oDW_ zeF^XPWk$eiH%r0$$;?kW&rKH!rU|T1nChP6o3)OI`+hrp$xxF$s#Nf4nY4H^VBNmQ z@F?+CvSUD;6os%`kyxeg=OYEWe1)u=m2sZ_Gp}C#C;vn(y&xWaO!%WX=nrKUXOI@D!HTryD0!%hNL(e6hCw4lT{kWa_UYJ38wCTSWbIhxyF=f|pKz96V@l^jy`?N7IlV%jFEp?b}@AT^&j`qvK`yjBvUP z+xU>xW;VC6hOC;Vo?aUIq%E9U+f~7%R}zvBJ#I+M=}d&VKaU!|u=`n? zBi9bTjYEQ{**o0H&vqtmKd-0w4KUk(CV1{Aj%gog%fan_cKwz0UkfQR9LbJz@KNgB zG8h+qTVHxi8*uh#bO6yjqZXUfGR&5(OcH?z<44uJA|ub|<6$&?vo)a?f7=5lDhZ<6 z&j(dBHp&mN6TXFhSb0&UjuG8V=prpt;91p+(>wF!q0eGlpz=)}N&}a11NWtGk~xSi zB{`>oxad~P*}$Fwh7M;YuB#11--EBdwmUhzrQ^}=4b>e+#Jf}76cG<6!x&56w_e-1 zV#lmH>5gC5evaSXk!?4D`}4WL5@tQMS5U{8Wi|Jst4UqBn~?U&r|0|itJ!nw zuQPSthdN&GjEj3^GRkcC`eR0e>OJRRS|`J-=Mfgs3|cIs9CN#T6i38XU)lsA`` z$3@;9Og6n8iumxPV^9a!9f0QB`a*e&Q@J_f%&C-wqFQvDPCZ+imS}rtfHk*etpp1( z@y+ju7V4lO!!u7Q@Ceo1z06uc8z&$7oW&H))SY|Ht9${^>aHC166vIHOu(r)_QxxF zm>(^vFwVSaqvR_$A37wSEtmD|ZizBk;N!`r!nR%dFmoM+)j;`UXNBm{M0#tnPf4ct zf~)$!?i$83&sQb2{I{??8N1%(fB0-q=rVrW=e3RSW5V(~F9#=oWm>(v@ieALHzt<6 zy1V!fGwks=5`)$@uBCG`EJcn$ej z##^|-j0!p9-gwW}Ij{E>Rw=Mc*%&ru>qx3`{`IZc`J;t;=?ZMire5%0jG@oYKA!af z{YbQ~$ECgks||hC72YP<3%AZo?8ygj`r3_n;tlA;iL{wFDfGA?-q@1#k(NzSQm$Y8 zZE3?dYc%dRw2Og)`%6=Wrx$RQtUna7?=6Ib!I#DAhqY_uV%`nPsc&tC3n;{7eL6c5 zDZgWu)qQaD=NomQK_?lvZ+@&?waq8ApSl;C;KV2Eh9lECCR)SqYkNa(AFsIppFj4g z1K|%l4BKZ#SMLS>>$)hx#P5A~;wR-ZMfAF`2dCsOyJ{g+>W{i*F5H(ZLCXsPTbD$x=RM8qz2e`?usQPbJdsr+r;)qDb#GyraEdsQN#?pf z(eg7dD{?*iV~vh%)6EjNXSZ!{Ot{eS=-haBTJNFA(U}q+$sGPV=DW8xE_aRxeC;_D zN6;u6JGK!Et;Dpvj|!?kkGSYnE~zS|_yi_?BFQWNqx}%CXX0{Nkvn|k3G?k&f#MC9 zrpkXP*jth}YS;K6e%UtQL0N%WX0)aKkcD*nR?64CGP0QY8M#9sikFt97Iw33_$cBy z(a={a9L&U4D(_#oT6h0w-oAptPIk(%kFm09LCuxp@D6PQLpcpNrGK&X*r}To)$PA_ z#e?(B)qfvnkb2j0l5SoqM6fqK1uiR3u^1LVxsK~69A(kqFbJR6!(bWz8c#p-Kr{o_ zs&v~#@-E>}jS_ytq+cN^?={uYG;2JoJB_4F7GR_rxuTEawhE1&G!&e8&t7_th_2sD zz7Zkj)uxwEb2fYJdM!5Cor>W6G#!n}f4&Mffx9N!(@f7K-IsI8Vt zkjaEgkSYq_(+FFm^@L(R$1Wwe$xbf+b6j$6XuRDaTm~hjZP@HOcN-b6nG6)+AyhdT zLYkP&Fr$^I-b(|#E;F?cJXR{*b@!SOrVqJ)>&N$Fy%WE__dow7MFaVZ2N+|~Pkx!S zca1b^q?upYGu^j9q+f^xiW(rdxmYvB2jNmrUcl_5nbbgrwUamDWOWPqk!AXxP? zd|!Y2S|_uLH0yo^UBsc}TD^Ixkx`x*7nz<;K1RG@W>|)6j%<$IE7f3&4o-%4hHHMC zt7nU_M^GMN1ZJ`xttzuFH{CWTn461fbcmP(9qv|K&L3%l`OEbea*vuzMTU}jLl?N# zfS*tEXjoWdVTQ(Qr@NT}(zh}3-1>;n+6xJ!Ldd_uLv-(+@Fcn(5ks?;38C)jN-;?MB$UHmjtXU7@7?+I6D}Y-T6(v_hnK zBK?U64lJJedCp4f0Vm=&&*VId)=sA~Xqx=8T(MQ7g*abgtuvc%eKj1j`j(KJN_!4x zuou4rZNJ#;oZRjE&bR5V8L45`V;_sl%2+4pUMKztpb#Z-6xHE-+aiYxiAk`F!f|%k^PX8LQZH`@B$qEG*a5vLxBBmdqcMbE;!sW9rlRPwOvkNURBW}^ytIkl; z)92lH&9cpmSgr|O`etW+fwoTM!?7or2zhaKeA=cW7o4a2L(t9ij5o^gaV26hvuBon zStRgru1eZI+Zr#C3YQ+Ck2{b#?Oad&nUoX~{_H%ZX*tfE^i17XZxHG&>*o|}SVOSi zN~f%!NE-BXmJ`5Fvix(!6WUhJpTNV!0X8!tPzjz=RRP}dE{ zglB|#et9!!&h|_N_;twB|_A z^H*M%7F^Rr{CP}YD6?Ps-o3C(4Gk(eW9$^;hhuuxfMaS2a*NPbx~Eian$-^Lmox47 zgHP~ONpwErd^3CRW8ALu!b&N?H%I-XpPq~2OfAB#I%0@L{p+k~L;*jo=f3(}M6`(C z;A7j9zUq8NnJ1bZ0&#R>jSr29u@Cxo{9j!XQe4F8mkdg{*8@t>p<<)SnT6Fp1Q2Vc z^N8oTA{}JQAlPeaGqmFX3BPTzy`Mx=0?cg!{~z|gva8Ci4Oc>7Q34AIX{5WQrMtVk zOGG6E>6Y#WDd`50E@=>uMidl~loU|v%xA~D-S0Sm;GFS(VKDrFYt84GbKduLUtv9# z(&v+4SGN#KND@m6vo1Mj?q^%SjBH&21Jxj_YgEU=tt@j(qkiT12bc@RD{tM@lDS-^pG000qC# zQeFE)mPhptUJs-br2ha8r1D%5cT)#WrLcnzX>wp>aNuPdE5AxZeun+#)P;i*yEQC~X`VZ_VVRkW$+MZsAEL{Sl3GG%V=O zR;~Fnu8-^{zsyPA(T#Kq<(E9P9XBsfcc~kq(>oS9#4(`K(W>ambZIFSCJBaU_4$1D@=v{*s)^uiU zeRgm=+7SM)wX&YTB3z1cpBn8_FDW@XoT2InXO`>O#}e!DLH*mX*Ksf92M?03UUY=T zs13AbI%0FmhZEbnI>s(Qt0=9owl1cqL9kCIh-TKvxWf|n6qxrloKW_T)z7n zugNkd8%1RP)yO(oJMwvre7fyEo0`{AEQcDRH@CWp&|eTWy)C+Di;nDYX}QssWJhhi zW>>0vkR6S%S&a0fjn|N}d)6UY&E)(_VN>z%a}R8vyli;a`ltrCWdbwr076SIP#1^P z=7F}b2|4)(h#`*H!BH`*QuGsOCqQO$55z2N)83wzxK^^dfFBTLC}CE@*JDKFrmO#7OT3i6jh2Y*2(VRzhTovq z-S&Je<^ILczZ#fj%onwoVgSP5g~siF_MF{&WIbdPa3-_N>*?WLJYH2VjQhB0;y>69e1GmfrT%9*pcYsS4*^dtgDKv*Iz2XWqRz3h zF(sk}00wQsORynAIZC^!iTXO2{hdl+2ZvXHzjT;t{+(RB1PngxGk1K8Xp4XS)kyy_ zAE2H9X;TD_Wyq`M$5DL}1C)_!`J1=Bq$UZBr({ChiN_wtX*w-As$8r2_eRE5)++ni z)9=W%W5Up%bxuv`y!dAk!P#Z^7;#PHLF0&|zYP)Ib`XqMz^#y%9t+_)={*Y+`xKJf z0q5p6cAu&;j6jhja}8KDL)?eJ_BV~R&EUiE+#fYMy)>Ut=ESD?I(MeX-y9Ky^`D*Z2ou#gFnmc1aXL z^63EbuF~L5-=dzP;eUT|VPuwUWCY2&qM%No$x@01kTRB&MhOiVs2>5-C$3T4%q00t zU@8&1u~!rEI+4;GYFwyBNS)Ozk5|JN~MD|D3Mzz!2OJGpHftJ9V5B$YGhbt_n8H#!fB(tGs62Dn zFBdbw7?S{>yJ-kekZsF80u(R@0kKrDLSTzegLm#qAw)6x-z&XLQhl+nEAgNw`dw3&1L$JQ=B9aS{gFOwG zt6g=<82@=)o&Cl5&g%I%4*4F2Kwg!`D-Swf(A;x8hI}9(bqjEi zVcrF0!>vC4wBdJWz!0_YE-L*hl3nS=T~Ud@XO7V4JC(_EoU3Bl=CVaDiF~Q_1hQ%1 zg80^cmtQFWQ(JQ&h71x=kC)Htnlsb-cf8jT&!IT=<8?!4$N?vtz!k6(ebepx%CmQh zU7w=^@UruZNB1p&Vv8yQWrGjTJkRMnXhZ>H2I`1jZs(Vg&aHFq>r{$S`4&Rs)01t% zoeCrbZ0c~C5%{>_fiG>;e_EG6uWok1a!=+-B>IdFtruA52Zj`}!6XUJ>HFqS}SFomlLxa{rp@Tfer|Pn=>aTv= zMPkIr5ZRC*5>moz@$1}~?uF9VL^utqj`_sQ0JV8Nh60#VMW8i$-?1$(9l>#I5dt8T+@M0?~c0A5;@OPOrd z++G*GT+QVYVD(pX4qb3dlxDaako(O1Q`a?1`G_0C3L{fPA%sgB$aTWS#nML#O1k;= zrM~e={o!XI_EZWZORe2n(Ny-THfgt5xAv(l8v&xxY=rs8fbsBZLVp`)x~mh|*{=55 zS)MWbeEEHs>_v8g``B7h7ICtVPSmXH78{w{AXTl~3uh!`&`sXv!>ntJX3Z~B8Ni$3 z_4PLMO6*A)-Vbz+tz{#BzDae#STsD11IIg`dG_=1*M6@=z%zvliCV5Kj{^j~12TD! z;gZ`Wtkyg$+*_`0(bW0<=5s^DAY`KvrK%NC72Kjhl*Q*Yz!x*@5CwW7&UDCIJ#_-r za{bpLA6ncnf+OyyARvKMk>}2M=qEZ%*O3I$EM?@4r}0MiL*icbiGR@zS~M&-2zA4F z5fpmY@nV$w{k$qHnZvy_s=5%-yq@0U08C*X{~SF5xxHq=Py!9S+Nb?1Z+T9`%2k;l z`QNk6KTf=wuAQl(5m4YPj14$EIa(W%=A^Q0W;KPJm(!FaBHT*B8bj;EjXZj5y4B+m zq6&d%DcG5r98z`}paOAQ?Mb}-WlCudh%j~l#eL9ZE=R<>|MZ0Rfog|Cw>Rn?a?Qr z%Mb>}Qh#_((q}}M_YKtabgzs(qhN2hBx;h1e%0z(E0xd%$Wyrj6{A~#dyf+1H@VE8 zB6RdKy1q@Di{P@?DZ>m(HilMDPis~KnsU>Ea=~WO1ZbY zdiD?uRq(Xpqyk8H&3^5$qbe))fL7OKWX>Ri(pdIl%4_MqnAQ-`idN|*V>ySP-4#xZ z9*}l;coUH39*VIJsN>)7Q@!)4q`+7|^{&m0x-mJQ^mG{mV$P6Ur9iqgCgGQ{OvkVc zc9h{PdoF_mU+bLad%ta{O!}_v6VQ`bWw6NVe{ic&Vs)53pG>D4WP6=93hKLL#a*Q+ zh@`^9jbLOV(jK@lvB0Cd;(y4y?h$a8mkv_%yvdyc3R<$(!s>q>3aDV>!u)AjNcdgN z$f;_ZoC@pKcM?@aiCcq}!xTZEY!5cBbY3IQJm?0zLT@g=JtX8`xxTu%|70RhoHMC{nd`Q&>IYk71wD>HgTn(zyEC!JnauGqDs%q*9CNwBlusGvgekqO{_xk(w&Y7VZmwFpGwFRvCUXWOc z#_-UTo>@Yw9wGQh|E$UcHjMOfA8rMA*d2=Tk1)T&lAkTe%h^RGJakF#-_8t2DogRwVc3spJHMEIYg=gu z1Z0HWEO>mE+ru$8wV(aBx8=_+KrQ*!tk_Xm4QCt;wv{fF_raelhC`b zRrw^yK&f>s&em1k?%jZEc6zqPS{ zR{8(?`M(wT-wOP11^ypdfqU{Rpc4eO@mIiIxderj&G$24gh%nv_Y$;FM%q14Ti%N; zMEZR56*%_oXV4eWA;U({0pEa`>gmQEaCv}K4~m~n{|0+Fq0#Zpi)64ulKTSzkf9USc5rH|gUqtZD6VLgnI)}RIwl^)*%p5ttshq zVq`l8f@0yy^x?DXy}4>rE&gvx+d$1c&>T8bw{6}|c?LWjN({QuCuJ-XMy`h|ZM6WL zRA(r?w=PD8+-dZErd-#_6Ih~H$w`)TJ1;hXFU+J|!$k0}#;1W8k-@^R(&Hm&Et{M~ zfzWY#=8Bo1L4hBZu~MR5fH%9BcED70JEf0D+`xQsXTJ9S^401cKe4R}CRB=dWnZ@z z8+V{U2heRX;ii~HIpn6f0-d(~(d zn8_E>$w?ZaKHir)2LUNs+Sn;l88Ym%i)1C=;2x;TC;<##ahboB+Xq6SiR-i#VGT@DaGobrEjHHdwRj(p7YK)*x{-4Z(Z09> z;P@^%EASoRgjX&h-zj+^mUdqs4teyH_U>H|JiIoq?+QpE3kPu~=1(=IkPCR8{>}4( zD$ogXG#}vpP(960z;0snb(r}j0c+W_AxqXeq@C2F=gA<)f-~~fEw|`pb52(O_5ggh ztzqWsif0%x{9nSE-0BHvok*P8=+MO6w-Ih0b&_rfcmb*Jye?vA8`u=k{--7WfDAs( z*|4IrUXQnb$BPTMfqAuv_s&kiRj}FiB3K5cp>lN2L%H4Iz7fK7Alr_Vi61M5)fFY# zH83pKcK=6~@RvBj1d-)kZGST@tsrg^zY%jp5i$3g^p0yz9t^^AAka)d&Jwf7mTM7b z)hYZdo)B_@;}1Ks@ueC%&q1oNX>GsxZ$wBvb7^#FdhSypq@bdv5+Mg_hGZ^9ChbzF{j3vlwr3ddHRFR<@>E-yl)Rf9dth!f&DV2R64rCGeg3!PId91pFTcVvD;_cpi@W zB_Ddi=(%l1^L!2VCxD9(y1=tD7(o#XvVXnJ0|2}fVwmu*#O)f-N8Bb{p8~ChGc7TXc!HDQj6o@b#ntxTl90ckYwiG` zqF%xyw3OABzSF)1gko<5Go9*SqHfP#!=s5L8)O!t;DPxdA6DbD!m?*vZ%tnk1+A6M zOdy6E=z9${ozupKad7dlXv0Z?bM{QTZ!t^QJn}+F*uKTGCD@GhLy(9)nP-@}`$3wg zI9qOXZX1Ca&Bl;@2Bj(Lw5Zd(wsRoEG60AlmAHaXVSU0jd9z29JRG+dH^i%c$&6!W zQ!u|0tUX%jv@DJt&0^4UWP%qLo> zJP3MsIST+<&PIn|swuR~oO{DOAECyoqo)m*%IsycKeTOQfB0CrrVi0y3V^1)*t~dF zo-c%m!9$RV?+wFeTteH67%p-MEaYl9%Rn5z4k2(M@G7+ds=;)!9Ry~WyZ={7GNv$eqAc-(MM!w@88LdNe(sct`( zSg(P$MMx}(q8z8QE7>QQB`{R{-kARPPLg^e5LquEk!>Pnn8BrQrb39Q0ngA(^C7_x z+F3pa_=#dM?2FSDEtrb3ArT3C)}*e?+e?;BBg-3w;|*(rG;Nk`<;yYOVAl2fV-or|dr;+ot9egtIKJOGx9Pw!sHC;HAhwD@VHhA{l@JC?B0#pnl zt&wytAq>gtOGXvWmL21n58m^`BL<&eZkJadP`&`VXFOr=i0fgS_TkMsK*~s$f9ZSV zi}aOj^{EOlhXTa`0qr;+6W5EJFsBSN%aszs-|7_vT!z?NhfHBuBsR>p)69svb@-}i zk#bj{BH|+FyJ7`oU!KCdFHa5bM>zyK-Sq*1wx#-|umm`%dQ{&!ja}fhcn}A@SQD~A zr2C`6A>bNs$8F&IbKO|mY9UsYa(xYf#@?&Jcl~XtF&*+UmCh^9j1@58AHK!mq`wai zD*@EfA->*u{>M>$_b$NUo>QJC9)T%Iqv1w(boZgW%hL+qpiaDtkUh{VSWlZ!ARO$=~X$sAUSHgZdPg_x(YFz@gpUo3rL&?-+Q|5S$g^$aqn z8CB#Yb?~bUJxw!K`@D2nR*NX_Fua1~j2ur9ak!N%8E*h7Sz)fFgfutT?TMBu#jd3k zj~+(^zf<7`jQ)==={o#_kp+qJj!D7?eCC^H)WTN*pgO=yT5uU zmi6eOghSqET(1H=#J6vilU<8~=5tb-qsKgQR3}KjcsTsHf|q0IGV_Wbf1?=)ep6Wv z(@2~rD~`Vpn!%-&b>&Xt4g@sBztWu#xs)Fj} zz5~N0Z=n5-4$=8mpCLRoCFy3iwsZ9MFL?K?pl8$ zCqeG}*sWFheEcI_F^gX$T-j(zX*uPUl32IoAARFw0^jN7ohQI7zBvv@Ic^wEufp@Q zxYV4Xq4@zmHZfP<)C0W`F!rQ*WZzJgeven3Lm5|csIJ{<^RbJrLOCp>1;L>OZ4Q~W z1mk-QUk$SIL_fF3ccTXZ=~NX*AJh(rTcuzUqaJfD%=_@yYHv^$J!|F-Jkqv_Bzw9| z9y<24*EpQ}(P3(5m?4t>EiU*2zX5Y@CT{V(>hyH>Chw6cuX=2ckny)~Bdus@(rVUQ z{90B~M(#Ipj8MjoP=6y$3$CC$6s`AdBmd;3+D8#eTkf!Anyuxm6+ zKkFs)$-%U=HoZ_kV0jSkrNUIIJc!^1#$e`cGS{2Wg?Wt1R}0Ja6kkfKw+{r9Qv^d< zI3jZhlDhK04nsR~L^~z&I10@?=BJzDR0#C?tKKPsOL@9wbZ8Iis=ne6i{p@V$nc7H zB=}75U9BcZQtQ0r{*@7uS6jHIt{g`v#V?+0X-oaho>yEVIX`)YS#il#IgUuQp)Na_ zr=kd!@T6OdeAHR1{Mko9WY!tu3x3XPPzf%1Be%-W?8#39AJoxSMA-+fUDx9lUo~V} z6wr#J;QC(HI2Y1QU}$bA%#t*Dj^V9IKOLtNN}4(K;(_T)6&sklI5_3i(u2)rdYImtKO| zDrLF@Q8Lcv*cI~3U2p2U6P+~`>f|4g8O?X{XH>yniKUj&$Ut=nR7yYRiyDy3o}NM; z`+>jQ=TyMgGyJ|RgOZ>HSR@6R5E&W=*%ysw(Q<-!FrI&%j-t4X+brpMbwrlI{Z$jq z^j^+>2b&4xF~9k~BVS57HPe5A(s_+=v7x&4suv04LcLKI8D>SuA1~u#B{u*7TL)<4 zkA1oi`rDd=Llei``s$97log#vM9`St)sqH!&) z@(xB?wB_Gxg*Dv?#hXz$xQ^C~RqX3JNZ$r+T3Da#A; ziFEI*e(CPk)9iwT0vT;~mhHkaI=RzcEWUaF0BLRS{aWxcjwOF2#P$>DN_?a@kGXl( zuhL8=tcb}A%|HHZ`TuJCpTk&8+UCEy)zI`~-N_yirvDkaXAj7etF>HsJmREW&KKmr zVjh|Fx`oyCi>m}1U~(qvpQ!f-8Qv#Zx8QZO57f%!v<%fp`6>1JgeBPM7jQZ(aNBkW zJQ?S(Kn)>)g(rqeFgpcipx8M0nIn0&Ee~9iYA*Qud?+%~~Z}XW% z@K`g$5n~=X&-~J{`$sXP(*Yvn| zV3s7wyWgge$wL0sDlPIMZWiLOmG3F{l3hP(+_J9jk)p`A^>R#S({2sQW7Hcw2 zc_J}fT`!AD5F-MUqmey+z2% zIQFQduD3MrkADM@)_M;#@xE`Q==YlLRCH=g@=mV#_v)GIOK_a#a~oI-Teh42S7(w* z)z#0CG7P$3xBHYBW)&RJRQ>HI2W9v=c4HCXhfEgnqLZ1M$gSB{$|;8V@;v?`rN|hc3{aMkDdL*^J#6t*o>+>~p!50tbyhprrgpK2w9AsY93cN5>WCNL~Zl~Of=OI0_-7aYbfa2O1XPZ~j_&TUd4=+u!& z)6^nyvCu{$Zlxp($#qR-rln7HtvIuP^d>l?5)E%$vUZT7CIN7Ga zimJ9ec$Q`#Nl>C9tGe0I;!H_LrJyoAT9P`#E+Y2>#&h&=qCMbD8__;fNBlfw6V}4| z980O~06^AN>no83_DTWUQ$-jk3Xe$K0@=%*m)6u_rMYD)#>x|ghlt%S%(H^{4s9}y z?bWyFR-G5R6>wf1v`Vr&bxGN-tqgVVhVw2+Mighn{})ZIoYH@cR(zkq9-V=ZRz78( z0YPg7*sGJGs(&z?e4Ve0^q%z<(zdHgV~c}FNyFz$w3|}Ja&yUI!mCrd99jz4d9tKDR1qv{#990 zBC@KO^+ypi;6DQNu6>~mp5QWiOrts~5(KiaIC#p>!@`z^SoxD=J z+<4IG1?c+5Js>)QK^XAv+NJ2D>HRGrf0e0ypknRYTj2-xnm$B8erhT=ko4;!T z{urC$p+Q9Hb5e~};GooV8YaPM-VE(g8o7UAG37q8g|X&;9CLNI|aD(^0>RrOym& zX79}!jJ~l-bT#|{^CaHlN{Hb35i$;H8Z4Q%hvU`c9)ppY-uZmEa$j!~m{ppUu^D;V z1VFZ(Vc2B9PWN6irRs8_MBV0@wb^cL_>#ydk(#HxBc>6ZP*5D`$>zr+&(5O_SxT8xO>2J;9q z|4dkWO~(C5P7P^J&l0Q6{6kZv0mU)(Qco&(#0_D;#~8YUD3K3K-mDwsW!W>12m zy*uF%pe^HDg#7|bTA=&vlNn-@{6w9c=Ume+y-!K<+M9@GtLz3DL@9zV50>g}-vg#( zUE5)zQK*Sqiv%o`1nmeDVYczi8&7j9&m|9jG8Ktr9;2 zd!>GMN3iu{8fSiMdhHaERRDi=R=8Fd>JJh+dyt7IOox?H+-X@tel3$qa+OURN+Kz01&)!jL0E-Eaw}zt)z~x+0A`DHBa|9w*IkWcim%`~CWm z+he$1F?2&DoCs#WDlgAz0GIvU$vF27sDwjRgNGsGVJv|JUU920tg$=x7!Iwg#~Qz( zM}so{u1R3@NDwbkFa|jAe%SYT!b8-6$&5PE&wK4<$0%?yT3haEU{_DLa|Re^kW4wk zyA#A)%kJS%1X4>l1tjO93p;p*R^_GU;eZgsvG5Ju56eB zXN%68JpeIuAsZ?zRSF4f|Dj>~1IP-EuKiq;ag-;BSFXA}1V)N#olGl+=draYOoahi9| z2rjAqX%46a63HjsAtdqWdA!xXKs)g5(Wt~ej+-{*7s*5s;c9di3K9s0#sg%sv5-xP z#ekl8Z7aOp_uM&UQCI66kOM4;bq$9P?vX|Pn*|BPi2?zDUy)H+HcLLGAS#u51uj6Q zk;>q!9^&2Sg@k>&iSbYO7L$(+dX7_}=XcU0UicAnD$R3arKLCQ&TG>X@$}o=ak}t- zf53ozG-!YeU1(~mU`Em`mR_i73S9T?rE3-ho@{tBQ)5Fp7B4PNr9Z5SRYD3Freqw` zu^R_FaL)nyKcV3+tQ8R!qd-{r)AEfO(<+fF>%j;}7H$U=Vn9GHFU`;-{$|M4G~s>! z_-P?o;r4%BfDK-V;4~zRgl!K2P*8%-8;tv2A?1MZ>t_C`xMN^f91{wJmKLZ+scgm* z@P&}MPCvgYH&Q^0r?RNTe&wjFYzY2pAFx>Gc<#QrUK0k>uz4kDO|a|KcUG7A@TQ)UBF3?OPnO#b|QhgGvQ z{7~WvS7pJimZddd`n?azkp(6*1q@u5XEL$m&XqP}8FxQ1)zI}y>Pm}VAZyxZDEWZ1 z?K9Z>qkUe}>aq)z+*ThUF;4~SPi>^I%D-KT{!_Q9Q6ki8%tPGQ748<`0&scpV9z(@B~~HH75jA(+^F8z3`>*BmoB6_hVQ zWfy?aGG7E9T=$w(wk0!2QV^GI3MNatoowC6MEx&%3D_@5vi@o*#ZS!XFs9$~ee$$C z9axA{BUdK*atsWz%1K|}&R=C}z0F)rmoy=5Bf>1svLUS5jg!MEr~bS%nk_VU4`Sw)SyiWRTLD2HU5ZFl={+bmlg9_} zZ7c7}vngSFqi7Bt4)@v7=3`69tw1r;-fw>cpz?0RYEXI)?V&DGb`<2QKso?G4R!)m zVMR9o^?7H|t>?Z@>Wh!TlY2uMS-h9gZv3$T5=-6nJRzt3SUlx2NdUxTJ|6<7y718A zH1|C^FS6}<0z@O5c_Fisj`o-v%nAXoTg*bgmOfwG=>C)nsi=rk3&e5(1?Za%Ag)j< zN#Dl1d7VD0^{MQs_+t3a<8Q4h+i+V`t1<*BW>BLJqDUg=*uDL2`{xy*K`O$gAM)Hj z1dh0NjD;a*-oUMZuXnkYvu1ASf$CjRO&Ck;tye0$*btgV{2X#is#r@R zNgky1115j<8&C}zx{<652?Iztuxo*KNZ&f73lGtEu`5O2CY`p7o*e+SePjFTl5Um$X0kZaqEzP zsLiY!v57FAB`TY1w{-y={=frt!A`dJxJ!&68g(X6q;47Zrh$l|gB+L?3_S=h_l@QF z;F<}1t?qyEofqlh=-Xh#jDd7mAelspA?on!z_HD(ukRF?E43D~Qwy;=CIdI88{zy% zgZKBap%57pB40N^b1{5E?V#hlzG|T&u%1+QHvvPWVFb96CmC@cFqN`7bvZr5bkbEBWiDo&7~~#OBjyttAyJnaDtfv_D)9;=`jK(wAz;HJ1R>iUA4^69zA@4ftpL zp+Rnp?uYIm=d3OO3L#Ek2l1WH03-0<<)#{b0K}+EHTUiL#6ut<{Y+gO`;?IdzvD$j z)uhWOKus@8Uh-N6w-%_ARcDQ!D8D=~B_};qiq~%i9JWu4^uRWsy;@dYg$@cddx9}B zz&c~>X5AXOFy}%+@YBgac;8t`Vy4}#5V4^gIT}W+IwNQm&p`!ImuApcL)u&bg(^|r zdo5nJhos-ZV3TMKN8tphMPiJVFMdD_5~@AW2-z={{U(!4lJZv;1D#r(w!#VAqdVbw zRHSsOz=}Uon<*(is8+uthu)$1o^)vi_*O>~1Sa(daIUAv9Oo*vPTpha6xtW~;ota7 zW|Oxr@$5VakWBVz!2D_pT>58*s!Wl?4&jZcQ}v1~-fbYp_!D3!B_}&3pXaOtGvv2A z*&waJchM6R5pP{zywzyF>Er=^M6HqScppso427w*owdLyam_@~ z=CyH^b3gB{ zK+f#4)Jx=fW?NOormo~k<-p`>vi#@NIputd1u=r?7nV#xKOn7WP$AWR@zLl#RU~+_ zY-!*6%<|py{mFiAhiQiEAO&9b+(AHl-0IYK-+2DpAvb(qZE8uEIyd#f20?rjJda)L zve592OGWrSZgRxIuOZTN+9DJ8xI^vOr9}kvXc6IFvfkCtV=_%aPjmTw9!8s_TWRV^ z)hf#=H~DDh$^y20_cr&dmzSyNZJIw(HIstve8a$v#2=&=n^E`K_d=V`L*y}t^sXsK zPLK$bAg-v$Qj^FR@vC_RPTAm$XY9Bk^HS>(QqMu{o`#c47}LnV4g?}q-)}i+Z!R{L z4?VqaS()+AmK&76mCE-8rRH6!Yh`o^TCo4fX`slrLIvmVwI5%|_YZ+nR@33N`f49` z(EyP0vK!1(f17VZdlliH)p-W$qfxB{f3a>M$&+LUcxEPUaWhGkW^6f;tt37KZSBWVa# zMSdiG8>|v?J2I{54IiBjnLpah)~l$vs;lg^EO;jp+aBOBx14+KlUf1iId4NLjY1r|o{4xDd+0B)PUCcVzr9$ke^NE9ofek|+D_aAQP#5nuMNl7iH9CSsw$j2mX(4*yEkvFCj9V{uR%E`v5baS(hG<~e90I_Wru=@WgyO!y-#?Ik2XKF|2wW} z?fCQ;HBW(G%YfKyFej>U`o8AC>-Hx`4XXrC++u3WQ`gy%g77 zH(Iwl#?FBzFQmYzsaEN|faQ-qS=nPZFekHa zWe1sKSy*?Cx$1>DQ-t6>a&9sYH&CsIDG?Xmjq=owjTpWiU_{)z9cViBpIcN+8}XDY zC8`&>0?404&Pf!wo~FoXGaFKk2(&#w#UxS-SAMM{tA_(($FXKfAZzJL!OGf?quEUv zN2&z*A$FWpVtPIaFp)wVH?o8;xSs+TA^H6I^Mw&)lM(ucFO9umjy1p~sy#0W4-b@) z}6b> z(K9NKGN75Z^Ffo{LK4luNc_=pKwo&!2Uk5w$fC!LxEaF9~FT;&<>nPICIVBJbSgp47N zN}-&|573}8k+T0_7+o+ZH|^9m8$K0(A&6l6uo^D3TFold=BkIT|Kr_a@zpST0F`;3 z{H)T4NauxLc9MG4q>Z_d5ihGyjaK_HUROe%IlTMH`ydlK)Tx1rUY}Sn^VfQzP8=q3 z94{$ee$SrbI9T5{a(FBtWbjdR?m`&<$~RH@J7yA z9H%WGOWnwP@u;y}=!f(2w%c_cno$RUQSWkjYr5dCcC~>Gk>Dmv_xt%PfE((Z(&tok z!%i7rK8mB?5aXx5u7hI+t7n63%hk$^PC9QtVcvSqH>xa-V-Gz^s0h$WjzLLWJ9o~) zu{4u`Xmh{JT$wJ)yi%}nc)1oUx?tO#>E0*686O`=b6Dl zA!w84dDQ*T?z(~2yS^5?S1n03oG!d!O{mfH(Bi|$t~8E=!RWZ-u-xco?+CT8=;{E# z8(faR$awP@E8fTZj&cdU&94(e7CjuK87I@piWd!jKSxZtFk{airbM9#z&cMb6J9z5 z@-A$I@6|D+C*1!_Xy%*%)seP-Jhe|bxF|!}zc6#JJA&$C`wqOvl5%P`3wD#GT4?E8+=r?p_ z{KNIU2Ip!m2Mj!KO~iDjf`x+e-d4}PUD2`q+EEWpcMDR&GSAb}H2ux25KabrGBpM!*gbKHCS1G{Qn3DLOw3Sv%s0qktg+i(lgk*Z-Po{V%({)K#-FEkgD-SFxNthXpoV<7+ zw^}!l0toI!sEP1fD!hE52i)OIrLb|P&e8o&Dm%|rH4Sz==D(k$|E-q@7X?FKn5+b? zc$(S`JW)cY*~?$Y{M^yIMEsqH_N510kI& zZ1XN^QO{RTTMfRxar2F`xoO-zI8l*zgI8JTHOL00A^`(c$=mOZ!+!|(dQJ>q(W^ac zbwNpg$5-nq#V2Q?kI!s0_4frehGT}ip7W^iCwBTAxDVc&>hayB3ww)!n_Pz7Ti>}m zMv+K0(^fK?!f-ZsL`#6N(j}D8)SAET{p&~9{5@d~8%dVoN8IMrn6QM~#VIxipqM>s z{YuYYL5Eq;rpWq(yMng>NEN0M_LFFz>H%x0e9R~#S z*kf)bam&9jHlQ2z1O{_2M8x^% zaNod|xSDNRbE=D`Xg-dFPTK+(f8GU_LCk6$vvf=)z`m2N50%}=ef6l$tHp-M|ABpX z?yFcT_XK^oQirCERE#rT!wWAF?^7$x;Ba$IZUI!wuS2KLK(Ds8VGyY0!rUF0f6q=k zUF%?ue<1;;bJx(}m2-Q;0KbhB)>f*$fgv5aM(5!(mf<)o$Z^=Q9hDS5HxTAjxR#okB(5!s`a~wQzu4#)beviEi&$pB^pls3 zGRIF9eJu?o;mLUTJ^UlcDJsOuSibQ!JJaiaJwDVye6Y5cF#NlLzC<#XUpxx(5XiX>Zf1&qm0`BCZsPQ>pef*Cb=8L z5R*fI{-z!D!6A54!%%Q|BMak($U6#s3p<)vc&q9gm*tWO^OuDx9ogut{?(AoVXRGp zlnC*tev45*!?;oS=^)E6GR~BJ@AitVwK)3=EK7Rwj~(XsOJ{Iv2{{Ijf)5TLhNMlt zbsWna)_J;b1X@-T*dk)@Mo1^kn^z?db;V)8E99Y{ESJlrs!Tf5;lL{ zkwXrijYC2~ZgKJ&Zf2SD`FoD!dEsPk$G{R96clfw)cwqKM2=^>I$(i~NcPYsAHe+>oAM+u17lV4r)_@sRIYCv!kNmaph1TbWeD$7YBX@G!_+tA{WuYtz zff!asfgd1lUDGkRaX6h9qfH`4gEgT_h=kyx?<6MS!z*_ zv|W3whN9Ds8IoHqGmufb7U8|zFaC%oWg?q4b=~29LgadR(9jf=;ztHDdM-k@IjK4 z=JlNgS-=WfM#4uE7Qzt3In;58 z{!(>UV_jFZD4U9^ZoT;I=Z1j!SZ*GRF1C<1%%$Ov0E&Y@11N^8M!%DgSPe#7azJ*S zGo2usShBxghky5-`fA}@9vBTeX1p2Wu6d|%avOZl z@yd%h6?~(jPo-RRB+0~Myu{~DvYBrNe?pdH@14z>=_$See7cPl_OZRKRHf$r1tkf^ z$BI%lJC47=0kxO@ne%cq>JOxHV6`l_obpR)6Wvk>HWiv^Hg4Co3ME8zOqs0})4J!< z4mK#B2Q7T|_^7a>6QgY={2-X@!L{4LVwS65u;vP-#O+8{ggt?9g|IueN}jc*k9%mG zI;yQMgAehS)XD8#2IS|7h>{FXac&Xr(W4 zv0#psJNvK7!$gDeTG5vhDiXe-Ay4tyXkzK~wzJW5C7LqSRY$s#Di#EpYVMYDUPdUB zsL^hF5+CKd13ZZ^gv4Jp?u>gCOZ#tE$;CSev6KU4qE@pVlE{CAO#JY8clOz@^GX_W zpD*vneb-`pS0ZJina*GxOaR!-Z#l1M@SwM_+v^zE(+bmMn!5|bazdxvT<6H{#ysJ} zojz9bqmUjD(awvi)FxDRi#j~`hWaz4Uqho!;cYZR`Z)!O&N z3OoKjX-d&Z0TSN?6mhIdJ>un`f$}pr0_Rg7(ls#aTg-?XX?B3Wq?gb3I^NK(#9=+* zb@lcf+X>LX%6oxL%0E$1BQwNvp5-YnT2_YcyY4yv-Bwvb<5@i?4uxftyUcn`J~wRF zK00Mi&|?{1?oufzFcQB@dKv7Rs;+4>&c>99dX3pm5I@9CUpKon!j$GX=f++n`9yk=|d_ z+K(A2bv78i_E)g$oh+dR>Izu;2j2wZ z8-AN-oBP8342wbd&HZB3OliK)2IP0b;z-}jt{Od^l%5SfaW&C99|C?-J4pYBy|--0 zGVQ{J6+tPHZjkQo66x*^=}zfTq#LBWTe?9~y1N@`DUp^E-t(Rroq6_8*zf-4j5Bv# zXRLLsBhJv`Dmr-`e2P2+Rq8XtBk8-~cH)7N?(L)E3=ww04Hnfh<&sKf*J8CF+(RKa z2NEafBh+QgBOkihNr8Dqm$I`In|kKk#rh(iLCuA9%=y9$<+zl8#y|o~q~1B}*K3f` zeiYn2@ad?33X8bfU;p7p&b}`F3oJCM@n_?;?xjLZfphB@w?JI|AR@anzq_k zGKrh3;!{a+lfUvNX5g!YJ_oYdoS)8npLz9UY#)?^DuB1GU5G47ZB@(}k`Vzm3faopQ}x*`SU5qfZB7~vZWQ+F!Xz?!C8VbrC*4wKVymw2xTh`Txn*) zp=jSLyvdLcPxUF&s@GyW6YYQceb;;?+V2{YbuuA6;z%g#ELgp`gOeoo+euJXsJ(^; zS_{*9zQLsW5fKQQpzE)ZF^Tv)Xrk3L&-50^lxS#G5*mz@8mI>YAVxIJ7*5EP9h^c< zcQJpZOi1g@sc1X!JvV9a8B<*Z%0@H&9*5Bk@_G{(j&B^Au>!HKS@VOINyEo6`HahD zL(+_>-#KT-m=-Hr&I&0SfYM!sfc;P|A6Hd>8{`!%8ufkyN=BUdVv`clKADCL6+hzY zsb?MlRLnmz+2e%n$vmh3t?Y`LwsloN8BQ>l zqUJSNSD#BjU(>2Xe*SZRwWhO{0%tns_NckSOz@e3HpIt$5C=n7DCr9@7fPq* z?43mCy5CJ`1zK^g${8?*F#5@`9KIW~f*B6I`qa(+6z;KgnRqGo0Q=dSo}ool%e8tb z?_Yd5ol6BbIDug!%B;n3r#B?=g}uu~D#Gv;GNU-}hp)&6mEF29OSyrc%gZyMI7_i4 zo5+0aIRW`*EU73SzIPh9vlTqQZE|OY+Kn2KPl!B*8=fra%{SFYHl;$ZuuqrqCFCYU z!`JotahSD!PCy*3qd--X8$=9C7;q?I_>Sx&I^z!JjfV_(fFboFabT6%DxM>jUFXUW zg7>e#S`32~f(0B590pdk*q_7@TJu?_PHa?TRmt{;=MOjuoPkMOg%nqS571Xm;bqgF zE=4GiQF8QT%qR-n2N~t8p9w&u!!PV>nOoC9^_Q#l0BBC`Q?L|X6}=+*C2LglN~+;E z&OriYOma-LR21Wt?l4GwiB)f#|xm5C3ir61=p%YL@wyOixl zbO%a7!9Y?b=w#h^ddlk$)u-*65e_jCU&0NRnq1+s7)!X(mh4>~9LxH$K`eK%&GgHM zYlW+C+@4H|0ytYp$;kL1$Fk%&(_m)D1RZQ~z+|CO#R5lcQEzOqgUa4Kz!8<|Y>Eam zmV-VeR_a&;b<8^4z9h0s70|lAKDb??=>;r-_d8fraKD#X0&K$>$g`(I8(K`@ll6M6 z>-uYLot!yEW$^sG80d96+y)4%(q# zuNE6|&@z?uL7TK$b^+;^M&v-Gcx~BR>Q{Stu{ql?8Mksvy=Kt}4>*`yUyT))aht_G zMw3}78y(IqpB$;wHg}GJDJy#>m+o@F5TkHbpPu0sPKK_d<|q0e0)yDPp2>ukNrLs5 z!Z!Ds(!T#Z18CIaV*+3!=&p}eatV-}9KO?Ub!r7}iM=_&miToE0j=+U?$8hh9HU>#;Z_US;mQ#VrZ`HVcwgposICLc$~5-n=$B_;0vK2S)jUJFx-idX)%#{* zn()qb(VK84;NLaY9aa# z5_Og1!`>=s#b>`HMgP3XgtBL)w%MC7j>CH&5?*1`CHr2+Wwph9))EZbkTP$h#R(;8 zbs6If_$jdWK(?9p9T>LJc}VokBHrO(E?KDH;_{3M0541kZhQH5qjz|00cn)F!=YRC zjc;sxfYJ{Yr}pi1;dVmB@VV^^rK~N8FaFcvZx9+wZH)W#-I0~gugjv84&IOA_6}H$ zDc#1{{lnBScZPn7h^_B6$a?seq|>`jHX^Qn2CyO++#~S{p1a&ZMCrs61S9J~J!blY zA!@G5*p=ETlY#c;^Tt&~^DE+0@=MfJ6m&mU!Bm)VHDSJf)`+HVs9LVFgQ+FAJ*6~F z(GhzRa6cq!m)g|=)DgfpT7A0?HPoye@S-k30D*9b)Cc}eiJWqLY~+lm@*Uw+lO-$4 z&pUD0keyUZOAc)OIU8S(f{(^a{!<>QLc6phR~fQ{L)ZjhedO^+jzy|6Nj70uI9aWIvm~ZG#Kgg7Wt^w6jc`Ax4&8wh zhLI`pz;iIC`VJ7m4e{tV^vA``t}%~UD%I>Yv<>YdnrPX=+eBxoq=jH{MiwsTJlpYf%D!>Gpm#HA%i3UPY;wCLo5U8)U_< z!}v!r!XW?&o%lKnCcTMRWoh3uhr7C$-zuQtwm;+KOArWOuugftTNSP2wl6>@>#t~| zF_)xy@Xn?6q!;gU{&*nl-HW8mYXYbm?P}u?Zpzp*S{}`uh4*@x$5XMsC~p4WIJCIe zm+N7(m1Eghv$YnbF|W|u%r{o^Y*HKfrH`<5-H1B^ngOsrTvG^!{=BLs&8LG{jJk)B zM}RP-=_U@mfY?qaBH``(^&0H5BQYJl>L;||CAQFy%EwBWJby?OgsC*zeju5!ZoI45 z-sVC1=X+gBdaIyZetPN3Qteum(jy#+VM>TwsyNcK3#4mfq?CE|o@L>g){DgP+Uf)@ z-BI-E3sqMZdHEsRn6s@Ne$Oa3LH5HdZZeqmqNL$B9wuF;4kbB>B;FG;qE*g#$-%0q)Ft+ifUXL>v}q zG~>>UK`=8xNW;pJYEte&Vo|{5>`!BGlZfEnNorSHpSeobUz3X%$6x?M9*axi%`>3M zMtqB1wpR`XR9L#TEm4l1_ubE=-5$p*hnW=``&yUFl$VzL-gi52GHG1VZ6T#ml7t;Q z{Hyd>)mc6Iz`%x=kUY;RnsCa+A!R=M@S*gY@9QhG%+|4* z%n#hnj=Ezn-e=Tg)U8^T%`M&zzkB`T=essmRoLzPYaG*;!sYT|wMvahx!xCDWBwN# zcp3s#J;)ez;SbmO>2{sKWF^KKgf|_l71TdJKmz z4(*m7{yikz8eE27o1Cq(#lCp{dRL2$WP(oJ4_DDq^#hbAB+5#iLb7>UTOiiduN8iO z29SNFxgQPN>}ql?_qrcMq{t(`PNQ#x#ZR&988RE*y})is;(ez^7W7_*hRme-?sUkH z)$*KbRJM{pK9z%BZac}j-g?1TF~+1=i8PFw$&@|9ufxX^=<_ydQqgbCG`1f(lqrPA z4>}_Tl)WU_?rPA}7=TIao#6hW{^nYQXWLC5xzj9OZU-h)$i-*0S$jnOOC@hqo*4nP5c)CAR+9nbX z*!YELghb?7XIQFow;HD6cy+ukc(GPf$dBqCk;&?`9>=gL6NSpQpDz4(!efZunO6?R zz}l^?+kF8;b`TFvLI4Ui${QLLS)hnm{!MnN=)|K+osDRX<2bwMJIfYg#P{=&9c6J{ zz_c3G^8Gx8fdq}oT>Pad9TBVwEP=Ac2o1u3%g1yQ!IVRpm=^$jC|0G_$SyCSsP9*4 zQ`i>C>)7Neod5>q8)5X5V@&st3}@-CqHcY!@eD9S>?A&;qi(=nTyi82|xz!AaihH+Vy#1%_!LpNgn zojm@L*|x+b7A6wq{9~}MV#NS^w>j@ZrM^)R8Q^{qGwxEx78wl{hE+vt%BtP*7N3RpKiW!LIKDx z@-OvRuhgy;?_^NcfgWtrvqm#s4#apIEoBrVwn-{23MiyGFdGHH&TD&Y5Je2S(={-F z6y8=P=@5bf17~f@CPpa}047I=NcBh07*8r`zXH6nbzZUH)ag^`pZNXHbFNk?%n8{$ zxYL-XWssLh>}CD<=PUHu3Wel2-P(c_Pp*N&VrzPK5c0?&A5tRA4LX=Z4_6wkX?Qf9 zS8^5^byi$EcenSIQi3XyF~jrYjYNI&RCg&a_ZYbI&=wqsM? zun{AWVZkLbBS#VAzJDpX8nSu}&=xfJz*dq=SYHoRT(-r${I79dS+|yVfg%Y=bm&=6 z-)jU&VFh>6%$c9+I-25IjO<_{J*s1eZ{Eb1Te4|&v~jE#el z)_2YdOujGHc|2Du)j)ZQT*RSq=}4dyaC3(M@444c$txf53GO~zmu&04$C+Z) z3DYm{5<>_aG^6dA>|sUVa22jMrz>jZ0L4_h-Wul>;H@cN(Zo1W(8#!S;e`;v>)GF- z#lT70U~F6I4;KLob@#decKo23>6`gyT|{8u9i>J1En~BF!eZnj9%rwGA;Ir`PNrZD z#cDQMsyjlmuVbWKP#2-}Osur{H`cje@0>- z9uWJK^sRfK3N??MKS15!5m_@Ll)aDyvK|)gH=uWs^~dBXHhcCgHF~umW@O8hTM1wM@Ur!Zvq@NDIoZSmf%ysw#=iq z>&JD1sa=|E3kr%Apf>(IetFXO@&%OrI~fXkOHn6fhnlAr0jKb5+PICW40>Pq_Gx#X znLFStp?9wBq+104wk|0<|^ zD^VTRPkJue9(0Y7gS`SMJf6Y{;$})9VYS*#=rnLiV3+@Bd-#H@7-utgxFi|%>g_7u zEUZEn0yb?aN;_Hw3N1#$UYj)A!B_H|2a}s0sI9{bW7RO*?bT>Ra6;L&^yj4ovZ+rk zuFaw~>a8`A0}`~_yQ%!1ylgLxdZZ!+7s8JFLEaPveIzIG^`Lu&nZgTUCA~^mT1JK+IdPQCPXC;FG zS8TXTku+=8=kpH##|y$xw%c=~3S`AZ1^6ExU-wfY*(umaSj9x*FUIu7A*V}_3Jn1r zQS7H$_>uP)`xw2~po&v>i<`<^gLk+pU1P@;M`Df@b}YTL-`5uZbK?EA$^{-nN+RY$ zGR3t-=uQwG;Off@!=1+>Nkm)+H>ijl|KQ%GQnj9;;w|U~diSZ!UdE6+b+o)<@z&=? z5aAdX3Qn7{mDKMu{_jUe1^d|70JRyl$KRZ0i(P^ucC%Hm&H|i;Q34zS)hc`!)5>tr zV7;PPU_+m&)6jnZ1=KFExjmY-lkoQNF9DiPv{jI58>;-ePA)Fj3~Z>P?N#aj<2`VE zsM4XCePf�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�YNLK2`iGr)gNgLveD_ewUI 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

    Wz2$tVt57+YzX{Yq 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®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

    D0z@1k4+2||xH=q_3 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 Vul@bW35*So1?U9@l?f{J{{e!8sptRz literal 0 HcmV?d00001 From 3634454987ecd1e94901ca166b2bc488f749749b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 14 Oct 2024 16:03:34 +0800 Subject: [PATCH 0252/2029] modify code --- src/class147/Code01_Catalan.java | 118 +++++++++++++++++++++++++++++++ src/class147/Code02_Pancake.java | 71 +++++++++++++++++++ src/class147/Code03_Skyline.java | 54 ++++++++++++++ 3 files changed, 243 insertions(+) create mode 100644 src/class147/Code01_Catalan.java create mode 100644 src/class147/Code02_Pancake.java create mode 100644 src/class147/Code03_Skyline.java diff --git a/src/class147/Code01_Catalan.java b/src/class147/Code01_Catalan.java new file mode 100644 index 000000000..5d8ff345a --- /dev/null +++ b/src/class147/Code01_Catalan.java @@ -0,0 +1,118 @@ +package class147; + +// 卡特兰数 +// 测试的题目数据量很小,请根据数据量可能很大的情况进行实现 +// 答案对 1000000007 取余 +// 测试链接 : https://www.luogu.com.cn/problem/P1044 +// 提交以下的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 Code01_Catalan { + + public static int MOD = 1000000007; + + public static int MAXN = 1000001; + + // 阶乘余数表 + public static long[] fac = new long[MAXN]; + + // 阶乘逆元表 + public static long[] inv1 = new long[MAXN]; + + // 数字逆元表 + public static long[] inv2 = new long[MAXN]; + + // 来自讲解讲解099,题目3,生成阶乘余数表、阶乘逆元表 + public static void build1(int n) { + fac[0] = inv1[0] = 1; + fac[1] = 1; + for (int i = 2; i <= n; i++) { + fac[i] = ((long) i * fac[i - 1]) % MOD; + } + inv1[n] = power(fac[n], MOD - 2); + for (int i = n - 1; i >= 1; i--) { + inv1[i] = ((long) (i + 1) * inv1[i + 1]) % MOD; + } + } + + // 来自讲解讲解099,题目2,生成数字的逆元表 + public static void build2(int n) { + inv2[1] = 1; + for (int i = 2; i <= n + 1; i++) { + inv2[i] = MOD - inv2[MOD % i] * (MOD / i) % MOD; + } + } + + public static long power(long x, long p) { + long ans = 1; + while (p > 0) { + if ((p & 1) == 1) { + ans = (ans * x) % MOD; + } + x = (x * x) % MOD; + p >>= 1; + } + return ans; + } + + public static long c(int n, int k) { + return (((fac[n] * inv1[k]) % MOD) * inv1[n - k]) % MOD; + } + + // 公式1 + public static long compute1(int n) { + build1(2 * n); + return (c(2 * n, n) - c(2 * n, n - 1) + MOD) % MOD; + } + + // 公式2 + public static long compute2(int n) { + build1(2 * n); + return c(2 * n, n) * power(n + 1, MOD - 2) % MOD; + } + + // 公式3 + public static long compute3(int n) { + build2(n); + long[] catalan = new long[n + 1]; + catalan[0] = catalan[1] = 1; + for (int i = 2; i <= n; i++) { + catalan[i] = catalan[i - 1] * (4 * i - 2) % MOD * inv2[i + 1] % MOD; + } + return catalan[n]; + } + + // 公式4 + public static long compute4(int n) { + long[] catalan = new long[n + 1]; + catalan[0] = catalan[1] = 1; + for (int i = 2; i <= n; i++) { + for (int l = 0, r = i - 1; l < i; l++, r--) { + catalan[i] = (catalan[i] + catalan[l] * catalan[r] % MOD) % MOD; + } + } + return catalan[n]; + } + + 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(); + int n = (int) in.nval; + out.println(compute1(n)); +// out.println(compute2(n)); +// out.println(compute3(n)); +// out.println(compute4(n)); + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class147/Code02_Pancake.java b/src/class147/Code02_Pancake.java new file mode 100644 index 000000000..6c6616c2e --- /dev/null +++ b/src/class147/Code02_Pancake.java @@ -0,0 +1,71 @@ +package class147; + +// 鸡蛋饼 +// 注意!答案不对 10^9 + 7 取余!而是对 10^8 + 7 取余! +// 测试链接 : https://www.luogu.com.cn/problem/P1976 +// 提交以下的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 Code02_Pancake { + + public static int MOD = 100000007; + + public static int MAXN = 1000001; + + public static long[] fac = new long[MAXN]; + + public static long[] inv = new long[MAXN]; + + public static void build(int n) { + fac[0] = inv[0] = 1; + fac[1] = 1; + for (int i = 2; i <= n; i++) { + fac[i] = ((long) i * fac[i - 1]) % MOD; + } + inv[n] = power(fac[n], MOD - 2); + for (int i = n - 1; i >= 1; i--) { + inv[i] = ((long) (i + 1) * inv[i + 1]) % MOD; + } + } + + public static long power(long x, long p) { + long ans = 1; + while (p > 0) { + if ((p & 1) == 1) { + ans = (ans * x) % MOD; + } + x = (x * x) % MOD; + p >>= 1; + } + return ans; + } + + public static long c(int n, int k) { + return (((fac[n] * inv[k]) % MOD) * inv[n - k]) % MOD; + } + + // 这里用公式1 + public static long compute(int n) { + build(2 * n); + return (c(2 * n, n) - c(2 * n, n - 1) + MOD) % MOD; + } + + 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(); + int n = (int) in.nval; + out.println(compute(n)); + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class147/Code03_Skyline.java b/src/class147/Code03_Skyline.java new file mode 100644 index 000000000..280a63591 --- /dev/null +++ b/src/class147/Code03_Skyline.java @@ -0,0 +1,54 @@ +package class147; + +// 卡特兰数天际线 +// 答案对 1000000 取余 +// 1 <= n <= 1000 +// 测试链接 : https://www.luogu.com.cn/problem/SP7897 +// 测试链接 : https://www.spoj.com/problems/SKYLINE +// 提交以下的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 Code03_Skyline { + + public static int MOD = 1000000; + + public static int MAXN = 1001; + + public static long[] catalan = new long[MAXN]; + + // 因为取余的数字含有很多因子 + // 无法用费马小定理或者扩展欧几里得求逆元 + // 所以使用公式4 + public static void build() { + catalan[0] = catalan[1] = 1; + for (int i = 2; i < MAXN; i++) { + for (int l = 0, r = i - 1; l < i; l++, r--) { + catalan[i] = (catalan[i] + catalan[l] * catalan[r] % MOD) % MOD; + } + } + } + + 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)); + build(); + while (in.nextToken() != StreamTokenizer.TT_EOF) { + int n = (int) in.nval; + if (n == 0) { + break; + } + out.println(catalan[n]); + } + out.flush(); + out.close(); + br.close(); + } + +} From 8694435804e9103bfdeb201a7f11c08cb6d62162 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 14 Oct 2024 16:29:09 +0800 Subject: [PATCH 0253/2029] modify code --- src/class147/Code01_Catalan.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class147/Code01_Catalan.java b/src/class147/Code01_Catalan.java index 5d8ff345a..b8d5f1f7c 100644 --- a/src/class147/Code01_Catalan.java +++ b/src/class147/Code01_Catalan.java @@ -28,7 +28,7 @@ public class Code01_Catalan { // 数字逆元表 public static long[] inv2 = new long[MAXN]; - // 来自讲解讲解099,题目3,生成阶乘余数表、阶乘逆元表 + // 来自讲解099,题目3,生成阶乘余数表、阶乘逆元表 public static void build1(int n) { fac[0] = inv1[0] = 1; fac[1] = 1; @@ -41,7 +41,7 @@ public static void build1(int n) { } } - // 来自讲解讲解099,题目2,生成数字的逆元表 + // 来自讲解099,题目2,生成数字的逆元表 public static void build2(int n) { inv2[1] = 1; for (int i = 2; i <= n + 1; i++) { From 6dddb0491c0c52105f92602885661738ecf892d2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 14 Oct 2024 16:29:51 +0800 Subject: [PATCH 0254/2029] modify code --- src/class147/Code01_Catalan.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class147/Code01_Catalan.java b/src/class147/Code01_Catalan.java index b8d5f1f7c..ec62fd990 100644 --- a/src/class147/Code01_Catalan.java +++ b/src/class147/Code01_Catalan.java @@ -41,7 +41,7 @@ public static void build1(int n) { } } - // 来自讲解099,题目2,生成数字的逆元表 + // 来自讲解099,题目2,生成连续数字的逆元表 public static void build2(int n) { inv2[1] = 1; for (int i = 2; i <= n + 1; i++) { From 584a85113edb28bfd87a09900786ae40cd9fb22f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 14 Oct 2024 20:15:41 +0800 Subject: [PATCH 0255/2029] modify code --- src/class147/Code02_RedMore.java | 45 +++++++++++++++++++ ...02_Pancake.java => Code03_CircleLine.java} | 4 +- ...Skyline.java => Code04_SplitTriangle.java} | 4 +- 3 files changed, 49 insertions(+), 4 deletions(-) create mode 100644 src/class147/Code02_RedMore.java rename src/class147/{Code02_Pancake.java => Code03_CircleLine.java} (97%) rename src/class147/{Code03_Skyline.java => Code04_SplitTriangle.java} (96%) diff --git a/src/class147/Code02_RedMore.java b/src/class147/Code02_RedMore.java new file mode 100644 index 000000000..064738005 --- /dev/null +++ b/src/class147/Code02_RedMore.java @@ -0,0 +1,45 @@ +package class147; + +// 任意前缀上红大于黑 +// 答案对 100 取余 +// 测试链接 : https://www.luogu.com.cn/problem/P1722 +// 提交以下的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 Code02_RedMore { + + public static int MOD = 100; + + // 因为取余的数字含有很多因子 + // 无法用费马小定理或者扩展欧几里得求逆元 + // 所以使用公式4 + public static long compute(int n) { + long[] catalan = new long[n + 1]; + catalan[0] = catalan[1] = 1; + for (int i = 2; i <= n; i++) { + for (int l = 0, r = i - 1; l < i; l++, r--) { + catalan[i] = (catalan[i] + catalan[l] * catalan[r] % MOD) % MOD; + } + } + return catalan[n]; + } + + 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(); + int n = (int) in.nval; + out.println(compute(n)); + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class147/Code02_Pancake.java b/src/class147/Code03_CircleLine.java similarity index 97% rename from src/class147/Code02_Pancake.java rename to src/class147/Code03_CircleLine.java index 6c6616c2e..89e135a46 100644 --- a/src/class147/Code02_Pancake.java +++ b/src/class147/Code03_CircleLine.java @@ -1,6 +1,6 @@ package class147; -// 鸡蛋饼 +// 圆上连线 // 注意!答案不对 10^9 + 7 取余!而是对 10^8 + 7 取余! // 测试链接 : https://www.luogu.com.cn/problem/P1976 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -12,7 +12,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code02_Pancake { +public class Code03_CircleLine { public static int MOD = 100000007; diff --git a/src/class147/Code03_Skyline.java b/src/class147/Code04_SplitTriangle.java similarity index 96% rename from src/class147/Code03_Skyline.java rename to src/class147/Code04_SplitTriangle.java index 280a63591..09251a44b 100644 --- a/src/class147/Code03_Skyline.java +++ b/src/class147/Code04_SplitTriangle.java @@ -1,6 +1,6 @@ package class147; -// 卡特兰数天际线 +// 划分三角形 // 答案对 1000000 取余 // 1 <= n <= 1000 // 测试链接 : https://www.luogu.com.cn/problem/SP7897 @@ -14,7 +14,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code03_Skyline { +public class Code04_SplitTriangle { public static int MOD = 1000000; From beb84fc20f8f26b96c7a8e7ead52128118e1e167 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 14 Oct 2024 20:39:49 +0800 Subject: [PATCH 0256/2029] modify code --- src/class147/Code05_treeHouseLadder.java | 55 ++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 src/class147/Code05_treeHouseLadder.java diff --git a/src/class147/Code05_treeHouseLadder.java b/src/class147/Code05_treeHouseLadder.java new file mode 100644 index 000000000..822c414d0 --- /dev/null +++ b/src/class147/Code05_treeHouseLadder.java @@ -0,0 +1,55 @@ +package class147; + +// 树屋阶梯 +// 测试链接 : https://www.luogu.com.cn/problem/P2532 +// 提交以下的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.math.BigInteger; + +public class Code05_treeHouseLadder { + + // 这里用公式1 + // java同学使用BigInteger即可 + // C++同学需要自己实现高精度乘法了 + public static BigInteger compute(int n) { + BigInteger a = new BigInteger("1"); + BigInteger b = new BigInteger("1"); + BigInteger c = new BigInteger("1"); + BigInteger d = new BigInteger("1"); + BigInteger cur; + for (int i = 1; i <= 2 * n; i++) { + cur = new BigInteger(String.valueOf(i)); + a = a.multiply(cur); + if (i <= n) { + b = b.multiply(cur); + } + if (i <= n - 1) { + c = c.multiply(cur); + } + if (i <= n + 1) { + d = d.multiply(cur); + } + } + return a.divide(b.multiply(b)).subtract(a.divide(c.multiply(d))); + } + + 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(); + int n = (int) in.nval; + BigInteger ans = compute(n); + out.println(ans.toString()); + out.flush(); + out.close(); + br.close(); + } + +} From 6a7165ba0cbd1eccc886b95ea0cffc2f726b4731 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 14 Oct 2024 20:40:21 +0800 Subject: [PATCH 0257/2029] modify code --- ...{Code05_treeHouseLadder.java => Code05_TreehouseLadder.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/class147/{Code05_treeHouseLadder.java => Code05_TreehouseLadder.java} (97%) diff --git a/src/class147/Code05_treeHouseLadder.java b/src/class147/Code05_TreehouseLadder.java similarity index 97% rename from src/class147/Code05_treeHouseLadder.java rename to src/class147/Code05_TreehouseLadder.java index 822c414d0..620d8d61d 100644 --- a/src/class147/Code05_treeHouseLadder.java +++ b/src/class147/Code05_TreehouseLadder.java @@ -12,7 +12,7 @@ import java.io.StreamTokenizer; import java.math.BigInteger; -public class Code05_treeHouseLadder { +public class Code05_TreehouseLadder { // 这里用公式1 // java同学使用BigInteger即可 From e9876dd8e8e4a92b386368cf2929ce690e0e6fc7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 14 Oct 2024 20:43:04 +0800 Subject: [PATCH 0258/2029] modify code --- src/class147/Code05_TreehouseLadder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class147/Code05_TreehouseLadder.java b/src/class147/Code05_TreehouseLadder.java index 620d8d61d..b3b299506 100644 --- a/src/class147/Code05_TreehouseLadder.java +++ b/src/class147/Code05_TreehouseLadder.java @@ -16,7 +16,7 @@ public class Code05_TreehouseLadder { // 这里用公式1 // java同学使用BigInteger即可 - // C++同学需要自己实现高精度乘法了 + // C++同学需要自己实现高精度乘法 public static BigInteger compute(int n) { BigInteger a = new BigInteger("1"); BigInteger b = new BigInteger("1"); From 7495e04612594fb0e5f98a4c791e28924c2a062c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 14 Oct 2024 21:16:02 +0800 Subject: [PATCH 0259/2029] modify code --- src/class147/Code05_TreehouseLadder.java | 12 ++--------- .../Code06_UniqueBinarySearchTrees.java | 21 +++++++++++++++++++ 2 files changed, 23 insertions(+), 10 deletions(-) create mode 100644 src/class147/Code06_UniqueBinarySearchTrees.java diff --git a/src/class147/Code05_TreehouseLadder.java b/src/class147/Code05_TreehouseLadder.java index b3b299506..983103dc5 100644 --- a/src/class147/Code05_TreehouseLadder.java +++ b/src/class147/Code05_TreehouseLadder.java @@ -14,14 +14,12 @@ public class Code05_TreehouseLadder { - // 这里用公式1 + // 这里用公式2 // java同学使用BigInteger即可 // C++同学需要自己实现高精度乘法 public static BigInteger compute(int n) { BigInteger a = new BigInteger("1"); BigInteger b = new BigInteger("1"); - BigInteger c = new BigInteger("1"); - BigInteger d = new BigInteger("1"); BigInteger cur; for (int i = 1; i <= 2 * n; i++) { cur = new BigInteger(String.valueOf(i)); @@ -29,14 +27,8 @@ public static BigInteger compute(int n) { if (i <= n) { b = b.multiply(cur); } - if (i <= n - 1) { - c = c.multiply(cur); - } - if (i <= n + 1) { - d = d.multiply(cur); - } } - return a.divide(b.multiply(b)).subtract(a.divide(c.multiply(d))); + return a.divide(b.multiply(b)).divide(new BigInteger(String.valueOf(n + 1))); } public static void main(String[] args) throws IOException { diff --git a/src/class147/Code06_UniqueBinarySearchTrees.java b/src/class147/Code06_UniqueBinarySearchTrees.java new file mode 100644 index 000000000..1c2b42cc3 --- /dev/null +++ b/src/class147/Code06_UniqueBinarySearchTrees.java @@ -0,0 +1,21 @@ +package class147; + +// 不同的二叉搜索树 +// 测试链接 : https://leetcode.cn/problems/unique-binary-search-trees/ +public class Code06_UniqueBinarySearchTrees { + + // 数据量小用哪个公式都可以 + // 不用考虑溢出、取余等问题 + // 这里用公式4 + public static int numTrees(int n) { + int[] catalan = new int[n + 1]; + catalan[0] = catalan[1] = 1; + for (int i = 2; i <= n; i++) { + for (int l = 0, r = i - 1; l < i; l++, r--) { + catalan[i] += catalan[l] * catalan[r]; + } + } + return catalan[n]; + } + +} From b27506a3df9dd54defc7d2eaca23b40551a2d61c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 14 Oct 2024 21:23:51 +0800 Subject: [PATCH 0260/2029] modify code --- src/class147/Code07_LeafExpectation.java | 28 ++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/class147/Code07_LeafExpectation.java diff --git a/src/class147/Code07_LeafExpectation.java b/src/class147/Code07_LeafExpectation.java new file mode 100644 index 000000000..c493e63e3 --- /dev/null +++ b/src/class147/Code07_LeafExpectation.java @@ -0,0 +1,28 @@ +package class147; + +// 叶子节点数的期望 +// 测试链接 : https://www.luogu.com.cn/problem/P3978 +// 提交以下的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 Code07_LeafExpectation { + + 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(); + double n = in.nval; + out.printf("%.12f", n * (n + 1) / (2 * (2 * n - 1))); + out.flush(); + out.close(); + br.close(); + } + +} From b6505d42646470066fdf66480a83f132b9e59dfe Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 14 Oct 2024 21:30:01 +0800 Subject: [PATCH 0261/2029] modify code --- src/class147/Code01_Catalan.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/class147/Code01_Catalan.java b/src/class147/Code01_Catalan.java index ec62fd990..bba4e278b 100644 --- a/src/class147/Code01_Catalan.java +++ b/src/class147/Code01_Catalan.java @@ -1,8 +1,7 @@ package class147; // 卡特兰数 -// 测试的题目数据量很小,请根据数据量可能很大的情况进行实现 -// 答案对 1000000007 取余 +// 测试题目的数据量虽然很小,但请假设数据量很大来实现,答案对 1000000007 取余 // 测试链接 : https://www.luogu.com.cn/problem/P1044 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 From caa641233333d14ae468658c7593fc8e026651b7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 15 Oct 2024 11:24:52 +0800 Subject: [PATCH 0262/2029] modify code --- src/class147/Code08_GenerateString.java | 71 +++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 src/class147/Code08_GenerateString.java diff --git a/src/class147/Code08_GenerateString.java b/src/class147/Code08_GenerateString.java new file mode 100644 index 000000000..6a2ab114e --- /dev/null +++ b/src/class147/Code08_GenerateString.java @@ -0,0 +1,71 @@ +package class147; + +// 生成字符串 +// 测试链接 : https://www.luogu.com.cn/problem/P1641 +// 提交以下的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 Code08_GenerateString { + + public static int MOD = 20100403; + + public static int MAXN = 2000001; + + public static long[] fac = new long[MAXN]; + + public static long[] inv = new long[MAXN]; + + public static void build(int n) { + fac[0] = inv[0] = 1; + fac[1] = 1; + for (int i = 2; i <= n; i++) { + fac[i] = ((long) i * fac[i - 1]) % MOD; + } + inv[n] = power(fac[n], MOD - 2); + for (int i = n - 1; i >= 1; i--) { + inv[i] = ((long) (i + 1) * inv[i + 1]) % MOD; + } + } + + public static long power(long x, long p) { + long ans = 1; + while (p > 0) { + if ((p & 1) == 1) { + ans = (ans * x) % MOD; + } + x = (x * x) % MOD; + p >>= 1; + } + return ans; + } + + public static long c(int n, int k) { + return (((fac[n] * inv[k]) % MOD) * inv[n - k]) % MOD; + } + + public static long compute(int n, int m) { + build(n + m); + return (c(n + m, m) - c(n + m, m - 1) + MOD) % MOD; + } + + 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(); + int n = (int) in.nval; + in.nextToken(); + int m = (int) in.nval; + out.println(compute(n, m)); + out.flush(); + out.close(); + br.close(); + } + +} From 1d6c6c28ada8b066eaffe4019a9a443ecde9a8d9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 15 Oct 2024 11:25:27 +0800 Subject: [PATCH 0263/2029] modify code --- ...e06_UniqueBinarySearchTrees.java => Code06_UniqueTrees.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/class147/{Code06_UniqueBinarySearchTrees.java => Code06_UniqueTrees.java} (91%) diff --git a/src/class147/Code06_UniqueBinarySearchTrees.java b/src/class147/Code06_UniqueTrees.java similarity index 91% rename from src/class147/Code06_UniqueBinarySearchTrees.java rename to src/class147/Code06_UniqueTrees.java index 1c2b42cc3..2d6be350d 100644 --- a/src/class147/Code06_UniqueBinarySearchTrees.java +++ b/src/class147/Code06_UniqueTrees.java @@ -2,7 +2,7 @@ // 不同的二叉搜索树 // 测试链接 : https://leetcode.cn/problems/unique-binary-search-trees/ -public class Code06_UniqueBinarySearchTrees { +public class Code06_UniqueTrees { // 数据量小用哪个公式都可以 // 不用考虑溢出、取余等问题 From ff8aebf4a416e7b3e3c06938b6e4d3064bd9bd37 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 15 Oct 2024 11:27:35 +0800 Subject: [PATCH 0264/2029] modify code --- .../{Code08_GenerateString.java => Code06_GenerateString.java} | 2 +- .../{Code06_UniqueTrees.java => Code07_UniqueTrees.java} | 2 +- ...{Code07_LeafExpectation.java => Code08_LeafExpectation.java} | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename src/class147/{Code08_GenerateString.java => Code06_GenerateString.java} (97%) rename src/class147/{Code06_UniqueTrees.java => Code07_UniqueTrees.java} (93%) rename src/class147/{Code07_LeafExpectation.java => Code08_LeafExpectation.java} (95%) diff --git a/src/class147/Code08_GenerateString.java b/src/class147/Code06_GenerateString.java similarity index 97% rename from src/class147/Code08_GenerateString.java rename to src/class147/Code06_GenerateString.java index 6a2ab114e..e9bb375e0 100644 --- a/src/class147/Code08_GenerateString.java +++ b/src/class147/Code06_GenerateString.java @@ -11,7 +11,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code08_GenerateString { +public class Code06_GenerateString { public static int MOD = 20100403; diff --git a/src/class147/Code06_UniqueTrees.java b/src/class147/Code07_UniqueTrees.java similarity index 93% rename from src/class147/Code06_UniqueTrees.java rename to src/class147/Code07_UniqueTrees.java index 2d6be350d..da01c02b8 100644 --- a/src/class147/Code06_UniqueTrees.java +++ b/src/class147/Code07_UniqueTrees.java @@ -2,7 +2,7 @@ // 不同的二叉搜索树 // 测试链接 : https://leetcode.cn/problems/unique-binary-search-trees/ -public class Code06_UniqueTrees { +public class Code07_UniqueTrees { // 数据量小用哪个公式都可以 // 不用考虑溢出、取余等问题 diff --git a/src/class147/Code07_LeafExpectation.java b/src/class147/Code08_LeafExpectation.java similarity index 95% rename from src/class147/Code07_LeafExpectation.java rename to src/class147/Code08_LeafExpectation.java index c493e63e3..1a6114ea4 100644 --- a/src/class147/Code07_LeafExpectation.java +++ b/src/class147/Code08_LeafExpectation.java @@ -11,7 +11,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code07_LeafExpectation { +public class Code08_LeafExpectation { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); From 7e2f6faedc8a622d37f69f679f972082c9a027de Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 15 Oct 2024 11:49:32 +0800 Subject: [PATCH 0265/2029] modify code --- src/class041/Code02_NthMagicalNumber.java | 2 +- src/class042/Code04_RedPalindromeGoodStrings.java | 2 +- src/class066/Code08_DistinctSubsequencesII.java | 2 +- src/class068/Code01_DistinctSubsequences.java | 2 +- src/class068/Code04_FillCellsUseAllColorsWays.java | 2 +- src/class069/Code04_PathsDivisibleByK.java | 2 +- .../Code06_CountDifferentPalindromicSubsequences.java | 2 +- src/class081/Code01_NumberOfWaysWearDifferentHats.java | 2 +- src/class081/Code03_TheNumberOfGoodSubsets.java | 2 +- src/class082/Code07_DiSequence.java | 2 +- src/class083/Code02_KInversePairsArray.java | 2 +- src/class084/Code03_CountOfIntegers.java | 2 +- src/class090/Code01_CuttingBamboo.java | 2 +- src/class090/Code02_MaximumProduct.java | 2 +- src/class101/Code04_FindAllGoodStrings.java | 2 +- src/class126/Code02_GridPainting.java | 2 +- src/class127/Code05_WaysOfArrangePlates.java | 6 +++--- src/class130/Code06_SumOfTotalStrength.java | 2 +- src/class132/Code03_WaysOfRevert1.java | 2 +- src/class132/Code03_WaysOfRevert2.java | 2 +- src/class134/Code01_GaussEor.java | 2 +- src/class136/Code04_Lanterns.java | 2 +- src/class144/Code04_SplitWays1.java | 2 +- src/class145/Code02_SetCounting.java | 2 +- src/class145/Code03_DistributeSpecialties.java | 2 +- src/class145/Code04_NothingFear.java | 2 +- src/class145/Code05_Game1.java | 2 +- src/class145/Code05_Game2.java | 2 +- src/class147/Code01_Catalan.java | 2 +- src/class147/Code02_RedMore.java | 4 ++-- src/class147/Code03_CircleLine.java | 2 +- src/class147/Code04_SplitTriangle.java | 4 ++-- src/class147/Code07_UniqueTrees.java | 2 +- 33 files changed, 37 insertions(+), 37 deletions(-) diff --git a/src/class041/Code02_NthMagicalNumber.java b/src/class041/Code02_NthMagicalNumber.java index 56435c0de..8ffd52f4b 100644 --- a/src/class041/Code02_NthMagicalNumber.java +++ b/src/class041/Code02_NthMagicalNumber.java @@ -2,7 +2,7 @@ // 一个正整数如果能被 a 或 b 整除,那么它是神奇的。 // 给定三个整数 n , a , b ,返回第 n 个神奇的数字。 -// 因为答案可能很大,所以返回答案 对 10^9 + 7 取模 后的值。 +// 因为答案可能很大,所以返回答案 对 10^9 + 7 取模 // 测试链接 : https://leetcode.cn/problems/nth-magical-number/ public class Code02_NthMagicalNumber { diff --git a/src/class042/Code04_RedPalindromeGoodStrings.java b/src/class042/Code04_RedPalindromeGoodStrings.java index eab0efa08..47b2fba1f 100644 --- a/src/class042/Code04_RedPalindromeGoodStrings.java +++ b/src/class042/Code04_RedPalindromeGoodStrings.java @@ -3,7 +3,7 @@ // 可以用r、e、d三种字符拼接字符串,如果拼出来的字符串中 // 有且仅有1个长度>=2的回文子串,那么这个字符串定义为"好串" // 返回长度为n的所有可能的字符串中,好串有多少个 -// 结果对1000000007取模, 1 <= n <= 10^9 +// 结果对 1000000007 取模, 1 <= n <= 10^9 // 示例: // n = 1, 输出0 // n = 2, 输出3 diff --git a/src/class066/Code08_DistinctSubsequencesII.java b/src/class066/Code08_DistinctSubsequencesII.java index 81fe3d57d..bd02e1935 100644 --- a/src/class066/Code08_DistinctSubsequencesII.java +++ b/src/class066/Code08_DistinctSubsequencesII.java @@ -2,7 +2,7 @@ // 不同的子序列 II // 给定一个字符串 s,计算 s 的 不同非空子序列 的个数 -// 因为结果可能很大,所以返回答案需要对 10^9 + 7 取余 +// 因为结果可能很大,所以返回答案需要对 10^9 + 7 取模 // 字符串的 子序列 是经由原字符串删除一些(也可能不删除) // 字符但不改变剩余字符相对位置的一个新字符串 // 例如,"ace" 是 "abcde" 的一个子序列,但 "aec" 不是 diff --git a/src/class068/Code01_DistinctSubsequences.java b/src/class068/Code01_DistinctSubsequences.java index 462ef5dda..55b1a4b08 100644 --- a/src/class068/Code01_DistinctSubsequences.java +++ b/src/class068/Code01_DistinctSubsequences.java @@ -2,7 +2,7 @@ // 不同的子序列 // 给你两个字符串s和t ,统计并返回在s的子序列中t出现的个数 -// 答案对1000000007取余 +// 答案对 1000000007 取模 // 测试链接 : https://leetcode.cn/problems/distinct-subsequences/ public class Code01_DistinctSubsequences { diff --git a/src/class068/Code04_FillCellsUseAllColorsWays.java b/src/class068/Code04_FillCellsUseAllColorsWays.java index 97051c007..9d2b87914 100644 --- a/src/class068/Code04_FillCellsUseAllColorsWays.java +++ b/src/class068/Code04_FillCellsUseAllColorsWays.java @@ -97,7 +97,7 @@ public static void main(String[] args) { long start = System.currentTimeMillis(); int ans = ways2(n, m); long end = System.currentTimeMillis(); - System.out.println("取余之后的结果 : " + ans); + System.out.println("取模之后的结果 : " + ans); System.out.println("运行时间 : " + (end - start) + " 毫秒"); System.out.println("性能测试结束"); } diff --git a/src/class069/Code04_PathsDivisibleByK.java b/src/class069/Code04_PathsDivisibleByK.java index fd4005247..10dead148 100644 --- a/src/class069/Code04_PathsDivisibleByK.java +++ b/src/class069/Code04_PathsDivisibleByK.java @@ -4,7 +4,7 @@ // 给一个下标从0开始的 n * m 整数矩阵 grid 和一个整数 k // 从起点(0,0)出发,每步只能往下或者往右,你想要到达终点(m-1, n-1) // 请你返回路径和能被 k 整除的路径数目 -// 由于答案可能很大,返回答案对10^9+7取余的结果 +// 答案对 1000000007 取模 // 测试链接 : https://leetcode.cn/problems/paths-in-matrix-whose-sum-is-divisible-by-k/ public class Code04_PathsDivisibleByK { diff --git a/src/class077/Code06_CountDifferentPalindromicSubsequences.java b/src/class077/Code06_CountDifferentPalindromicSubsequences.java index c7f18fd52..0443142dc 100644 --- a/src/class077/Code06_CountDifferentPalindromicSubsequences.java +++ b/src/class077/Code06_CountDifferentPalindromicSubsequences.java @@ -4,7 +4,7 @@ // 统计不同回文子序列 // 给你一个字符串s,返回s中不同的非空回文子序列个数 -// 由于答案可能很大,请你将答案对10^9+7取余后返回 +// 由于答案可能很大,答案对 1000000007 取模 // 测试链接 : https://leetcode.cn/problems/count-different-palindromic-subsequences/ public class Code06_CountDifferentPalindromicSubsequences { diff --git a/src/class081/Code01_NumberOfWaysWearDifferentHats.java b/src/class081/Code01_NumberOfWaysWearDifferentHats.java index 06240781d..dc1292797 100644 --- a/src/class081/Code01_NumberOfWaysWearDifferentHats.java +++ b/src/class081/Code01_NumberOfWaysWearDifferentHats.java @@ -7,7 +7,7 @@ // 总共有 n 个人和 40 种不同的帽子,帽子编号从 1 到 40 // 给你一个整数列表的列表 hats ,其中 hats[i] 是第 i 个人所有喜欢帽子的列表 // 请你给每个人安排一顶他喜欢的帽子,确保每个人戴的帽子跟别人都不一样,并返回方案数 -// 由于答案可能很大,请返回它对10^9+7取余后的结果 +// 由于答案可能很大,答案对 1000000007 取模 // 测试链接 : https://leetcode.cn/problems/number-of-ways-to-wear-different-hats-to-each-other public class Code01_NumberOfWaysWearDifferentHats { diff --git a/src/class081/Code03_TheNumberOfGoodSubsets.java b/src/class081/Code03_TheNumberOfGoodSubsets.java index 33ed732de..8db9e17b5 100644 --- a/src/class081/Code03_TheNumberOfGoodSubsets.java +++ b/src/class081/Code03_TheNumberOfGoodSubsets.java @@ -9,7 +9,7 @@ // [2, 3],[1, 2, 3],[1, 3] 是好子集 // 乘积分别为6=2*3,6=2*3,3=3 // [1, 4]和[4]不是好子集,因为乘积分别为4=2*2和4=2*2 -// 请你返回nums中不同的好子集的数目对10^9+7取余的结果 +// 返回nums中不同的好子集的数目,答案对 1000000007 取模 // 如果两个子集删除的下标不同,那么它们被视为不同的子集 // 测试链接 : https://leetcode.cn/problems/the-number-of-good-subsets/ public class Code03_TheNumberOfGoodSubsets { diff --git a/src/class082/Code07_DiSequence.java b/src/class082/Code07_DiSequence.java index c4b0e87fb..c326a7bfa 100644 --- a/src/class082/Code07_DiSequence.java +++ b/src/class082/Code07_DiSequence.java @@ -7,7 +7,7 @@ // 如果 s[i] == 'D',那么 perm[i] > perm[i+1] // 如果 s[i] == 'I',那么 perm[i] < perm[i+1] // 返回有效排列的perm的数量 -// 因为答案可能很大,所以请返回你的答案对10^9+7取余 +// 因为答案可能很大,答案对 1000000007 取模 // 测试链接 : https://leetcode.cn/problems/valid-permutations-for-di-sequence/ public class Code07_DiSequence { diff --git a/src/class083/Code02_KInversePairsArray.java b/src/class083/Code02_KInversePairsArray.java index f47145223..dede7494e 100644 --- a/src/class083/Code02_KInversePairsArray.java +++ b/src/class083/Code02_KInversePairsArray.java @@ -6,7 +6,7 @@ // 如果满足0<=inums[j],则为一个逆序对 // 给你两个整数n和k,找出所有包含从1到n的数字 // 且恰好拥有k个逆序对的不同的数组的个数 -// 由于答案可能很大,只需要返回对10^9+7取余的结果 +// 由于答案可能很大,答案对 1000000007 取模 // 测试链接 : https://leetcode.cn/problems/k-inverse-pairs-array/ public class Code02_KInversePairsArray { diff --git a/src/class084/Code03_CountOfIntegers.java b/src/class084/Code03_CountOfIntegers.java index 04566df81..f05731a18 100644 --- a/src/class084/Code03_CountOfIntegers.java +++ b/src/class084/Code03_CountOfIntegers.java @@ -6,7 +6,7 @@ // num1 <= x <= num2 // min_sum <= digit_sum(x) <= max_sum // 请你返回好整数的数目 -// 答案可能很大请返回答案对10^9 + 7 取余后的结果 +// 答案可能很大,答案对 1000000007 取模 // 注意,digit_sum(x)表示x各位数字之和 // 测试链接 : https://leetcode.cn/problems/count-of-integers/ public class Code03_CountOfIntegers { diff --git a/src/class090/Code01_CuttingBamboo.java b/src/class090/Code01_CuttingBamboo.java index 44d8744ea..9c54d24d6 100644 --- a/src/class090/Code01_CuttingBamboo.java +++ b/src/class090/Code01_CuttingBamboo.java @@ -4,7 +4,7 @@ // 现需要将一根长为正整数bamboo_len的竹子砍为若干段 // 每段长度均为正整数 // 请返回每段竹子长度的最大乘积是多少 -// 答案需要对1000000007取模 +// 答案需要对 1000000007 取模 // 测试链接 : https://leetcode.cn/problems/jian-sheng-zi-ii-lcof/ public class Code01_CuttingBamboo { diff --git a/src/class090/Code02_MaximumProduct.java b/src/class090/Code02_MaximumProduct.java index 870171deb..ff0510a1a 100644 --- a/src/class090/Code02_MaximumProduct.java +++ b/src/class090/Code02_MaximumProduct.java @@ -3,7 +3,7 @@ // 分成k份的最大乘积 // 一个数字n一定要分成k份,得到的乘积尽量大是多少 // 数字n和k,可能非常大,到达10^12规模 -// 结果可能更大,所以返回结果对1000000007取模 +// 结果可能更大,所以返回结果对 1000000007 取模 // 来自真实大厂笔试,没有在线测试,对数器验证 public class Code02_MaximumProduct { diff --git a/src/class101/Code04_FindAllGoodStrings.java b/src/class101/Code04_FindAllGoodStrings.java index 0519fc130..51aad4dfd 100644 --- a/src/class101/Code04_FindAllGoodStrings.java +++ b/src/class101/Code04_FindAllGoodStrings.java @@ -4,7 +4,7 @@ // 给你两个长度为n的字符串s1和s2,以及一个字符串evil // 好字符串的定义为 : 长度为n,字典序大于等于s1,字典序小于等于s2,且不包含evil字符串 // 返回好字符串的数量 -// 由于答案很大返回对1000000007取余的结果 +// 由于答案可能很大,答案对 1000000007 取模 // 测试链接 : https://leetcode.cn/problems/find-all-good-strings/ public class Code04_FindAllGoodStrings { diff --git a/src/class126/Code02_GridPainting.java b/src/class126/Code02_GridPainting.java index 9de5f5d7e..af330035f 100644 --- a/src/class126/Code02_GridPainting.java +++ b/src/class126/Code02_GridPainting.java @@ -4,7 +4,7 @@ // 给你两个整数m和n,表示m*n的网格,其中每个单元格最开始是白色 // 请你用红、绿、蓝三种颜色为每个单元格涂色,所有单元格都需要被涂色 // 要求相邻单元格的颜色一定要不同 -// 返回网格涂色的方法数,答案对1000000007取余 +// 返回网格涂色的方法数,答案对 1000000007 取模 // 1 <= m <= 5 // 1 <= n <= 1000 // 测试链接 : https://leetcode.cn/problems/painting-a-grid-with-three-different-colors/ diff --git a/src/class127/Code05_WaysOfArrangePlates.java b/src/class127/Code05_WaysOfArrangePlates.java index fbbdd6efb..a85140137 100644 --- a/src/class127/Code05_WaysOfArrangePlates.java +++ b/src/class127/Code05_WaysOfArrangePlates.java @@ -3,7 +3,7 @@ // 摆盘子的方法 // 一共有n个盘子k种菜,所有盘子排成一排,每个盘子只能放一种菜 // 要求最多连续两个盘子菜品一样,更长的重复出现是不允许的 -// 返回摆盘的方法数,答案可能很大,对1000000007取余 +// 返回摆盘的方法数,答案对 1000000007 取模 // 1 <= n <= 1000 // 1 <= k <= 1000 // 来自真实大厂笔试,对数器验证 @@ -150,12 +150,12 @@ public static void main(String[] args) { long start, end; start = System.currentTimeMillis(); - System.out.println("dp2方法结果(已经取余) : " + dp2(n, k)); + System.out.println("dp2方法结果(已经取模) : " + dp2(n, k)); end = System.currentTimeMillis(); System.out.println("dp2方法用时(毫秒) : " + (end - start)); start = System.currentTimeMillis(); - System.out.println("dp3方法结果(已经取余) : " + dp3(n, k)); + System.out.println("dp3方法结果(已经取模) : " + dp3(n, k)); end = System.currentTimeMillis(); System.out.println("dp3方法用时(毫秒) : " + (end - start)); System.out.println("性能测试结束"); diff --git a/src/class130/Code06_SumOfTotalStrength.java b/src/class130/Code06_SumOfTotalStrength.java index 0429da81d..f18c146bf 100644 --- a/src/class130/Code06_SumOfTotalStrength.java +++ b/src/class130/Code06_SumOfTotalStrength.java @@ -4,7 +4,7 @@ // 题目可以简化为如下的描述 // 给定一个长度为n的数组arr,下标从0开始 // 任何一个子数组的指标为,子数组累加和 * 子数组中最小值 -// 返回arr中所有子数组指标的累加和,答案对1000000007取余 +// 返回arr中所有子数组指标的累加和,答案对 1000000007 取模 // 1 <= n <= 10^5 // 1 <= arr[i] <= 10^9 // 测试链接 : https://leetcode.cn/problems/sum-of-total-strength-of-wizards/ diff --git a/src/class132/Code03_WaysOfRevert1.java b/src/class132/Code03_WaysOfRevert1.java index e30ff1055..ea4f7d521 100644 --- a/src/class132/Code03_WaysOfRevert1.java +++ b/src/class132/Code03_WaysOfRevert1.java @@ -5,7 +5,7 @@ // 并且任意i位置的数字都满足 : arr[i] <= max(arr[i-1], arr[i+1]) // 特别的,arr[1] <= arr[2],arr[n] <= arr[n-1] // 但是输入的arr中有些数字丢失了,丢失的数字用0表示 -// 返回还原成不违规的arr有多少种方法,答案很大需要对998244353取余 +// 返回还原成不违规的arr有多少种方法,答案对 998244353 取模 // 3 <= n <= 10^4 // 测试链接 : https://www.nowcoder.com/practice/49c5284278974cbda474ec13d8bd86a9 // 提交以下的code,提交时请把类名改成"Main",无法通过所有测试用例 diff --git a/src/class132/Code03_WaysOfRevert2.java b/src/class132/Code03_WaysOfRevert2.java index 49c65e24b..8fef80c7e 100644 --- a/src/class132/Code03_WaysOfRevert2.java +++ b/src/class132/Code03_WaysOfRevert2.java @@ -5,7 +5,7 @@ // 并且任意i位置的数字都满足 : arr[i] <= max(arr[i-1], arr[i+1]) // 特别的,arr[1] <= arr[2],arr[n] <= arr[n-1] // 但是输入的arr中有些数字丢失了,丢失的数字用0表示 -// 返回还原成不违规的arr有多少种方法,答案很大需要对998244353取余 +// 返回还原成不违规的arr有多少种方法,答案对 998244353 取模 // 3 <= n <= 10^4 // 测试链接 : https://www.nowcoder.com/practice/49c5284278974cbda474ec13d8bd86a9 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class134/Code01_GaussEor.java b/src/class134/Code01_GaussEor.java index 758887dcc..4779adaac 100644 --- a/src/class134/Code01_GaussEor.java +++ b/src/class134/Code01_GaussEor.java @@ -5,7 +5,7 @@ // 每个数拥有的质数因子一定不超过2000,每个数最多挑选一次 // 在至少要选一个数的情况下,你可以随意挑选数字乘起来 // 乘得的结果需要是完全平方数,请问有几种挑选数字的方法 -// 方法数可能很大,结果对1000000007取余 +// 方法数可能很大,答案对 1000000007 取模 // 1 <= n <= 300 // 1 <= arr[i] <= 10^18 // 测试链接 : https://acm.hdu.edu.cn/showproblem.php?pid=5833 diff --git a/src/class136/Code04_Lanterns.java b/src/class136/Code04_Lanterns.java index 307eb1956..22766856d 100644 --- a/src/class136/Code04_Lanterns.java +++ b/src/class136/Code04_Lanterns.java @@ -5,7 +5,7 @@ // 每个开关能改变若干灯泡的状态,改变是指,亮变不亮、不亮变亮 // 比如n=5,某个开关为XXOOO,表示这个开关只能改变后3个灯泡的状态 // 可以随意使用开关,返回有多少种亮灯的组合,全不亮也算一种组合 -// 结果可能很大对2008取余 +// 答案可能很大,对 2008 取模 // 1 <= n <= 50 // 1 <= m <= 50 // 测试链接 : https://www.luogu.com.cn/problem/P3857 diff --git a/src/class144/Code04_SplitWays1.java b/src/class144/Code04_SplitWays1.java index 32e57f25a..768764733 100644 --- a/src/class144/Code04_SplitWays1.java +++ b/src/class144/Code04_SplitWays1.java @@ -8,7 +8,7 @@ // 返回有多少种有效的划分方式 // 1 <= n <= 10^7 // 1 <= A[i] <= 10^7 -// 最终结果可能很大,对1000000007取余 +// 最终结果可能很大,答案对 1000000007 取模 // 来自真实大厂笔试题,该实现为对数器版本 // 有同学找到了测试链接,就是Code04_SplitWays2文件 public class Code04_SplitWays1 { diff --git a/src/class145/Code02_SetCounting.java b/src/class145/Code02_SetCounting.java index 877a95ed6..9ea689b33 100644 --- a/src/class145/Code02_SetCounting.java +++ b/src/class145/Code02_SetCounting.java @@ -4,7 +4,7 @@ // 一共有n个不同的数,能构成2^n个不同集合 // 在2^n个集合中挑出若干个集合,至少挑一个 // 希望这若干个集合的交集,正好有k个数 -// 返回挑选集合的方案数,答案对 1000000007 取余 +// 返回挑选集合的方案数,答案对 1000000007 取模 // 1 <= n <= 10^6 // 0 <= k <= n // 测试链接 : https://www.luogu.com.cn/problem/P10596 diff --git a/src/class145/Code03_DistributeSpecialties.java b/src/class145/Code03_DistributeSpecialties.java index d183dc169..9d106b160 100644 --- a/src/class145/Code03_DistributeSpecialties.java +++ b/src/class145/Code03_DistributeSpecialties.java @@ -3,7 +3,7 @@ // 分特产 // 一共有m种特产,arr[i]表示i种特产有几个 // 一共有n个同学,每个同学至少要得到一个特产 -// 返回分配特产的方法数,答案对 1000000007 取余 +// 返回分配特产的方法数,答案对 1000000007 取模 // 0 <= n、m <= 1000 // 0 <= arr[i] <= 1000 // 测试链接 : https://www.luogu.com.cn/problem/P5505 diff --git a/src/class145/Code04_NothingFear.java b/src/class145/Code04_NothingFear.java index 8230a27cb..7230cdf41 100644 --- a/src/class145/Code04_NothingFear.java +++ b/src/class145/Code04_NothingFear.java @@ -6,7 +6,7 @@ // 如果配对之后,糖果能量 > 药片能量,称为糖果大的配对 // 如果配对之后,糖果能量 < 药片能量,称为药片大的配对 // 希望做到,糖果大的配对数量 = 药片大的配对数量 + k -// 返回配对方法数,答案对 1000000009 取余 +// 返回配对方法数,答案对 1000000009 取模 // 举例,a = [5, 35, 15, 45],b = [40, 20, 10, 30],k = 2,返回4,因为有4种配对方法 // (5-40,35-20,15-10,45-30)、(5-40,35-30,15-10,45-20) // (5-20,35-30,15-10,45-40)、(5-30,35-20,15-10,45-40) diff --git a/src/class145/Code05_Game1.java b/src/class145/Code05_Game1.java index 2f591f447..779c318e7 100644 --- a/src/class145/Code05_Game1.java +++ b/src/class145/Code05_Game1.java @@ -6,7 +6,7 @@ // 给定长度为n的数组arr,arr[i]的值表示i号节点由谁拥有,0为小A拥有,1为小B拥有 // 游戏有m回合,每回合都有胜负,两人需要选择一个自己拥有、但之前没选过的点,作为本回合当前点 // 小A当前点的子树里有小B当前点,则小A胜;小B当前点的子树里有小A当前点,则小B胜;否则平局 -// 返回m回合里能出现k次非平局的游戏方法数,打印k=0..m时的所有答案,对 998244353 取余 +// 返回m回合里能出现k次非平局的游戏方法数,打印k=0..m时的所有答案,对 998244353 取模 // 两场游戏视为不同的定义:当且仅当存在小A拥有的点x,小B在小A选择x的那个回合所选择的点不同 // 测试链接 : https://www.luogu.com.cn/problem/P6478 // 提交以下的code,提交时请把类名改成"Main",注意dfs是递归函数 diff --git a/src/class145/Code05_Game2.java b/src/class145/Code05_Game2.java index fd26afc74..05cd69977 100644 --- a/src/class145/Code05_Game2.java +++ b/src/class145/Code05_Game2.java @@ -6,7 +6,7 @@ // 给定长度为n的数组arr,arr[i]的值表示i号节点由谁拥有,0为小A拥有,1为小B拥有 // 游戏有m回合,每回合都有胜负,两人需要选择一个自己拥有、但之前没选过的点,作为本回合当前点 // 小A当前点的子树里有小B当前点,则小A胜;小B当前点的子树里有小A当前点,则小B胜;否则平局 -// 返回m回合里能出现k次非平局的游戏方法数,打印k=0..m时的所有答案,对 998244353 取余 +// 返回m回合里能出现k次非平局的游戏方法数,打印k=0..m时的所有答案,对 998244353 取模 // 两场游戏视为不同的定义:当且仅当存在小A拥有的点x,小B在小A选择x的那个回合所选择的点不同 // 测试链接 : https://www.luogu.com.cn/problem/P6478 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class147/Code01_Catalan.java b/src/class147/Code01_Catalan.java index bba4e278b..afe105f83 100644 --- a/src/class147/Code01_Catalan.java +++ b/src/class147/Code01_Catalan.java @@ -1,7 +1,7 @@ package class147; // 卡特兰数 -// 测试题目的数据量虽然很小,但请假设数据量很大来实现,答案对 1000000007 取余 +// 测试题目的数据量虽然很小,但请假设数据量很大来实现,答案对 1000000007 取模 // 测试链接 : https://www.luogu.com.cn/problem/P1044 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class147/Code02_RedMore.java b/src/class147/Code02_RedMore.java index 064738005..d0b5946a8 100644 --- a/src/class147/Code02_RedMore.java +++ b/src/class147/Code02_RedMore.java @@ -1,7 +1,7 @@ package class147; // 任意前缀上红大于黑 -// 答案对 100 取余 +// 答案对 100 取模 // 测试链接 : https://www.luogu.com.cn/problem/P1722 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -16,7 +16,7 @@ public class Code02_RedMore { public static int MOD = 100; - // 因为取余的数字含有很多因子 + // 因为取模的数字含有很多因子 // 无法用费马小定理或者扩展欧几里得求逆元 // 所以使用公式4 public static long compute(int n) { diff --git a/src/class147/Code03_CircleLine.java b/src/class147/Code03_CircleLine.java index 89e135a46..becfc2935 100644 --- a/src/class147/Code03_CircleLine.java +++ b/src/class147/Code03_CircleLine.java @@ -1,7 +1,7 @@ package class147; // 圆上连线 -// 注意!答案不对 10^9 + 7 取余!而是对 10^8 + 7 取余! +// 注意!答案不对 10^9 + 7 取模!而是对 10^8 + 7 取模! // 测试链接 : https://www.luogu.com.cn/problem/P1976 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class147/Code04_SplitTriangle.java b/src/class147/Code04_SplitTriangle.java index 09251a44b..02c1feb15 100644 --- a/src/class147/Code04_SplitTriangle.java +++ b/src/class147/Code04_SplitTriangle.java @@ -1,7 +1,7 @@ package class147; // 划分三角形 -// 答案对 1000000 取余 +// 答案对 1000000 取模 // 1 <= n <= 1000 // 测试链接 : https://www.luogu.com.cn/problem/SP7897 // 测试链接 : https://www.spoj.com/problems/SKYLINE @@ -22,7 +22,7 @@ public class Code04_SplitTriangle { public static long[] catalan = new long[MAXN]; - // 因为取余的数字含有很多因子 + // 因为取模的数字含有很多因子 // 无法用费马小定理或者扩展欧几里得求逆元 // 所以使用公式4 public static void build() { diff --git a/src/class147/Code07_UniqueTrees.java b/src/class147/Code07_UniqueTrees.java index da01c02b8..30d1cdf7f 100644 --- a/src/class147/Code07_UniqueTrees.java +++ b/src/class147/Code07_UniqueTrees.java @@ -5,7 +5,7 @@ public class Code07_UniqueTrees { // 数据量小用哪个公式都可以 - // 不用考虑溢出、取余等问题 + // 不用考虑溢出、取模等问题 // 这里用公式4 public static int numTrees(int n) { int[] catalan = new int[n + 1]; From 279dbcd48552b3b1fb49097245e9ea9c3bd73034 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 15 Oct 2024 11:57:43 +0800 Subject: [PATCH 0266/2029] modify code --- src/class041/Code02_NthMagicalNumber.java | 2 +- src/class052/Code03_SumOfSubarrayMinimums.java | 2 +- src/class066/Code04_DecodeWaysII.java | 2 +- src/class066/Code08_DistinctSubsequencesII.java | 2 +- src/class069/Code02_ProfitableSchemes.java | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/class041/Code02_NthMagicalNumber.java b/src/class041/Code02_NthMagicalNumber.java index 8ffd52f4b..7eedd6037 100644 --- a/src/class041/Code02_NthMagicalNumber.java +++ b/src/class041/Code02_NthMagicalNumber.java @@ -2,7 +2,7 @@ // 一个正整数如果能被 a 或 b 整除,那么它是神奇的。 // 给定三个整数 n , a , b ,返回第 n 个神奇的数字。 -// 因为答案可能很大,所以返回答案 对 10^9 + 7 取模 +// 因为答案可能很大,所以返回答案 对 1000000007 取模 // 测试链接 : https://leetcode.cn/problems/nth-magical-number/ public class Code02_NthMagicalNumber { diff --git a/src/class052/Code03_SumOfSubarrayMinimums.java b/src/class052/Code03_SumOfSubarrayMinimums.java index f959beb22..15ccfa5d9 100644 --- a/src/class052/Code03_SumOfSubarrayMinimums.java +++ b/src/class052/Code03_SumOfSubarrayMinimums.java @@ -2,7 +2,7 @@ // 子数组的最小值之和 // 给定一个整数数组 arr,找到 min(b) 的总和,其中 b 的范围为 arr 的每个(连续)子数组。 -// 由于答案可能很大,因此 返回答案模 10^9 + 7 +// 由于答案可能很大,答案对 1000000007 取模 // 测试链接 : https://leetcode.cn/problems/sum-of-subarray-minimums/ public class Code03_SumOfSubarrayMinimums { diff --git a/src/class066/Code04_DecodeWaysII.java b/src/class066/Code04_DecodeWaysII.java index d3be45084..bd61f62cd 100644 --- a/src/class066/Code04_DecodeWaysII.java +++ b/src/class066/Code04_DecodeWaysII.java @@ -17,7 +17,7 @@ // 例如,"1*" 可以表示 "11"、"12"、"13"、"14"、"15"、"16"、"17"、"18" 或 "19" // 对 "1*" 进行解码,相当于解码该字符串可以表示的任何编码消息 // 给你一个字符串 s ,由数字和 '*' 字符组成,返回 解码 该字符串的方法 数目 -// 由于答案数目可能非常大,返回10^9 + 7的模 +// 由于答案数目可能非常大,答案对 1000000007 取模 // 测试链接 : https://leetcode.cn/problems/decode-ways-ii/ public class Code04_DecodeWaysII { diff --git a/src/class066/Code08_DistinctSubsequencesII.java b/src/class066/Code08_DistinctSubsequencesII.java index bd02e1935..e73ef5f81 100644 --- a/src/class066/Code08_DistinctSubsequencesII.java +++ b/src/class066/Code08_DistinctSubsequencesII.java @@ -2,7 +2,7 @@ // 不同的子序列 II // 给定一个字符串 s,计算 s 的 不同非空子序列 的个数 -// 因为结果可能很大,所以返回答案需要对 10^9 + 7 取模 +// 因为结果可能很大,答案对 1000000007 取模 // 字符串的 子序列 是经由原字符串删除一些(也可能不删除) // 字符但不改变剩余字符相对位置的一个新字符串 // 例如,"ace" 是 "abcde" 的一个子序列,但 "aec" 不是 diff --git a/src/class069/Code02_ProfitableSchemes.java b/src/class069/Code02_ProfitableSchemes.java index 84039c143..e10d05277 100644 --- a/src/class069/Code02_ProfitableSchemes.java +++ b/src/class069/Code02_ProfitableSchemes.java @@ -6,7 +6,7 @@ // 如果成员参与了其中一项工作,就不能参与另一项工作 // 工作的任何至少产生 minProfit 利润的子集称为 盈利计划 // 并且工作的成员总数最多为 n -// 有多少种计划可以选择?因为答案很大,所以 返回结果模 10^9 + 7 的值。 +// 有多少种计划可以选择?因为答案很大,答案对 1000000007 取模 // 测试链接 : https://leetcode.cn/problems/profitable-schemes/ public class Code02_ProfitableSchemes { From 316ba1d66d764887872c659308b4ab25e269c215 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 15 Oct 2024 16:48:57 +0800 Subject: [PATCH 0267/2029] modify code --- src/class147/Code02_RedMore.java | 2 +- src/class147/Code03_FunnySequence.java | 96 +++++++++++++++++++ ...CircleLine.java => Code04_CircleLine.java} | 2 +- ...riangle.java => Code05_SplitTriangle.java} | 4 +- ...adder.java => Code06_TreehouseLadder.java} | 2 +- ...String.java => Code07_GenerateString.java} | 2 +- ...iqueTrees.java => Code08_UniqueTrees.java} | 4 +- ...ation.java => Code09_LeafExpectation.java} | 2 +- 8 files changed, 105 insertions(+), 9 deletions(-) create mode 100644 src/class147/Code03_FunnySequence.java rename src/class147/{Code03_CircleLine.java => Code04_CircleLine.java} (98%) rename src/class147/{Code04_SplitTriangle.java => Code05_SplitTriangle.java} (93%) rename src/class147/{Code05_TreehouseLadder.java => Code06_TreehouseLadder.java} (97%) rename src/class147/{Code06_GenerateString.java => Code07_GenerateString.java} (97%) rename src/class147/{Code07_UniqueTrees.java => Code08_UniqueTrees.java} (83%) rename src/class147/{Code08_LeafExpectation.java => Code09_LeafExpectation.java} (95%) diff --git a/src/class147/Code02_RedMore.java b/src/class147/Code02_RedMore.java index d0b5946a8..4ed514011 100644 --- a/src/class147/Code02_RedMore.java +++ b/src/class147/Code02_RedMore.java @@ -18,7 +18,7 @@ public class Code02_RedMore { // 因为取模的数字含有很多因子 // 无法用费马小定理或者扩展欧几里得求逆元 - // 所以使用公式4 + // 同时注意到n的范围并不大,直接使用公式4 public static long compute(int n) { long[] catalan = new long[n + 1]; catalan[0] = catalan[1] = 1; diff --git a/src/class147/Code03_FunnySequence.java b/src/class147/Code03_FunnySequence.java new file mode 100644 index 000000000..15d4846d2 --- /dev/null +++ b/src/class147/Code03_FunnySequence.java @@ -0,0 +1,96 @@ +package class147; + +// 有趣的数列(重要!质因子计数法) +// 测试链接 : https://www.luogu.com.cn/problem/P3200 +// 提交以下的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_FunnySequence { + + public static int MAXN = 2000001; + + public static boolean[] visit = new boolean[MAXN]; + + public static int[] prime = new int[MAXN]; + + public static int cnt; + + public static int[] minpf = new int[MAXN]; + + public static int[] counts = new int[MAXN]; + + // 来自讲解097,欧拉筛,时间复杂度O(n) + public static void euler(int n) { + Arrays.fill(visit, 1, n, false); + cnt = 0; + for (int i = 2; i <= n; i++) { + if (!visit[i]) { + prime[++cnt] = i; + } + for (int j = 1; j <= cnt; j++) { + if (i * prime[j] > n) { + break; + } + visit[i * prime[j]] = true; + minpf[i * prime[j]] = prime[j]; + if (i % prime[j] == 0) { + break; + } + } + } + } + + public static long power(long x, long p, int mod) { + long ans = 1; + while (p > 0) { + if ((p & 1) == 1) { + ans = (ans * x) % mod; + } + x = (x * x) % mod; + p >>= 1; + } + return ans; + } + + // 使用的是公式2 + 质因子计数法 + public static int compute(int n, int mod) { + euler(2 * n); + Arrays.fill(counts, 2, n + 1, -1); + Arrays.fill(counts, n + 2, 2 * n + 1, 1); + for (int i = 2 * n; i >= 2; i--) { + if (minpf[i] != 0) { + counts[minpf[i]] += counts[i]; + counts[i / minpf[i]] += counts[i]; + } + } + long ans = 1; + for (int i = 2; i <= 2 * n; i++) { + if (minpf[i] == 0) { + ans = ans * power(i, counts[i], mod) % mod; + } + } + return (int) ans; + } + + 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(); + int n = (int) in.nval; + in.nextToken(); + int mod = (int) in.nval; + out.println(compute(n, mod)); + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class147/Code03_CircleLine.java b/src/class147/Code04_CircleLine.java similarity index 98% rename from src/class147/Code03_CircleLine.java rename to src/class147/Code04_CircleLine.java index becfc2935..af5e1268c 100644 --- a/src/class147/Code03_CircleLine.java +++ b/src/class147/Code04_CircleLine.java @@ -12,7 +12,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code03_CircleLine { +public class Code04_CircleLine { public static int MOD = 100000007; diff --git a/src/class147/Code04_SplitTriangle.java b/src/class147/Code05_SplitTriangle.java similarity index 93% rename from src/class147/Code04_SplitTriangle.java rename to src/class147/Code05_SplitTriangle.java index 02c1feb15..83dd21f31 100644 --- a/src/class147/Code04_SplitTriangle.java +++ b/src/class147/Code05_SplitTriangle.java @@ -14,7 +14,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code04_SplitTriangle { +public class Code05_SplitTriangle { public static int MOD = 1000000; @@ -24,7 +24,7 @@ public class Code04_SplitTriangle { // 因为取模的数字含有很多因子 // 无法用费马小定理或者扩展欧几里得求逆元 - // 所以使用公式4 + // 同时注意到n的范围并不大,直接使用公式4 public static void build() { catalan[0] = catalan[1] = 1; for (int i = 2; i < MAXN; i++) { diff --git a/src/class147/Code05_TreehouseLadder.java b/src/class147/Code06_TreehouseLadder.java similarity index 97% rename from src/class147/Code05_TreehouseLadder.java rename to src/class147/Code06_TreehouseLadder.java index 983103dc5..3fb214369 100644 --- a/src/class147/Code05_TreehouseLadder.java +++ b/src/class147/Code06_TreehouseLadder.java @@ -12,7 +12,7 @@ import java.io.StreamTokenizer; import java.math.BigInteger; -public class Code05_TreehouseLadder { +public class Code06_TreehouseLadder { // 这里用公式2 // java同学使用BigInteger即可 diff --git a/src/class147/Code06_GenerateString.java b/src/class147/Code07_GenerateString.java similarity index 97% rename from src/class147/Code06_GenerateString.java rename to src/class147/Code07_GenerateString.java index e9bb375e0..75199734b 100644 --- a/src/class147/Code06_GenerateString.java +++ b/src/class147/Code07_GenerateString.java @@ -11,7 +11,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code06_GenerateString { +public class Code07_GenerateString { public static int MOD = 20100403; diff --git a/src/class147/Code07_UniqueTrees.java b/src/class147/Code08_UniqueTrees.java similarity index 83% rename from src/class147/Code07_UniqueTrees.java rename to src/class147/Code08_UniqueTrees.java index 30d1cdf7f..3ae2045f8 100644 --- a/src/class147/Code07_UniqueTrees.java +++ b/src/class147/Code08_UniqueTrees.java @@ -2,11 +2,11 @@ // 不同的二叉搜索树 // 测试链接 : https://leetcode.cn/problems/unique-binary-search-trees/ -public class Code07_UniqueTrees { +public class Code08_UniqueTrees { // 数据量小用哪个公式都可以 // 不用考虑溢出、取模等问题 - // 这里用公式4 + // 同时注意到n的范围并不大,直接使用公式4 public static int numTrees(int n) { int[] catalan = new int[n + 1]; catalan[0] = catalan[1] = 1; diff --git a/src/class147/Code08_LeafExpectation.java b/src/class147/Code09_LeafExpectation.java similarity index 95% rename from src/class147/Code08_LeafExpectation.java rename to src/class147/Code09_LeafExpectation.java index 1a6114ea4..2e4b3d158 100644 --- a/src/class147/Code08_LeafExpectation.java +++ b/src/class147/Code09_LeafExpectation.java @@ -11,7 +11,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code08_LeafExpectation { +public class Code09_LeafExpectation { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); From a35b331ea82fd4412b1d9a315346027123bfef84 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 15 Oct 2024 19:01:22 +0800 Subject: [PATCH 0268/2029] modify code --- src/class147/Code03_FunnySequence.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/class147/Code03_FunnySequence.java b/src/class147/Code03_FunnySequence.java index 15d4846d2..6709c92ad 100644 --- a/src/class147/Code03_FunnySequence.java +++ b/src/class147/Code03_FunnySequence.java @@ -68,11 +68,12 @@ public static int compute(int n, int mod) { if (minpf[i] != 0) { counts[minpf[i]] += counts[i]; counts[i / minpf[i]] += counts[i]; + counts[i] = 0; } } long ans = 1; for (int i = 2; i <= 2 * n; i++) { - if (minpf[i] == 0) { + if (counts[i] != 0) { ans = ans * power(i, counts[i], mod) % mod; } } From fa009ccf8483003cee3179499acd84bec5f70d24 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 15 Oct 2024 19:07:18 +0800 Subject: [PATCH 0269/2029] modify code --- src/class147/Code03_FunnySequence.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/class147/Code03_FunnySequence.java b/src/class147/Code03_FunnySequence.java index 6709c92ad..207816cde 100644 --- a/src/class147/Code03_FunnySequence.java +++ b/src/class147/Code03_FunnySequence.java @@ -22,6 +22,8 @@ public class Code03_FunnySequence { public static int cnt; + // 如果minpf[i] == 0,代表i是质数 + // 如果minpf[i] != 0,代表i的最小质因子是minpf[i] public static int[] minpf = new int[MAXN]; public static int[] counts = new int[MAXN]; @@ -39,6 +41,8 @@ public static void euler(int n) { break; } visit[i * prime[j]] = true; + // 讲解097重点解释了欧拉筛的过程,看完必懂 + // 此时可以收集(i * prime[j])这个数的最小质因子为prime[j] minpf[i * prime[j]] = prime[j]; if (i % prime[j] == 0) { break; From 19a2827705515a4b6ac81dc94915932b81f49b47 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 15 Oct 2024 19:25:24 +0800 Subject: [PATCH 0270/2029] modify code --- src/class147/Code03_FunnySequence.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class147/Code03_FunnySequence.java b/src/class147/Code03_FunnySequence.java index 207816cde..86a0ae780 100644 --- a/src/class147/Code03_FunnySequence.java +++ b/src/class147/Code03_FunnySequence.java @@ -34,15 +34,15 @@ public static void euler(int n) { cnt = 0; for (int i = 2; i <= n; i++) { if (!visit[i]) { - prime[++cnt] = i; + prime[cnt++] = i; } - for (int j = 1; j <= cnt; j++) { + for (int j = 0; j < cnt; j++) { if (i * prime[j] > n) { break; } visit[i * prime[j]] = true; - // 讲解097重点解释了欧拉筛的过程,看完必懂 - // 此时可以收集(i * prime[j])这个数的最小质因子为prime[j] + // 此时收集(i * prime[j])这个数的最小质因子为prime[j] + // 讲解097欧拉筛的部分重点解释了这个过程,看完必懂 minpf[i * prime[j]] = prime[j]; if (i % prime[j] == 0) { break; From 2070ae14dca61a86985bdc490c34edf43ae9ba1c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 16 Oct 2024 10:38:39 +0800 Subject: [PATCH 0271/2029] modify code --- src/class147/Code03_FunnySequence.java | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/class147/Code03_FunnySequence.java b/src/class147/Code03_FunnySequence.java index 86a0ae780..0ea03bb36 100644 --- a/src/class147/Code03_FunnySequence.java +++ b/src/class147/Code03_FunnySequence.java @@ -16,33 +16,35 @@ public class Code03_FunnySequence { public static int MAXN = 2000001; - public static boolean[] visit = new boolean[MAXN]; + // 如果minpf[i] == 0,代表i是质数 + // 如果minpf[i] != 0,代表i是合数,并且最小质因子是minpf[i] + public static int[] minpf = new int[MAXN]; + // 质数表 public static int[] prime = new int[MAXN]; public static int cnt; - // 如果minpf[i] == 0,代表i是质数 - // 如果minpf[i] != 0,代表i的最小质因子是minpf[i] - public static int[] minpf = new int[MAXN]; - + // 因子计数 public static int[] counts = new int[MAXN]; // 来自讲解097,欧拉筛,时间复杂度O(n) public static void euler(int n) { - Arrays.fill(visit, 1, n, false); + Arrays.fill(minpf, 2, n, 0); cnt = 0; for (int i = 2; i <= n; i++) { - if (!visit[i]) { + // minpf[i] == 0代表i为质数,收集进质数表 + // minpf数组替代了讲解097中visit数组的作用 + if (minpf[i] == 0) { prime[cnt++] = i; } for (int j = 0; j < cnt; j++) { if (i * prime[j] > n) { break; } - visit[i * prime[j]] = true; // 此时收集(i * prime[j])这个数的最小质因子为prime[j] - // 讲解097欧拉筛的部分重点解释了这个过程,看完必懂 + // minpf[i * prime[j]] != 0,也标记了(i * prime[j])不是质数 + // 讲解097欧拉筛的部分,重点解释了这个过程,看完必懂 minpf[i * prime[j]] = prime[j]; if (i % prime[j] == 0) { break; From 9bee637930ea819c2a7a1e8e7730ce3fca0e19ea Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 16 Oct 2024 10:40:43 +0800 Subject: [PATCH 0272/2029] modify code --- src/class147/Code03_FunnySequence.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/class147/Code03_FunnySequence.java b/src/class147/Code03_FunnySequence.java index 0ea03bb36..6c5b68850 100644 --- a/src/class147/Code03_FunnySequence.java +++ b/src/class147/Code03_FunnySequence.java @@ -23,6 +23,7 @@ public class Code03_FunnySequence { // 质数表 public static int[] prime = new int[MAXN]; + // 质数表大小 public static int cnt; // 因子计数 @@ -43,7 +44,7 @@ public static void euler(int n) { break; } // 此时收集(i * prime[j])这个数的最小质因子为prime[j] - // minpf[i * prime[j]] != 0,也标记了(i * prime[j])不是质数 + // minpf[i * prime[j]] != 0,也标记了(i * prime[j])是合数 // 讲解097欧拉筛的部分,重点解释了这个过程,看完必懂 minpf[i * prime[j]] = prime[j]; if (i % prime[j] == 0) { From 8606a744302a7ac493d650be1558be295fa5875d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 16 Oct 2024 10:52:25 +0800 Subject: [PATCH 0273/2029] modify code --- src/class147/Code03_FunnySequence.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/class147/Code03_FunnySequence.java b/src/class147/Code03_FunnySequence.java index 6c5b68850..3d7fd783c 100644 --- a/src/class147/Code03_FunnySequence.java +++ b/src/class147/Code03_FunnySequence.java @@ -68,9 +68,17 @@ public static long power(long x, long p, int mod) { // 使用的是公式2 + 质因子计数法 public static int compute(int n, int mod) { + // 利用欧拉筛生成[2 ~ 2*n]范围上所有数的最小质因子 + // 如果x为质数,minpf[x] == 0 + // 如果x为合数,x的最小质因子为minpf[x] euler(2 * n); + // 分母每个因子设置计数 Arrays.fill(counts, 2, n + 1, -1); + // 分子每个因子设置计数 Arrays.fill(counts, n + 2, 2 * n + 1, 1); + // 从大到小的每个数统计计数 + // 合数根据最小质因子来分解,变成更小数字的计数 + // 质数无法分解,计数确定,最后快速幂计算乘积 for (int i = 2 * n; i >= 2; i--) { if (minpf[i] != 0) { counts[minpf[i]] += counts[i]; @@ -78,6 +86,7 @@ public static int compute(int n, int mod) { counts[i] = 0; } } + // 每个质数的幂,都乘起来,就是最后答案 long ans = 1; for (int i = 2; i <= 2 * n; i++) { if (counts[i] != 0) { From e9e26c398534641196412d0ba297222a94c86472 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 16 Oct 2024 11:46:44 +0800 Subject: [PATCH 0274/2029] modify code --- ...{Code06_TreehouseLadder.java => Code04_TreehouseLadder.java} | 2 +- .../{Code07_GenerateString.java => Code05_GenerateString.java} | 2 +- src/class147/{Code04_CircleLine.java => Code06_CircleLine.java} | 2 +- .../{Code05_SplitTriangle.java => Code07_SplitTriangle.java} | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) rename src/class147/{Code06_TreehouseLadder.java => Code04_TreehouseLadder.java} (97%) rename src/class147/{Code07_GenerateString.java => Code05_GenerateString.java} (97%) rename src/class147/{Code04_CircleLine.java => Code06_CircleLine.java} (98%) rename src/class147/{Code05_SplitTriangle.java => Code07_SplitTriangle.java} (97%) diff --git a/src/class147/Code06_TreehouseLadder.java b/src/class147/Code04_TreehouseLadder.java similarity index 97% rename from src/class147/Code06_TreehouseLadder.java rename to src/class147/Code04_TreehouseLadder.java index 3fb214369..a0200dbbd 100644 --- a/src/class147/Code06_TreehouseLadder.java +++ b/src/class147/Code04_TreehouseLadder.java @@ -12,7 +12,7 @@ import java.io.StreamTokenizer; import java.math.BigInteger; -public class Code06_TreehouseLadder { +public class Code04_TreehouseLadder { // 这里用公式2 // java同学使用BigInteger即可 diff --git a/src/class147/Code07_GenerateString.java b/src/class147/Code05_GenerateString.java similarity index 97% rename from src/class147/Code07_GenerateString.java rename to src/class147/Code05_GenerateString.java index 75199734b..6c1474fda 100644 --- a/src/class147/Code07_GenerateString.java +++ b/src/class147/Code05_GenerateString.java @@ -11,7 +11,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code07_GenerateString { +public class Code05_GenerateString { public static int MOD = 20100403; diff --git a/src/class147/Code04_CircleLine.java b/src/class147/Code06_CircleLine.java similarity index 98% rename from src/class147/Code04_CircleLine.java rename to src/class147/Code06_CircleLine.java index af5e1268c..8dcbb7253 100644 --- a/src/class147/Code04_CircleLine.java +++ b/src/class147/Code06_CircleLine.java @@ -12,7 +12,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code04_CircleLine { +public class Code06_CircleLine { public static int MOD = 100000007; diff --git a/src/class147/Code05_SplitTriangle.java b/src/class147/Code07_SplitTriangle.java similarity index 97% rename from src/class147/Code05_SplitTriangle.java rename to src/class147/Code07_SplitTriangle.java index 83dd21f31..7a66e5d4f 100644 --- a/src/class147/Code05_SplitTriangle.java +++ b/src/class147/Code07_SplitTriangle.java @@ -14,7 +14,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code05_SplitTriangle { +public class Code07_SplitTriangle { public static int MOD = 1000000; From 7fc6f61d55bf3e99962c1d03b81bcf3b1e4a0ad5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 16 Oct 2024 16:28:04 +0800 Subject: [PATCH 0275/2029] modify code --- src/class147/Code01_Catalan.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class147/Code01_Catalan.java b/src/class147/Code01_Catalan.java index afe105f83..d3b8ac2fc 100644 --- a/src/class147/Code01_Catalan.java +++ b/src/class147/Code01_Catalan.java @@ -1,6 +1,6 @@ package class147; -// 卡特兰数 +// 卡特兰数模版 // 测试题目的数据量虽然很小,但请假设数据量很大来实现,答案对 1000000007 取模 // 测试链接 : https://www.luogu.com.cn/problem/P1044 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 From b431b398de1a43a9daf27bfb22121576764a1795 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 16 Oct 2024 17:53:05 +0800 Subject: [PATCH 0276/2029] modify code --- src/class147/{Code06_CircleLine.java => Code02_CircleLine.java} | 2 +- src/class147/{Code02_RedMore.java => Code03_RedMore.java} | 2 +- .../{Code03_FunnySequence.java => Code04_FunnySequence.java} | 2 +- .../{Code07_SplitTriangle.java => Code06_SplitTriangle.java} | 2 +- .../{Code08_UniqueTrees.java => Code07_UniqueTrees.java} | 2 +- ...{Code04_TreehouseLadder.java => Code08_TreehouseLadder.java} | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) rename src/class147/{Code06_CircleLine.java => Code02_CircleLine.java} (98%) rename src/class147/{Code02_RedMore.java => Code03_RedMore.java} (97%) rename src/class147/{Code03_FunnySequence.java => Code04_FunnySequence.java} (98%) rename src/class147/{Code07_SplitTriangle.java => Code06_SplitTriangle.java} (97%) rename src/class147/{Code08_UniqueTrees.java => Code07_UniqueTrees.java} (93%) rename src/class147/{Code04_TreehouseLadder.java => Code08_TreehouseLadder.java} (97%) diff --git a/src/class147/Code06_CircleLine.java b/src/class147/Code02_CircleLine.java similarity index 98% rename from src/class147/Code06_CircleLine.java rename to src/class147/Code02_CircleLine.java index 8dcbb7253..93ecc7ddc 100644 --- a/src/class147/Code06_CircleLine.java +++ b/src/class147/Code02_CircleLine.java @@ -12,7 +12,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code06_CircleLine { +public class Code02_CircleLine { public static int MOD = 100000007; diff --git a/src/class147/Code02_RedMore.java b/src/class147/Code03_RedMore.java similarity index 97% rename from src/class147/Code02_RedMore.java rename to src/class147/Code03_RedMore.java index 4ed514011..d421732b7 100644 --- a/src/class147/Code02_RedMore.java +++ b/src/class147/Code03_RedMore.java @@ -12,7 +12,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code02_RedMore { +public class Code03_RedMore { public static int MOD = 100; diff --git a/src/class147/Code03_FunnySequence.java b/src/class147/Code04_FunnySequence.java similarity index 98% rename from src/class147/Code03_FunnySequence.java rename to src/class147/Code04_FunnySequence.java index 3d7fd783c..6233ecc23 100644 --- a/src/class147/Code03_FunnySequence.java +++ b/src/class147/Code04_FunnySequence.java @@ -12,7 +12,7 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class Code03_FunnySequence { +public class Code04_FunnySequence { public static int MAXN = 2000001; diff --git a/src/class147/Code07_SplitTriangle.java b/src/class147/Code06_SplitTriangle.java similarity index 97% rename from src/class147/Code07_SplitTriangle.java rename to src/class147/Code06_SplitTriangle.java index 7a66e5d4f..1bb22077a 100644 --- a/src/class147/Code07_SplitTriangle.java +++ b/src/class147/Code06_SplitTriangle.java @@ -14,7 +14,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code07_SplitTriangle { +public class Code06_SplitTriangle { public static int MOD = 1000000; diff --git a/src/class147/Code08_UniqueTrees.java b/src/class147/Code07_UniqueTrees.java similarity index 93% rename from src/class147/Code08_UniqueTrees.java rename to src/class147/Code07_UniqueTrees.java index 3ae2045f8..6cb2c1a48 100644 --- a/src/class147/Code08_UniqueTrees.java +++ b/src/class147/Code07_UniqueTrees.java @@ -2,7 +2,7 @@ // 不同的二叉搜索树 // 测试链接 : https://leetcode.cn/problems/unique-binary-search-trees/ -public class Code08_UniqueTrees { +public class Code07_UniqueTrees { // 数据量小用哪个公式都可以 // 不用考虑溢出、取模等问题 diff --git a/src/class147/Code04_TreehouseLadder.java b/src/class147/Code08_TreehouseLadder.java similarity index 97% rename from src/class147/Code04_TreehouseLadder.java rename to src/class147/Code08_TreehouseLadder.java index a0200dbbd..fcd4040c8 100644 --- a/src/class147/Code04_TreehouseLadder.java +++ b/src/class147/Code08_TreehouseLadder.java @@ -12,7 +12,7 @@ import java.io.StreamTokenizer; import java.math.BigInteger; -public class Code04_TreehouseLadder { +public class Code08_TreehouseLadder { // 这里用公式2 // java同学使用BigInteger即可 From 3db7fe2f863950e74d6cfb79ab79762eaaa3bfcf Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 17 Oct 2024 02:15:26 +0800 Subject: [PATCH 0277/2029] modify code --- src/class147/Code01_Catalan.java | 16 ++++++++-------- src/class147/Code03_RedMore.java | 8 ++++---- ...tTriangle.java => Code06_CatalanSkyline.java} | 12 ++++++------ src/class147/Code07_UniqueTrees.java | 8 ++++---- 4 files changed, 22 insertions(+), 22 deletions(-) rename src/class147/{Code06_SplitTriangle.java => Code06_CatalanSkyline.java} (84%) diff --git a/src/class147/Code01_Catalan.java b/src/class147/Code01_Catalan.java index d3b8ac2fc..55bbf9dab 100644 --- a/src/class147/Code01_Catalan.java +++ b/src/class147/Code01_Catalan.java @@ -79,24 +79,24 @@ public static long compute2(int n) { // 公式3 public static long compute3(int n) { build2(n); - long[] catalan = new long[n + 1]; - catalan[0] = catalan[1] = 1; + long[] f = new long[n + 1]; + f[0] = f[1] = 1; for (int i = 2; i <= n; i++) { - catalan[i] = catalan[i - 1] * (4 * i - 2) % MOD * inv2[i + 1] % MOD; + f[i] = f[i - 1] * (4 * i - 2) % MOD * inv2[i + 1] % MOD; } - return catalan[n]; + return f[n]; } // 公式4 public static long compute4(int n) { - long[] catalan = new long[n + 1]; - catalan[0] = catalan[1] = 1; + long[] f = new long[n + 1]; + f[0] = f[1] = 1; for (int i = 2; i <= n; i++) { for (int l = 0, r = i - 1; l < i; l++, r--) { - catalan[i] = (catalan[i] + catalan[l] * catalan[r] % MOD) % MOD; + f[i] = (f[i] + f[l] * f[r] % MOD) % MOD; } } - return catalan[n]; + return f[n]; } public static void main(String[] args) throws IOException { diff --git a/src/class147/Code03_RedMore.java b/src/class147/Code03_RedMore.java index d421732b7..c204b041b 100644 --- a/src/class147/Code03_RedMore.java +++ b/src/class147/Code03_RedMore.java @@ -20,14 +20,14 @@ public class Code03_RedMore { // 无法用费马小定理或者扩展欧几里得求逆元 // 同时注意到n的范围并不大,直接使用公式4 public static long compute(int n) { - long[] catalan = new long[n + 1]; - catalan[0] = catalan[1] = 1; + long[] f = new long[n + 1]; + f[0] = f[1] = 1; for (int i = 2; i <= n; i++) { for (int l = 0, r = i - 1; l < i; l++, r--) { - catalan[i] = (catalan[i] + catalan[l] * catalan[r] % MOD) % MOD; + f[i] = (f[i] + f[l] * f[r] % MOD) % MOD; } } - return catalan[n]; + return f[n]; } public static void main(String[] args) throws IOException { diff --git a/src/class147/Code06_SplitTriangle.java b/src/class147/Code06_CatalanSkyline.java similarity index 84% rename from src/class147/Code06_SplitTriangle.java rename to src/class147/Code06_CatalanSkyline.java index 1bb22077a..32bb483f2 100644 --- a/src/class147/Code06_SplitTriangle.java +++ b/src/class147/Code06_CatalanSkyline.java @@ -1,6 +1,6 @@ package class147; -// 划分三角形 +// 卡特兰数天际线 // 答案对 1000000 取模 // 1 <= n <= 1000 // 测试链接 : https://www.luogu.com.cn/problem/SP7897 @@ -14,22 +14,22 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code06_SplitTriangle { +public class Code06_CatalanSkyline { public static int MOD = 1000000; public static int MAXN = 1001; - public static long[] catalan = new long[MAXN]; + public static long[] f = new long[MAXN]; // 因为取模的数字含有很多因子 // 无法用费马小定理或者扩展欧几里得求逆元 // 同时注意到n的范围并不大,直接使用公式4 public static void build() { - catalan[0] = catalan[1] = 1; + f[0] = f[1] = 1; for (int i = 2; i < MAXN; i++) { for (int l = 0, r = i - 1; l < i; l++, r--) { - catalan[i] = (catalan[i] + catalan[l] * catalan[r] % MOD) % MOD; + f[i] = (f[i] + f[l] * f[r] % MOD) % MOD; } } } @@ -44,7 +44,7 @@ public static void main(String[] args) throws IOException { if (n == 0) { break; } - out.println(catalan[n]); + out.println(f[n]); } out.flush(); out.close(); diff --git a/src/class147/Code07_UniqueTrees.java b/src/class147/Code07_UniqueTrees.java index 6cb2c1a48..fae553484 100644 --- a/src/class147/Code07_UniqueTrees.java +++ b/src/class147/Code07_UniqueTrees.java @@ -8,14 +8,14 @@ public class Code07_UniqueTrees { // 不用考虑溢出、取模等问题 // 同时注意到n的范围并不大,直接使用公式4 public static int numTrees(int n) { - int[] catalan = new int[n + 1]; - catalan[0] = catalan[1] = 1; + int[] f = new int[n + 1]; + f[0] = f[1] = 1; for (int i = 2; i <= n; i++) { for (int l = 0, r = i - 1; l < i; l++, r--) { - catalan[i] += catalan[l] * catalan[r]; + f[i] += f[l] * f[r]; } } - return catalan[n]; + return f[n]; } } From 17d7b03abc504ce62668d0fb038d71d931578884 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 17 Oct 2024 12:01:21 +0800 Subject: [PATCH 0278/2029] modify code --- src/class147/Code01_Catalan.java | 4 ++-- src/class147/Code04_FunnySequence.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/class147/Code01_Catalan.java b/src/class147/Code01_Catalan.java index 55bbf9dab..8a31a53f0 100644 --- a/src/class147/Code01_Catalan.java +++ b/src/class147/Code01_Catalan.java @@ -24,7 +24,7 @@ public class Code01_Catalan { // 阶乘逆元表 public static long[] inv1 = new long[MAXN]; - // 数字逆元表 + // 连续数逆元表 public static long[] inv2 = new long[MAXN]; // 来自讲解099,题目3,生成阶乘余数表、阶乘逆元表 @@ -40,7 +40,7 @@ public static void build1(int n) { } } - // 来自讲解099,题目2,生成连续数字的逆元表 + // 来自讲解099,题目2,生成连续数逆元表 public static void build2(int n) { inv2[1] = 1; for (int i = 2; i <= n + 1; i++) { diff --git a/src/class147/Code04_FunnySequence.java b/src/class147/Code04_FunnySequence.java index 6233ecc23..d4e2e9876 100644 --- a/src/class147/Code04_FunnySequence.java +++ b/src/class147/Code04_FunnySequence.java @@ -1,6 +1,6 @@ package class147; -// 有趣的数列(重要!质因子计数法) +// 有趣的数列(重要!因子计数法) // 测试链接 : https://www.luogu.com.cn/problem/P3200 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 From be818f2b228d53272885c25edbe4cc194d037c59 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 17 Oct 2024 14:37:25 +0800 Subject: [PATCH 0279/2029] modify code --- src/class147/Code01_Catalan.java | 1 + src/class147/Code02_CircleLine.java | 2 ++ src/class147/Code03_RedMore.java | 4 +++- .../{Code07_UniqueTrees.java => Code04_UniqueTrees.java} | 4 +++- ...Code04_FunnySequence.java => Code05_FunnySequence.java} | 6 +++++- ...de05_GenerateString.java => Code06_GenerateString.java} | 5 ++++- .../{Code06_CatalanSkyline.java => Code07_Skyline.java} | 7 ++++--- src/class147/Code08_TreehouseLadder.java | 4 ++++ src/class147/Code09_LeafExpectation.java | 4 ++++ 9 files changed, 30 insertions(+), 7 deletions(-) rename src/class147/{Code07_UniqueTrees.java => Code04_UniqueTrees.java} (75%) rename src/class147/{Code04_FunnySequence.java => Code05_FunnySequence.java} (95%) rename src/class147/{Code05_GenerateString.java => Code06_GenerateString.java} (88%) rename src/class147/{Code06_CatalanSkyline.java => Code07_Skyline.java} (84%) diff --git a/src/class147/Code01_Catalan.java b/src/class147/Code01_Catalan.java index 8a31a53f0..1fb81c9df 100644 --- a/src/class147/Code01_Catalan.java +++ b/src/class147/Code01_Catalan.java @@ -1,6 +1,7 @@ package class147; // 卡特兰数模版 +// 进栈顺序规定为1、2、3..n,返回有多少种不同的出栈顺序 // 测试题目的数据量虽然很小,但请假设数据量很大来实现,答案对 1000000007 取模 // 测试链接 : https://www.luogu.com.cn/problem/P1044 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class147/Code02_CircleLine.java b/src/class147/Code02_CircleLine.java index 93ecc7ddc..4866d6651 100644 --- a/src/class147/Code02_CircleLine.java +++ b/src/class147/Code02_CircleLine.java @@ -1,7 +1,9 @@ package class147; // 圆上连线 +// 圆上有2n个点,这些点成对连接起来,形成n条线段,任意两条线段不能相交,返回连接的方法数 // 注意!答案不对 10^9 + 7 取模!而是对 10^8 + 7 取模! +// 1 <= n <= 2999 // 测试链接 : https://www.luogu.com.cn/problem/P1976 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class147/Code03_RedMore.java b/src/class147/Code03_RedMore.java index c204b041b..1c3bcfd43 100644 --- a/src/class147/Code03_RedMore.java +++ b/src/class147/Code03_RedMore.java @@ -1,7 +1,9 @@ package class147; // 任意前缀上红大于黑 -// 答案对 100 取模 +// 有n个红和n个黑,要组成2n长度的数列,保证任意前缀上,红的数量 >= 黑的数量 +// 返回有多少种排列方法,答案对 100 取模 +// 1 <= n <= 100 // 测试链接 : https://www.luogu.com.cn/problem/P1722 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class147/Code07_UniqueTrees.java b/src/class147/Code04_UniqueTrees.java similarity index 75% rename from src/class147/Code07_UniqueTrees.java rename to src/class147/Code04_UniqueTrees.java index fae553484..8deaff1fc 100644 --- a/src/class147/Code07_UniqueTrees.java +++ b/src/class147/Code04_UniqueTrees.java @@ -1,8 +1,10 @@ package class147; // 不同的二叉搜索树 +// 一共有n个节点,认为节点之间无差别,返回能形成多少种不同结构的二叉树 +// 1 <= n <= 19 // 测试链接 : https://leetcode.cn/problems/unique-binary-search-trees/ -public class Code07_UniqueTrees { +public class Code04_UniqueTrees { // 数据量小用哪个公式都可以 // 不用考虑溢出、取模等问题 diff --git a/src/class147/Code04_FunnySequence.java b/src/class147/Code05_FunnySequence.java similarity index 95% rename from src/class147/Code04_FunnySequence.java rename to src/class147/Code05_FunnySequence.java index d4e2e9876..c5b9dc122 100644 --- a/src/class147/Code04_FunnySequence.java +++ b/src/class147/Code05_FunnySequence.java @@ -1,6 +1,10 @@ package class147; // 有趣的数列(重要!因子计数法) +// 求第n项卡特兰数,要求答案对p取模 +// 1 <= n <= 10^6 +// 1 <= p <= 10^9 +// p可能不为质数 // 测试链接 : https://www.luogu.com.cn/problem/P3200 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -12,7 +16,7 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class Code04_FunnySequence { +public class Code05_FunnySequence { public static int MAXN = 2000001; diff --git a/src/class147/Code05_GenerateString.java b/src/class147/Code06_GenerateString.java similarity index 88% rename from src/class147/Code05_GenerateString.java rename to src/class147/Code06_GenerateString.java index 6c1474fda..c2bf50568 100644 --- a/src/class147/Code05_GenerateString.java +++ b/src/class147/Code06_GenerateString.java @@ -1,6 +1,9 @@ package class147; // 生成字符串 +// 有n个1和m个0,要组成n+m长度的数列,保证任意前缀上,1的数量 >= 0的数量 +// 返回有多少种排列方法,答案对 20100403 取模 +// 1 <= m <= n <= 10^6 // 测试链接 : https://www.luogu.com.cn/problem/P1641 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -11,7 +14,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code05_GenerateString { +public class Code06_GenerateString { public static int MOD = 20100403; diff --git a/src/class147/Code06_CatalanSkyline.java b/src/class147/Code07_Skyline.java similarity index 84% rename from src/class147/Code06_CatalanSkyline.java rename to src/class147/Code07_Skyline.java index 32bb483f2..faf1f242f 100644 --- a/src/class147/Code06_CatalanSkyline.java +++ b/src/class147/Code07_Skyline.java @@ -1,7 +1,8 @@ package class147; -// 卡特兰数天际线 -// 答案对 1000000 取模 +// 不含递增三元组的排列方法数 +// 数字从1到n,可以形成很多排列,要求任意从左往右的三个位置,不能出现依次递增的样子 +// 返回排列的方法数,答案对 1000000 取模 // 1 <= n <= 1000 // 测试链接 : https://www.luogu.com.cn/problem/SP7897 // 测试链接 : https://www.spoj.com/problems/SKYLINE @@ -14,7 +15,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code06_CatalanSkyline { +public class Code07_Skyline { public static int MOD = 1000000; diff --git a/src/class147/Code08_TreehouseLadder.java b/src/class147/Code08_TreehouseLadder.java index fcd4040c8..f6bbd7bc8 100644 --- a/src/class147/Code08_TreehouseLadder.java +++ b/src/class147/Code08_TreehouseLadder.java @@ -1,6 +1,10 @@ package class147; // 树屋阶梯 +// 地面高度是0,想搭建一个阶梯,要求每一个台阶上升1的高度,最终到达高度n +// 阶梯的样子可以打开测试链接查看,你有无穷多的任意规格的长方形材料 +// 返回搭建阶梯的不同方法数,答案可能很大,不取模!就打印真实答案 +// 1 <= n <= 500 // 测试链接 : https://www.luogu.com.cn/problem/P2532 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class147/Code09_LeafExpectation.java b/src/class147/Code09_LeafExpectation.java index 2e4b3d158..c21ab326e 100644 --- a/src/class147/Code09_LeafExpectation.java +++ b/src/class147/Code09_LeafExpectation.java @@ -1,6 +1,10 @@ package class147; // 叶子节点数的期望 +// 一共有n个节点,认为节点之间无差别,能形成很多不同结构的二叉树 +// 每一种二叉树都有若干叶子节点,返回叶子节点数的期望 +// 1 <= n <= 10^9 +// 答案误差小于10的-9次方 // 测试链接 : https://www.luogu.com.cn/problem/P3978 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 From ebb8af3ecf21f9d1edfb88919f6ca491bfd3ad80 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 17 Oct 2024 14:44:50 +0800 Subject: [PATCH 0280/2029] modify code --- src/class147/Code05_FunnySequence.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class147/Code05_FunnySequence.java b/src/class147/Code05_FunnySequence.java index c5b9dc122..ec7506648 100644 --- a/src/class147/Code05_FunnySequence.java +++ b/src/class147/Code05_FunnySequence.java @@ -1,6 +1,6 @@ package class147; -// 有趣的数列(重要!因子计数法) +// 有趣的数列(重要! 因子计数法) // 求第n项卡特兰数,要求答案对p取模 // 1 <= n <= 10^6 // 1 <= p <= 10^9 From 48f33b40053c7fcedcbbd493cc59c60380b43635 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 17 Oct 2024 15:00:38 +0800 Subject: [PATCH 0281/2029] modify code --- src/class147/Code08_TreehouseLadder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class147/Code08_TreehouseLadder.java b/src/class147/Code08_TreehouseLadder.java index f6bbd7bc8..f304aee0a 100644 --- a/src/class147/Code08_TreehouseLadder.java +++ b/src/class147/Code08_TreehouseLadder.java @@ -2,7 +2,7 @@ // 树屋阶梯 // 地面高度是0,想搭建一个阶梯,要求每一个台阶上升1的高度,最终到达高度n -// 阶梯的样子可以打开测试链接查看,你有无穷多的任意规格的长方形材料 +// 你有无穷多的任意规格的长方形材料,希望能搭建出阶梯的样子 // 返回搭建阶梯的不同方法数,答案可能很大,不取模!就打印真实答案 // 1 <= n <= 500 // 测试链接 : https://www.luogu.com.cn/problem/P2532 From 22fa35c5318ce9017268cac17a57c05ac8a23d58 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 17 Oct 2024 15:04:23 +0800 Subject: [PATCH 0282/2029] modify code --- src/class147/Code03_RedMore.java | 2 +- src/class147/Code04_UniqueTrees.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class147/Code03_RedMore.java b/src/class147/Code03_RedMore.java index 1c3bcfd43..81d159791 100644 --- a/src/class147/Code03_RedMore.java +++ b/src/class147/Code03_RedMore.java @@ -1,6 +1,6 @@ package class147; -// 任意前缀上红大于黑 +// 任意前缀上红多于黑 // 有n个红和n个黑,要组成2n长度的数列,保证任意前缀上,红的数量 >= 黑的数量 // 返回有多少种排列方法,答案对 100 取模 // 1 <= n <= 100 diff --git a/src/class147/Code04_UniqueTrees.java b/src/class147/Code04_UniqueTrees.java index 8deaff1fc..820fb9ce8 100644 --- a/src/class147/Code04_UniqueTrees.java +++ b/src/class147/Code04_UniqueTrees.java @@ -1,6 +1,6 @@ package class147; -// 不同的二叉搜索树 +// 不同结构的二叉树数量 // 一共有n个节点,认为节点之间无差别,返回能形成多少种不同结构的二叉树 // 1 <= n <= 19 // 测试链接 : https://leetcode.cn/problems/unique-binary-search-trees/ From f1b56cadea2ad9ba88cea0b6a9911996326e9137 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 18 Oct 2024 11:26:43 +0800 Subject: [PATCH 0283/2029] modify code --- src/class147/Code01_Catalan.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/class147/Code01_Catalan.java b/src/class147/Code01_Catalan.java index 1fb81c9df..1307fd6f4 100644 --- a/src/class147/Code01_Catalan.java +++ b/src/class147/Code01_Catalan.java @@ -2,7 +2,8 @@ // 卡特兰数模版 // 进栈顺序规定为1、2、3..n,返回有多少种不同的出栈顺序 -// 测试题目的数据量虽然很小,但请假设数据量很大来实现,答案对 1000000007 取模 +// 测试题目的数据量很小,得到的卡特兰数没有多大 +// 但是请假设,当n比较大时,卡特兰数是很大的,答案对 1000000007 取模 // 测试链接 : https://www.luogu.com.cn/problem/P1044 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 From 00587843cc91698f4893de16cc2e68ac6ef80805 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 18 Oct 2024 12:11:04 +0800 Subject: [PATCH 0284/2029] modify code --- src/class147/Code01_Catalan.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class147/Code01_Catalan.java b/src/class147/Code01_Catalan.java index 1307fd6f4..4eedcb360 100644 --- a/src/class147/Code01_Catalan.java +++ b/src/class147/Code01_Catalan.java @@ -2,7 +2,7 @@ // 卡特兰数模版 // 进栈顺序规定为1、2、3..n,返回有多少种不同的出栈顺序 -// 测试题目的数据量很小,得到的卡特兰数没有多大 +// 测试题目的数据量很小,得到的卡特兰数没有多大,不需要取模处理 // 但是请假设,当n比较大时,卡特兰数是很大的,答案对 1000000007 取模 // 测试链接 : https://www.luogu.com.cn/problem/P1044 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 From 02c3b176cda307873b3a314d3beb27a29cf93863 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 18 Oct 2024 17:46:08 +0800 Subject: [PATCH 0285/2029] modify code --- src/class147/Code09_LeafExpectation.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class147/Code09_LeafExpectation.java b/src/class147/Code09_LeafExpectation.java index c21ab326e..1555ce4b0 100644 --- a/src/class147/Code09_LeafExpectation.java +++ b/src/class147/Code09_LeafExpectation.java @@ -23,7 +23,7 @@ public static void main(String[] args) throws IOException { PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); in.nextToken(); double n = in.nval; - out.printf("%.12f", n * (n + 1) / (2 * (2 * n - 1))); + out.printf("%.9f", n * (n + 1) / (2 * (2 * n - 1))); out.flush(); out.close(); br.close(); From 250a1c6847a7114653a514924717fd57d0b00244 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 18 Oct 2024 18:06:43 +0800 Subject: [PATCH 0286/2029] modify code --- src/class147/Code08_TreehouseLadder.java | 2 +- src/class147/Code09_LeafExpectation.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class147/Code08_TreehouseLadder.java b/src/class147/Code08_TreehouseLadder.java index f304aee0a..5a832a853 100644 --- a/src/class147/Code08_TreehouseLadder.java +++ b/src/class147/Code08_TreehouseLadder.java @@ -2,7 +2,7 @@ // 树屋阶梯 // 地面高度是0,想搭建一个阶梯,要求每一个台阶上升1的高度,最终到达高度n -// 你有无穷多的任意规格的长方形材料,希望能搭建出阶梯的样子 +// 有无穷多任意规格的矩形材料,但是必须选择n个矩形,希望能搭建出阶梯的样子 // 返回搭建阶梯的不同方法数,答案可能很大,不取模!就打印真实答案 // 1 <= n <= 500 // 测试链接 : https://www.luogu.com.cn/problem/P2532 diff --git a/src/class147/Code09_LeafExpectation.java b/src/class147/Code09_LeafExpectation.java index 1555ce4b0..aacd77940 100644 --- a/src/class147/Code09_LeafExpectation.java +++ b/src/class147/Code09_LeafExpectation.java @@ -2,7 +2,7 @@ // 叶子节点数的期望 // 一共有n个节点,认为节点之间无差别,能形成很多不同结构的二叉树 -// 每一种二叉树都有若干叶子节点,返回叶子节点数的期望 +// 假设不同结构的二叉树,等概率出现一棵,返回叶子节点的期望是多少 // 1 <= n <= 10^9 // 答案误差小于10的-9次方 // 测试链接 : https://www.luogu.com.cn/problem/P3978 From af06e14cf9d2373751e44ac98d9efacfa5370e4a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 18 Oct 2024 18:55:43 +0800 Subject: [PATCH 0287/2029] modify code --- ...26\346\250\241\345\244\204\347\220\206.pdf" | Bin 0 -> 171881 bytes src/class147/Code09_LeafExpectation.java | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 "ppt/\347\256\227\346\263\225\350\256\262\350\247\243147\343\200\220\346\211\251\345\261\225\343\200\221\345\215\241\347\211\271\345\205\260\346\225\260\351\242\230\345\236\213\350\257\246\350\247\243\345\222\214\345\217\226\346\250\241\345\244\204\347\220\206.pdf" diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243147\343\200\220\346\211\251\345\261\225\343\200\221\345\215\241\347\211\271\345\205\260\346\225\260\351\242\230\345\236\213\350\257\246\350\247\243\345\222\214\345\217\226\346\250\241\345\244\204\347\220\206.pdf" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243147\343\200\220\346\211\251\345\261\225\343\200\221\345\215\241\347\211\271\345\205\260\346\225\260\351\242\230\345\236\213\350\257\246\350\247\243\345\222\214\345\217\226\346\250\241\345\244\204\347\220\206.pdf" new file mode 100644 index 0000000000000000000000000000000000000000..ee71c2edac1cd7d373a9f78f7b62b38099f3382c GIT binary patch literal 171881 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

    -6m-bcV8NA>c89#kz`q>cZOIBX53%}9584R6z zi{P6z^=q1POc2$oMzMA1hN%>%`H$|T8m+|_gbCmBGb^9Aw2p!=bCLz7B&F0^ZjsLU zg|pLNwr0!bzXW_1%vP0&wwka0gjpx5pp4H4XUBoA**@ieOSa3m*C|;pR<3lnx7|w4 zG#D_+U$KS5Q)`#y**OC363-nbdBKAoL6jBkm>cS_87)yIk}(Jv=$S`fI`#lA-;MpO z#K1?d;2rl?0RO1YgopP`hx>Bzr_hsQ8F~{IUye&I4{fomt2JRt?L5nafL(RFp`DpFJE* z?p%UzXf|GV!qf)aMi)K}hlv{qH^yu#vP>IT`sH`yQbC8UwA66*-EG+K7F+z7Yk$x+ zqH(Wm*?*kb_f;+e?8J*3g zS)M=z>k91%f1kMX{31`u2eGZ?;Vn_(2eCx2yR2Y+Z!{qnF?PfexMo~>?#DTqd zF14YC_h-Sh#^bG({EN~1f@S#|P0{7><9LDG)E81vvWTCe8C&A@r zraEJ%x+u|pY?Cu&{;tttn-A-{U`Fzg4@AfzI%Dg=ogO@ETeTJ%pR&1~?{mTLqDx;+ zAY~mYd2rvlOKAT+LEC;o^uNP`x{zI>ApE~FoWIP>k3e5YLA?*&>Vnbahlwz5f*>M` z8qAwnVf6Q+h-jX;z(#4RR@(VXkIXk8uljfQAJeja1;*Q&gBC!@{!Kwn#&uyVmM6qC z7>}PWJU+mg;L%KZY9kDb(8|~DFUU6}-XB0gf>(B7lrA?_i@fO`a<()wrtZ25&K`(o<`MF)1wIS% zgz1vJ2(OCwyayLJp;4UD)u{qT{l(f_%|$Y-jQ*hk!JAXxyuD|zu6)b8__8E>8`x2R zJ=FtzLjdTR;>{IuBvU=v;-V{g7!1DJp*@3sq50?368eUp1)szpq)x%Lq0fiUvlRSm zOw)LPg&mFfl&tQxiR?OHQsLgTeKz?;gTf};hdii#$B#foeqa^W6w8bsvUwQ=F?{4P z{($ZiUPQCJJiMD?Xy*E8tt0blduRKv5g$8alJ;;Mh$K;_*t@wyVARg zumzo9UTB+iAsf(cq&$C=IU3IiU#^p_e>G%!(_1;_gN1Jlj@_U&rxMM6u;PzWppq*- z9MDf8v7^E0M=&YtBM-GSsT>q<4aXL6_Ps!&=$Ah;O+g+aBCdo%vgL)2&(}@sRfwfG zR5xW@iFhf9DRb+KtJw)M>|(OrJ+Njh13*#LbJnyZQ6*w+V!5zB%^zs!;% zig72M*d6Jp;f!ZOi=-{*GR{anS){3U#}(=iPn@p%xV21P<~b4~v*ck92Vr?A8^U>3 zcbVndsS9$q@5UtA(-tsyP41*J&$GY|KPSI-9-Qy@X^NLPs!XfeMLdp&$ zS))@!RT)pA2UdG9uepxDU=mMdX7tmH!OEKHhF;b7K1rD^wQ38+II-D z){Cvfgl%klXV$BZWGtBu)S=ikn)Ig3;Cmq!9c z5;B|~FVcRU8fr4$)mF?Q*hZL>B#Vp;cEE7o_n}+7ty9oBX4~^Q7S|11st=nzSzxz} zq58;s$*7MNI2Glq+SGg}DfR29S36<7**roH#axQbWetcUcOM9^jOEAWckAnE(r}C5 z?4M7`8LZM3Ag?Z&Xc7^dM-?&}@9NN9TP%|TRFP`!p0D?RR<;j_;^lKbAYPVP?9~RN z9(xI$3=2O4U_&ZU9x@X$2esjN>t3NQkEFGj@R;C!%jCRVdP*z5$9EV=q22P3Ym&2@ zKPn<-QXh%cYjHhQzpeQgjKnDGzfrR(H(;%+^~e~2ObGXjjOh(<4CGnJ5Jt4UKxtiz zK7N?(H#TgXReJM;E({bK>d*4caz)RjT_Nus-~?ZCdeAtVZRedmW6_gyBYCg!=QbhLK-Ar*sH?$DN_t5AM6O3A9%G!oj} zU|UJMoja>?5e^9(0~G@o`6wQyj3dn(>t&LloTi+i;zV|RFz5JZA~b~i+R9t`Q|5KS zQCDI;Hf%RWcL%BL5U_nCw0l=jq`={Ay&G(yH!U%&5_u zDlrss!>H$dcsOLZM33)F-5!2C&Dlge)Ab-EtYo)9Mv;%6>okbnF*4WNTl{0~$>)^< za$219WG}&ji7tQVLhQ6wh$lt|2!9~{m9GSeWSmmrZDcgLQVKzg7+cTpV${3SBs&$Us1N9UQTdUeRbi0*Vsy#0}o|yS$fK7nc&JSl;K$kq3U7AYJzSd9>`3v z6uAlRWz@yAPP$KyOiD=0n3GNL+D`}}=cX284C zA*5^0T`ia_G8@6vAj1R(2t~^>7H+Dfk|{J&0p@N9Kj?d|81wWnDo`P9ylGyZPt%6p zeJ+$+KjjJ>R8C!$z-x{HNskS6&?jQS6+Ugl-D_Dr)B!(q7K<{wt_6^zWmyb9)O`oX zyR`JXkVWx5Q5MP?v|adtaD7rO1LCo!5X#wFbOCD>}f6 z>H!3)GOIcQzYtrSb@Q=anL$oF9|f`@o`Ds}a={~k9s_`tH?YOZg$56Apl{0X`pXbM z%v-pdNn>ACRDJPb-@|=l%QG_b+u}ArB6g3&rm28s5p5E~+6NT-(hWgJ59#f6lsxc} za@s@w5i%^KO=V5|K4s`oR5RCd9R3~h*3NL`T&mMK#0;t{}^i=lHD~O~URrTRUsSIfY|8O_pt}s*hwh=dBAgWrC z8@vPbUOHp{_~+tmX^*uyX!BNJF{)s&kW$g&0sE7@FF%DYNEGi$&L*xE{u_zP&b@B5 z9)o8za_IL<%gj=v6o}K*-%qv0Wd&_5C;F5dm|@E%_B*3GOFlM(C1Qt$0BUQrSI6Pr zbmV6Z5Bac`|!i;p_(>jtoq00arvb1si2QxJLI=ob=Q5WIt%j2uOkj} zNQ{tKiIczl?!Wyy*DB|cHtnrgZRhYG9lnG=?E}}`o`vujFp{VGX-U6%Ptms2?mB#4 zTMay4TH9cn3((-6=58wjoHMC$E19!??Gr<3$WeIPRpk|wm56_0vJH%srEu>yvQabT z8(N8&-rG;ffrngkE=n~JrnZlX`GBN#}uO5L#N)+b~$It(MDTg5vI!Qt&6~I}p*n$~#!qgBX3E z@;JT4De=raB9Qib9SX z4jINsz?4)?oooQT#`9s2K;*sH?YbFRn21rvsRog(lcU!YpBp8z2~AMkqLiIaw|t^8 zp=qb77x_>R^RI=Zg0s41*>2n1kZ>fYXvs-&(Wy8YMDeANy{)ov7voi08ZZwrzMO`d zd`N(dc+{#j!)3@6^24O56ze zB1WShY8+n9gAW$0tpDik!}3wJRbr3Rv|obErOyd{0T``3k`ucxwdilwtiJZe)z%cv z%RnHf3eD6~?sJA}!b>3Magxw+pmg_)D5m-dM}scV4+sDTPXDlAzWN6!cBt2};sy`B zcE~j&#e3W4GYp4mjjXNY5_0TG z*ej@uo8XN+Z#2_g6P{0uSsx{t65@ocE6C0D(HmV;eJuX;D&3x` z&VjVDtXZ11mSvP)9y zgF?QXH@;H1hSj8f50jFQZO1NMwBWH^cWG>#6U^ zdR`fw&c4C73_@C;7-fzt8a>>Yv_!c>f~{^*_D;vFtyR|H%KF`p^4+ zkN(sCuj7B|`hVyAFWLV+_kZYrY5mdkA6vBvczOTZz5n*b|JT9)ao4}yC#!G$F(XcYm6VNa-G7zxSGZQc{GBRmH(MdSzTbUaQ*qB-w|JXq% z;Am+46GII2KbK7R&zb(AXc$?3C?S12abt5+GbaKz7WSVgb27G8CE(!ri2!5$e?kR{ zor!=>{l7$5m|6ZUB2K{e6BYt4rvHkJe_i@dNV)wt^)vR5fuiPC#*73^42(ZEDE>cd z@DJy|*Ff6X#?;A-fq;RX{a=yyFOqW}U#mEq zOr>f^M4BPy&+T+roQ)7)Dt+JyPI?-aEH94C&x5h&;Bc8H^CcfG6AJ5M>hkGZP*-V% zBb;Z`8{7Q7rb$6KLt?9IHu+7B-_+aoSGW~XYQNe}Hl5vh8Mv;|ohp+~E{(OBW}6Xu z{=Q_Hdsdb24Qc-C-J*DTcpN?9?(5B*NrK}A1$(D9&qvf+%bgo)UCEDr<1(sUaC?gZXfl7{X z#}!BsalJ3Iolwlwe!=D__V?ZCW>9#QZ2$oL5Knefd;@XSv?3pY6B#)k#e^2|2gcC%kRJZr$-HMiOTZgdq0bC=N- z<$y@yy3eDz#uFuxCU2%@i1aF9BsXrLArH5cqHi{+o|0i_VJI51Ar^x?hmi>r1JRg; zEFatVe&FaJ&%4kN-uFlDi%gxi2ejxJ9Qv?WkIfzWx9#*Qp)D5BYt)^TVdFwX-NJnz z84OzvbpMq1-J4!`C$&o(^Qu%govMk|1vB&0yHDLmy9A zFG-h%u0A35my4(}9icXZmw}{o%x`_!l`YvSA{KnUTYY;5fx%{YAOiV7Z|#_`_7Cyh z+A_&O!C-UJm2; zK3`BB%5j= z%1;;Ml2rYU7i%lpsAh1GxTVE}lOHb1WzbAxs8+`m@LaAY#FQrkhLbOzAYvA#Vk(>< zs?uO7Y}f81Kskj3rwEYC%~d4{lQUD9s~a&hRx~h{j%i9^;CZq&zWXvv+aCGq(OG)h z-1O`_U?FYli$Bwoppkbz2VjX=8KXc~$e>ofSS z-dexrG^!z7>k1s|m`#t@FL0?+u!z9+r0S9iU>Qp4U;Z6cn?j)RiUz!?qnDYOY#76_OQ$YwTb)r>T;+SwkDsT%P1zu^LZ}1JeSvVuG}noVl=0$ZGOy8 z#vD_Xkd|pPtrh5{K=*8@h9;M)5N^gSuQf_^-nYL`^+3;T(*s;_BIbPh94DZK8L0K1 z80Ks!BQs7EKhvxgGrZ4Aq-+7x31xe)`X}0pLrKqzd)$XRs$Fya1mdlY|amdj?BzdT_$a;A; zWr!x&`E_2bD3Sd+l#@@KMwBYi^IUxJ-FNbrZuo8ZS+Us)sgs=98p~NGKuzRxZMKtb zac;Dk;RrioUcc{1xt*R}rWbIpBrN`_0vCDkGO0#>xjfUkiBsGM`#0z}trwjlEjZ_l6l%0C)l&eKrd+hnbO9|^stjAN9MCS#F4Xb57c(OfY!ss0QDSyXa(PmxPeD@70azTzuAzWaeIrJ1I`>~^L7qnv6$b&jf%Xme zG^pbXsQ4s}o995r?oBo=-2a4vDWE0By$sdo_qaQNpe)w_@W4lnLn1}At!*XQgY0KH zm>VNy*(VCT#!*qcfCiytnkQ~Gv$B&00eu&pG`Hqk$;R1@Ao`8Sz0UUw2$x^(#kHts zp|(>((6D>~Wy1v;4HTO9ea$|E`Bvg% z(NjWPUJJlA@yHLX;?WP@lnu__OVAT7!79p~CfDKW>D|ulDBM(xXX|5J z@cT(`Aj|kU6Ci3h9ha)F#|*z<#UaU7M9MFb9A`b@jM&9Dl=2)O%~S;TCU`=03P*<_ zw7;4rXEw)&^ANAT_86^LyzX2U!kY>1?I?86e+d~Q=gyNU2`-TTL8<`=PzH->cT_e~sG|c~MIb{3 zImN|TcI6N8tICj%$)E{Fqf0%ov2?_1Y!jnAc#h-&<-aC!6E+qCc0ZEu&$(u1e!&Vm z8JQq5-4wC<$)0NwzTwZib3rz}uVC z_ewA;n#(9|8+?z+jvwMk;37An3%ueBG7dy!JOXSDrU@nNBQ`$pN_H7^&cS~T9A|l# zvA_@QFWv@$(6)l=!-Y02!hgW)eg#EvcY(kh+ZxDJ+rPxCS`x zNe!3>Qh41K{0{gLAOz$DKr9F*OlT1NxnRyN)J>?z*UT=gZ!;8$TMq>B6rcc;pjaOW zg`5z&o(Mblm!8c5NF~O5E1(p?fwk1@4o>LaZYn_OM9n6w*~ls(qO3qJNn+(D1R&HY z2s_9Hs-)1VUjgGTB@7xhwlg5kBI+TK;3*u>s1OffNy-zIgWpNu(TtO1EyJy0mIRw_i^j}p%J~d77K~cd z>9A*HO!~YG_>}h4wKytTg>m>{X;X!B{*;B5nPpv#(;$Zl$F(z_v$M0cT}gWe4;e;> z3PML3RBL+3Ev15RcEkt_ww#iTTY^C_;R=HncT^|Q#E{Y|G4sAtWE@wOV0$JXeY!58 zHX*rkDxJuE!9i@+5~dcAS1(d-iKx(GS<@N92Nro%7ou3ZS{@4W*!ZP|$QWF79*zsuzCryW{t~I_G(d=Braa$T8?tGp zdTVHY?y{0+4;9tgpPl^7?8c=xgc)=(g)o8c3 zsTIafrK(~h5z;iKv9dZLX?zh-O~{df#CnjLKy83h(ZL$!A#A1kUIxG{EH1<3i}a`D zTji>=66~PEJR#l-ZnBfkv_nT z<)TriOjbINXiWy)RaR%c60f8M->o;@1F%NaGxEP4VipN^tZNKQs)j_|VE5Q8bnU8p$#}o2&9NjT7t?OwCC>Tap zS$VkBQo^mKrNrZDZ!N`Y2X_Y7l%ub40F`&m+bg1v2G`H`|K`gxmsd|UFr$-lPbK3v zTj6v~7qg57#ei&sz6Y07klJEoWwQ2nBH@}q9puRA5y;s>C9|P*m&D}u{Kc&WuSpH~ zH>nD*VC2AwV^czzGl$k_m%5y7TZ>{CN@ZFNV&Eogar47WpSn8l?BzX3A|!ko(+!Lz zMVFv5pOqdvNToeRrehy&#G5j6{&VUk>Cx7n5Bk_CC3wOf^D;(ucuYAN<|@BUGMNib%iGF}<>>~Y)4pSJwNx)*F26;kfPGjiY9l~R zfJ{=cR)t)}P}l&1U1prz*E|A!pHeyaa}=n$-KDV48J0{DtwU)LlD#BiX+8-nM&v@7 zuC%92Z3(}YD){bTqo(sNoqsCgD^*qZZW;Qwzh)t=623|V0TL(t%#iJty7+U=SwXe@ z%!7uM1WnZEd*Hof4}haLf{_u>2{W;W`maTO+`|Fhaj|y{yQ5M?7Z5IVx*@s!lCqTB ziAB`qe*Zs*>{v|FaY@GR$$iW-Cy^o^fq;oy0hx1g1B%s1wWL#LE|+;mknBJl%J2rVE!jT}n6ft+y?E|5=epLk zDpYlS1^1o96bM8Cd7<)w$7iPvj$5s5I0r*o5%7^Dtv`W@t&{xQTiajSgE-wK^;kXm zT>1D`*!XOGK01Tk?>2flpPB4yNN^rM3EsE^_@*iAt@5YL?;@zPFpifp(r@}UWm!{K zgWxGVf?(eWw}wVDU`~6nn}=2tl-oGT4oz8-TVdu!+8q%C3Do_03`#Dj^`OQM889}- zL{oJ7z+xo&=y&Ot=;u_j>}^(nZqfv}oM1tbC9a|Ml9B08e3?MU016smuA6P#vcB)* z(T5MKN;`b@oklmFM|e@v6uez|#I#rEo=*dbOF(F8C^6WUurHcP`3z?#o@L+emQJ6y z8t#2kxA_7(Vg2l(@{q?T9VW!xg$=R}G4B0u)o+-N5^ooFed!WIwQ7*MsP~j7NVgqKzaQK zGKC^tIk|7CMSp644O}q}W;}vnjPT^ADw_mHh@wjkNHCCKP6>57wh{u`l6xcLeTEn^ z+!Z#$pBy%%N5&z70<(;yqq|rZNQN-aq?;0gLA!y<)tqIYPoB=hiqaxXMrnf}`+GZl z40_!`>W#<~Fg%PnYUS`eCB6L(B8TsJ3RThC@;K+Xc()p6n!p-gWYbc3J+~J#!BuZ+ zcmF(3uuN9Hqn^Y;I>`H#DI#@cQ)~ZB&+>?oiBM+Q0q1tgBA*v zC#>VC_R3D0PX(PX(W5kx7Go*~1{)hn$51zeE`}2;QLKQ|)A)SyOAo|mn+?^3Vl72Q za9qd21+@nG3w_TGv3?=~E4jk$O(({qBFA=9xsr7u?wTS=TsU^*e&l`ycJFaN(GPb& zG41`KFyh=$$OerkS?`{4li{hpEFP%ISDVov88w+WVOD6?KFK2dFwAg)5s8+;)183~ z3R5Gqgp*3ttAHL3((9z%*f=Gh6g65$IufJDo2q9ZNvog_+IuhIALwN5)QT@i8rW?{W+;a+#LC`&%g-3|JN!Md-l9T(w$C? zO}8cpuo!B^F9erC@*UD$&c8w!~Y?3Y7eWSE$zkQgp{dQqgS;vpRmuUVX2$l$-uzH(4~dBUrFyJU;5kRay9P>!{izM zDd+$>t#fEa!nvNaJUGCEoc6qIIXQHb=*Lnqjx%;MH!~3Dg#{14u26jaJ9__eC>T|- zjui@#)%1}`7*^U1kkv6G37q50$HRJn351L?_P)jYGrDzE6T<69euJNq;1=DxQT_!# zbU-zmye?%t|DWhn&*LrqA&iaWfbx01bJk3kr${CDp3yahH z^TWX)6?pa5!**QEt6CatR?I9PBM{1Gpb3UCp>(`%xZ=Dmz z9LIapLpc+?D~FQnNp}A5&Wuc$fH!6EtanymyJ9^HVVnwOki1MuNr^Y{KC&9i2pMc_ zr=%vb8fOSGC6>rfmljOY=*PcZMs}duYW)<5PzGr103}gi5M;+d>_K7zQ*mn9Xr~@P zAjLtp79){%`O#;38Hx>+Zr;OyIZrtYwj(@4f>ASP`>?)(V zMxXaY%ok@H06Q{(gZRo@90@~u(EbN0gk&*~lN)|&0DBg!Q+w5ftM}5`JI#$Sd~!aD z1Un+Ku&tK;*$t{Bu46dbG~AR!PQEC-?*&Iay}z}AUOoj;{p{75Hxqv`jx*^z+` z2FXS|_^Ld%7SSGhpLA0=I|d~(0XyS31PURbOD?!RMHL#%)7Meyyp|zjwD)!(owagH zh3>G?Z|x=8eW#eQ2@~J;52@e9M`d*7_e)#5z^HD7et%VxWS*;5pT{(1hRag%dndso zF9owuLi4u9k!^eJYcwiL%o|2FkB|V=dnkr9y*mu~zsbq-N(&nJSGJt6eV&`tmGfGA zP5fr~nIM?zsOU*;WOGc$6{=>x@fE|zI~ zNBZCpxyDliN>kq8&}&{ag%^pY2oQm( zZx@VP5dDqQ4s>{KH7f~psZ?M+&uK1#0}0dEk-WhuZ99}1{3T^CWPA?*_~RGQ`q*En zUb0ndn`JFOV-byxw+}dilqx|zz9JyL3)d=~yBWAYIvjp87BfdIW(d7Zk{!N{C)D(?(^tM?RJK^A@wM68UgR5WHp_F zQjMhQ5gg{5nIW8d`=;CHW0Tktx?7xe?;m>)cLTyDNFL%7ksCg7Abb3LPNpepST2;l z+r6o-<`-|)BWCz+j@_YSHoiBcmU%;O_k2GC&~Yypl$$hoHa?2qrteh>W3GYmHT+^8 z%r?6FhLc1k0rbNz7EXoZ3^?jNK~>Wb2(H5Rh7xNPy#yk|uEQeLN6?6B;ugr~62TEX z?N*c+^1?;Nz;t-EQ15LFUTD!M2UN!VE+M*!2h}yxPi^LwluaJ?ak<#dg&tBK=WO$2 zf?7T`Gv0pvf{`N3+8Vu;h8j`i%*+=9auq88 zybSd>_4C90h}%(Q_S9`E$GYD$QITrumYJAD!##UH9$*(DUz~}0Kpw@)VOKu`S}5Xz zI4lJKR`vdod%_d8F*OKL*tCH^n&+)UX9cYKPcK$j#P2c(c&UTb*0oS5fd09E&t@BeWUp5mZ&8` zH@sV1X|uF>_qJX0BaH#F5RCz=f);wN$SKj~*|ZlnY10ZFTRj;0IDVyGx%(s%p2=Jn zu^Bp~+SxW~au3q=2a?8mM@$gysV?-!y7^4AB(86WxD0>0G+z=h(K`XRyD?ID!UE&S zM6`h+|6Ee=4hO~DCV|YoexCGag|S!azZ*DR^nSaA*gZV&)WkX+!n&IeL}}L;E@4AS zzv=grv?8^r|62dm=G((xYxvOkboR>nO!`*&&bVYtF%Lh5JcWEmI#w!A zE_%KU&B9mGWyH_uPV8>;x5PR^z;b;yqEV6gx7Pwy09Mab>J&=FJ~V~ky68#)H~k=^U$7b zKm)$@i7BH3vk2rePR|Y8#b3>RF!;c;%Xr#A#8yR6KfhIg*>BD5J@pP+5>m%86P{CG zOPXG^xx^5w&H@0={6|u2h8sGvJSA8$MQM7{qho*5AHcK`_-`kRWw6K4oX|+_THDF< za?X@9G@faRgzvXmEER79@2T!~F*bxWP+T7I2oB>b9+($yyON zIw!(H^vQrh^1HrRx-~w(GNWt8=;x^Co?k3ra#CbG6YYZpG6o8_kPex;V%S;s^_fOX zr!Wqg0we6^@0dfXrp`wiW?rHK&Z?Yr5{vb2F`tOM;6zB-ILN8ti5&)!Kb1CMgmSEb zXKLrM1h&S}=qNt7Ya~oE-~*YT;kZ-1bQt^M1IX4i3k3%j^eG{4TykYrfIkw1cj@bk3o&2x%^zpRGK1BDqVst30| zncgO{Nc1N0Bw<6^6z`Mmo$Z;nKAgtipHP_##{kM%(~uPE2WDm=?MMynuj>cLJVc-h z(05%BwhFJ0CqRf+Jj2U(i0H{v7#u+7DX`?GA56S`9!G%055$UqPBtz#9x4FjH_{Bu z?J!4noxU~EhxSLYBQx-lxPVvLv9xF2yWqSuoW@q9Ber|DuC{v?z~2aOZyqfg{a3nw zFmAZvzPnLy>xATxA4W4W$|JGb#%c+dB$ecP6)7+91WOY6mp_=nu+3}OZ zyGc4hDnXI~ze;ZtJB75XX~AKA_T?616vU`m?`Rz9m{6C&KTjeZW)wy^z8K{SM$)Xe zS_YLE4N>YUNoL0a22N#XxxD4mjGD$(`GdtB$Wx^@1iGSIG@K!Mev59+Sib0 zBL>TJ?@x&0&87U=TMe?R)x26{l>t(i`x-c+R9%bt#V1Q)YBa78{RyYevy@9rMCd@D zZJy;bF6+*trylDyCX4Kl79^M?Y?nWqo(Uk>{@@o7wa)F}3+y)vb z=Hq4fivQ()h%miXRC1DxA4As(zTDdVRIWDN)d{Oi9<17^V{jGX?TMx?;jM&u!``vr zJn!t^HL7b^bI-j_gNOJlB$E763e9Tgu`5OqyWXhV z1(oSOg(b(ImalgT^IOtcI+WbWM0qH66?n34)5*FKV`3kymX8b;we1s5kvlfF6}auE z&;CAQxmm+TKt(zGfv2i>5B2Xg@FtS#?WJM~QN=~sf4Zg}Z_5&4iKqN1`VP;St?;&;%XeQoQXz9xP8t5S&-uRp`+Aq_|M%4;-L3Vk^^EIzmg`wk&Lq4r^y_NxY7RUYYf-U{ zCsCFE4^P!24wbGjB5wok6C(n2%OpbSc{Mg;%e|BxSs1!}f zUpaDH1X8{gI60&X*S5)#K}7<$$l9Yf09UFCv|f6 zTYCCTe@(SU-t@Sp`kuP|cMh3Hj9eP?oSsnsbilh{;4hE-po|ck=?Bd@LAPWo@+Mb> zc`Zy?{9b}pt9&_Wsgu#4EQN`H>qS#R0_9(8dulH@XAEe5SRtVsr>i)nJlnTI*dR5t zS>ed-o8QV#^aO_V-OZ#8=9si99l*{+9dkD4H$1*jt1i~0(Dy|9g-0yAwAa zSuk9e8t(U&d&#usVb2n_)k~?c*^Kq?EF>OjNSRMr__PPCpZ1F=bnmT-d>bA3qGqQ} zlFWmnM#!MR#?9Q%au?pVDNG!tH(fLn^Sr)L-qs>9=o~vrKH+J|^d{|VKSGqx#8+NE zvu-%h_f>8#ce&?P!MMXmJLHzdXD)TM)7*eYe^!$n9VsfvER8tNXK3mxDKGBP^0@8! z&b0$-Mj}f3@0_2bXOeQb36uBBx!Bta-@F(*{jDx?*5hYiLSc1>nrPjsao@09xi7X; z+ssUcr|TM1Ulp!Un((z>l_uSDrMfF`xj)ASeXOwW&`ja-nqm|h&^Ag6|C zrr3;SM_GTiZW0TP%WuBVoGke<^q#*f?}2Ve-l07H<`ajt&YOr#e0-yArkGf57jXEn z-9dTU8aL~%qZGk z@^cCUt<#|gP1~~~OyfqRByX&2z5Z^}EPAz3>#v2_1p8BMz1yu_jah$**44|*HiRGi zwd?y9d|2HiZ|?o%0NGikHCXCg#9D~?r}@>Fe5=sKHVc2z;~FE8H{{&$d^go0B=HZAsvKHobP zWY*6IO*c>rCIU&=GUM8v@q)k9eU>)y4vvs>5I(xK7V%SRZ(rxlU>sL zm&sg9WEi!(Od;K8htJM{AF%YFW!DD0;)`%?(+yhe@QO!H{qE7}6|DBV`tC}PS>a2IU84mI zE9af_5*H5Hto7DUsk2+c^u0ux^d+zCz2~LgMDiqYm@eT_5TR$+#_m;{~dREE*K9xX3(z`xjXBPc9%5P!lkF=}NHQe(C6W1q1 zbzY7ZtBI67;<-3#)NlRD(x3FIKh{^JG`?A3Aazbezj?TlUKJCO<~|#?U@Xiqw>9*N zq+jK{R_>+B6}n>RRuf)5$0+s8kPP$p%4s5&hFgS|#Z+vmS;X_bLpe@pSN+exTGC6O z*EL^gM2ZY#Z&XhmCD zt=hJihWx|N_yk^^o|%rwczQDW;OBtkr2P){Uu7Cy^l+(RkZk! z$L1leU5sNZhB~*4uKoJJ%hC9|%Fq1ywu-VAdp>6)Tdw+w(&`IJ^u@$%>c#A%JS7#c ztX^VT)-QG7TUI`nr>?QEK;^JlG^<1HqGNRC%P%!g?2grJ*lKmEPd_QB}url!0w?e>AUGY^L~>PLT7c3oU+db}D%1K+j; zd9Dw&vLcG|9~|zG5v>}uV%2)dd|x!#FuvTDch^&$xR(6R#RH2M4T+`Y$7uNHnJ>|I zZ*v$czPf+IwxwoYO?T{hlC;J>!x|gybt}Xhw>A#5PR>91!rJx4&64zU^PK&jD8xv= zKM`5rE-%?z>lb6{%Ox##oppCvr~k6?@UuEewf#E38g>*`=1a_8J)c@Ledcye-|$`4 zrYOl_e z^?lTbJ-ubow9XPi(aZV+j-|t5S*GK=9lCJ$lRPDucWvpX&94*8$}x0v$G+5CN%ixi z9)``If5FI6SFJB@`xSqwjvThVL0+cAWzB|GuafwcCT3OO_i2W6m%HR$Rn1Y(m*e;T zb6Mr(td>ukl(>$E1{W->$q(nr?vgUn;5z4>z3D73i}%+aiA3M0f;kSV$0c}nk9N7u zW9CP)8=DJ~*BA(1T@f1+aqL)0{OZS;YGHL?`w{sU&vrE(k@w;<=!mT2E{r}Esbczx&i-tdvnSS2vn<0JVVR=0m86EH`F8Xl5zg%Rx|qAgb$&v9!M(Ch zXMQc?>+=r&oP4x>;KSjBJgJ3cin{lH+&LMW^QLy&MkDPXQtj)E5^>B@MyC`xzwvWN zp8KBtz8k}~+USUAI{F!xv@k$ab@49+MdClmII#B)94ShJguw7$KyiZbZzK& z@%{1Ibr;>G<-(N`xZm&F>vV^~mwhvV|Je(ki>XeoZEF|a_gpMI=DNea>Y_FO6{Kjn zjkrox_lCelYtN@W)u}1WY4rkSnZ+rUur>o zC+B;YUBhQ?J{r4su;_kqfv80Ks$j9A=%3ul+wVCC9?y5&6QpIZLos=iQ?FwwzUAiI zsf5)#&*!`4>2^y_3fK*uuEB(M{N$aq5K$J&RZ?7A;oR}2rDVRqD>dcrF2ZQ*9j7H% z7~R2dT&CqCo;;51HCI*Fw4HE&+h*3|k$PZ_$)DLdNmDh-9?QO6vQsw6Tj%gP+y9I9 z`nGKIDa)bevI~>5v)#>-!zrb{&wjB=%Xcq5R2u!jx@V)#(C(FASDA4gE?o3L<)ldC z#l4;Pk+<)q&+=qm*0~{`dfBRtY!dAXTNOU6$J_l!*W*6($=SvF-P+DyZN3_#g5rG| zY|&d0=MmcW27%FTMGWW^ z241}+?%TW_g0JRHtZL}h>y5~LqPIZL@3Og`cKA>31fKH?Cb$}0^ajF9cv##I`6tK* z&?8AV=1G>kv2=^*RZz%!Tn75mB0=DExMO2 z^_E7g;tCP+ly0!01xF};m*w3%zS6Z&U#mg(?M?l%{W0uaG3<~SwqXo-@TZZKiDBVcXCjB3|OvonObbGHWjEDs4%BCu??h zw&n1G_is)QcgpU5CA+&x_HDU-h+fQuv~<&Q>841nO#UEa(V^tr!Q@Bx^;cq*Z(7n1 zt94Wd15{`A4iA=0Y&bC!)|qsR3+}pOBFz74N!sSc z28~n7GqZ=z_`HrQjP0=lol^+s3(EO|)9vUCy0e#^oi*n>WUEuaLCd{vd(WQT9vAmH zwr5-X)|Nf8JHb$t4ZdJ1f|^?b{9O;YfKDc5Unduftu!0Afc;+nel&!oLDxWNcFG$L zc=@=}80dN?O4zB;EDtyZutR8D3=H)_Bb8e)TLrXgfi^)-JD;+t+d)5nw%flUK*s=d zN70lGv>0>-iqH`Pp|e;_WEY*T1pa_=X8x}K_YlGVbf^UfxVeM&H70@z0$%_1p<#d^ zi{?)I7lt69JL~WNqxt=Vf#x!j1VZF|{*7_IXMkQW&gVZE!oX1~26oN*9Yg3$lBCQ< zSacGnU_c!h1KJCM;uH)hkV&Nn6ojClH}d!W5f~HNAC6%VM&KyKFG12N`vdC0Q0iP1 zXP}_b^S5TM4{!0pmGYE(tNe9~bZ5&vaWK!v|=omp6M@LBn;)6xUN$MIv z_ACm&98+Ua$6<5G4+A=)u8YC)*+C~^jNh0nnU z*fn)7LL$^X1A36`aR#td>Rbjez~3>jE(@W^3h)b*`TICJ4m@uTdXUfHOa@NT2bjww zC~^VoGH?nX2nb)0U*aeO^j}hK2tg=(fHhD$v}cq_l`|bjQ4Cs_2{a6?fl+-1xHS0u zK8`~V@?RXoK_e=4&jhFAl=J!Dn1d6*qNx~0z`7(bD!)KSD3h`V@D3npDm?9Ygnfa*q*LU_@dX@O7ezP+Gi5I%9_U5Z_SXuw1%dgItV zHI8%SjKS-ob6`x!-~QRz@B5nzBUmJhvKOErI&{te^MmXZU{K5^Ksbf?#X!q6RaO{E zr`Q!(7bPe<2N-LP{b5WOLUsjGLddQF zHU~X)4tf~%tN>1lW7JpzR0QR=B%MUyaU@I+p~LhL1g3{DV0s7xyixJHPm>4}Iu}4{ z3+1OEt7E`(F(^)wpv0l%Yk)JH1T_4%IUx2!GTw z09X~2mw*ZaIzs_Qz;kg7-U|Vpt0V(R8rm}n(_=Ci)SQcCGNJPgV9j2oX?TOri)Z7nA|pDawT68i}HGYK{aj9O47GAjAg> z*P$Sjg5ny$pj?kcL54t;3kuhRBnxD>)N!EDgW?biq2{chvSLtkM^1$Z>w^Ufd1wuk zT9bgea1H{pCTdN>spw$)W8nn62AqSCETB#5UNDe(!WeXy0geDTUSV(!LV_*BYcNT8 z4HU{JNsI;6exO=_V>^b^skt7B;RL(}D8?b)fCW-99Aw5Y2G!yu4hmLi90P@H7Zj)P z8Z0O$B*EL85Fa=W`yfcKAU*)Qkj`-u%8@`d1LegeD256lptUqBtRAd(F4+_VkDgf@j)WcodUQ?1CK*d&P$R3=K>(eLVS=Q zut9TK&>a8?$}&hFBmw6+B*f@Fep9)45i+waxiMH2QcW)7hq6q0@xgPzQFt_F#_DfL3hm@jCwW# zj7d^-2{4rEmjJ`4`49)A#tncGu$?kNhDEhqpdyOS!LJxWsPUPTwNrhcgHdy8aFGEn zb17?p8&K-KEx6^vIqwtx=35v5|4V-C04MO2T)^LNB5w5xapU}Of~INZ@6V<&IBS5{ zzrJj+z=NK4nb&QIJ<+JGH{E?awgnKH+O>Wis%Ub|3heh czuvc>4SpW;_fJL;a6~h4K?Q}47KVcV1DqrFt^fc4 literal 0 HcmV?d00001 diff --git a/src/class147/Code09_LeafExpectation.java b/src/class147/Code09_LeafExpectation.java index aacd77940..f21c5fc0b 100644 --- a/src/class147/Code09_LeafExpectation.java +++ b/src/class147/Code09_LeafExpectation.java @@ -2,7 +2,7 @@ // 叶子节点数的期望 // 一共有n个节点,认为节点之间无差别,能形成很多不同结构的二叉树 -// 假设不同结构的二叉树,等概率出现一棵,返回叶子节点的期望是多少 +// 假设所有不同结构的二叉树,等概率出现一棵,返回叶子节点的期望 // 1 <= n <= 10^9 // 答案误差小于10的-9次方 // 测试链接 : https://www.luogu.com.cn/problem/P3978 @@ -23,7 +23,7 @@ public static void main(String[] args) throws IOException { PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); in.nextToken(); double n = in.nval; - out.printf("%.9f", n * (n + 1) / (2 * (2 * n - 1))); + out.printf("%.9f", n * (n + 1) / ((2 * n - 1) * 2)); out.flush(); out.close(); br.close(); From bb0b175e6750aefe0cd9e4bd86c9045892b2ebb3 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 19 Oct 2024 03:05:07 +0800 Subject: [PATCH 0288/2029] modify code --- ...6\346\250\241\345\244\204\347\220\206.pdf" | Bin 171881 -> 178704 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243147\343\200\220\346\211\251\345\261\225\343\200\221\345\215\241\347\211\271\345\205\260\346\225\260\351\242\230\345\236\213\350\257\246\350\247\243\345\222\214\345\217\226\346\250\241\345\244\204\347\220\206.pdf" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243147\343\200\220\346\211\251\345\261\225\343\200\221\345\215\241\347\211\271\345\205\260\346\225\260\351\242\230\345\236\213\350\257\246\350\247\243\345\222\214\345\217\226\346\250\241\345\244\204\347\220\206.pdf" index ee71c2edac1cd7d373a9f78f7b62b38099f3382c..050c9a7c11eb7b5bccc8a438d1bcde44272398c7 100644 GIT binary patch delta 62817 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 KC98Uw^8Wy^&=x}g delta 56044 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 ZA#n+_;=&{B6lSGjG_(8o3=A4%|35LSv26eV From c8b33da0dd66dc4ca24fe21274236800c968abf6 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 22 Oct 2024 15:44:22 +0800 Subject: [PATCH 0289/2029] modify code --- src/class148/AVL.java | 243 +++++++++++++++++++++++++++++++++++++ src/class149/SkipList.java | 71 +++++++++++ 2 files changed, 314 insertions(+) create mode 100644 src/class148/AVL.java create mode 100644 src/class149/SkipList.java diff --git a/src/class148/AVL.java b/src/class148/AVL.java new file mode 100644 index 000000000..91da391ee --- /dev/null +++ b/src/class148/AVL.java @@ -0,0 +1,243 @@ +package class148; + +// AVL树的实现 +// 测试链接 : https://www.luogu.com.cn/problem/P3369 +// 提交以下的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 AVL { + + public static int MAXN = 100001; + + public static int cnt; + + public static int head; + + public static int[] key = new int[MAXN]; + + public static int[] count = new int[MAXN]; + + public static int[] size = new int[MAXN]; + + public static int[] height = new int[MAXN]; + + public static int[] left = new int[MAXN]; + + public static int[] right = new int[MAXN]; + + public static void build() { + cnt = head = 0; + } + + public static void up(int i) { + size[i] = size[left[i]] + size[right[i]] + count[i]; + height[i] = Math.max(height[left[i]], height[right[i]]) + 1; + } + + public static int leftRotate(int i) { + int r = right[i]; + right[i] = left[r]; + left[r] = i; + up(i); + up(r); + return r; + } + + public static int rightRotate(int i) { + int l = left[i]; + left[i] = right[l]; + right[l] = i; + up(i); + up(l); + return l; + } + + public static int maintain(int i) { + int lh = height[left[i]]; + int rh = height[right[i]]; + if (lh - rh > 1) { + int llh = height[left[left[i]]]; + int lrh = height[right[left[i]]]; + if (llh >= lrh) { + i = rightRotate(i); + } else { + left[i] = leftRotate(left[i]); + i = rightRotate(i); + } + } else if (rh - lh > 1) { + int rrh = height[right[right[i]]]; + int rlh = height[left[right[i]]]; + if (rrh >= rlh) { + i = leftRotate(i); + } else { + right[i] = rightRotate(right[i]); + i = leftRotate(i); + } + } + return i; + } + + public static void add(int k) { + head = add(head, k); + } + + public static int add(int i, int k) { + if (i == 0) { + key[++cnt] = k; + count[cnt] = size[cnt] = height[cnt] = 1; + return cnt; + } + if (key[i] == k) { + count[i]++; + } else if (key[i] > k) { + left[i] = add(left[i], k); + } else { + right[i] = add(right[i], k); + } + up(i); + return maintain(i); + } + + public static void remove(int k) { + if (rank(k) != rank(k + 1)) { + head = remove(head, k); + } + } + + public static int remove(int i, int k) { + if (key[i] < k) { + right[i] = remove(right[i], k); + } else if (key[i] > k) { + left[i] = remove(left[i], k); + } else { + if (count[i] > 1) { + count[i]--; + } else { + if (left[i] == 0 && right[i] == 0) { + return 0; + } else if (left[i] != 0 && right[i] == 0) { + i = left[i]; + } else if (left[i] == 0 && right[i] != 0) { + i = right[i]; + } else { + int replace = right[i]; + while (left[replace] != 0) { + replace = left[replace]; + } + right[i] = removeMostLeft(right[i], replace); + left[replace] = left[i]; + right[replace] = right[i]; + i = replace; + } + } + } + up(i); + return maintain(i); + } + + public static int removeMostLeft(int i, int mostLeft) { + if (i == mostLeft) { + return right[i]; + } else { + left[i] = removeMostLeft(left[i], mostLeft); + up(i); + return maintain(i); + } + } + + public static int rank(int k) { + return small(head, k) + 1; + } + + public static int small(int i, int k) { + if (i == 0) { + return 0; + } + if (key[i] >= k) { + return small(left[i], k); + } else { + return size[left[i]] + count[i] + small(right[i], k); + } + } + + public static int index(int x) { + return index(head, x); + } + + public static int index(int i, int x) { + if (size[left[i]] >= x) { + return index(left[i], x); + } else if (size[left[i]] + count[i] < x) { + return index(right[i], x - size[left[i]] - count[i]); + } + return key[i]; + } + + public static int pre(int k) { + return pre(head, k); + } + + public static int pre(int i, int k) { + if (i == 0) { + return Integer.MIN_VALUE; + } + if (key[i] >= k) { + return pre(left[i], k); + } else { + return Math.max(key[i], pre(right[i], k)); + } + } + + public static int post(int k) { + return post(head, k); + } + + public static int post(int i, int k) { + if (i == 0) { + return Integer.MAX_VALUE; + } + if (key[i] <= k) { + return post(right[i], k); + } else { + return Math.min(key[i], post(left[i], k)); + } + } + + public static void main(String[] args) throws IOException { + build(); + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StreamTokenizer in = new StreamTokenizer(br); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + in.nextToken(); + int n = (int) in.nval; + for (int i = 1, op, x; i <= n; i++) { + in.nextToken(); + op = (int) in.nval; + in.nextToken(); + x = (int) in.nval; + if (op == 1) { + add(x); + } else if (op == 2) { + remove(x); + } else if (op == 3) { + out.println(rank(x)); + } else if (op == 4) { + out.println(index(x)); + } else if (op == 5) { + out.println(pre(x)); + } else { + out.println(post(x)); + } + } + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class149/SkipList.java b/src/class149/SkipList.java new file mode 100644 index 000000000..08480c2f3 --- /dev/null +++ b/src/class149/SkipList.java @@ -0,0 +1,71 @@ +package class149; + +// 跳表的实现 +// 测试链接 : https://www.luogu.com.cn/problem/P3369 +// 提交以下的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 SkipList { + + public static void add(int k) { + + } + + public static void remove(int k) { + + } + + public static int rank(int k) { + return 0; + } + + public static int index(int x) { + return 0; + } + + public static int pre(int x) { + return 0; + } + + public static int post(int x) { + return 0; + } + + 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(); + int n = (int) in.nval; + for (int i = 1, op, x; i <= n; i++) { + in.nextToken(); + op = (int) in.nval; + in.nextToken(); + x = (int) in.nval; + if (op == 1) { + add(x); + } else if (op == 2) { + remove(x); + } else if (op == 3) { + out.println(rank(x)); + } else if (op == 4) { + out.println(index(x)); + } else if (op == 5) { + out.println(pre(x)); + } else { + out.println(post(x)); + } + } + out.flush(); + out.close(); + br.close(); + } + +} From fec1e23c25e6236eeeadb1f3f925f691b512bf50 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 22 Oct 2024 15:49:12 +0800 Subject: [PATCH 0290/2029] modify code --- src/class148/AVL.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/class148/AVL.java b/src/class148/AVL.java index 91da391ee..815faf0f6 100644 --- a/src/class148/AVL.java +++ b/src/class148/AVL.java @@ -126,14 +126,14 @@ public static int remove(int i, int k) { } else if (left[i] == 0 && right[i] != 0) { i = right[i]; } else { - int replace = right[i]; - while (left[replace] != 0) { - replace = left[replace]; + int mostLeft = right[i]; + while (left[mostLeft] != 0) { + mostLeft = left[mostLeft]; } - right[i] = removeMostLeft(right[i], replace); - left[replace] = left[i]; - right[replace] = right[i]; - i = replace; + right[i] = removeMostLeft(right[i], mostLeft); + left[mostLeft] = left[i]; + right[mostLeft] = right[i]; + i = mostLeft; } } } From a08ed31185d47673543262a2f6a2d07e31d7f940 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 23 Oct 2024 12:50:36 +0800 Subject: [PATCH 0291/2029] modify code --- src/class148/{AVL.java => Code01_AVL.java} | 24 ++-- src/class148/Code02_ReconstructionQueue.java | 134 +++++++++++++++++++ 2 files changed, 150 insertions(+), 8 deletions(-) rename src/class148/{AVL.java => Code01_AVL.java} (92%) create mode 100644 src/class148/Code02_ReconstructionQueue.java diff --git a/src/class148/AVL.java b/src/class148/Code01_AVL.java similarity index 92% rename from src/class148/AVL.java rename to src/class148/Code01_AVL.java index 815faf0f6..7506d2fb1 100644 --- a/src/class148/AVL.java +++ b/src/class148/Code01_AVL.java @@ -10,14 +10,15 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.StreamTokenizer; +import java.util.Arrays; -public class AVL { +public class Code01_AVL { public static int MAXN = 100001; - public static int cnt; + public static int cnt = 0; - public static int head; + public static int head = 0; public static int[] key = new int[MAXN]; @@ -31,10 +32,6 @@ public class AVL { public static int[] right = new int[MAXN]; - public static void build() { - cnt = head = 0; - } - public static void up(int i) { size[i] = size[left[i]] + size[right[i]] + count[i]; height[i] = Math.max(height[left[i]], height[right[i]]) + 1; @@ -209,8 +206,18 @@ public static int post(int i, int k) { } } + public static void clear() { + Arrays.fill(key, 1, cnt + 1, 0); + Arrays.fill(count, 1, cnt + 1, 0); + Arrays.fill(size, 1, cnt + 1, 0); + Arrays.fill(height, 1, cnt + 1, 0); + Arrays.fill(left, 1, cnt + 1, 0); + Arrays.fill(right, 1, cnt + 1, 0); + cnt = 0; + head = 0; + } + public static void main(String[] args) throws IOException { - build(); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StreamTokenizer in = new StreamTokenizer(br); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); @@ -235,6 +242,7 @@ public static void main(String[] args) throws IOException { out.println(post(x)); } } + clear(); out.flush(); out.close(); br.close(); diff --git a/src/class148/Code02_ReconstructionQueue.java b/src/class148/Code02_ReconstructionQueue.java new file mode 100644 index 000000000..5b27ace60 --- /dev/null +++ b/src/class148/Code02_ReconstructionQueue.java @@ -0,0 +1,134 @@ +package class148; + +import java.util.Arrays; + +// 根据身高重建队列(最优复杂度) +// 时间复杂度做到O(n * log n) +// 测试链接 : https://leetcode.cn/problems/queue-reconstruction-by-height/ +public class Code02_ReconstructionQueue { + + public static int[][] reconstructQueue(int[][] people) { + Arrays.sort(people, (a, b) -> a[0] != b[0] ? (b[0] - a[0]) : (a[1] - b[1])); + for (int[] p : people) { + add(p[0], p[1]); + } + fill(people); + clear(); + return people; + } + + public static int MAXN = 2001; + + public static int cnt = 0; + + public static int head = 0; + + public static int[] key = new int[MAXN]; + + public static int[] value = new int[MAXN]; + + public static int[] size = new int[MAXN]; + + public static int[] height = new int[MAXN]; + + public static int[] left = new int[MAXN]; + + public static int[] right = new int[MAXN]; + + public static void up(int i) { + size[i] = size[left[i]] + size[right[i]] + 1; + height[i] = Math.max(height[left[i]], height[right[i]]) + 1; + } + + public static int leftRotate(int i) { + int r = right[i]; + right[i] = left[r]; + left[r] = i; + up(i); + up(r); + return r; + } + + public static int rightRotate(int i) { + int l = left[i]; + left[i] = right[l]; + right[l] = i; + up(i); + up(l); + return l; + } + + public static int maintain(int i) { + int lh = height[left[i]]; + int rh = height[right[i]]; + if (lh - rh > 1) { + int llh = height[left[left[i]]]; + int lrh = height[right[left[i]]]; + if (llh >= lrh) { + i = rightRotate(i); + } else { + left[i] = leftRotate(left[i]); + i = rightRotate(i); + } + } else if (rh - lh > 1) { + int rrh = height[right[right[i]]]; + int rlh = height[left[right[i]]]; + if (rrh >= rlh) { + i = leftRotate(i); + } else { + right[i] = rightRotate(right[i]); + i = leftRotate(i); + } + } + return i; + } + + public static void add(int num, int index) { + head = add(head, index + 1, num, index); + } + + public static int add(int i, int rank, int num, int index) { + if (i == 0) { + key[++cnt] = num; + value[cnt] = index; + size[cnt] = height[cnt] = 1; + return cnt; + } + if (size[left[i]] + 1 >= rank) { + left[i] = add(left[i], rank, num, index); + } else { + right[i] = add(right[i], rank - size[left[i]] - 1, num, index); + } + up(i); + return maintain(i); + } + + public static void fill(int[][] ans) { + fi = 0; + inOrder(ans, head); + } + + public static int fi; + + public static void inOrder(int[][] ans, int i) { + if (i == 0) { + return; + } + inOrder(ans, left[i]); + ans[fi][0] = key[i]; + ans[fi++][1] = value[i]; + inOrder(ans, right[i]); + } + + public static void clear() { + Arrays.fill(key, 1, cnt + 1, 0); + Arrays.fill(value, 1, cnt + 1, 0); + Arrays.fill(size, 1, cnt + 1, 0); + Arrays.fill(height, 1, cnt + 1, 0); + Arrays.fill(left, 1, cnt + 1, 0); + Arrays.fill(right, 1, cnt + 1, 0); + cnt = 0; + head = 0; + } + +} From bbca6f0f7f004a537e6edb6d5f741e0f8d88dc73 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 23 Oct 2024 22:59:05 +0800 Subject: [PATCH 0292/2029] modify code --- src/class148/Code01_AVL.java | 68 +++++------ src/class149/SkipList.java | 216 +++++++++++++++++++++++++++++++++-- 2 files changed, 240 insertions(+), 44 deletions(-) diff --git a/src/class148/Code01_AVL.java b/src/class148/Code01_AVL.java index 7506d2fb1..3516b4a2a 100644 --- a/src/class148/Code01_AVL.java +++ b/src/class148/Code01_AVL.java @@ -80,38 +80,38 @@ public static int maintain(int i) { return i; } - public static void add(int k) { - head = add(head, k); + public static void add(int num) { + head = add(head, num); } - public static int add(int i, int k) { + public static int add(int i, int num) { if (i == 0) { - key[++cnt] = k; + key[++cnt] = num; count[cnt] = size[cnt] = height[cnt] = 1; return cnt; } - if (key[i] == k) { + if (key[i] == num) { count[i]++; - } else if (key[i] > k) { - left[i] = add(left[i], k); + } else if (key[i] > num) { + left[i] = add(left[i], num); } else { - right[i] = add(right[i], k); + right[i] = add(right[i], num); } up(i); return maintain(i); } - public static void remove(int k) { - if (rank(k) != rank(k + 1)) { - head = remove(head, k); + public static void remove(int num) { + if (rank(num) != rank(num + 1)) { + head = remove(head, num); } } - public static int remove(int i, int k) { - if (key[i] < k) { - right[i] = remove(right[i], k); - } else if (key[i] > k) { - left[i] = remove(left[i], k); + public static int remove(int i, int num) { + if (key[i] < num) { + right[i] = remove(right[i], num); + } else if (key[i] > num) { + left[i] = remove(left[i], num); } else { if (count[i] > 1) { count[i]--; @@ -148,18 +148,18 @@ public static int removeMostLeft(int i, int mostLeft) { } } - public static int rank(int k) { - return small(head, k) + 1; + public static int rank(int num) { + return small(head, num) + 1; } - public static int small(int i, int k) { + public static int small(int i, int num) { if (i == 0) { return 0; } - if (key[i] >= k) { - return small(left[i], k); + if (key[i] >= num) { + return small(left[i], num); } else { - return size[left[i]] + count[i] + small(right[i], k); + return size[left[i]] + count[i] + small(right[i], num); } } @@ -176,33 +176,33 @@ public static int index(int i, int x) { return key[i]; } - public static int pre(int k) { - return pre(head, k); + public static int pre(int num) { + return pre(head, num); } - public static int pre(int i, int k) { + public static int pre(int i, int num) { if (i == 0) { return Integer.MIN_VALUE; } - if (key[i] >= k) { - return pre(left[i], k); + if (key[i] >= num) { + return pre(left[i], num); } else { - return Math.max(key[i], pre(right[i], k)); + return Math.max(key[i], pre(right[i], num)); } } - public static int post(int k) { - return post(head, k); + public static int post(int num) { + return post(head, num); } - public static int post(int i, int k) { + public static int post(int i, int num) { if (i == 0) { return Integer.MAX_VALUE; } - if (key[i] <= k) { - return post(right[i], k); + if (key[i] <= num) { + return post(right[i], num); } else { - return Math.min(key[i], post(left[i], k)); + return Math.min(key[i], post(left[i], num)); } } diff --git a/src/class149/SkipList.java b/src/class149/SkipList.java index 08480c2f3..d89a7af20 100644 --- a/src/class149/SkipList.java +++ b/src/class149/SkipList.java @@ -10,35 +10,230 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.StreamTokenizer; +import java.util.Arrays; -// 待实现 public class SkipList { - public static void add(int k) { + public static int MAXL = 17; + public static int MAXN = 100001; + + public static int cnt; + + public static int[] key = new int[MAXN]; + + public static int[] count = new int[MAXN]; + + public static int[] size = new int[MAXN]; + + public static int[][] next = new int[MAXN][MAXL + 1]; + + public static int[][] len = new int[MAXN][MAXL + 1]; + + public static void build() { + cnt = 1; + key[cnt] = Integer.MIN_VALUE; + size[cnt] = MAXL; + } + + public static void clear() { + Arrays.fill(key, 1, cnt + 1, 0); + Arrays.fill(count, 1, cnt + 1, 0); + Arrays.fill(size, 1, cnt + 1, 0); + for (int i = 1; i <= cnt; i++) { + Arrays.fill(next[i], 0); + Arrays.fill(len[i], 0); + } + cnt = 0; + } + + public static int random() { + int ans = 1; + while (Math.random() < 0.5) { + ans++; + } + return Math.min(ans, MAXL); + } + + public static int find(int i, int h, int num) { + while (next[i][h] != 0 && key[next[i][h]] < num) { + i = next[i][h]; + } + if (h == 1) { + if (next[i][h] != 0 && key[next[i][h]] == num) { + return next[i][h]; + } else { + return 0; + } + } + return find(i, h - 1, num); + } + + public static void add(int num) { + if (find(1, MAXL, num) != 0) { + addCount(1, MAXL, num); + } else { + key[++cnt] = num; + count[cnt] = 1; + size[cnt] = random(); + addNode(1, MAXL, cnt); + } } - public static void remove(int k) { + public static void addCount(int i, int h, int num) { + while (next[i][h] != 0 && key[next[i][h]] < num) { + i = next[i][h]; + } + if (h == 1) { + count[next[i][h]]++; + } else { + addCount(i, h - 1, num); + } + len[i][h]++; + } + public static int addNode(int i, int h, int j) { + int rightCnt = 0; + while (next[i][h] != 0 && key[next[i][h]] < key[j]) { + rightCnt += len[i][h]; + i = next[i][h]; + } + if (h == 1) { + next[j][h] = next[i][h]; + next[i][h] = j; + len[j][h] = count[next[j][h]]; + len[i][h] = count[next[i][h]]; + return rightCnt; + } else { + int downCnt = addNode(i, h - 1, j); + if (h > size[j]) { + len[i][h]++; + } else { + next[j][h] = next[i][h]; + next[i][h] = j; + len[j][h] = len[i][h] + 1 - downCnt - count[j]; + len[i][h] = downCnt + count[j]; + } + return rightCnt + downCnt; + } } - public static int rank(int k) { - return 0; + public static void remove(int num) { + int j = find(1, MAXL, num); + if (j != 0) { + if (count[j] > 1) { + removeCount(1, MAXL, num); + } else { + removeNode(1, MAXL, j); + } + } + } + + public static void removeCount(int i, int h, int num) { + while (next[i][h] != 0 && key[next[i][h]] < num) { + i = next[i][h]; + } + if (h == 1) { + count[next[i][h]]--; + } else { + removeCount(i, h - 1, num); + } + len[i][h]--; + } + + public static void removeNode(int i, int h, int j) { + if (h < 1) { + return; + } + while (next[i][h] != 0 && key[next[i][h]] < key[j]) { + i = next[i][h]; + } + if (h > size[j]) { + len[i][h]--; + } else { + next[i][h] = next[j][h]; + len[i][h] += len[j][h] - 1; + } + removeNode(i, h - 1, j); + } + + public static int rank(int num) { + return rank(1, MAXL, num) + 1; + } + + public static int rank(int i, int h, int num) { + int rightCnt = 0; + while (next[i][h] != 0 && key[next[i][h]] < num) { + rightCnt += len[i][h]; + i = next[i][h]; + } + if (h == 1) { + return rightCnt; + } else { + return rightCnt + rank(i, h - 1, num); + } } public static int index(int x) { - return 0; + return index(1, MAXL, x); } - public static int pre(int x) { - return 0; + public static int index(int i, int h, int x) { + int c = 0; + while (next[i][h] != 0 && c + len[i][h] < x) { + c += len[i][h]; + i = next[i][h]; + } + if (h == 1) { + return key[next[i][h]]; + } else { + return index(i, h - 1, x - c); + } + } + + public static int pre(int num) { + return pre(1, MAXL, num); + } + + public static int pre(int i, int h, int num) { + while (next[i][h] != 0 && key[next[i][h]] < num) { + i = next[i][h]; + } + if (h == 1) { + return i == 1 ? Integer.MIN_VALUE : key[i]; + } else { + return pre(i, h - 1, num); + } } - public static int post(int x) { - return 0; + public static int post(int num) { + return post(1, MAXL, num); + } + + public static int post(int i, int h, int num) { + while (next[i][h] != 0 && key[next[i][h]] < num) { + i = next[i][h]; + } + if (h == 1) { + if (next[i][h] == 0) { + return Integer.MAX_VALUE; + } + if (key[next[i][h]] > num) { + return key[next[i][h]]; + } + i = next[i][h]; + if (next[i][h] == 0) { + return Integer.MAX_VALUE; + } else { + return key[next[i][h]]; + } + } else { + return post(i, h - 1, num); + } } public static void main(String[] args) throws IOException { + build(); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StreamTokenizer in = new StreamTokenizer(br); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); @@ -63,6 +258,7 @@ public static void main(String[] args) throws IOException { out.println(post(x)); } } + clear(); out.flush(); out.close(); br.close(); From 9f22b05c53395eb4942b083ce632bdc535d66a6b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 23 Oct 2024 23:03:44 +0800 Subject: [PATCH 0293/2029] modify code --- src/class149/SkipList.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class149/SkipList.java b/src/class149/SkipList.java index d89a7af20..20c22f1b2 100644 --- a/src/class149/SkipList.java +++ b/src/class149/SkipList.java @@ -14,7 +14,7 @@ public class SkipList { - public static int MAXL = 17; + public static int MAXL = 20; public static int MAXN = 100001; From 88f200bbea42029fad6f9644f0d84f5854cb2f6c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 23 Oct 2024 23:04:47 +0800 Subject: [PATCH 0294/2029] modify code --- src/class148/Code01_AVL.java | 2 +- src/class149/SkipList.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class148/Code01_AVL.java b/src/class148/Code01_AVL.java index 3516b4a2a..92e1a3698 100644 --- a/src/class148/Code01_AVL.java +++ b/src/class148/Code01_AVL.java @@ -1,6 +1,6 @@ package class148; -// AVL树的实现 +// AVL树的实现(静态数组实现) // 测试链接 : https://www.luogu.com.cn/problem/P3369 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class149/SkipList.java b/src/class149/SkipList.java index 20c22f1b2..08cc67d5d 100644 --- a/src/class149/SkipList.java +++ b/src/class149/SkipList.java @@ -1,6 +1,6 @@ package class149; -// 跳表的实现 +// 跳表的实现(静态数组实现) // 测试链接 : https://www.luogu.com.cn/problem/P3369 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 From 5a8ef3019d093190e87a4344c1d9f7bf00425a9d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 24 Oct 2024 14:25:40 +0800 Subject: [PATCH 0295/2029] modify code --- src/class148/Code01_AVL.java | 12 +++++++++++- src/class148/Code02_ReconstructionQueue.java | 9 +++++++-- src/class149/SkipList.java | 11 ++++++++++- 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/class148/Code01_AVL.java b/src/class148/Code01_AVL.java index 92e1a3698..05cd64f1b 100644 --- a/src/class148/Code01_AVL.java +++ b/src/class148/Code01_AVL.java @@ -1,6 +1,15 @@ package class148; -// AVL树的实现(静态数组实现) +// AVL树的实现 +// 实现一种结构,支持如下操作,要求单次调用的时间复杂度O(log n) +// 1,增加一个x,支持重复加入 +// 2,删除一个x,只删掉一个 +// 3,查询x的排名,x的排名为,比x小的数的个数+1 +// 4,查询数据中排名为x的数 +// 5,查询x的前驱,x的前驱为,小于x的数中最大的数,不存在返回整数最小值 +// 6,查询x的后继,x的后继为,大于x的数中最小的数,不存在返回整数最大值 +// 所有操作的次数 <= 10^5 +// -10^7 <= x <= +10^7 // 测试链接 : https://www.luogu.com.cn/problem/P3369 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -12,6 +21,7 @@ import java.io.StreamTokenizer; import java.util.Arrays; + public class Code01_AVL { public static int MAXN = 100001; diff --git a/src/class148/Code02_ReconstructionQueue.java b/src/class148/Code02_ReconstructionQueue.java index 5b27ace60..67ad884c7 100644 --- a/src/class148/Code02_ReconstructionQueue.java +++ b/src/class148/Code02_ReconstructionQueue.java @@ -2,8 +2,13 @@ import java.util.Arrays; -// 根据身高重建队列(最优复杂度) -// 时间复杂度做到O(n * log n) +// 重建队列(做到最优时间复杂度) +// 一共n个人,每个人有(a, b)两个数据,数据a表示该人的身高 +// 数据b表示该人的要求,站在自己左边的人中,正好有b个人的身高大于等于自己的身高 +// 请你把n个人从左到右进行排列,要求每个人的要求都可以满足 +// 返回其中一种排列即可 +// 本题输入的数据一定存在这样的排列 +// 题解中的绝大多数方法,时间复杂度O(n平方),但是时间复杂度能做到O(n * log n) // 测试链接 : https://leetcode.cn/problems/queue-reconstruction-by-height/ public class Code02_ReconstructionQueue { diff --git a/src/class149/SkipList.java b/src/class149/SkipList.java index 08cc67d5d..96a519eb3 100644 --- a/src/class149/SkipList.java +++ b/src/class149/SkipList.java @@ -1,6 +1,15 @@ package class149; -// 跳表的实现(静态数组实现) +// 跳表的实现 +// 实现一种结构,支持如下操作,要求单次调用的时间复杂度O(log n) +// 1,增加一个x,支持重复加入 +// 2,删除一个x,只删掉一个 +// 3,查询x的排名,x的排名为,比x小的数的个数+1 +// 4,查询数据中排名为x的数 +// 5,查询x的前驱,x的前驱为,小于x的数中最大的数,不存在返回整数最小值 +// 6,查询x的后继,x的后继为,大于x的数中最小的数,不存在返回整数最大值 +// 所有操作的次数 <= 10^5 +// -10^7 <= x <= +10^7 // 测试链接 : https://www.luogu.com.cn/problem/P3369 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 From 81e36739cdd0ab58c7779e3047c4afdd37ef2b2b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 24 Oct 2024 14:28:17 +0800 Subject: [PATCH 0296/2029] modify code --- src/class148/Code02_ReconstructionQueue.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/class148/Code02_ReconstructionQueue.java b/src/class148/Code02_ReconstructionQueue.java index 67ad884c7..ed58ca0df 100644 --- a/src/class148/Code02_ReconstructionQueue.java +++ b/src/class148/Code02_ReconstructionQueue.java @@ -6,8 +6,7 @@ // 一共n个人,每个人有(a, b)两个数据,数据a表示该人的身高 // 数据b表示该人的要求,站在自己左边的人中,正好有b个人的身高大于等于自己的身高 // 请你把n个人从左到右进行排列,要求每个人的要求都可以满足 -// 返回其中一种排列即可 -// 本题输入的数据一定存在这样的排列 +// 返回其中一种排列即可,本题的数据保证一定存在这样的排列 // 题解中的绝大多数方法,时间复杂度O(n平方),但是时间复杂度能做到O(n * log n) // 测试链接 : https://leetcode.cn/problems/queue-reconstruction-by-height/ public class Code02_ReconstructionQueue { From 9a850de4ec8ceca719cdde12cee39197d2e19e81 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 24 Oct 2024 15:27:54 +0800 Subject: [PATCH 0297/2029] modify code --- src/class148/Code01_AVL.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/class148/Code01_AVL.java b/src/class148/Code01_AVL.java index 05cd64f1b..23f9c723f 100644 --- a/src/class148/Code01_AVL.java +++ b/src/class148/Code01_AVL.java @@ -21,7 +21,6 @@ import java.io.StreamTokenizer; import java.util.Arrays; - public class Code01_AVL { public static int MAXN = 100001; From 9ce3078d740d11716f8a3ef4ba3ce1e7beec227f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 24 Oct 2024 16:01:13 +0800 Subject: [PATCH 0298/2029] modify code --- src/class148/{Code01_AVL.java => AVL1.java} | 2 +- src/class148/AVL2.java | 241 ++++++++++++++++ ...ionQueue.java => ReconstructionQueue.java} | 2 +- .../{SkipList.java => SkipList1.java} | 2 +- src/class149/SkipList2.java | 260 ++++++++++++++++++ 5 files changed, 504 insertions(+), 3 deletions(-) rename src/class148/{Code01_AVL.java => AVL1.java} (99%) create mode 100644 src/class148/AVL2.java rename src/class148/{Code02_ReconstructionQueue.java => ReconstructionQueue.java} (98%) rename src/class149/{SkipList.java => SkipList1.java} (99%) create mode 100644 src/class149/SkipList2.java diff --git a/src/class148/Code01_AVL.java b/src/class148/AVL1.java similarity index 99% rename from src/class148/Code01_AVL.java rename to src/class148/AVL1.java index 23f9c723f..491ddcb5d 100644 --- a/src/class148/Code01_AVL.java +++ b/src/class148/AVL1.java @@ -21,7 +21,7 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class Code01_AVL { +public class AVL1 { public static int MAXN = 100001; diff --git a/src/class148/AVL2.java b/src/class148/AVL2.java new file mode 100644 index 000000000..15b6571dd --- /dev/null +++ b/src/class148/AVL2.java @@ -0,0 +1,241 @@ +package class148; + +// AVL树的实现 +// 实现一种结构,支持如下操作,要求单次调用的时间复杂度O(log n) +// 1,增加一个x,支持重复加入 +// 2,删除一个x,只删掉一个 +// 3,查询x的排名,x的排名为,比x小的数的个数+1 +// 4,查询数据中排名为x的数 +// 5,查询x的前驱,x的前驱为,小于x的数中最大的数,不存在返回整数最小值 +// 6,查询x的后继,x的后继为,大于x的数中最小的数,不存在返回整数最大值 +// 所有操作的次数 <= 10^5 +// -10^7 <= x <= +10^7 +// 测试链接 : https://www.luogu.com.cn/problem/P3369 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +//#include +//#include +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +// +//int cnt = 0; +//int head = 0; +//int key[MAXN]; +//int key_count[MAXN]; +//int size[MAXN]; +//int height[MAXN]; +//int leftChild[MAXN]; +//int rightChild[MAXN]; +// +//void up(int i) { +// size[i] = size[leftChild[i]] + size[rightChild[i]] + key_count[i]; +// height[i] = max(height[leftChild[i]], height[rightChild[i]]) + 1; +//} +// +//int leftRotate(int i) { +// int r = rightChild[i]; +// rightChild[i] = leftChild[r]; +// leftChild[r] = i; +// up(i); +// up(r); +// return r; +//} +// +//int rightRotate(int i) { +// int l = leftChild[i]; +// leftChild[i] = rightChild[l]; +// rightChild[l] = i; +// up(i); +// up(l); +// return l; +//} +// +//int maintain(int i) { +// int lh = height[leftChild[i]]; +// int rh = height[rightChild[i]]; +// if (lh - rh > 1) { +// int llh = height[leftChild[leftChild[i]]]; +// int lrh = height[rightChild[leftChild[i]]]; +// if (llh >= lrh) { +// i = rightRotate(i); +// } else { +// leftChild[i] = leftRotate(leftChild[i]); +// i = rightRotate(i); +// } +// } else if (rh - lh > 1) { +// int rrh = height[rightChild[rightChild[i]]]; +// int rlh = height[leftChild[rightChild[i]]]; +// if (rrh >= rlh) { +// i = leftRotate(i); +// } else { +// rightChild[i] = rightRotate(rightChild[i]); +// i = leftRotate(i); +// } +// } +// return i; +//} +// +//int addNode(int i, int num) { +// if (i == 0) { +// key[++cnt] = num; +// key_count[cnt] = size[cnt] = height[cnt] = 1; +// return cnt; +// } +// if (key[i] == num) { +// key_count[i]++; +// } else if (key[i] > num) { +// leftChild[i] = addNode(leftChild[i], num); +// } else { +// rightChild[i] = addNode(rightChild[i], num); +// } +// up(i); +// return maintain(i); +//} +// +//void add(int num) { +// head = addNode(head, num); +//} +// +//int getRank(int i, int num) { +// if (i == 0) { +// return 0; +// } +// if (key[i] >= num) { +// return getRank(leftChild[i], num); +// } else { +// return size[leftChild[i]] + key_count[i] + getRank(rightChild[i], num); +// } +//} +// +//int getRank(int num) { +// return getRank(head, num) + 1; +//} +// +//int removeMostLeft(int i, int mostLeft) { +// if (i == mostLeft) { +// return rightChild[i]; +// } else { +// leftChild[i] = removeMostLeft(leftChild[i], mostLeft); +// up(i); +// return maintain(i); +// } +//} +// +//int removeNode(int i, int num) { +// if (key[i] < num) { +// rightChild[i] = removeNode(rightChild[i], num); +// } else if (key[i] > num) { +// leftChild[i] = removeNode(leftChild[i], num); +// } else { +// if (key_count[i] > 1) { +// key_count[i]--; +// } else { +// if (leftChild[i] == 0 && rightChild[i] == 0) { +// return 0; +// } else if (leftChild[i] != 0 && rightChild[i] == 0) { +// i = leftChild[i]; +// } else if (leftChild[i] == 0 && rightChild[i] != 0) { +// i = rightChild[i]; +// } else { +// int mostLeft = rightChild[i]; +// while (leftChild[mostLeft] != 0) { +// mostLeft = leftChild[mostLeft]; +// } +// rightChild[i] = removeMostLeft(rightChild[i], mostLeft); +// leftChild[mostLeft] = leftChild[i]; +// rightChild[mostLeft] = rightChild[i]; +// i = mostLeft; +// } +// } +// } +// up(i); +// return maintain(i); +//} +// +//void remove(int num) { +// if (getRank(num) != getRank(num + 1)) { +// head = removeNode(head, num); +// } +//} +// +//int getIndex(int i, int x) { +// if (size[leftChild[i]] >= x) { +// return getIndex(leftChild[i], x); +// } else if (size[leftChild[i]] + key_count[i] < x) { +// return getIndex(rightChild[i], x - size[leftChild[i]] - key_count[i]); +// } +// return key[i]; +//} +// +//int getIndex(int x) { +// return getIndex(head, x); +//} +// +//int pre(int i, int num) { +// if (i == 0) { +// return INT_MIN; +// } +// if (key[i] >= num) { +// return pre(leftChild[i], num); +// } else { +// return max(key[i], pre(rightChild[i], num)); +// } +//} +// +//int pre(int num) { +// return pre(head, num); +//} +// +//int post(int i, int num) { +// if (i == 0) { +// return INT_MAX; +// } +// if (key[i] <= num) { +// return post(rightChild[i], num); +// } else { +// return min(key[i], post(leftChild[i], num)); +// } +//} +// +//int post(int num) { +// return post(head, num); +//} +// +//void clear() { +// memset(key + 1, 0, cnt * sizeof(int)); +// memset(key_count + 1, 0, cnt * sizeof(int)); +// memset(size + 1, 0, cnt * sizeof(int)); +// memset(height + 1, 0, cnt * sizeof(int)); +// memset(leftChild + 1, 0, cnt * sizeof(int)); +// memset(rightChild + 1, 0, cnt * sizeof(int)); +// cnt = 0; +// head = 0; +//} +// +//int main() { +// int n; +// cin >> n; +// for (int i = 1, op, x; i <= n; i++) { +// cin >> op >> x; +// if (op == 1) { +// add(x); +// } else if (op == 2) { +// remove(x); +// } else if (op == 3) { +// cout << getRank(x) << endl; +// } else if (op == 4) { +// cout << getIndex(x) << endl; +// } else if (op == 5) { +// cout << pre(x) << endl; +// } else { +// cout << post(x) << endl; +// } +// } +// clear(); +// return 0; +//} \ No newline at end of file diff --git a/src/class148/Code02_ReconstructionQueue.java b/src/class148/ReconstructionQueue.java similarity index 98% rename from src/class148/Code02_ReconstructionQueue.java rename to src/class148/ReconstructionQueue.java index ed58ca0df..4c864fe71 100644 --- a/src/class148/Code02_ReconstructionQueue.java +++ b/src/class148/ReconstructionQueue.java @@ -9,7 +9,7 @@ // 返回其中一种排列即可,本题的数据保证一定存在这样的排列 // 题解中的绝大多数方法,时间复杂度O(n平方),但是时间复杂度能做到O(n * log n) // 测试链接 : https://leetcode.cn/problems/queue-reconstruction-by-height/ -public class Code02_ReconstructionQueue { +public class ReconstructionQueue { public static int[][] reconstructQueue(int[][] people) { Arrays.sort(people, (a, b) -> a[0] != b[0] ? (b[0] - a[0]) : (a[1] - b[1])); diff --git a/src/class149/SkipList.java b/src/class149/SkipList1.java similarity index 99% rename from src/class149/SkipList.java rename to src/class149/SkipList1.java index 96a519eb3..26a1c2e2b 100644 --- a/src/class149/SkipList.java +++ b/src/class149/SkipList1.java @@ -21,7 +21,7 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class SkipList { +public class SkipList1 { public static int MAXL = 20; diff --git a/src/class149/SkipList2.java b/src/class149/SkipList2.java new file mode 100644 index 000000000..fbba35f66 --- /dev/null +++ b/src/class149/SkipList2.java @@ -0,0 +1,260 @@ +package class149; + +// 跳表的实现 +// 实现一种结构,支持如下操作,要求单次调用的时间复杂度O(log n) +// 1,增加一个x,支持重复加入 +// 2,删除一个x,只删掉一个 +// 3,查询x的排名,x的排名为,比x小的数的个数+1 +// 4,查询数据中排名为x的数 +// 5,查询x的前驱,x的前驱为,小于x的数中最大的数,不存在返回整数最小值 +// 6,查询x的后继,x的后继为,大于x的数中最小的数,不存在返回整数最大值 +// 所有操作的次数 <= 10^5 +// -10^7 <= x <= +10^7 +// 测试链接 : https://www.luogu.com.cn/problem/P3369 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +//#include +//#include +//#include +//#include +//#include +// +//using namespace std; +// +//const int MAXL = 20; +//const int MAXN = 100001; +// +//int cnt; +//int key[MAXN]; +//int key_count[MAXN]; +//int size[MAXN]; +//int next_node[MAXN][MAXL + 1]; +//int len[MAXN][MAXL + 1]; +// +//void build() { +// cnt = 1; +// key[cnt] = INT_MIN; +// size[cnt] = MAXL; +//} +// +//void clear() { +// memset(key + 1, 0, cnt * sizeof(int)); +// memset(key_count + 1, 0, cnt * sizeof(int)); +// memset(size + 1, 0, cnt * sizeof(int)); +// for (int i = 1; i <= cnt; i++) { +// memset(next_node[i], 0, (MAXL + 1) * sizeof(int)); +// memset(len[i], 0, (MAXL + 1) * sizeof(int)); +// } +// cnt = 0; +//} +// +//int randomLevel() { +// int ans = 1; +// while ((std::rand() / double(RAND_MAX)) < 0.5) { +// ans++; +// } +// return min(ans, MAXL); +//} +// +//int find(int i, int h, int num) { +// while (next_node[i][h] != 0 && key[next_node[i][h]] < num) { +// i = next_node[i][h]; +// } +// if (h == 1) { +// if (next_node[i][h] != 0 && key[next_node[i][h]] == num) { +// return next_node[i][h]; +// } else { +// return 0; +// } +// } +// return find(i, h - 1, num); +//} +// +//void addCount(int i, int h, int num) { +// while (next_node[i][h] != 0 && key[next_node[i][h]] < num) { +// i = next_node[i][h]; +// } +// if (h == 1) { +// key_count[next_node[i][h]]++; +// } else { +// addCount(i, h - 1, num); +// } +// len[i][h]++; +//} +// +//int addNode(int i, int h, int j) { +// int rightCnt = 0; +// while (next_node[i][h] != 0 && key[next_node[i][h]] < key[j]) { +// rightCnt += len[i][h]; +// i = next_node[i][h]; +// } +// if (h == 1) { +// next_node[j][h] = next_node[i][h]; +// next_node[i][h] = j; +// len[j][h] = key_count[next_node[j][h]]; +// len[i][h] = key_count[next_node[i][h]]; +// return rightCnt; +// } else { +// int downCnt = addNode(i, h - 1, j); +// if (h > size[j]) { +// len[i][h]++; +// } else { +// next_node[j][h] = next_node[i][h]; +// next_node[i][h] = j; +// len[j][h] = len[i][h] + 1 - downCnt - key_count[j]; +// len[i][h] = downCnt + key_count[j]; +// } +// return rightCnt + downCnt; +// } +//} +// +//void add(int num) { +// if (find(1, MAXL, num) != 0) { +// addCount(1, MAXL, num); +// } else { +// key[++cnt] = num; +// key_count[cnt] = 1; +// size[cnt] = randomLevel(); +// addNode(1, MAXL, cnt); +// } +//} +// +//void removeCount(int i, int h, int num) { +// while (next_node[i][h] != 0 && key[next_node[i][h]] < num) { +// i = next_node[i][h]; +// } +// if (h == 1) { +// key_count[next_node[i][h]]--; +// } else { +// removeCount(i, h - 1, num); +// } +// len[i][h]--; +//} +// +//void removeNode(int i, int h, int j) { +// if (h < 1) { +// return; +// } +// while (next_node[i][h] != 0 && key[next_node[i][h]] < key[j]) { +// i = next_node[i][h]; +// } +// if (h > size[j]) { +// len[i][h]--; +// } else { +// next_node[i][h] = next_node[j][h]; +// len[i][h] += len[j][h] - 1; +// } +// removeNode(i, h - 1, j); +//} +// +//void remove(int num) { +// int j = find(1, MAXL, num); +// if (j != 0) { +// if (key_count[j] > 1) { +// removeCount(1, MAXL, num); +// } else { +// removeNode(1, MAXL, j); +// } +// } +//} +// +//int getRank(int i, int h, int num) { +// int rightCnt = 0; +// while (next_node[i][h] != 0 && key[next_node[i][h]] < num) { +// rightCnt += len[i][h]; +// i = next_node[i][h]; +// } +// if (h == 1) { +// return rightCnt; +// } else { +// return rightCnt + getRank(i, h - 1, num); +// } +//} +// +//int getRank(int num) { +// return getRank(1, MAXL, num) + 1; +//} +// +//int index(int i, int h, int x) { +// int c = 0; +// while (next_node[i][h] != 0 && c + len[i][h] < x) { +// c += len[i][h]; +// i = next_node[i][h]; +// } +// if (h == 1) { +// return key[next_node[i][h]]; +// } else { +// return index(i, h - 1, x - c); +// } +//} +// +//int index(int x) { +// return index(1, MAXL, x); +//} +// +//int pre(int i, int h, int num) { +// while (next_node[i][h] != 0 && key[next_node[i][h]] < num) { +// i = next_node[i][h]; +// } +// if (h == 1) { +// return i == 1 ? INT_MIN : key[i]; +// } else { +// return pre(i, h - 1, num); +// } +//} +// +//int pre(int num) { +// return pre(1, MAXL, num); +//} +// +//int post(int i, int h, int num) { +// while (next_node[i][h] != 0 && key[next_node[i][h]] < num) { +// i = next_node[i][h]; +// } +// if (h == 1) { +// if (next_node[i][h] == 0) { +// return INT_MAX; +// } +// if (key[next_node[i][h]] > num) { +// return key[next_node[i][h]]; +// } +// i = next_node[i][h]; +// if (next_node[i][h] == 0) { +// return INT_MAX; +// } else { +// return key[next_node[i][h]]; +// } +// } else { +// return post(i, h - 1, num); +// } +//} +// +//int post(int num) { +// return post(1, MAXL, num); +//} +// +//int main() { +// build(); +// int n; +// cin >> n; +// for (int i = 1, op, x; i <= n; i++) { +// cin >> op >> x; +// if (op == 1) { +// add(x); +// } else if (op == 2) { +// remove(x); +// } else if (op == 3) { +// cout << getRank(x) << endl; +// } else if (op == 4) { +// cout << index(x) << endl; +// } else if (op == 5) { +// cout << pre(x) << endl; +// } else { +// cout << post(x) << endl; +// } +// } +// clear(); +// return 0; +//} \ No newline at end of file From dac5cd19cb5af592f3d697c6f594ce4ba1ac4d9c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 24 Oct 2024 16:02:54 +0800 Subject: [PATCH 0299/2029] modify code --- src/class148/AVL1.java | 2 +- src/class148/AVL2.java | 2 +- src/class149/SkipList1.java | 2 +- src/class149/SkipList2.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class148/AVL1.java b/src/class148/AVL1.java index 491ddcb5d..42814a02e 100644 --- a/src/class148/AVL1.java +++ b/src/class148/AVL1.java @@ -1,6 +1,6 @@ package class148; -// AVL树的实现 +// AVL树的实现(java版) // 实现一种结构,支持如下操作,要求单次调用的时间复杂度O(log n) // 1,增加一个x,支持重复加入 // 2,删除一个x,只删掉一个 diff --git a/src/class148/AVL2.java b/src/class148/AVL2.java index 15b6571dd..df966d202 100644 --- a/src/class148/AVL2.java +++ b/src/class148/AVL2.java @@ -1,6 +1,6 @@ package class148; -// AVL树的实现 +// AVL树的实现(C++版) // 实现一种结构,支持如下操作,要求单次调用的时间复杂度O(log n) // 1,增加一个x,支持重复加入 // 2,删除一个x,只删掉一个 diff --git a/src/class149/SkipList1.java b/src/class149/SkipList1.java index 26a1c2e2b..4a2ab0c1f 100644 --- a/src/class149/SkipList1.java +++ b/src/class149/SkipList1.java @@ -1,6 +1,6 @@ package class149; -// 跳表的实现 +// 跳表的实现(java版) // 实现一种结构,支持如下操作,要求单次调用的时间复杂度O(log n) // 1,增加一个x,支持重复加入 // 2,删除一个x,只删掉一个 diff --git a/src/class149/SkipList2.java b/src/class149/SkipList2.java index fbba35f66..cb25c1cf8 100644 --- a/src/class149/SkipList2.java +++ b/src/class149/SkipList2.java @@ -1,6 +1,6 @@ package class149; -// 跳表的实现 +// 跳表的实现(C++版) // 实现一种结构,支持如下操作,要求单次调用的时间复杂度O(log n) // 1,增加一个x,支持重复加入 // 2,删除一个x,只删掉一个 From eee9655d399e2bb0238341f63abbf522ea6b6fb8 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 25 Oct 2024 13:21:38 +0800 Subject: [PATCH 0300/2029] modify code --- src/class148/AVL1.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/class148/AVL1.java b/src/class148/AVL1.java index 42814a02e..4a1c15ea4 100644 --- a/src/class148/AVL1.java +++ b/src/class148/AVL1.java @@ -25,20 +25,28 @@ public class AVL1 { public static int MAXN = 100001; + // 空间使用计数 public static int cnt = 0; + // 整棵树的头节点编号 public static int head = 0; + // 节点的key public static int[] key = new int[MAXN]; + // 节点key的计数 public static int[] count = new int[MAXN]; + // 子树的数字总数 public static int[] size = new int[MAXN]; + // 子树高度 public static int[] height = new int[MAXN]; + // 左孩子 public static int[] left = new int[MAXN]; + // 右孩子 public static int[] right = new int[MAXN]; public static void up(int i) { From f5e8a33b4b04ce8a8222ea3566a74d9752a22480 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 25 Oct 2024 13:31:31 +0800 Subject: [PATCH 0301/2029] modify code --- src/class148/AVL1.java | 16 ++++++++-------- src/class148/AVL2.java | 8 ++++---- src/class148/ReconstructionQueue.java | 12 ++++++------ 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/class148/AVL1.java b/src/class148/AVL1.java index 4a1c15ea4..6a6c0b607 100644 --- a/src/class148/AVL1.java +++ b/src/class148/AVL1.java @@ -34,12 +34,6 @@ public class AVL1 { // 节点的key public static int[] key = new int[MAXN]; - // 节点key的计数 - public static int[] count = new int[MAXN]; - - // 子树的数字总数 - public static int[] size = new int[MAXN]; - // 子树高度 public static int[] height = new int[MAXN]; @@ -49,6 +43,12 @@ public class AVL1 { // 右孩子 public static int[] right = new int[MAXN]; + // 节点key的计数 + public static int[] count = new int[MAXN]; + + // 子树的数字总数 + public static int[] size = new int[MAXN]; + public static void up(int i) { size[i] = size[left[i]] + size[right[i]] + count[i]; height[i] = Math.max(height[left[i]], height[right[i]]) + 1; @@ -225,11 +225,11 @@ public static int post(int i, int num) { public static void clear() { Arrays.fill(key, 1, cnt + 1, 0); - Arrays.fill(count, 1, cnt + 1, 0); - Arrays.fill(size, 1, cnt + 1, 0); Arrays.fill(height, 1, cnt + 1, 0); Arrays.fill(left, 1, cnt + 1, 0); Arrays.fill(right, 1, cnt + 1, 0); + Arrays.fill(count, 1, cnt + 1, 0); + Arrays.fill(size, 1, cnt + 1, 0); cnt = 0; head = 0; } diff --git a/src/class148/AVL2.java b/src/class148/AVL2.java index df966d202..6d4fa546d 100644 --- a/src/class148/AVL2.java +++ b/src/class148/AVL2.java @@ -26,11 +26,11 @@ //int cnt = 0; //int head = 0; //int key[MAXN]; -//int key_count[MAXN]; -//int size[MAXN]; //int height[MAXN]; //int leftChild[MAXN]; //int rightChild[MAXN]; +//int key_count[MAXN]; +//int size[MAXN]; // //void up(int i) { // size[i] = size[leftChild[i]] + size[rightChild[i]] + key_count[i]; @@ -208,11 +208,11 @@ // //void clear() { // memset(key + 1, 0, cnt * sizeof(int)); -// memset(key_count + 1, 0, cnt * sizeof(int)); -// memset(size + 1, 0, cnt * sizeof(int)); // memset(height + 1, 0, cnt * sizeof(int)); // memset(leftChild + 1, 0, cnt * sizeof(int)); // memset(rightChild + 1, 0, cnt * sizeof(int)); +// memset(key_count + 1, 0, cnt * sizeof(int)); +// memset(size + 1, 0, cnt * sizeof(int)); // cnt = 0; // head = 0; //} diff --git a/src/class148/ReconstructionQueue.java b/src/class148/ReconstructionQueue.java index 4c864fe71..d5909eb5b 100644 --- a/src/class148/ReconstructionQueue.java +++ b/src/class148/ReconstructionQueue.java @@ -29,15 +29,15 @@ public static int[][] reconstructQueue(int[][] people) { public static int[] key = new int[MAXN]; - public static int[] value = new int[MAXN]; - - public static int[] size = new int[MAXN]; - public static int[] height = new int[MAXN]; public static int[] left = new int[MAXN]; public static int[] right = new int[MAXN]; + + public static int[] value = new int[MAXN]; + + public static int[] size = new int[MAXN]; public static void up(int i) { size[i] = size[left[i]] + size[right[i]] + 1; @@ -126,11 +126,11 @@ public static void inOrder(int[][] ans, int i) { public static void clear() { Arrays.fill(key, 1, cnt + 1, 0); - Arrays.fill(value, 1, cnt + 1, 0); - Arrays.fill(size, 1, cnt + 1, 0); Arrays.fill(height, 1, cnt + 1, 0); Arrays.fill(left, 1, cnt + 1, 0); Arrays.fill(right, 1, cnt + 1, 0); + Arrays.fill(value, 1, cnt + 1, 0); + Arrays.fill(size, 1, cnt + 1, 0); cnt = 0; head = 0; } From db1aba746471767c048dc39c4937fb0aa042d588 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 25 Oct 2024 13:36:24 +0800 Subject: [PATCH 0302/2029] modify code --- src/class148/AVL1.java | 8 ++------ src/class148/AVL2.java | 8 ++------ src/class148/ReconstructionQueue.java | 8 ++------ 3 files changed, 6 insertions(+), 18 deletions(-) diff --git a/src/class148/AVL1.java b/src/class148/AVL1.java index 6a6c0b607..3219d7f8e 100644 --- a/src/class148/AVL1.java +++ b/src/class148/AVL1.java @@ -76,18 +76,14 @@ public static int maintain(int i) { int lh = height[left[i]]; int rh = height[right[i]]; if (lh - rh > 1) { - int llh = height[left[left[i]]]; - int lrh = height[right[left[i]]]; - if (llh >= lrh) { + if (height[left[left[i]]] >= height[right[left[i]]]) { i = rightRotate(i); } else { left[i] = leftRotate(left[i]); i = rightRotate(i); } } else if (rh - lh > 1) { - int rrh = height[right[right[i]]]; - int rlh = height[left[right[i]]]; - if (rrh >= rlh) { + if (height[right[right[i]]] >= height[left[right[i]]]) { i = leftRotate(i); } else { right[i] = rightRotate(right[i]); diff --git a/src/class148/AVL2.java b/src/class148/AVL2.java index 6d4fa546d..91fde331a 100644 --- a/src/class148/AVL2.java +++ b/src/class148/AVL2.java @@ -59,18 +59,14 @@ // int lh = height[leftChild[i]]; // int rh = height[rightChild[i]]; // if (lh - rh > 1) { -// int llh = height[leftChild[leftChild[i]]]; -// int lrh = height[rightChild[leftChild[i]]]; -// if (llh >= lrh) { +// if (height[leftChild[leftChild[i]]] >= height[rightChild[leftChild[i]]]) { // i = rightRotate(i); // } else { // leftChild[i] = leftRotate(leftChild[i]); // i = rightRotate(i); // } // } else if (rh - lh > 1) { -// int rrh = height[rightChild[rightChild[i]]]; -// int rlh = height[leftChild[rightChild[i]]]; -// if (rrh >= rlh) { +// if (height[rightChild[rightChild[i]]] >= height[leftChild[rightChild[i]]]) { // i = leftRotate(i); // } else { // rightChild[i] = rightRotate(rightChild[i]); diff --git a/src/class148/ReconstructionQueue.java b/src/class148/ReconstructionQueue.java index d5909eb5b..e3715645a 100644 --- a/src/class148/ReconstructionQueue.java +++ b/src/class148/ReconstructionQueue.java @@ -66,18 +66,14 @@ public static int maintain(int i) { int lh = height[left[i]]; int rh = height[right[i]]; if (lh - rh > 1) { - int llh = height[left[left[i]]]; - int lrh = height[right[left[i]]]; - if (llh >= lrh) { + if (height[left[left[i]]] >= height[right[left[i]]]) { i = rightRotate(i); } else { left[i] = leftRotate(left[i]); i = rightRotate(i); } } else if (rh - lh > 1) { - int rrh = height[right[right[i]]]; - int rlh = height[left[right[i]]]; - if (rrh >= rlh) { + if (height[right[right[i]]] >= height[left[right[i]]]) { i = leftRotate(i); } else { right[i] = rightRotate(right[i]); From 771b907dd12e6e7931905cd0005c50e9a19eae8d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 25 Oct 2024 13:43:43 +0800 Subject: [PATCH 0303/2029] modify code --- src/class148/AVL1.java | 4 ++-- src/class148/AVL2.java | 4 ++-- src/class149/SkipList1.java | 4 ++-- src/class149/SkipList2.java | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/class148/AVL1.java b/src/class148/AVL1.java index 3219d7f8e..1ea42eb08 100644 --- a/src/class148/AVL1.java +++ b/src/class148/AVL1.java @@ -2,8 +2,8 @@ // AVL树的实现(java版) // 实现一种结构,支持如下操作,要求单次调用的时间复杂度O(log n) -// 1,增加一个x,支持重复加入 -// 2,删除一个x,只删掉一个 +// 1,增加x,重复加入算多个词频 +// 2,删除x,如果有多个,只删掉一个 // 3,查询x的排名,x的排名为,比x小的数的个数+1 // 4,查询数据中排名为x的数 // 5,查询x的前驱,x的前驱为,小于x的数中最大的数,不存在返回整数最小值 diff --git a/src/class148/AVL2.java b/src/class148/AVL2.java index 91fde331a..748bb2712 100644 --- a/src/class148/AVL2.java +++ b/src/class148/AVL2.java @@ -2,8 +2,8 @@ // AVL树的实现(C++版) // 实现一种结构,支持如下操作,要求单次调用的时间复杂度O(log n) -// 1,增加一个x,支持重复加入 -// 2,删除一个x,只删掉一个 +// 1,增加x,重复加入算多个词频 +// 2,删除x,如果有多个,只删掉一个 // 3,查询x的排名,x的排名为,比x小的数的个数+1 // 4,查询数据中排名为x的数 // 5,查询x的前驱,x的前驱为,小于x的数中最大的数,不存在返回整数最小值 diff --git a/src/class149/SkipList1.java b/src/class149/SkipList1.java index 4a2ab0c1f..b728d5982 100644 --- a/src/class149/SkipList1.java +++ b/src/class149/SkipList1.java @@ -2,8 +2,8 @@ // 跳表的实现(java版) // 实现一种结构,支持如下操作,要求单次调用的时间复杂度O(log n) -// 1,增加一个x,支持重复加入 -// 2,删除一个x,只删掉一个 +// 1,增加x,重复加入算多个词频 +// 2,删除x,如果有多个,只删掉一个 // 3,查询x的排名,x的排名为,比x小的数的个数+1 // 4,查询数据中排名为x的数 // 5,查询x的前驱,x的前驱为,小于x的数中最大的数,不存在返回整数最小值 diff --git a/src/class149/SkipList2.java b/src/class149/SkipList2.java index cb25c1cf8..4805b3611 100644 --- a/src/class149/SkipList2.java +++ b/src/class149/SkipList2.java @@ -2,8 +2,8 @@ // 跳表的实现(C++版) // 实现一种结构,支持如下操作,要求单次调用的时间复杂度O(log n) -// 1,增加一个x,支持重复加入 -// 2,删除一个x,只删掉一个 +// 1,增加x,重复加入算多个词频 +// 2,删除x,如果有多个,只删掉一个 // 3,查询x的排名,x的排名为,比x小的数的个数+1 // 4,查询数据中排名为x的数 // 5,查询x的前驱,x的前驱为,小于x的数中最大的数,不存在返回整数最小值 From 203bf337239a886497ac6ba5a8e0cf9851b7a826 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 25 Oct 2024 22:16:28 +0800 Subject: [PATCH 0304/2029] modify code --- src/class148/AVL1.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/class148/AVL1.java b/src/class148/AVL1.java index 1ea42eb08..c186fc0cc 100644 --- a/src/class148/AVL1.java +++ b/src/class148/AVL1.java @@ -49,11 +49,13 @@ public class AVL1 { // 子树的数字总数 public static int[] size = new int[MAXN]; + // 修正信息 public static void up(int i) { size[i] = size[left[i]] + size[right[i]] + count[i]; height[i] = Math.max(height[left[i]], height[right[i]]) + 1; } + // i节点为头的树左旋,返回左旋后头节点的空间编号 public static int leftRotate(int i) { int r = right[i]; right[i] = left[r]; @@ -63,6 +65,7 @@ public static int leftRotate(int i) { return r; } + // i节点为头的树右旋,返回右旋后头节点的空间编号 public static int rightRotate(int i) { int l = left[i]; left[i] = right[l]; @@ -72,6 +75,9 @@ public static int rightRotate(int i) { return l; } + // 检查i节点为头的树是否违规 + // 如果命中了某种违规情况,就进行相应调整 + // 返回树的头节点的空间编号 public static int maintain(int i) { int lh = height[left[i]]; int rh = height[right[i]]; @@ -93,10 +99,13 @@ public static int maintain(int i) { return i; } + // 增加数字num,重复加入算多个词频 public static void add(int num) { head = add(head, num); } + // 当前来到i号节点,num这个数字一定会加入以i为头的树 + // 树结构有可能变化,返回头节点编号 public static int add(int i, int num) { if (i == 0) { key[++cnt] = num; @@ -114,12 +123,15 @@ public static int add(int i, int num) { return maintain(i); } + // 删除数字num,如果有多个,只删掉一个 public static void remove(int num) { if (rank(num) != rank(num + 1)) { head = remove(head, num); } } + // 当前来到i号节点,以i为头的树一定会减少1个num + // 树结构有可能变化,返回头节点编号 public static int remove(int i, int num) { if (key[i] < num) { right[i] = remove(right[i], num); @@ -151,6 +163,8 @@ public static int remove(int i, int num) { return maintain(i); } + // 以i号节点为头的树上,最左节点的编号一定是mostLeft + // 删掉这个节点,并保证树的平衡性,返回头节点的编号 public static int removeMostLeft(int i, int mostLeft) { if (i == mostLeft) { return right[i]; @@ -161,10 +175,12 @@ public static int removeMostLeft(int i, int mostLeft) { } } + // 查询num的排名,比num小的数字个数+1,就是num的排名 public static int rank(int num) { return small(head, num) + 1; } + // 以i为头的树上,比num小的数字有几个 public static int small(int i, int num) { if (i == 0) { return 0; From a1cb1f978dc11c6d5549081cbcf005539ef000b1 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 25 Oct 2024 23:36:55 +0800 Subject: [PATCH 0305/2029] modify code --- ...4\270\223\351\242\2301-AVL\346\240\221.pptx" | Bin 0 -> 47576 bytes src/class148/ReconstructionQueue.java | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 "ppt/\347\256\227\346\263\225\350\256\262\350\247\243148\343\200\220\346\211\251\345\261\225\343\200\221\346\234\211\345\272\217\350\241\250\344\270\223\351\242\2301-AVL\346\240\221.pptx" diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243148\343\200\220\346\211\251\345\261\225\343\200\221\346\234\211\345\272\217\350\241\250\344\270\223\351\242\2301-AVL\346\240\221.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243148\343\200\220\346\211\251\345\261\225\343\200\221\346\234\211\345\272\217\350\241\250\344\270\223\351\242\2301-AVL\346\240\221.pptx" new file mode 100644 index 0000000000000000000000000000000000000000..94efe887ee1802770952b721ad977b89faccce46 GIT binary patch literal 47576 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 rank) { + if (size[left[i]] >= rank) { left[i] = add(left[i], rank, num, index); } else { right[i] = add(right[i], rank - size[left[i]] - 1, num, index); From b9db0c2daf8154241fbb8f09c3455b676e916596 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 28 Oct 2024 13:37:56 +0800 Subject: [PATCH 0306/2029] modify code --- src/class149/SkipList1.java | 12 ++++++------ src/class149/SkipList2.java | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/class149/SkipList1.java b/src/class149/SkipList1.java index b728d5982..7e8f53ede 100644 --- a/src/class149/SkipList1.java +++ b/src/class149/SkipList1.java @@ -33,7 +33,7 @@ public class SkipList1 { public static int[] count = new int[MAXN]; - public static int[] size = new int[MAXN]; + public static int[] level = new int[MAXN]; public static int[][] next = new int[MAXN][MAXL + 1]; @@ -42,13 +42,13 @@ public class SkipList1 { public static void build() { cnt = 1; key[cnt] = Integer.MIN_VALUE; - size[cnt] = MAXL; + level[cnt] = MAXL; } public static void clear() { Arrays.fill(key, 1, cnt + 1, 0); Arrays.fill(count, 1, cnt + 1, 0); - Arrays.fill(size, 1, cnt + 1, 0); + Arrays.fill(level, 1, cnt + 1, 0); for (int i = 1; i <= cnt; i++) { Arrays.fill(next[i], 0); Arrays.fill(len[i], 0); @@ -84,7 +84,7 @@ public static void add(int num) { } else { key[++cnt] = num; count[cnt] = 1; - size[cnt] = random(); + level[cnt] = random(); addNode(1, MAXL, cnt); } } @@ -115,7 +115,7 @@ public static int addNode(int i, int h, int j) { return rightCnt; } else { int downCnt = addNode(i, h - 1, j); - if (h > size[j]) { + if (h > level[j]) { len[i][h]++; } else { next[j][h] = next[i][h]; @@ -157,7 +157,7 @@ public static void removeNode(int i, int h, int j) { while (next[i][h] != 0 && key[next[i][h]] < key[j]) { i = next[i][h]; } - if (h > size[j]) { + if (h > level[j]) { len[i][h]--; } else { next[i][h] = next[j][h]; diff --git a/src/class149/SkipList2.java b/src/class149/SkipList2.java index 4805b3611..cff16d44e 100644 --- a/src/class149/SkipList2.java +++ b/src/class149/SkipList2.java @@ -29,20 +29,20 @@ //int cnt; //int key[MAXN]; //int key_count[MAXN]; -//int size[MAXN]; +//int level[MAXN]; //int next_node[MAXN][MAXL + 1]; //int len[MAXN][MAXL + 1]; // //void build() { // cnt = 1; // key[cnt] = INT_MIN; -// size[cnt] = MAXL; +// level[cnt] = MAXL; //} // //void clear() { // memset(key + 1, 0, cnt * sizeof(int)); // memset(key_count + 1, 0, cnt * sizeof(int)); -// memset(size + 1, 0, cnt * sizeof(int)); +// memset(level + 1, 0, cnt * sizeof(int)); // for (int i = 1; i <= cnt; i++) { // memset(next_node[i], 0, (MAXL + 1) * sizeof(int)); // memset(len[i], 0, (MAXL + 1) * sizeof(int)); @@ -98,7 +98,7 @@ // return rightCnt; // } else { // int downCnt = addNode(i, h - 1, j); -// if (h > size[j]) { +// if (h > level[j]) { // len[i][h]++; // } else { // next_node[j][h] = next_node[i][h]; @@ -116,7 +116,7 @@ // } else { // key[++cnt] = num; // key_count[cnt] = 1; -// size[cnt] = randomLevel(); +// level[cnt] = randomLevel(); // addNode(1, MAXL, cnt); // } //} @@ -140,7 +140,7 @@ // while (next_node[i][h] != 0 && key[next_node[i][h]] < key[j]) { // i = next_node[i][h]; // } -// if (h > size[j]) { +// if (h > level[j]) { // len[i][h]--; // } else { // next_node[i][h] = next_node[j][h]; From ff99a049e80e218da9040d33929b520924f0e619 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 28 Oct 2024 18:25:40 +0800 Subject: [PATCH 0307/2029] modify code --- src/class149/SkipList1.java | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/class149/SkipList1.java b/src/class149/SkipList1.java index 7e8f53ede..6e684f49b 100644 --- a/src/class149/SkipList1.java +++ b/src/class149/SkipList1.java @@ -23,28 +23,37 @@ public class SkipList1 { + // 跳表最大层的限制 public static int MAXL = 20; public static int MAXN = 100001; + // 空间使用计数 public static int cnt; + // 节点的key public static int[] key = new int[MAXN]; + // 节点key的计数 public static int[] count = new int[MAXN]; + // 节点拥有多少层指针 public static int[] level = new int[MAXN]; + // 节点每一层指针指向哪个节点 public static int[][] next = new int[MAXN][MAXL + 1]; + // 节点每一层指针的长度(底层跨过多少数,左开右闭) public static int[][] len = new int[MAXN][MAXL + 1]; + // 建立跳表 public static void build() { cnt = 1; key[cnt] = Integer.MIN_VALUE; level[cnt] = MAXL; } + // 使用多少空间一律清空 public static void clear() { Arrays.fill(key, 1, cnt + 1, 0); Arrays.fill(count, 1, cnt + 1, 0); @@ -56,6 +65,7 @@ public static void clear() { cnt = 0; } + // 扔骰子决定节点的层数 public static int random() { int ans = 1; while (Math.random() < 0.5) { @@ -64,6 +74,7 @@ public static int random() { return Math.min(ans, MAXL); } + // 当前在i号节点的h层,返回key为num的节点,空间编号是多少 public static int find(int i, int h, int num) { while (next[i][h] != 0 && key[next[i][h]] < num) { i = next[i][h]; @@ -78,6 +89,7 @@ public static int find(int i, int h, int num) { return find(i, h - 1, num); } + // 增加num,重复加入算多个词频 public static void add(int num) { if (find(1, MAXL, num) != 0) { addCount(1, MAXL, num); @@ -89,6 +101,7 @@ public static void add(int num) { } } + // 当前在i号节点的h层,num增加一个词频 public static void addCount(int i, int h, int num) { while (next[i][h] != 0 && key[next[i][h]] < num) { i = next[i][h]; @@ -101,6 +114,9 @@ public static void addCount(int i, int h, int num) { len[i][h]++; } + // 当前在i号节点的h层,插入空间编号为j的节点 + // 返回值:从i号节点出发,直到把空间编号为j的节点插入,总共跨过多少数字 + // 返回值很重要,因为上游需要这个信息来改动指针长度 public static int addNode(int i, int h, int j) { int rightCnt = 0; while (next[i][h] != 0 && key[next[i][h]] < key[j]) { @@ -127,6 +143,7 @@ public static int addNode(int i, int h, int j) { } } + // 删除x,如果有多个,只删掉一个 public static void remove(int num) { int j = find(1, MAXL, num); if (j != 0) { @@ -138,6 +155,7 @@ public static void remove(int num) { } } + // 当前在i号节点的h层,num减少一个词频 public static void removeCount(int i, int h, int num) { while (next[i][h] != 0 && key[next[i][h]] < num) { i = next[i][h]; @@ -150,6 +168,7 @@ public static void removeCount(int i, int h, int num) { len[i][h]--; } + // 当前在i号节点的h层,删除空间编号为j的节点 public static void removeNode(int i, int h, int j) { if (h < 1) { return; @@ -166,10 +185,12 @@ public static void removeNode(int i, int h, int j) { removeNode(i, h - 1, j); } + // 查询num的排名 public static int rank(int num) { return rank(1, MAXL, num) + 1; } + // 当前在i号节点的h层,查询有多少个数字比num小 public static int rank(int i, int h, int num) { int rightCnt = 0; while (next[i][h] != 0 && key[next[i][h]] < num) { @@ -183,10 +204,12 @@ public static int rank(int i, int h, int num) { } } + // 查询排名第x的key是什么 public static int index(int x) { return index(1, MAXL, x); } + // 当前在i号节点的h层,查询排名第x的key是什么 public static int index(int i, int h, int x) { int c = 0; while (next[i][h] != 0 && c + len[i][h] < x) { @@ -200,6 +223,7 @@ public static int index(int i, int h, int x) { } } + // 查询num的前驱 public static int pre(int num) { return pre(1, MAXL, num); } @@ -215,6 +239,7 @@ public static int pre(int i, int h, int num) { } } + // 查询num的后继 public static int post(int num) { return post(1, MAXL, num); } From e2090f665c4c3eaf284f1ba53847b765e597807b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 28 Oct 2024 18:27:43 +0800 Subject: [PATCH 0308/2029] modify code --- src/class149/SkipList1.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class149/SkipList1.java b/src/class149/SkipList1.java index 6e684f49b..8cba53b6b 100644 --- a/src/class149/SkipList1.java +++ b/src/class149/SkipList1.java @@ -115,8 +115,8 @@ public static void addCount(int i, int h, int num) { } // 当前在i号节点的h层,插入空间编号为j的节点 - // 返回值:从i号节点出发,直到把空间编号为j的节点插入,总共跨过多少数字 - // 返回值很重要,因为上游需要这个信息来改动指针长度 + // 返回值:从i号节点出发,直到把空间编号为j的节点插入,底层总共跨过多少数字 + // 返回值很重要,因为上游需要这个信息来改动指针的长度信息 public static int addNode(int i, int h, int j) { int rightCnt = 0; while (next[i][h] != 0 && key[next[i][h]] < key[j]) { From 2a4a2b203ca0503d6dc57dd633e79cd6e8c38a2e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 28 Oct 2024 22:32:05 +0800 Subject: [PATCH 0309/2029] modify code --- ...\351\242\2302-\350\267\263\350\241\250.pptx" | Bin 0 -> 39635 bytes src/class149/SkipList1.java | 8 ++++---- src/class149/SkipList2.java | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) create mode 100644 "ppt/\347\256\227\346\263\225\350\256\262\350\247\243149\343\200\220\346\211\251\345\261\225\343\200\221\346\234\211\345\272\217\350\241\250\344\270\223\351\242\2302-\350\267\263\350\241\250.pptx" diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243149\343\200\220\346\211\251\345\261\225\343\200\221\346\234\211\345\272\217\350\241\250\344\270\223\351\242\2302-\350\267\263\350\241\250.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243149\343\200\220\346\211\251\345\261\225\343\200\221\346\234\211\345\272\217\350\241\250\344\270\223\351\242\2302-\350\267\263\350\241\250.pptx" new file mode 100644 index 0000000000000000000000000000000000000000..2e146bd9a1e79d8e365d06408d3bf81da5436ef0 GIT binary patch literal 39635 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 literal 0 HcmV?d00001 diff --git a/src/class149/SkipList1.java b/src/class149/SkipList1.java index 8cba53b6b..089e0d386 100644 --- a/src/class149/SkipList1.java +++ b/src/class149/SkipList1.java @@ -115,7 +115,7 @@ public static void addCount(int i, int h, int num) { } // 当前在i号节点的h层,插入空间编号为j的节点 - // 返回值:从i号节点出发,直到把空间编号为j的节点插入,底层总共跨过多少数字 + // 返回值:从i号节点出发,直到把空间编号为j的节点插入,底层总共有多少数字比key[j]小 // 返回值很重要,因为上游需要这个信息来改动指针的长度信息 public static int addNode(int i, int h, int j) { int rightCnt = 0; @@ -187,11 +187,11 @@ public static void removeNode(int i, int h, int j) { // 查询num的排名 public static int rank(int num) { - return rank(1, MAXL, num) + 1; + return small(1, MAXL, num) + 1; } // 当前在i号节点的h层,查询有多少个数字比num小 - public static int rank(int i, int h, int num) { + public static int small(int i, int h, int num) { int rightCnt = 0; while (next[i][h] != 0 && key[next[i][h]] < num) { rightCnt += len[i][h]; @@ -200,7 +200,7 @@ public static int rank(int i, int h, int num) { if (h == 1) { return rightCnt; } else { - return rightCnt + rank(i, h - 1, num); + return rightCnt + small(i, h - 1, num); } } diff --git a/src/class149/SkipList2.java b/src/class149/SkipList2.java index cff16d44e..fc69395e1 100644 --- a/src/class149/SkipList2.java +++ b/src/class149/SkipList2.java @@ -160,7 +160,7 @@ // } //} // -//int getRank(int i, int h, int num) { +//int small(int i, int h, int num) { // int rightCnt = 0; // while (next_node[i][h] != 0 && key[next_node[i][h]] < num) { // rightCnt += len[i][h]; @@ -169,12 +169,12 @@ // if (h == 1) { // return rightCnt; // } else { -// return rightCnt + getRank(i, h - 1, num); +// return rightCnt + small(i, h - 1, num); // } //} // //int getRank(int num) { -// return getRank(1, MAXL, num) + 1; +// return small(1, MAXL, num) + 1; //} // //int index(int i, int h, int x) { From 6ef1d37415c98b9ab90285f093f496f44931ee6c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 4 Nov 2024 17:05:38 +0800 Subject: [PATCH 0310/2029] modify code --- src/class150/ScapeGoat1.java | 225 +++++++++++++++++++++++++++++++++++ src/class150/ScapeGoat2.java | 204 +++++++++++++++++++++++++++++++ 2 files changed, 429 insertions(+) create mode 100644 src/class150/ScapeGoat1.java create mode 100644 src/class150/ScapeGoat2.java diff --git a/src/class150/ScapeGoat1.java b/src/class150/ScapeGoat1.java new file mode 100644 index 000000000..269cd07ad --- /dev/null +++ b/src/class150/ScapeGoat1.java @@ -0,0 +1,225 @@ +package class150; + +// 替罪羊树的实现(java版) +// 实现一种结构,支持如下操作,要求单次调用的时间复杂度O(log n) +// 1,增加x,重复加入算多个词频 +// 2,删除x,如果有多个,只删掉一个 +// 3,查询x的排名,x的排名为,比x小的数的个数+1 +// 4,查询数据中排名为x的数 +// 5,查询x的前驱,x的前驱为,小于x的数中最大的数,不存在返回整数最小值 +// 6,查询x的后继,x的后继为,大于x的数中最小的数,不存在返回整数最大值 +// 所有操作的次数 <= 10^5 +// -10^7 <= x <= +10^7 +// 测试链接 : https://www.luogu.com.cn/problem/P3369 +// 提交以下的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 ScapeGoat1 { + + public static int MAXN = 100001; + + public static double ALPHA = 0.7; + + // 整棵树的头节点编号 + public static int head = 0; + + // 节点的key值 + public static int[] key = new int[MAXN]; + + // 节点key的计数 + public static int[] count = new int[MAXN]; + + // 左孩子 + public static int[] left = new int[MAXN]; + + // 右孩子 + public static int[] right = new int[MAXN]; + + // 数字总数 + public static int[] size = new int[MAXN]; + + // 节点总数 + public static int[] diff = new int[MAXN]; + + public static int[] order = new int[MAXN]; + + public static int[] stack = new int[MAXN]; + + public static int orderSize, stackSize; + + public static void prepare(int n) { + stackSize = 0; + for (int i = n; i >= 1; i--) { + stack[++stackSize] = i; + } + } + + public static void inorder(int i) { + if (i != 0) { + inorder(left[i]); + if (count[i] > 0) { + order[++orderSize] = i; + } else { + stack[++stackSize] = i; + } + inorder(right[i]); + } + } + + public static void up(int i) { + size[i] = size[left[i]] + size[right[i]] + count[i]; + diff[i] = diff[left[i]] + diff[right[i]] + (count[i] > 0 ? 1 : 0); + } + + public static int build(int l, int r) { + if (l > r) { + return 0; + } + int m = (l + r) / 2; + int h = order[m]; + left[h] = build(l, m - 1); + right[h] = build(m + 1, r); + up(h); + return h; + } + + public static int rebuild(int i) { + orderSize = 0; + inorder(i); + if (orderSize > 0) { + return build(1, orderSize); + } else { + return 0; + } + } + + public static boolean balance(int i) { + return ALPHA * diff[i] > Math.max(diff[left[i]], diff[right[i]]); + } + + public static void add(int num) { + head = add(head, num); + } + + public static int add(int i, int num) { + if (i == 0) { + i = stack[stackSize--]; + key[i] = num; + left[i] = right[i] = 0; + count[i] = size[i] = diff[i] = 1; + return i; + } else { + if (key[i] == num) { + count[i]++; + } else if (key[i] > num) { + left[i] = add(left[i], num); + } else { + right[i] = add(right[i], num); + } + up(i); + return balance(i) ? i : rebuild(i); + } + } + + public static int rank(int num) { + return small(head, num) + 1; + } + + public static int small(int i, int num) { + if (i == 0) { + return 0; + } + if (key[i] >= num) { + return small(left[i], num); + } else { + return size[left[i]] + count[i] + small(right[i], num); + } + } + + public static int index(int x) { + return index(head, x); + } + + public static int index(int i, int x) { + if (size[left[i]] >= x) { + return index(left[i], x); + } else if (size[left[i]] + count[i] < x) { + return index(right[i], x - size[left[i]] - count[i]); + } + return key[i]; + } + + public static int pre(int num) { + int kth = rank(num); + if (kth == 1) { + return Integer.MIN_VALUE; + } else { + return index(kth - 1); + } + } + + public static int post(int num) { + int kth = rank(num + 1); + if (kth == size[head] + 1) { + return Integer.MAX_VALUE; + } else { + return index(kth); + } + } + + public static void remove(int num) { + if (rank(num) != rank(num + 1)) { + head = remove(head, num); + } + } + + public static int remove(int i, int num) { + if (key[i] == num) { + count[i]--; + } else if (key[i] > num) { + left[i] = remove(left[i], num); + } else { + right[i] = remove(right[i], num); + } + up(i); + return balance(i) ? i : rebuild(i); + } + + 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(); + int n = (int) in.nval; + prepare(n); + for (int i = 1, op, x; i <= n; i++) { + in.nextToken(); + op = (int) in.nval; + in.nextToken(); + x = (int) in.nval; + if (op == 1) { + add(x); + } else if (op == 2) { + remove(x); + } else if (op == 3) { + out.println(rank(x)); + } else if (op == 4) { + out.println(index(x)); + } else if (op == 5) { + out.println(pre(x)); + } else { + out.println(post(x)); + } + } + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class150/ScapeGoat2.java b/src/class150/ScapeGoat2.java new file mode 100644 index 000000000..4a58fa64f --- /dev/null +++ b/src/class150/ScapeGoat2.java @@ -0,0 +1,204 @@ +package class150; + +// 替罪羊树的实现(C++版) +// 实现一种结构,支持如下操作,要求单次调用的时间复杂度O(log n) +// 1,增加x,重复加入算多个词频 +// 2,删除x,如果有多个,只删掉一个 +// 3,查询x的排名,x的排名为,比x小的数的个数+1 +// 4,查询数据中排名为x的数 +// 5,查询x的前驱,x的前驱为,小于x的数中最大的数,不存在返回整数最小值 +// 6,查询x的后继,x的后继为,大于x的数中最小的数,不存在返回整数最大值 +// 所有操作的次数 <= 10^5 +// -10^7 <= x <= +10^7 +// 测试链接 : https://www.luogu.com.cn/problem/P3369 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +//#include +//#include +//#include +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +// +//const double ALPHA = 0.7; +// +//int head = 0; +//int key[MAXN]; +//int key_count[MAXN]; +//int ls[MAXN]; +//int rs[MAXN]; +//int size[MAXN]; +//int diff[MAXN]; +//int order[MAXN]; +//int stack[MAXN]; +//int orderSize, stackSize; +// +//void prepare(int n) { +// stackSize = 0; +// for (int i = n; i >= 1; --i) { +// stack[++stackSize] = i; +// } +//} +// +//void inorder(int i) { +// if (i != 0) { +// inorder(ls[i]); +// if (key_count[i] > 0) { +// order[++orderSize] = i; +// } else { +// stack[++stackSize] = i; +// } +// inorder(rs[i]); +// } +//} +// +//void up(int i) { +// size[i] = size[ls[i]] + size[rs[i]] + key_count[i]; +// diff[i] = diff[ls[i]] + diff[rs[i]] + (key_count[i] > 0 ? 1 : 0); +//} +// +//int build(int l, int r) { +// if (l > r) { +// return 0; +// } +// int m = (l + r) / 2; +// int h = order[m]; +// ls[h] = build(l, m - 1); +// rs[h] = build(m + 1, r); +// up(h); +// return h; +//} +// +//int rebuild(int i) { +// orderSize = 0; +// inorder(i); +// if (orderSize > 0) { +// return build(1, orderSize); +// } else { +// return 0; +// } +//} +// +//bool balance(int i) { +// return ALPHA * diff[i] > max(diff[ls[i]], diff[rs[i]]); +//} +// +//int add(int i, int num) { +// if (i == 0) { +// i = stack[stackSize--]; +// key[i] = num; +// ls[i] = rs[i] = 0; +// key_count[i] = size[i] = diff[i] = 1; +// return i; +// } else { +// if (key[i] == num) { +// key_count[i]++; +// } else if (key[i] > num) { +// ls[i] = add(ls[i], num); +// } else { +// rs[i] = add(rs[i], num); +// } +// up(i); +// return balance(i) ? i : rebuild(i); +// } +//} +// +//int add(int num) { +// head = add(head, num); +// return head; +//} +// +//int small(int i, int num) { +// if (i == 0) { +// return 0; +// } +// if (key[i] >= num) { +// return small(ls[i], num); +// } else { +// return size[ls[i]] + key_count[i] + small(rs[i], num); // 使用 key_count +// } +//} +// +//int getRank(int num) { +// return small(head, num) + 1; +//} +// +//int index(int i, int x) { +// if (size[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]); +// } +// return key[i]; +//} +// +//int index(int x) { +// return index(head, x); +//} +// +//int pre(int num) { +// int kth = getRank(num); +// if (kth == 1) { +// return INT_MIN; +// } else { +// return index(kth - 1); +// } +//} +// +//int post(int num) { +// int kth = getRank(num + 1); +// if (kth == size[head] + 1) { +// return INT_MAX; +// } else { +// return index(kth); +// } +//} +// +//int remove(int i, int num) { +// if (key[i] == num) { +// key_count[i]--; +// } else if (key[i] > num) { +// ls[i] = remove(ls[i], num); +// } else { +// rs[i] = remove(rs[i], num); +// } +// up(i); +// return balance(i) ? i : rebuild(i); +//} +// +//int remove(int num) { +// if (getRank(num) != getRank(num + 1)) { +// head = remove(head, num); +// } +// return head; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// int n; +// cin >> n; +// prepare(n); +// for (int i = 0; i < n; ++i) { +// int op, x; +// cin >> op >> x; +// if (op == 1) { +// add(x); +// } else if (op == 2) { +// remove(x); +// } else if (op == 3) { +// cout << getRank(x) << "\n"; +// } else if (op == 4) { +// cout << index(x) << "\n"; +// } else if (op == 5) { +// cout << pre(x) << "\n"; +// } else { +// cout << post(x) << "\n"; +// } +// } +// return 0; +//} \ No newline at end of file From 8d39d3dc2db2911f1e4adcf115d919b62e81751c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 5 Nov 2024 13:24:49 +0800 Subject: [PATCH 0311/2029] modify code --- src/class150/ScapeGoat1.java | 50 ++++++++++++++++++--------------- src/class150/ScapeGoat2.java | 54 ++++++++++++++++++------------------ 2 files changed, 54 insertions(+), 50 deletions(-) diff --git a/src/class150/ScapeGoat1.java b/src/class150/ScapeGoat1.java index 269cd07ad..5f8a2cb69 100644 --- a/src/class150/ScapeGoat1.java +++ b/src/class150/ScapeGoat1.java @@ -19,6 +19,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.StreamTokenizer; +import java.util.Arrays; public class ScapeGoat1 { @@ -29,6 +30,9 @@ public class ScapeGoat1 { // 整棵树的头节点编号 public static int head = 0; + // 空间使用编号 + public static int cnt = 0; + // 节点的key值 public static int[] key = new int[MAXN]; @@ -47,26 +51,16 @@ public class ScapeGoat1 { // 节点总数 public static int[] diff = new int[MAXN]; - public static int[] order = new int[MAXN]; - - public static int[] stack = new int[MAXN]; - - public static int orderSize, stackSize; + // 中序遍历收集节点 + public static int[] collect = new int[MAXN]; - public static void prepare(int n) { - stackSize = 0; - for (int i = n; i >= 1; i--) { - stack[++stackSize] = i; - } - } + public static int ci; public static void inorder(int i) { if (i != 0) { inorder(left[i]); if (count[i] > 0) { - order[++orderSize] = i; - } else { - stack[++stackSize] = i; + collect[++ci] = i; } inorder(right[i]); } @@ -82,7 +76,7 @@ public static int build(int l, int r) { return 0; } int m = (l + r) / 2; - int h = order[m]; + int h = collect[m]; left[h] = build(l, m - 1); right[h] = build(m + 1, r); up(h); @@ -90,10 +84,10 @@ public static int build(int l, int r) { } public static int rebuild(int i) { - orderSize = 0; + ci = 0; inorder(i); - if (orderSize > 0) { - return build(1, orderSize); + if (ci > 0) { + return build(1, ci); } else { return 0; } @@ -109,11 +103,10 @@ public static void add(int num) { public static int add(int i, int num) { if (i == 0) { - i = stack[stackSize--]; + i = ++cnt; key[i] = num; left[i] = right[i] = 0; count[i] = size[i] = diff[i] = 1; - return i; } else { if (key[i] == num) { count[i]++; @@ -122,9 +115,9 @@ public static int add(int i, int num) { } else { right[i] = add(right[i], num); } - up(i); - return balance(i) ? i : rebuild(i); } + up(i); + return balance(i) ? i : rebuild(i); } public static int rank(int num) { @@ -191,13 +184,23 @@ public static int remove(int i, int num) { return balance(i) ? i : rebuild(i); } + public static void clear() { + Arrays.fill(key, 1, cnt + 1, 0); + Arrays.fill(count, 1, cnt + 1, 0); + Arrays.fill(left, 1, cnt + 1, 0); + Arrays.fill(right, 1, cnt + 1, 0); + Arrays.fill(size, 1, cnt + 1, 0); + Arrays.fill(diff, 1, cnt + 1, 0); + cnt = 0; + head = 0; + } + 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(); int n = (int) in.nval; - prepare(n); for (int i = 1, op, x; i <= n; i++) { in.nextToken(); op = (int) in.nval; @@ -217,6 +220,7 @@ public static void main(String[] args) throws IOException { out.println(post(x)); } } + clear(); out.flush(); out.close(); br.close(); diff --git a/src/class150/ScapeGoat2.java b/src/class150/ScapeGoat2.java index 4a58fa64f..04696091f 100644 --- a/src/class150/ScapeGoat2.java +++ b/src/class150/ScapeGoat2.java @@ -19,6 +19,7 @@ //#include //#include //#include +//#include // //using namespace std; // @@ -27,30 +28,21 @@ //const double ALPHA = 0.7; // //int head = 0; +//int cnt = 0; //int key[MAXN]; //int key_count[MAXN]; //int ls[MAXN]; //int rs[MAXN]; //int size[MAXN]; //int diff[MAXN]; -//int order[MAXN]; -//int stack[MAXN]; -//int orderSize, stackSize; -// -//void prepare(int n) { -// stackSize = 0; -// for (int i = n; i >= 1; --i) { -// stack[++stackSize] = i; -// } -//} +//int collect[MAXN]; +//int ci; // //void inorder(int i) { // if (i != 0) { // inorder(ls[i]); // if (key_count[i] > 0) { -// order[++orderSize] = i; -// } else { -// stack[++stackSize] = i; +// collect[++ci] = i; // } // inorder(rs[i]); // } @@ -66,7 +58,7 @@ // return 0; // } // int m = (l + r) / 2; -// int h = order[m]; +// int h = collect[m]; // ls[h] = build(l, m - 1); // rs[h] = build(m + 1, r); // up(h); @@ -74,10 +66,10 @@ //} // //int rebuild(int i) { -// orderSize = 0; +// ci = 0; // inorder(i); -// if (orderSize > 0) { -// return build(1, orderSize); +// if (ci > 0) { +// return build(1, ci); // } else { // return 0; // } @@ -89,11 +81,10 @@ // //int add(int i, int num) { // if (i == 0) { -// i = stack[stackSize--]; +// i = ++cnt; // key[i] = num; // ls[i] = rs[i] = 0; // key_count[i] = size[i] = diff[i] = 1; -// return i; // } else { // if (key[i] == num) { // key_count[i]++; @@ -102,14 +93,13 @@ // } else { // rs[i] = add(rs[i], num); // } -// up(i); -// return balance(i) ? i : rebuild(i); // } +// up(i); +// return balance(i) ? i : rebuild(i); //} // -//int add(int num) { +//void add(int num) { // head = add(head, num); -// return head; //} // //int small(int i, int num) { @@ -119,7 +109,7 @@ // if (key[i] >= num) { // return small(ls[i], num); // } else { -// return size[ls[i]] + key_count[i] + small(rs[i], num); // 使用 key_count +// return size[ls[i]] + key_count[i] + small(rs[i], num); // } //} // @@ -170,11 +160,21 @@ // return balance(i) ? i : rebuild(i); //} // -//int remove(int num) { +//void remove(int num) { // if (getRank(num) != getRank(num + 1)) { // head = remove(head, num); // } -// return head; +//} +// +//void clear() { +// memset(key, 0, sizeof(key)); +// memset(key_count, 0, sizeof(key_count)); +// memset(ls, 0, sizeof(ls)); +// memset(rs, 0, sizeof(rs)); +// memset(size, 0, sizeof(size)); +// memset(diff, 0, sizeof(diff)); +// cnt = 0; +// head = 0; //} // //int main() { @@ -182,7 +182,6 @@ // cin.tie(nullptr); // int n; // cin >> n; -// prepare(n); // for (int i = 0; i < n; ++i) { // int op, x; // cin >> op >> x; @@ -200,5 +199,6 @@ // cout << post(x) << "\n"; // } // } +// clear(); // return 0; //} \ No newline at end of file From c099a3b60e30682b9e2b51218c1651d13e975702 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 5 Nov 2024 14:09:16 +0800 Subject: [PATCH 0312/2029] modify code --- src/class150/ShowDetails.java | 209 ++++++++++++++++++++++++++++++++++ 1 file changed, 209 insertions(+) create mode 100644 src/class150/ShowDetails.java diff --git a/src/class150/ShowDetails.java b/src/class150/ShowDetails.java new file mode 100644 index 000000000..6a40f125a --- /dev/null +++ b/src/class150/ShowDetails.java @@ -0,0 +1,209 @@ +package class150; + +// 不同的平衡因子对替罪羊树产生的影响 +// 一旦, max(左树节点数,右树节点数) / 整树节点数 >= 平衡因子,就会发生重构 +// 平衡因子不能小于0.5,不能大于1.0,因为无意义 +// 当平衡因子等于0.5时树最平衡,即树高最小,此时查询效率高,但是重构的节点最多 +// 当平衡因子等于1.0时树为线状,即树高最大,此时查询效率低,但是重构几乎不发生 +// 为了保证查询效率高,同时重构的节点也不多,需要设置合适的平衡因子,一般为0.7 +// 当平衡因子为0.7左右时,树高几乎是O(log n),这保证了查询效率 +// 同时重构触发时机合适,重构的节点不会特别多,均摊下来,单次代价认为是O(log n) + +import java.util.Arrays; + +public class ShowDetails { + + public static int MAXN = 100001; + + public static double ALPHA = 0.7; + + public static int head = 0; + + public static int cnt = 0; + + public static int[] key = new int[MAXN]; + + public static int[] count = new int[MAXN]; + + public static int[] left = new int[MAXN]; + + public static int[] right = new int[MAXN]; + + public static int[] size = new int[MAXN]; + + public static int[] diff = new int[MAXN]; + + public static int[] collect = new int[MAXN]; + + public static int ci; + + public static void inorder(int i) { + if (i != 0) { + inorder(left[i]); + if (count[i] > 0) { + collect[++ci] = i; + } + inorder(right[i]); + } + } + + public static void up(int i) { + size[i] = size[left[i]] + size[right[i]] + count[i]; + diff[i] = diff[left[i]] + diff[right[i]] + (count[i] > 0 ? 1 : 0); + } + + public static int build(int l, int r) { + if (l > r) { + return 0; + } + int m = (l + r) / 2; + int h = collect[m]; + left[h] = build(l, m - 1); + right[h] = build(m + 1, r); + up(h); + return h; + } + + public static int rebuild(int i) { + ci = 0; + inorder(i); + if (ci > 0) { + return build(1, ci); + } else { + return 0; + } + } + + // 一旦判断不平衡,接下来必然重构,所以统计总共有多少节点会重构 + public static boolean balance(int i) { + if (ALPHA * diff[i] > Math.max(diff[left[i]], diff[right[i]])) { + return true; + } else { + cost += diff[i]; + return false; + } + } + + public static void add(int num) { + head = add(head, num); + } + + public static int add(int i, int num) { + if (i == 0) { + i = ++cnt; + key[i] = num; + left[i] = right[i] = 0; + count[i] = size[i] = diff[i] = 1; + } else { + if (key[i] == num) { + count[i]++; + } else if (key[i] > num) { + left[i] = add(left[i], num); + } else { + right[i] = add(right[i], num); + } + } + up(i); + return balance(i) ? i : rebuild(i); + } + + public static int rank(int num) { + return small(head, num) + 1; + } + + public static int small(int i, int num) { + if (i == 0) { + return 0; + } + if (key[i] >= num) { + return small(left[i], num); + } else { + return size[left[i]] + count[i] + small(right[i], num); + } + } + + public static int index(int x) { + return index(head, x); + } + + public static int index(int i, int x) { + if (size[left[i]] >= x) { + return index(left[i], x); + } else if (size[left[i]] + count[i] < x) { + return index(right[i], x - size[left[i]] - count[i]); + } + return key[i]; + } + + public static int pre(int num) { + int kth = rank(num); + if (kth == 1) { + return Integer.MIN_VALUE; + } else { + return index(kth - 1); + } + } + + public static int post(int num) { + int kth = rank(num + 1); + if (kth == size[head] + 1) { + return Integer.MAX_VALUE; + } else { + return index(kth); + } + } + + public static void remove(int num) { + if (rank(num) != rank(num + 1)) { + head = remove(head, num); + } + } + + public static int remove(int i, int num) { + if (key[i] == num) { + count[i]--; + } else if (key[i] > num) { + left[i] = remove(left[i], num); + } else { + right[i] = remove(right[i], num); + } + up(i); + return balance(i) ? i : rebuild(i); + } + + public static void clear() { + Arrays.fill(key, 1, cnt + 1, 0); + Arrays.fill(count, 1, cnt + 1, 0); + Arrays.fill(left, 1, cnt + 1, 0); + Arrays.fill(right, 1, cnt + 1, 0); + Arrays.fill(size, 1, cnt + 1, 0); + Arrays.fill(diff, 1, cnt + 1, 0); + cnt = 0; + head = 0; + } + + public static int deep(int i) { + if (i == 0) { + return 0; + } + return Math.max(deep(left[i]), deep(right[i])) + 1; + } + + public static int max, cost; + + public static void main(String[] args) { + System.out.println("测试开始"); + ALPHA = 0.7; // 设置不同的平衡因子 + max = 10000; // 设置插入范围 + cost = 0; // 清空重构节点计数 + for (int num = 1; num <= max; num++) { + add(num); + } + System.out.println("依次插入从 1 到 " + max + " 的所有数字"); + System.out.println("平衡因子 : " + ALPHA); + System.out.println("重构节点总数 : " + cost); + System.out.println("树高 : " + deep(head)); + System.out.println("测试结束"); + } + +} From 582fb28516825eed78af6e3e2995c52422a5689d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 5 Nov 2024 14:14:07 +0800 Subject: [PATCH 0313/2029] modify code --- src/class150/ShowDetails.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/class150/ShowDetails.java b/src/class150/ShowDetails.java index 6a40f125a..9145536d3 100644 --- a/src/class150/ShowDetails.java +++ b/src/class150/ShowDetails.java @@ -192,14 +192,17 @@ public static int deep(int i) { public static int max, cost; public static void main(String[] args) { + // 设置平衡因子 + ALPHA = 0.7; + // 设置插入范围 + max = 10000; + // 清空重构节点计数 + cost = 0; System.out.println("测试开始"); - ALPHA = 0.7; // 设置不同的平衡因子 - max = 10000; // 设置插入范围 - cost = 0; // 清空重构节点计数 for (int num = 1; num <= max; num++) { add(num); } - System.out.println("依次插入从 1 到 " + max + " 的所有数字"); + System.out.println("依次插入 1 到 " + max); System.out.println("平衡因子 : " + ALPHA); System.out.println("重构节点总数 : " + cost); System.out.println("树高 : " + deep(head)); From 324eddff1e029ef5b1d047ce865bb5efd5bb2334 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 5 Nov 2024 14:16:24 +0800 Subject: [PATCH 0314/2029] modify code --- src/class150/ShowDetails.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class150/ShowDetails.java b/src/class150/ShowDetails.java index 9145536d3..1f967eddf 100644 --- a/src/class150/ShowDetails.java +++ b/src/class150/ShowDetails.java @@ -5,7 +5,7 @@ // 平衡因子不能小于0.5,不能大于1.0,因为无意义 // 当平衡因子等于0.5时树最平衡,即树高最小,此时查询效率高,但是重构的节点最多 // 当平衡因子等于1.0时树为线状,即树高最大,此时查询效率低,但是重构几乎不发生 -// 为了保证查询效率高,同时重构的节点也不多,需要设置合适的平衡因子,一般为0.7 +// 为了保证查询效率,同时重构节点也不多,需要设置合适的平衡因子,一般0.7最常用 // 当平衡因子为0.7左右时,树高几乎是O(log n),这保证了查询效率 // 同时重构触发时机合适,重构的节点不会特别多,均摊下来,单次代价认为是O(log n) From 7d50966b4ee40a438b3139300523ae03bf07a1be Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 5 Nov 2024 14:17:22 +0800 Subject: [PATCH 0315/2029] modify code --- src/class150/ShowDetails.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class150/ShowDetails.java b/src/class150/ShowDetails.java index 1f967eddf..a6333bdf2 100644 --- a/src/class150/ShowDetails.java +++ b/src/class150/ShowDetails.java @@ -7,7 +7,7 @@ // 当平衡因子等于1.0时树为线状,即树高最大,此时查询效率低,但是重构几乎不发生 // 为了保证查询效率,同时重构节点也不多,需要设置合适的平衡因子,一般0.7最常用 // 当平衡因子为0.7左右时,树高几乎是O(log n),这保证了查询效率 -// 同时重构触发时机合适,重构的节点不会特别多,均摊下来,单次代价认为是O(log n) +// 同时重构的触发时机合适,重构节点不会特别多,均摊下来单次代价认为是O(log n) import java.util.Arrays; From 10a6201763adceeeba11602c50851a6555d057f0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 6 Nov 2024 14:31:27 +0800 Subject: [PATCH 0316/2029] modify code --- src/class150/ScapeGoat1.java | 119 ++++++++++++++++++++++----------- src/class150/ScapeGoat2.java | 87 ++++++++++++++++-------- src/class150/ShowDetails.java | 122 +++++++++++++++++++++------------- 3 files changed, 214 insertions(+), 114 deletions(-) diff --git a/src/class150/ScapeGoat1.java b/src/class150/ScapeGoat1.java index 5f8a2cb69..6467c1b83 100644 --- a/src/class150/ScapeGoat1.java +++ b/src/class150/ScapeGoat1.java @@ -51,11 +51,34 @@ public class ScapeGoat1 { // 节点总数 public static int[] diff = new int[MAXN]; - // 中序遍历收集节点 + // 中序收集节点的数组 public static int[] collect = new int[MAXN]; + // 中序收集节点的计数 public static int ci; + // 最上方不平衡的节点 + public static int child; + + // 最上方不平衡节点的父节点 + public static int father; + + // 最上方不平衡的节点是其父节点的什么孩子 + // 0代表左孩子,1代表右孩子 + public static int side; + + public static int init(int num) { + key[++cnt] = num; + left[cnt] = right[cnt] = 0; + count[cnt] = size[cnt] = diff[cnt] = 1; + return cnt; + } + + public static void up(int i) { + size[i] = size[left[i]] + size[right[i]] + count[i]; + diff[i] = diff[left[i]] + diff[right[i]] + (count[i] > 0 ? 1 : 0); + } + public static void inorder(int i) { if (i != 0) { inorder(left[i]); @@ -66,11 +89,6 @@ public static void inorder(int i) { } } - public static void up(int i) { - size[i] = size[left[i]] + size[right[i]] + count[i]; - diff[i] = diff[left[i]] + diff[right[i]] + (count[i] > 0 ? 1 : 0); - } - public static int build(int l, int r) { if (l > r) { return 0; @@ -83,13 +101,19 @@ public static int build(int l, int r) { return h; } - public static int rebuild(int i) { - ci = 0; - inorder(i); - if (ci > 0) { - return build(1, ci); - } else { - return 0; + public static void rebuild() { + if (child != -1) { + ci = 0; + inorder(child); + if (ci > 0) { + if (father == 0) { + head = build(1, ci); + } else if (side == 0) { + left[father] = build(1, ci); + } else { + right[father] = build(1, ci); + } + } } } @@ -97,31 +121,36 @@ public static boolean balance(int i) { return ALPHA * diff[i] > Math.max(diff[left[i]], diff[right[i]]); } - public static void add(int num) { - head = add(head, num); - } - - public static int add(int i, int num) { + public static void add(int i, int f, int s, int num) { if (i == 0) { - i = ++cnt; - key[i] = num; - left[i] = right[i] = 0; - count[i] = size[i] = diff[i] = 1; + if (f == 0) { + head = init(num); + } else if (s == 0) { + left[f] = init(num); + } else { + right[f] = init(num); + } } else { if (key[i] == num) { count[i]++; } else if (key[i] > num) { - left[i] = add(left[i], num); + add(left[i], i, 0, num); } else { - right[i] = add(right[i], num); + add(right[i], i, 1, num); + } + up(i); + if (!balance(i)) { + father = f; + child = i; + side = s; } } - up(i); - return balance(i) ? i : rebuild(i); } - public static int rank(int num) { - return small(head, num) + 1; + public static void add(int num) { + child = father = side = -1; + add(head, 0, 0, num); + rebuild(); } public static int small(int i, int num) { @@ -135,8 +164,8 @@ public static int small(int i, int num) { } } - public static int index(int x) { - return index(head, x); + public static int rank(int num) { + return small(head, num) + 1; } public static int index(int i, int x) { @@ -148,6 +177,10 @@ public static int index(int i, int x) { return key[i]; } + public static int index(int x) { + return index(head, x); + } + public static int pre(int num) { int kth = rank(num); if (kth == 1) { @@ -166,22 +199,28 @@ public static int post(int num) { } } - public static void remove(int num) { - if (rank(num) != rank(num + 1)) { - head = remove(head, num); - } - } - - public static int remove(int i, int num) { + public static void remove(int i, int f, int s, int num) { if (key[i] == num) { count[i]--; } else if (key[i] > num) { - left[i] = remove(left[i], num); + remove(left[i], i, 0, num); } else { - right[i] = remove(right[i], num); + remove(right[i], i, 1, num); } up(i); - return balance(i) ? i : rebuild(i); + if (!balance(i)) { + child = i; + father = f; + side = s; + } + } + + public static void remove(int num) { + if (rank(num) != rank(num + 1)) { + child = father = side = -1; + remove(head, 0, 0, num); + rebuild(); + } } public static void clear() { diff --git a/src/class150/ScapeGoat2.java b/src/class150/ScapeGoat2.java index 04696091f..15f120fe8 100644 --- a/src/class150/ScapeGoat2.java +++ b/src/class150/ScapeGoat2.java @@ -37,6 +37,21 @@ //int diff[MAXN]; //int collect[MAXN]; //int ci; +//int child; +//int father; +//int side; +// +//int init(int num) { +// key[++cnt] = num; +// ls[cnt] = rs[cnt] = 0; +// key_count[cnt] = size[cnt] = diff[cnt] = 1; +// return cnt; +//} +// +//void up(int i) { +// size[i] = size[ls[i]] + size[rs[i]] + key_count[i]; +// diff[i] = diff[ls[i]] + diff[rs[i]] + (key_count[i] > 0 ? 1 : 0); +//} // //void inorder(int i) { // if (i != 0) { @@ -48,11 +63,6 @@ // } //} // -//void up(int i) { -// size[i] = size[ls[i]] + size[rs[i]] + key_count[i]; -// diff[i] = diff[ls[i]] + diff[rs[i]] + (key_count[i] > 0 ? 1 : 0); -//} -// //int build(int l, int r) { // if (l > r) { // return 0; @@ -65,13 +75,19 @@ // return h; //} // -//int rebuild(int i) { -// ci = 0; -// inorder(i); -// if (ci > 0) { -// return build(1, ci); -// } else { -// return 0; +//void rebuild() { +// if (child != -1) { +// ci = 0; +// inorder(child); +// if (ci > 0) { +// if (father == 0) { +// head = build(1, ci); +// } else if (side == 0) { +// ls[father] = build(1, ci); +// } else { +// rs[father] = build(1, ci); +// } +// } // } //} // @@ -79,27 +95,36 @@ // return ALPHA * diff[i] > max(diff[ls[i]], diff[rs[i]]); //} // -//int add(int i, int num) { +//void add(int i, int f, int s, int num) { // if (i == 0) { -// i = ++cnt; -// key[i] = num; -// ls[i] = rs[i] = 0; -// key_count[i] = size[i] = diff[i] = 1; +// if (f == 0) { +// head = init(num); +// } else if (s == 0) { +// ls[f] = init(num); +// } else { +// rs[f] = init(num); +// } // } else { // if (key[i] == num) { // key_count[i]++; // } else if (key[i] > num) { -// ls[i] = add(ls[i], num); +// add(ls[i], i, 0, num); // } else { -// rs[i] = add(rs[i], num); +// add(rs[i], i, 1, num); +// } +// up(i); +// if (!balance(i)) { +// father = f; +// child = i; +// side = s; // } // } -// up(i); -// return balance(i) ? i : rebuild(i); //} // //void add(int num) { -// head = add(head, num); +// child = father = side = -1; +// add(head, 0, 0, num); +// rebuild(); //} // //int small(int i, int num) { @@ -148,21 +173,27 @@ // } //} // -//int remove(int i, int num) { +//void remove(int i, int f, int s, int num) { // if (key[i] == num) { // key_count[i]--; // } else if (key[i] > num) { -// ls[i] = remove(ls[i], num); +// remove(ls[i], i, 0, num); // } else { -// rs[i] = remove(rs[i], num); +// remove(rs[i], i, 1, num); // } // up(i); -// return balance(i) ? i : rebuild(i); +// if (!balance(i)) { +// child = i; +// father = f; +// side = s; +// } //} // //void remove(int num) { // if (getRank(num) != getRank(num + 1)) { -// head = remove(head, num); +// child = father = side = -1; +// remove(head, 0, 0, num); +// rebuild(); // } //} // @@ -182,7 +213,7 @@ // cin.tie(nullptr); // int n; // cin >> n; -// for (int i = 0; i < n; ++i) { +// for (int i = 1; i <= n; i++) { // int op, x; // cin >> op >> x; // if (op == 1) { diff --git a/src/class150/ShowDetails.java b/src/class150/ShowDetails.java index a6333bdf2..6980a1508 100644 --- a/src/class150/ShowDetails.java +++ b/src/class150/ShowDetails.java @@ -37,6 +37,24 @@ public class ShowDetails { public static int ci; + public static int child; + + public static int father; + + public static int side; + + public static int init(int num) { + key[++cnt] = num; + left[cnt] = right[cnt] = 0; + count[cnt] = size[cnt] = diff[cnt] = 1; + return cnt; + } + + public static void up(int i) { + size[i] = size[left[i]] + size[right[i]] + count[i]; + diff[i] = diff[left[i]] + diff[right[i]] + (count[i] > 0 ? 1 : 0); + } + public static void inorder(int i) { if (i != 0) { inorder(left[i]); @@ -47,11 +65,6 @@ public static void inorder(int i) { } } - public static void up(int i) { - size[i] = size[left[i]] + size[right[i]] + count[i]; - diff[i] = diff[left[i]] + diff[right[i]] + (count[i] > 0 ? 1 : 0); - } - public static int build(int l, int r) { if (l > r) { return 0; @@ -64,51 +77,58 @@ public static int build(int l, int r) { return h; } - public static int rebuild(int i) { - ci = 0; - inorder(i); - if (ci > 0) { - return build(1, ci); - } else { - return 0; + public static void rebuild() { + if (child != -1) { + ci = 0; + inorder(child); + if (ci > 0) { + // 统计重构节点的计数 + cost += ci; + if (father == 0) { + head = build(1, ci); + } else if (side == 0) { + left[father] = build(1, ci); + } else { + right[father] = build(1, ci); + } + } } } - // 一旦判断不平衡,接下来必然重构,所以统计总共有多少节点会重构 public static boolean balance(int i) { - if (ALPHA * diff[i] > Math.max(diff[left[i]], diff[right[i]])) { - return true; - } else { - cost += diff[i]; - return false; - } - } - - public static void add(int num) { - head = add(head, num); + return ALPHA * diff[i] > Math.max(diff[left[i]], diff[right[i]]); } - public static int add(int i, int num) { + public static void add(int i, int f, int s, int num) { if (i == 0) { - i = ++cnt; - key[i] = num; - left[i] = right[i] = 0; - count[i] = size[i] = diff[i] = 1; + if (f == 0) { + head = init(num); + } else if (s == 0) { + left[f] = init(num); + } else { + right[f] = init(num); + } } else { if (key[i] == num) { count[i]++; } else if (key[i] > num) { - left[i] = add(left[i], num); + add(left[i], i, 0, num); } else { - right[i] = add(right[i], num); + add(right[i], i, 1, num); + } + up(i); + if (!balance(i)) { + father = f; + child = i; + side = s; } } - up(i); - return balance(i) ? i : rebuild(i); } - public static int rank(int num) { - return small(head, num) + 1; + public static void add(int num) { + child = father = side = -1; + add(head, 0, 0, num); + rebuild(); } public static int small(int i, int num) { @@ -122,8 +142,8 @@ public static int small(int i, int num) { } } - public static int index(int x) { - return index(head, x); + public static int rank(int num) { + return small(head, num) + 1; } public static int index(int i, int x) { @@ -135,6 +155,10 @@ public static int index(int i, int x) { return key[i]; } + public static int index(int x) { + return index(head, x); + } + public static int pre(int num) { int kth = rank(num); if (kth == 1) { @@ -153,22 +177,28 @@ public static int post(int num) { } } - public static void remove(int num) { - if (rank(num) != rank(num + 1)) { - head = remove(head, num); - } - } - - public static int remove(int i, int num) { + public static void remove(int i, int f, int s, int num) { if (key[i] == num) { count[i]--; } else if (key[i] > num) { - left[i] = remove(left[i], num); + remove(left[i], i, 0, num); } else { - right[i] = remove(right[i], num); + remove(right[i], i, 1, num); } up(i); - return balance(i) ? i : rebuild(i); + if (!balance(i)) { + child = i; + father = f; + side = s; + } + } + + public static void remove(int num) { + if (rank(num) != rank(num + 1)) { + child = father = side = -1; + remove(head, 0, 0, num); + rebuild(); + } } public static void clear() { From 5176085d54eb938a21c703750ad1f4078e63c242 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 6 Nov 2024 14:49:06 +0800 Subject: [PATCH 0317/2029] modify code --- src/class150/ShowDetails.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class150/ShowDetails.java b/src/class150/ShowDetails.java index 6980a1508..6b6d3d9cc 100644 --- a/src/class150/ShowDetails.java +++ b/src/class150/ShowDetails.java @@ -1,6 +1,6 @@ package class150; -// 不同的平衡因子对替罪羊树产生的影响 +// 不同平衡因子对替罪羊树的影响实验 // 一旦, max(左树节点数,右树节点数) / 整树节点数 >= 平衡因子,就会发生重构 // 平衡因子不能小于0.5,不能大于1.0,因为无意义 // 当平衡因子等于0.5时树最平衡,即树高最小,此时查询效率高,但是重构的节点最多 From 363bcf9c57a4215441cb48b346e78a45e1a17b08 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 6 Nov 2024 15:44:25 +0800 Subject: [PATCH 0318/2029] modify code --- src/class150/ShowDetails.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/class150/ShowDetails.java b/src/class150/ShowDetails.java index 6b6d3d9cc..2b9e1406d 100644 --- a/src/class150/ShowDetails.java +++ b/src/class150/ShowDetails.java @@ -212,6 +212,7 @@ public static void clear() { head = 0; } + // 统计树高 public static int deep(int i) { if (i == 0) { return 0; @@ -219,16 +220,17 @@ public static int deep(int i) { return Math.max(deep(left[i]), deep(right[i])) + 1; } - public static int max, cost; + public static int max; + + public static int cost; public static void main(String[] args) { // 设置平衡因子 ALPHA = 0.7; // 设置插入范围 max = 10000; - // 清空重构节点计数 - cost = 0; System.out.println("测试开始"); + cost = 0; // 清空重构节点计数 for (int num = 1; num <= max; num++) { add(num); } From 51056c04d78c706ca60b9d07403b4c7740c1375b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 6 Nov 2024 15:47:49 +0800 Subject: [PATCH 0319/2029] modify code --- src/class150/ShowDetails.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class150/ShowDetails.java b/src/class150/ShowDetails.java index 2b9e1406d..cd997855e 100644 --- a/src/class150/ShowDetails.java +++ b/src/class150/ShowDetails.java @@ -1,6 +1,6 @@ package class150; -// 不同平衡因子对替罪羊树的影响实验 +// 平衡因子对替罪羊树影响的实验 // 一旦, max(左树节点数,右树节点数) / 整树节点数 >= 平衡因子,就会发生重构 // 平衡因子不能小于0.5,不能大于1.0,因为无意义 // 当平衡因子等于0.5时树最平衡,即树高最小,此时查询效率高,但是重构的节点最多 From 7feaa91b2b2d7b524f55ed425f22be73b5c8d987 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 6 Nov 2024 15:48:38 +0800 Subject: [PATCH 0320/2029] modify code --- src/class150/ShowDetails.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class150/ShowDetails.java b/src/class150/ShowDetails.java index cd997855e..3dda65a69 100644 --- a/src/class150/ShowDetails.java +++ b/src/class150/ShowDetails.java @@ -1,6 +1,6 @@ package class150; -// 平衡因子对替罪羊树影响的实验 +// 平衡因子影响替罪羊树的实验 // 一旦, max(左树节点数,右树节点数) / 整树节点数 >= 平衡因子,就会发生重构 // 平衡因子不能小于0.5,不能大于1.0,因为无意义 // 当平衡因子等于0.5时树最平衡,即树高最小,此时查询效率高,但是重构的节点最多 From bacf4c6b6970aca6b4b9472fb4739f7ef58da41d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 6 Nov 2024 15:50:32 +0800 Subject: [PATCH 0321/2029] modify code --- src/class150/ShowDetails.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class150/ShowDetails.java b/src/class150/ShowDetails.java index 3dda65a69..d31f4fd2b 100644 --- a/src/class150/ShowDetails.java +++ b/src/class150/ShowDetails.java @@ -4,10 +4,10 @@ // 一旦, max(左树节点数,右树节点数) / 整树节点数 >= 平衡因子,就会发生重构 // 平衡因子不能小于0.5,不能大于1.0,因为无意义 // 当平衡因子等于0.5时树最平衡,即树高最小,此时查询效率高,但是重构的节点最多 -// 当平衡因子等于1.0时树为线状,即树高最大,此时查询效率低,但是重构几乎不发生 +// 当平衡因子等于1.0时树为线状,即树高最大,此时查询效率低,但是重构不发生 // 为了保证查询效率,同时重构节点也不多,需要设置合适的平衡因子,一般0.7最常用 // 当平衡因子为0.7左右时,树高几乎是O(log n),这保证了查询效率 -// 同时重构的触发时机合适,重构节点不会特别多,均摊下来单次代价认为是O(log n) +// 同时重构的触发时机合适,重构节点不多,均摊下来,单次代价为O(log n) import java.util.Arrays; From 2da5f75cbf25b4bc8aeb037f8b4eaf216fe36e09 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 6 Nov 2024 15:52:43 +0800 Subject: [PATCH 0322/2029] modify code --- src/class150/ShowDetails.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/class150/ShowDetails.java b/src/class150/ShowDetails.java index d31f4fd2b..bd24c537c 100644 --- a/src/class150/ShowDetails.java +++ b/src/class150/ShowDetails.java @@ -3,11 +3,11 @@ // 平衡因子影响替罪羊树的实验 // 一旦, max(左树节点数,右树节点数) / 整树节点数 >= 平衡因子,就会发生重构 // 平衡因子不能小于0.5,不能大于1.0,因为无意义 -// 当平衡因子等于0.5时树最平衡,即树高最小,此时查询效率高,但是重构的节点最多 -// 当平衡因子等于1.0时树为线状,即树高最大,此时查询效率低,但是重构不发生 -// 为了保证查询效率,同时重构节点也不多,需要设置合适的平衡因子,一般0.7最常用 -// 当平衡因子为0.7左右时,树高几乎是O(log n),这保证了查询效率 -// 同时重构的触发时机合适,重构节点不多,均摊下来,单次代价为O(log n) +// 当平衡因子等于0.5时,树最平衡,树高最小,此时查询效率高,但是重构的节点最多 +// 当平衡因子等于1.0时,树为线状,树高最大,此时查询效率低,但是重构不发生 +// 保证查询效率,同时保证重构节点不多,需要设置合适的平衡因子,最常用为0.7 +// 平衡因子为0.7左右,树高几乎是O(log n),这保证了查询效率 +// 同时重构触发的时机合适,重构节点不多,均摊下来,单次代价为O(log n) import java.util.Arrays; From e03055c0c6e2dbb743840c74dc34fa06b157060e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 6 Nov 2024 16:04:28 +0800 Subject: [PATCH 0323/2029] modify code --- src/class150/ScapeGoat1.java | 6 +++-- src/class150/ScapeGoat2.java | 4 +--- src/class150/ShowDetails.java | 44 +++++++++++++++++------------------ 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/class150/ScapeGoat1.java b/src/class150/ScapeGoat1.java index 6467c1b83..05bb0e75f 100644 --- a/src/class150/ScapeGoat1.java +++ b/src/class150/ScapeGoat1.java @@ -23,10 +23,12 @@ public class ScapeGoat1 { - public static int MAXN = 100001; - + // 平衡因子 public static double ALPHA = 0.7; + // 空间的最大使用量 + public static int MAXN = 100001; + // 整棵树的头节点编号 public static int head = 0; diff --git a/src/class150/ScapeGoat2.java b/src/class150/ScapeGoat2.java index 15f120fe8..8f7c55603 100644 --- a/src/class150/ScapeGoat2.java +++ b/src/class150/ScapeGoat2.java @@ -23,10 +23,8 @@ // //using namespace std; // -//const int MAXN = 100001; -// //const double ALPHA = 0.7; -// +//const int MAXN = 100001; //int head = 0; //int cnt = 0; //int key[MAXN]; diff --git a/src/class150/ShowDetails.java b/src/class150/ShowDetails.java index bd24c537c..1a534ea56 100644 --- a/src/class150/ShowDetails.java +++ b/src/class150/ShowDetails.java @@ -13,10 +13,31 @@ public class ShowDetails { - public static int MAXN = 100001; + public static void main(String[] args) { + // 设置平衡因子 + ALPHA = 0.7; + // 设置插入范围 + max = 10000; + System.out.println("测试开始"); + cost = 0; // 清空重构节点计数 + for (int num = 1; num <= max; num++) { + add(num); + } + System.out.println("依次插入 1 到 " + max); + System.out.println("平衡因子 : " + ALPHA); + System.out.println("重构节点总数 : " + cost); + System.out.println("树高 : " + deep(head)); + System.out.println("测试结束"); + } public static double ALPHA = 0.7; + public static int max; + + public static int cost; + + public static int MAXN = 100001; + public static int head = 0; public static int cnt = 0; @@ -220,25 +241,4 @@ public static int deep(int i) { return Math.max(deep(left[i]), deep(right[i])) + 1; } - public static int max; - - public static int cost; - - public static void main(String[] args) { - // 设置平衡因子 - ALPHA = 0.7; - // 设置插入范围 - max = 10000; - System.out.println("测试开始"); - cost = 0; // 清空重构节点计数 - for (int num = 1; num <= max; num++) { - add(num); - } - System.out.println("依次插入 1 到 " + max); - System.out.println("平衡因子 : " + ALPHA); - System.out.println("重构节点总数 : " + cost); - System.out.println("树高 : " + deep(head)); - System.out.println("测试结束"); - } - } From c62c5f16d41782a389d0418f0e39dc56010aae6f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 6 Nov 2024 16:36:24 +0800 Subject: [PATCH 0324/2029] modify code --- src/class150/ShowDetails.java | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/src/class150/ShowDetails.java b/src/class150/ShowDetails.java index 1a534ea56..433f8d0cd 100644 --- a/src/class150/ShowDetails.java +++ b/src/class150/ShowDetails.java @@ -14,10 +14,8 @@ public class ShowDetails { public static void main(String[] args) { - // 设置平衡因子 - ALPHA = 0.7; - // 设置插入范围 - max = 10000; + ALPHA = 0.7; // 设置平衡因子 + max = 10000; // 设置插入范围 System.out.println("测试开始"); cost = 0; // 清空重构节点计数 for (int num = 1; num <= max; num++) { @@ -25,17 +23,25 @@ public static void main(String[] args) { } System.out.println("依次插入 1 到 " + max); System.out.println("平衡因子 : " + ALPHA); - System.out.println("重构节点总数 : " + cost); - System.out.println("树高 : " + deep(head)); + System.out.println("树的高度 : " + deep(head)); + System.out.println("重构节点 : " + cost); System.out.println("测试结束"); } - public static double ALPHA = 0.7; + // 统计树高 + public static int deep(int i) { + if (i == 0) { + return 0; + } + return Math.max(deep(left[i]), deep(right[i])) + 1; + } public static int max; public static int cost; + public static double ALPHA = 0.7; + public static int MAXN = 100001; public static int head = 0; @@ -103,8 +109,7 @@ public static void rebuild() { ci = 0; inorder(child); if (ci > 0) { - // 统计重构节点的计数 - cost += ci; + cost += ci; // 统计重构节点的计数 if (father == 0) { head = build(1, ci); } else if (side == 0) { @@ -233,12 +238,4 @@ public static void clear() { head = 0; } - // 统计树高 - public static int deep(int i) { - if (i == 0) { - return 0; - } - return Math.max(deep(left[i]), deep(right[i])) + 1; - } - } From 46191c5451994c6506ca3a498732f4a30d66729e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 6 Nov 2024 16:39:38 +0800 Subject: [PATCH 0325/2029] modify code --- src/class150/ShowDetails.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class150/ShowDetails.java b/src/class150/ShowDetails.java index 433f8d0cd..32bac6348 100644 --- a/src/class150/ShowDetails.java +++ b/src/class150/ShowDetails.java @@ -3,9 +3,9 @@ // 平衡因子影响替罪羊树的实验 // 一旦, max(左树节点数,右树节点数) / 整树节点数 >= 平衡因子,就会发生重构 // 平衡因子不能小于0.5,不能大于1.0,因为无意义 -// 当平衡因子等于0.5时,树最平衡,树高最小,此时查询效率高,但是重构的节点最多 -// 当平衡因子等于1.0时,树为线状,树高最大,此时查询效率低,但是重构不发生 -// 保证查询效率,同时保证重构节点不多,需要设置合适的平衡因子,最常用为0.7 +// 平衡因子等于0.5时,树最平衡,树高最小,此时查询效率高,但是重构的节点最多 +// 平衡因子等于1.0时,树为线状,树高最大,此时查询效率低,但是重构不发生 +// 保证查询效率,同时保证重构节点不多,需要设置合适的平衡因子,0.7最常用 // 平衡因子为0.7左右,树高几乎是O(log n),这保证了查询效率 // 同时重构触发的时机合适,重构节点不多,均摊下来,单次代价为O(log n) @@ -21,7 +21,7 @@ public static void main(String[] args) { for (int num = 1; num <= max; num++) { add(num); } - System.out.println("依次插入 1 到 " + max); + System.out.println("插入数字 : " + "1 ~ " + max); System.out.println("平衡因子 : " + ALPHA); System.out.println("树的高度 : " + deep(head)); System.out.println("重构节点 : " + cost); From 2e2ede5df33f3b5b8c518c00f9b84e003d48501b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 7 Nov 2024 13:47:31 +0800 Subject: [PATCH 0326/2029] modify code --- src/class150/ScapeGoat1.java | 33 ++++++++++++++++----------------- src/class150/ScapeGoat2.java | 26 +++++++++++++------------- src/class150/ShowDetails.java | 31 ++++++++++++++++--------------- 3 files changed, 45 insertions(+), 45 deletions(-) diff --git a/src/class150/ScapeGoat1.java b/src/class150/ScapeGoat1.java index 05bb0e75f..5b1c3fff8 100644 --- a/src/class150/ScapeGoat1.java +++ b/src/class150/ScapeGoat1.java @@ -59,14 +59,13 @@ public class ScapeGoat1 { // 中序收集节点的计数 public static int ci; - // 最上方不平衡的节点 - public static int child; + // 最上方的不平衡节点 + public static int top; - // 最上方不平衡节点的父节点 + // top的父节点 public static int father; - // 最上方不平衡的节点是其父节点的什么孩子 - // 0代表左孩子,1代表右孩子 + // top是父节点的什么孩子,1代表左孩子,2代表右孩子 public static int side; public static int init(int num) { @@ -104,13 +103,13 @@ public static int build(int l, int r) { } public static void rebuild() { - if (child != -1) { + if (top != 0) { ci = 0; - inorder(child); + inorder(top); if (ci > 0) { if (father == 0) { head = build(1, ci); - } else if (side == 0) { + } else if (side == 1) { left[father] = build(1, ci); } else { right[father] = build(1, ci); @@ -127,7 +126,7 @@ public static void add(int i, int f, int s, int num) { if (i == 0) { if (f == 0) { head = init(num); - } else if (s == 0) { + } else if (s == 1) { left[f] = init(num); } else { right[f] = init(num); @@ -136,21 +135,21 @@ public static void add(int i, int f, int s, int num) { if (key[i] == num) { count[i]++; } else if (key[i] > num) { - add(left[i], i, 0, num); + add(left[i], i, 1, num); } else { - add(right[i], i, 1, num); + add(right[i], i, 2, num); } up(i); if (!balance(i)) { + top = i; father = f; - child = i; side = s; } } } public static void add(int num) { - child = father = side = -1; + top = father = side = 0; add(head, 0, 0, num); rebuild(); } @@ -205,13 +204,13 @@ public static void remove(int i, int f, int s, int num) { if (key[i] == num) { count[i]--; } else if (key[i] > num) { - remove(left[i], i, 0, num); + remove(left[i], i, 1, num); } else { - remove(right[i], i, 1, num); + remove(right[i], i, 2, num); } up(i); if (!balance(i)) { - child = i; + top = i; father = f; side = s; } @@ -219,7 +218,7 @@ public static void remove(int i, int f, int s, int num) { public static void remove(int num) { if (rank(num) != rank(num + 1)) { - child = father = side = -1; + top = father = side = 0; remove(head, 0, 0, num); rebuild(); } diff --git a/src/class150/ScapeGoat2.java b/src/class150/ScapeGoat2.java index 8f7c55603..d0a9f3dd6 100644 --- a/src/class150/ScapeGoat2.java +++ b/src/class150/ScapeGoat2.java @@ -35,7 +35,7 @@ //int diff[MAXN]; //int collect[MAXN]; //int ci; -//int child; +//int top; //int father; //int side; // @@ -74,13 +74,13 @@ //} // //void rebuild() { -// if (child != -1) { +// if (top != 0) { // ci = 0; -// inorder(child); +// inorder(top); // if (ci > 0) { // if (father == 0) { // head = build(1, ci); -// } else if (side == 0) { +// } else if (side == 1) { // ls[father] = build(1, ci); // } else { // rs[father] = build(1, ci); @@ -97,7 +97,7 @@ // if (i == 0) { // if (f == 0) { // head = init(num); -// } else if (s == 0) { +// } else if (s == 1) { // ls[f] = init(num); // } else { // rs[f] = init(num); @@ -106,21 +106,21 @@ // if (key[i] == num) { // key_count[i]++; // } else if (key[i] > num) { -// add(ls[i], i, 0, num); +// add(ls[i], i, 1, num); // } else { -// add(rs[i], i, 1, num); +// add(rs[i], i, 2, num); // } // up(i); // if (!balance(i)) { +// top = i; // father = f; -// child = i; // side = s; // } // } //} // //void add(int num) { -// child = father = side = -1; +// top = father = side = 0; // add(head, 0, 0, num); // rebuild(); //} @@ -175,13 +175,13 @@ // if (key[i] == num) { // key_count[i]--; // } else if (key[i] > num) { -// remove(ls[i], i, 0, num); +// remove(ls[i], i, 1, num); // } else { -// remove(rs[i], i, 1, num); +// remove(rs[i], i, 2, num); // } // up(i); // if (!balance(i)) { -// child = i; +// top = i; // father = f; // side = s; // } @@ -189,7 +189,7 @@ // //void remove(int num) { // if (getRank(num) != getRank(num + 1)) { -// child = father = side = -1; +// top = father = side = 0; // remove(head, 0, 0, num); // rebuild(); // } diff --git a/src/class150/ShowDetails.java b/src/class150/ShowDetails.java index 32bac6348..eeb6d8d2f 100644 --- a/src/class150/ShowDetails.java +++ b/src/class150/ShowDetails.java @@ -26,6 +26,7 @@ public static void main(String[] args) { System.out.println("树的高度 : " + deep(head)); System.out.println("重构节点 : " + cost); System.out.println("测试结束"); + clear(); } // 统计树高 @@ -64,7 +65,7 @@ public static int deep(int i) { public static int ci; - public static int child; + public static int top; public static int father; @@ -105,14 +106,14 @@ public static int build(int l, int r) { } public static void rebuild() { - if (child != -1) { + if (top != 0) { ci = 0; - inorder(child); + inorder(top); if (ci > 0) { - cost += ci; // 统计重构节点的计数 + cost += ci; // 统计重构节点数 if (father == 0) { head = build(1, ci); - } else if (side == 0) { + } else if (side == 1) { left[father] = build(1, ci); } else { right[father] = build(1, ci); @@ -129,7 +130,7 @@ public static void add(int i, int f, int s, int num) { if (i == 0) { if (f == 0) { head = init(num); - } else if (s == 0) { + } else if (s == 1) { left[f] = init(num); } else { right[f] = init(num); @@ -138,21 +139,21 @@ public static void add(int i, int f, int s, int num) { if (key[i] == num) { count[i]++; } else if (key[i] > num) { - add(left[i], i, 0, num); + add(left[i], i, 1, num); } else { - add(right[i], i, 1, num); + add(right[i], i, 2, num); } up(i); if (!balance(i)) { + top = i; father = f; - child = i; side = s; } } } public static void add(int num) { - child = father = side = -1; + top = father = side = 0; add(head, 0, 0, num); rebuild(); } @@ -207,13 +208,13 @@ public static void remove(int i, int f, int s, int num) { if (key[i] == num) { count[i]--; } else if (key[i] > num) { - remove(left[i], i, 0, num); + remove(left[i], i, 1, num); } else { - remove(right[i], i, 1, num); + remove(right[i], i, 2, num); } up(i); if (!balance(i)) { - child = i; + top = i; father = f; side = s; } @@ -221,7 +222,7 @@ public static void remove(int i, int f, int s, int num) { public static void remove(int num) { if (rank(num) != rank(num + 1)) { - child = father = side = -1; + top = father = side = 0; remove(head, 0, 0, num); rebuild(); } @@ -238,4 +239,4 @@ public static void clear() { head = 0; } -} +} \ No newline at end of file From d3ca2c522b78e7c522faf77bf8bc63eb3579ccba Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 7 Nov 2024 13:49:50 +0800 Subject: [PATCH 0327/2029] modify code --- src/class150/ShowDetails.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class150/ShowDetails.java b/src/class150/ShowDetails.java index eeb6d8d2f..c58bfcf06 100644 --- a/src/class150/ShowDetails.java +++ b/src/class150/ShowDetails.java @@ -21,7 +21,7 @@ public static void main(String[] args) { for (int num = 1; num <= max; num++) { add(num); } - System.out.println("插入数字 : " + "1 ~ " + max); + System.out.println("插入数字 : " + "1~" + max); System.out.println("平衡因子 : " + ALPHA); System.out.println("树的高度 : " + deep(head)); System.out.println("重构节点 : " + cost); From 3172f2a770f986502501ba891702700257dd8210 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 7 Nov 2024 15:51:35 +0800 Subject: [PATCH 0328/2029] modify code --- src/class150/ScapeGoat1.java | 2 +- src/class150/ScapeGoat2.java | 2 +- src/class150/ShowDetails.java | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class150/ScapeGoat1.java b/src/class150/ScapeGoat1.java index 5b1c3fff8..71a5e5b21 100644 --- a/src/class150/ScapeGoat1.java +++ b/src/class150/ScapeGoat1.java @@ -119,7 +119,7 @@ public static void rebuild() { } public static boolean balance(int i) { - return ALPHA * diff[i] > Math.max(diff[left[i]], diff[right[i]]); + return ALPHA * diff[i] >= Math.max(diff[left[i]], diff[right[i]]); } public static void add(int i, int f, int s, int num) { diff --git a/src/class150/ScapeGoat2.java b/src/class150/ScapeGoat2.java index d0a9f3dd6..16bfe5f75 100644 --- a/src/class150/ScapeGoat2.java +++ b/src/class150/ScapeGoat2.java @@ -90,7 +90,7 @@ //} // //bool balance(int i) { -// return ALPHA * diff[i] > max(diff[ls[i]], diff[rs[i]]); +// return ALPHA * diff[i] >= max(diff[ls[i]], diff[rs[i]]); //} // //void add(int i, int f, int s, int num) { diff --git a/src/class150/ShowDetails.java b/src/class150/ShowDetails.java index c58bfcf06..a972e7ac6 100644 --- a/src/class150/ShowDetails.java +++ b/src/class150/ShowDetails.java @@ -1,7 +1,7 @@ package class150; // 平衡因子影响替罪羊树的实验 -// 一旦, max(左树节点数,右树节点数) / 整树节点数 >= 平衡因子,就会发生重构 +// 一旦,max(左树节点数,右树节点数) > 平衡因子 * 整树节点数,就会发生重构 // 平衡因子不能小于0.5,不能大于1.0,因为无意义 // 平衡因子等于0.5时,树最平衡,树高最小,此时查询效率高,但是重构的节点最多 // 平衡因子等于1.0时,树为线状,树高最大,此时查询效率低,但是重构不发生 @@ -123,7 +123,7 @@ public static void rebuild() { } public static boolean balance(int i) { - return ALPHA * diff[i] > Math.max(diff[left[i]], diff[right[i]]); + return ALPHA * diff[i] >= Math.max(diff[left[i]], diff[right[i]]); } public static void add(int i, int f, int s, int num) { From 82a3704a6e95e4b088591db2d6a6c8a0aed29f21 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 7 Nov 2024 15:54:35 +0800 Subject: [PATCH 0329/2029] modify code --- src/class150/ShowDetails.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/class150/ShowDetails.java b/src/class150/ShowDetails.java index a972e7ac6..a70c57d4c 100644 --- a/src/class150/ShowDetails.java +++ b/src/class150/ShowDetails.java @@ -2,9 +2,9 @@ // 平衡因子影响替罪羊树的实验 // 一旦,max(左树节点数,右树节点数) > 平衡因子 * 整树节点数,就会发生重构 -// 平衡因子不能小于0.5,不能大于1.0,因为无意义 -// 平衡因子等于0.5时,树最平衡,树高最小,此时查询效率高,但是重构的节点最多 -// 平衡因子等于1.0时,树为线状,树高最大,此时查询效率低,但是重构不发生 +// 平衡因子范围是(0.5, 1.0),否则无意义 +// 平衡因子等于0.5时,树最平衡,树高很小,查询效率高,但是重构发生很频繁 +// 平衡因子等于1.0时,树为线状,树高很大,重构完全不发生,但是查询效率低 // 保证查询效率,同时保证重构节点不多,需要设置合适的平衡因子,0.7最常用 // 平衡因子为0.7左右,树高几乎是O(log n),这保证了查询效率 // 同时重构触发的时机合适,重构节点不多,均摊下来,单次代价为O(log n) From a2719becc9b419b3c2097886343a0753595a32a4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 7 Nov 2024 15:56:15 +0800 Subject: [PATCH 0330/2029] modify code --- src/class150/ShowDetails.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/class150/ShowDetails.java b/src/class150/ShowDetails.java index a70c57d4c..4d99f3a0d 100644 --- a/src/class150/ShowDetails.java +++ b/src/class150/ShowDetails.java @@ -3,9 +3,9 @@ // 平衡因子影响替罪羊树的实验 // 一旦,max(左树节点数,右树节点数) > 平衡因子 * 整树节点数,就会发生重构 // 平衡因子范围是(0.5, 1.0),否则无意义 -// 平衡因子等于0.5时,树最平衡,树高很小,查询效率高,但是重构发生很频繁 -// 平衡因子等于1.0时,树为线状,树高很大,重构完全不发生,但是查询效率低 -// 保证查询效率,同时保证重构节点不多,需要设置合适的平衡因子,0.7最常用 +// 平衡因子等于0.5时,树高很小,查询效率高,但是重构发生很频繁 +// 平衡因子等于1.0时,树高很大,重构完全不发生,但是查询效率低 +// 保证查询效率、同时保证重构节点总数不多,0.7为最常用的平衡因子 // 平衡因子为0.7左右,树高几乎是O(log n),这保证了查询效率 // 同时重构触发的时机合适,重构节点不多,均摊下来,单次代价为O(log n) From 18d0b87cbc81d2064ef55e174e547018af2803c0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 7 Nov 2024 15:59:44 +0800 Subject: [PATCH 0331/2029] modify code --- src/class150/ShowDetails.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class150/ShowDetails.java b/src/class150/ShowDetails.java index 4d99f3a0d..546b884a2 100644 --- a/src/class150/ShowDetails.java +++ b/src/class150/ShowDetails.java @@ -4,10 +4,10 @@ // 一旦,max(左树节点数,右树节点数) > 平衡因子 * 整树节点数,就会发生重构 // 平衡因子范围是(0.5, 1.0),否则无意义 // 平衡因子等于0.5时,树高很小,查询效率高,但是重构发生很频繁 -// 平衡因子等于1.0时,树高很大,重构完全不发生,但是查询效率低 -// 保证查询效率、同时保证重构节点总数不多,0.7为最常用的平衡因子 -// 平衡因子为0.7左右,树高几乎是O(log n),这保证了查询效率 -// 同时重构触发的时机合适,重构节点不多,均摊下来,单次代价为O(log n) +// 平衡因子等于1.0时,重构完全不发生,但是树高很大,查询效率低 +// 保证查询效率、同时保证重构的节点总数不多,0.7为最常用的平衡因子 +// 这保证了查询效率,因为树高几乎是O(log n) +// 同时重构触发的时机合适,单次调整的均摊代价为O(log n) import java.util.Arrays; From f214392353ec96ed15b74915d55139790dd7d702 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 7 Nov 2024 16:25:01 +0800 Subject: [PATCH 0332/2029] modify code --- src/class150/ScapeGoat1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class150/ScapeGoat1.java b/src/class150/ScapeGoat1.java index 71a5e5b21..e69f3bec3 100644 --- a/src/class150/ScapeGoat1.java +++ b/src/class150/ScapeGoat1.java @@ -32,7 +32,7 @@ public class ScapeGoat1 { // 整棵树的头节点编号 public static int head = 0; - // 空间使用编号 + // 空间使用计数 public static int cnt = 0; // 节点的key值 From 2f701839248d4e0e90f6c13c83ce49130e46ba89 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 7 Nov 2024 18:01:01 +0800 Subject: [PATCH 0333/2029] modify code --- ...77\347\275\252\347\276\212\346\240\221.pptx" | Bin 0 -> 39862 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "ppt/\347\256\227\346\263\225\350\256\262\350\247\243150\343\200\220\346\211\251\345\261\225\343\200\221\346\234\211\345\272\217\350\241\250\344\270\223\351\242\2303-\346\233\277\347\275\252\347\276\212\346\240\221.pptx" diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243150\343\200\220\346\211\251\345\261\225\343\200\221\346\234\211\345\272\217\350\241\250\344\270\223\351\242\2303-\346\233\277\347\275\252\347\276\212\346\240\221.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243150\343\200\220\346\211\251\345\261\225\343\200\221\346\234\211\345\272\217\350\241\250\344\270\223\351\242\2303-\346\233\277\347\275\252\347\276\212\346\240\221.pptx" new file mode 100644 index 0000000000000000000000000000000000000000..2dcf48a2f82d308ef1bf6a4c2e148da7cb1928db GIT binary patch literal 39862 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 L^_>#(>(l=M0oGs( literal 0 HcmV?d00001 From 5cd83c2a4974a169daa9441bbc7487580069850b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 8 Nov 2024 14:51:13 +0800 Subject: [PATCH 0334/2029] modify code --- src/class073/Code03_TargetSum.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class073/Code03_TargetSum.java b/src/class073/Code03_TargetSum.java index 5b72c2caf..86d0c4698 100644 --- a/src/class073/Code03_TargetSum.java +++ b/src/class073/Code03_TargetSum.java @@ -122,7 +122,7 @@ public static int findTargetSumWays3(int[] nums, int target) { // 那么就一定对应一种target的方式 // 比如非负数组nums,target = 1, nums所有数累加和是11 // 求有多少方法组成1,其实就是求,有多少种子集累加和达到6的方法,(1+11)/2=6 - // 因为,子集累加和6 - 另一半的子集累加和5 = 1(target) + // 因为,子集累加和6 - 另一半的子集累加和5 = 1(target) // 所以有多少个累加和为6的不同集合,就代表有多少个target==1的表达式数量 // 至此已经转化为01背包问题了 public static int findTargetSumWays4(int[] nums, int target) { From 6c715ac12b3a5758733e97dd90613e63873d9a92 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 11 Nov 2024 13:20:45 +0800 Subject: [PATCH 0335/2029] modify code --- src/class151/Code01_DescartesTree1.java | 71 +++++++++++++++++++++++++ src/class151/Code01_DescartesTree2.java | 58 ++++++++++++++++++++ 2 files changed, 129 insertions(+) create mode 100644 src/class151/Code01_DescartesTree1.java create mode 100644 src/class151/Code01_DescartesTree2.java diff --git a/src/class151/Code01_DescartesTree1.java b/src/class151/Code01_DescartesTree1.java new file mode 100644 index 000000000..4e3713bcb --- /dev/null +++ b/src/class151/Code01_DescartesTree1.java @@ -0,0 +1,71 @@ +package class151; + +// 笛卡尔树模版(java版) +// 测试链接 : https://www.luogu.com.cn/problem/P5854 +// 如下实现是正确的,但java的版本无法通过所有测试用例 +// 这是洛谷平台没有照顾各种语言的实现所导致的 +// C++版本是Code01_DescartesTree2文件 +// C++版本和java版本逻辑完全一样,可以通过所有测试用例 +// 在真正笔试、比赛时,一定是兼顾各种语言的,该实现是一定正确的 + +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 Code01_DescartesTree1 { + + public static int MAXN = 10000001; + + public static int[] left = new int[MAXN]; + + public static int[] right = new int[MAXN]; + + public static int[] arr = new int[MAXN]; + + public static int[] stack = new int[MAXN]; + + public static int n; + + public static void build() { + for (int i = 1, top = 0, pos = 0; i <= n; i++) { + pos = top; + while (pos > 0 && arr[stack[pos]] > arr[i]) { + pos--; + } + if (pos > 0) { + right[stack[pos]] = i; + } + if (pos < top) { + left[i] = stack[pos + 1]; + } + stack[++pos] = i; + top = pos; + } + } + + 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; + for (int i = 1; i <= n; i++) { + in.nextToken(); + arr[i] = (int) in.nval; + } + build(); + long ans1 = 0, ans2 = 0; + for (int i = 1; i <= n; i++) { + ans1 ^= (long) i * (left[i] + 1); + ans2 ^= (long) i * (right[i] + 1); + } + out.println(ans1 + " " + ans2); + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class151/Code01_DescartesTree2.java b/src/class151/Code01_DescartesTree2.java new file mode 100644 index 000000000..78e1b335d --- /dev/null +++ b/src/class151/Code01_DescartesTree2.java @@ -0,0 +1,58 @@ +package class151; + +// 笛卡尔树模版(java版) +// 测试链接 : https://www.luogu.com.cn/problem/P5854 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +//#include +//#include +//#include +// +//#define LL long long +// +//using namespace std; +// +//const int MAXN = 10000001; +// +//int arr[MAXN]; +//int ls[MAXN]; +//int rs[MAXN]; +//int sta[MAXN]; +//int n; +// +//void build() { +// int top = 0; +// for (int i = 1; i <= n; i++) { +// int pos = top; +// while (pos > 0 && arr[sta[pos]] > arr[i]) { +// pos--; +// } +// if (pos > 0) { +// rs[sta[pos]] = i; +// } +// if (pos < top) { +// ls[i] = sta[pos + 1]; +// } +// sta[++pos] = i; +// top = pos; +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// build(); +// long long ans1 = 0, ans2 = 0; +// for (int i = 1; i <= n; i++) { +// ans1 ^= 1LL * i * (ls[i] + 1); +// ans2 ^= 1LL * i * (rs[i] + 1); +// } +// cout << ans1 << " " << ans2 << endl; +// return 0; +//} \ No newline at end of file From 8eb59f96bb579a1bf4562710e28ebc29ff6d897e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 11 Nov 2024 13:46:59 +0800 Subject: [PATCH 0336/2029] modify code --- src/class151/Code01_DescartesTree2.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class151/Code01_DescartesTree2.java b/src/class151/Code01_DescartesTree2.java index 78e1b335d..c338c8699 100644 --- a/src/class151/Code01_DescartesTree2.java +++ b/src/class151/Code01_DescartesTree2.java @@ -1,6 +1,6 @@ package class151; -// 笛卡尔树模版(java版) +// 笛卡尔树模版(C++版) // 测试链接 : https://www.luogu.com.cn/problem/P5854 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From 2f7a431140c54c468550c52d46534871634a49fa Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 11 Nov 2024 16:02:44 +0800 Subject: [PATCH 0337/2029] modify code --- src/class151/Code02_TreeOrder.java | 80 ++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 src/class151/Code02_TreeOrder.java diff --git a/src/class151/Code02_TreeOrder.java b/src/class151/Code02_TreeOrder.java new file mode 100644 index 000000000..a38e4611e --- /dev/null +++ b/src/class151/Code02_TreeOrder.java @@ -0,0 +1,80 @@ +package class151; + +// 树的序 +// 测试链接 : https://www.luogu.com.cn/problem/P1377 +// 提交以下的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 Code02_TreeOrder { + + public static int MAXN = 100001; + + public static int[] left = new int[MAXN]; + + public static int[] right = new int[MAXN]; + + public static int[] arr = new int[MAXN]; + + public static int[] stack = new int[MAXN]; + + public static int n; + + public static void build() { + for (int i = 1, top = 0, pos = 0; i <= n; i++) { + pos = top; + while (pos > 0 && arr[stack[pos]] > arr[i]) { + pos--; + } + if (pos > 0) { + right[stack[pos]] = i; + } + if (pos < top) { + left[i] = stack[pos + 1]; + } + stack[++pos] = i; + top = pos; + } + } + + // 防止递归爆栈用迭代的方式实现先序遍历 + public static void pre() { + int size = 1, i = 0, cur; + while (size > 0) { + cur = stack[size--]; + arr[++i] = cur; + if (right[cur] != 0) { + stack[++size] = right[cur]; + } + if (left[cur] != 0) { + stack[++size] = left[cur]; + } + } + } + + 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; + for (int i = 1; i <= n; i++) { + in.nextToken(); + arr[(int) in.nval] = i; + } + build(); + pre(); + for (int i = 1; i <= n; i++) { + out.print(arr[i] + " "); + } + out.flush(); + out.close(); + br.close(); + } + +} From d79da2d0aae909e014d547b3b30441ba9a2376be Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 11 Nov 2024 17:37:19 +0800 Subject: [PATCH 0338/2029] modify code --- src/class151/Code03_CountingProblem.java | 105 +++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 src/class151/Code03_CountingProblem.java diff --git a/src/class151/Code03_CountingProblem.java b/src/class151/Code03_CountingProblem.java new file mode 100644 index 000000000..437b19470 --- /dev/null +++ b/src/class151/Code03_CountingProblem.java @@ -0,0 +1,105 @@ +package class151; + +// 序列计数 +// 测试链接 : https://www.luogu.com.cn/problem/CF1748E +// 测试链接 : https://codeforces.com/problemset/problem/1748/E +// 提交以下的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_CountingProblem { + + public static int MAXN = 1000001; + + public static int MOD = 1000000007; + + public static int[] arr = new int[MAXN]; + + public static int[] left = new int[MAXN]; + + public static int[] right = new int[MAXN]; + + public static int[] stack = new int[MAXN]; + + public static int n, m; + + public static void build() { + for (int i = 1, top = 0, pos; i <= n; i++) { + pos = top; + while (pos > 0 && arr[stack[pos]] < arr[i]) { + pos--; + } + if (pos > 0) { + right[stack[pos]] = i; + } + if (pos < top) { + left[i] = stack[pos + 1]; + } + stack[++pos] = i; + top = pos; + } + } + + public static long compute() { + long[][] dp = new long[n + 1][m + 1]; + dfs(stack[1], dp); + return dp[stack[1]][m]; + } + + public static void dfs(int i, long[][] dp) { + for (int j = 1; j <= m; j++) { + dp[i][j] = 1; + } + if (left[i] != 0) { + dfs(left[i], dp); + for (int j = 1; j <= m; j++) { + dp[i][j] = dp[i][j] * dp[left[i]][j - 1] % MOD; + } + } + if (right[i] != 0) { + dfs(right[i], dp); + for (int j = 1; j <= m; j++) { + dp[i][j] = dp[i][j] * dp[right[i]][j] % MOD; + } + } + for (int j = 2; j <= m; j++) { + dp[i][j] = (dp[i][j] + dp[i][j - 1]) % MOD; + } + } + + public static void clear() { + Arrays.fill(left, 1, n + 1, 0); + Arrays.fill(right, 1, n + 1, 0); + } + + 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(); + int cases = (int) in.nval; + for (int t = 1; t <= cases; t++) { + in.nextToken(); + n = (int) in.nval; + in.nextToken(); + m = (int) in.nval; + for (int i = 1; i <= n; i++) { + in.nextToken(); + arr[i] = (int) in.nval; + } + build(); + out.println(compute()); + clear(); + } + out.flush(); + out.close(); + br.close(); + } + +} From 75e3a5918a950e549d0fea0e007ce60d9c836541 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 12 Nov 2024 14:32:02 +0800 Subject: [PATCH 0339/2029] modify code --- src/class043/Code02_SuperPalindromes.java | 1 + src/class043/Code02_SuperPalindromesCPP1.java | 85 +++++++++++++++++++ src/class043/Code02_SuperPalindromesCPP2.java | 66 ++++++++++++++ 3 files changed, 152 insertions(+) create mode 100644 src/class043/Code02_SuperPalindromesCPP1.java create mode 100644 src/class043/Code02_SuperPalindromesCPP2.java diff --git a/src/class043/Code02_SuperPalindromes.java b/src/class043/Code02_SuperPalindromes.java index 482449445..53adf94cb 100644 --- a/src/class043/Code02_SuperPalindromes.java +++ b/src/class043/Code02_SuperPalindromes.java @@ -3,6 +3,7 @@ import java.util.ArrayList; import java.util.List; +// 超级回文数(java版) // 如果一个正整数自身是回文数,而且它也是一个回文数的平方,那么我们称这个数为超级回文数。 // 现在,给定两个正整数 L 和 R (以字符串形式表示), // 返回包含在范围 [L, R] 中的超级回文数的数目。 diff --git a/src/class043/Code02_SuperPalindromesCPP1.java b/src/class043/Code02_SuperPalindromesCPP1.java new file mode 100644 index 000000000..6547fafcf --- /dev/null +++ b/src/class043/Code02_SuperPalindromesCPP1.java @@ -0,0 +1,85 @@ +package class043; + +// 超级回文数(superpalindromesInRange1方法C++版本) +// 如果一个正整数自身是回文数,而且它也是一个回文数的平方,那么我们称这个数为超级回文数。 +// 现在,给定两个正整数 L 和 R (以字符串形式表示), +// 返回包含在范围 [L, R] 中的超级回文数的数目。 +// 1 <= len(L) <= 18 +// 1 <= len(R) <= 18 +// L 和 R 是表示 [1, 10^18) 范围的整数的字符串 +// 测试链接 : https://leetcode.cn/problems/super-palindromes/ +// 如下实现是课上讲的superpalindromesInRange1方法的C++版本,提交如下代码可以直接通过 + +//#include +//#include +//#include +// +//using namespace std; +// +//class Solution { +//public: +// int superpalindromesInRange(string left, string right) { +// long long l = stoll(left); +// long long r = stoll(right); +// long long limit = static_cast(sqrt(r)); +// long long seed = 1; +// long long num = 0; +// int ans = 0; +// do { +// num = evenEnlarge(seed); +// if (num <= limit && safeSquare(num) && check(num * num, l, r)) { +// ans++; +// } +// num = oddEnlarge(seed); +// if (num <= limit && safeSquare(num) && check(num * num, l, r)) { +// ans++; +// } +// seed++; +// } while (num < limit); +// +// return ans; +// } +// +//private: +// bool safeSquare(long long num) { +// return num <= static_cast(sqrt(numeric_limits::max())); +// } +// +// long long evenEnlarge(long long seed) { +// long long ans = seed; +// while (seed != 0) { +// ans = ans * 10 + seed % 10; +// seed /= 10; +// } +// return ans; +// } +// +// long long oddEnlarge(long long seed) { +// long long ans = seed; +// seed /= 10; +// while (seed != 0) { +// ans = ans * 10 + seed % 10; +// seed /= 10; +// } +// return ans; +// } +// +// bool check(long long ans, long long l, long long r) { +// return ans >= l && ans <= r && isPalindrome(ans); +// } +// +// bool isPalindrome(long long num) { +// long long offset = 1; +// while (num / offset >= 10) { +// offset *= 10; +// } +// while (num != 0) { +// if (num / offset != num % 10) { +// return false; +// } +// num = (num % offset) / 10; +// offset /= 100; +// } +// return true; +// } +//}; diff --git a/src/class043/Code02_SuperPalindromesCPP2.java b/src/class043/Code02_SuperPalindromesCPP2.java new file mode 100644 index 000000000..de746458c --- /dev/null +++ b/src/class043/Code02_SuperPalindromesCPP2.java @@ -0,0 +1,66 @@ +package class043; + +// 超级回文数(superpalindromesInRange2方法C++版本) +// 如果一个正整数自身是回文数,而且它也是一个回文数的平方,那么我们称这个数为超级回文数。 +// 现在,给定两个正整数 L 和 R (以字符串形式表示), +// 返回包含在范围 [L, R] 中的超级回文数的数目。 +// 1 <= len(L) <= 18 +// 1 <= len(R) <= 18 +// L 和 R 是表示 [1, 10^18) 范围的整数的字符串 +// 测试链接 : https://leetcode.cn/problems/super-palindromes/ +// 如下实现是课上讲的superpalindromesInRange2方法的C++版本,提交如下代码可以直接通过 + +//#include +//#include +// +//using namespace std; +// +//class Solution { +//public: +// int superpalindromesInRange(string left, string right) { +// long long l = stoll(left); +// long long r = stoll(right); +// int i = 0; +// +// // 找到第一个 >= l 的位置 +// while (i < record.size() && record[i] < l) { +// i++; +// } +// +// int j = record.size() - 1; +// // 找到最后一个 <= r 的位置 +// while (j >= 0 && record[j] > r) { +// j--; +// } +// +// return (j >= i) ? (j - i + 1) : 0; +// } +// +//private: +// // 打表记录的超级回文数 +// const vector record = { +// 1L, 4L, 9L, 121L, 484L, 10201L, 12321L, 14641L, 40804L, 44944L, +// 1002001L, 1234321L, 4008004L, 100020001L, 102030201L, 104060401L, +// 121242121L, 123454321L, 125686521L, 400080004L, 404090404L, +// 10000200001L, 10221412201L, 12102420121L, 12345654321L, +// 40000800004L, 1000002000001L, 1002003002001L, 1004006004001L, +// 1020304030201L, 1022325232201L, 1024348434201L, 1210024200121L, +// 1212225222121L, 1214428244121L, 1232346432321L, 1234567654321L, +// 4000008000004L, 4004009004004L, 100000020000001L, 100220141022001L, +// 102012040210201L, 102234363432201L, 121000242000121L, +// 121242363242121L, 123212464212321L, 123456787654321L, +// 400000080000004L, 10000000200000001L, 10002000300020001L, +// 10004000600040001L, 10020210401202001L, 10022212521222001L, +// 10024214841242001L, 10201020402010201L, 10203040504030201L, +// 10205060806050201L, 10221432623412201L, 10223454745432201L, +// 12100002420000121L, 12102202520220121L, 12104402820440121L, +// 12122232623222121L, 12124434743442121L, 12321024642012321L, +// 12323244744232321L, 12343456865434321L, 12345678987654321L, +// 40000000800000004L, 40004000900040004L, 1000000002000000001L, +// 1000220014100220001L, 1002003004003002001L, 1002223236323222001L, +// 1020100204020010201L, 1020322416142230201L, 1022123226223212201L, +// 1022345658565432201L, 1210000024200000121L, 1210242036302420121L, +// 1212203226223022121L, 1212445458545442121L, 1232100246420012321L, +// 1232344458544432321L, 1234323468643234321L, 4000000008000000004L +// }; +//}; From 1c13bde04cc24a52fbe40e471b42e43d8f1d52b4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 12 Nov 2024 14:35:20 +0800 Subject: [PATCH 0340/2029] modify code --- src/class043/Code02_SuperPalindromesCPP2.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/class043/Code02_SuperPalindromesCPP2.java b/src/class043/Code02_SuperPalindromesCPP2.java index de746458c..39f157ce3 100644 --- a/src/class043/Code02_SuperPalindromesCPP2.java +++ b/src/class043/Code02_SuperPalindromesCPP2.java @@ -21,23 +21,17 @@ // long long l = stoll(left); // long long r = stoll(right); // int i = 0; -// -// // 找到第一个 >= l 的位置 // while (i < record.size() && record[i] < l) { // i++; // } -// // int j = record.size() - 1; -// // 找到最后一个 <= r 的位置 // while (j >= 0 && record[j] > r) { // j--; // } -// // return (j >= i) ? (j - i + 1) : 0; // } // //private: -// // 打表记录的超级回文数 // const vector record = { // 1L, 4L, 9L, 121L, 484L, 10201L, 12321L, 14641L, 40804L, 44944L, // 1002001L, 1234321L, 4008004L, 100020001L, 102030201L, 104060401L, From 2126055efbaa932696d68388dcca2776eb8d55a9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 12 Nov 2024 15:04:35 +0800 Subject: [PATCH 0341/2029] modify code --- src/class151/Code04_RemovingBlocks.java | 70 +++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 src/class151/Code04_RemovingBlocks.java diff --git a/src/class151/Code04_RemovingBlocks.java b/src/class151/Code04_RemovingBlocks.java new file mode 100644 index 000000000..c4cb292ed --- /dev/null +++ b/src/class151/Code04_RemovingBlocks.java @@ -0,0 +1,70 @@ +package class151; + +// 消除砖头 +// 测试链接 : https://www.luogu.com.cn/problem/AT_agc028_b +// 测试链接 : https://atcoder.jp/contests/agc028/tasks/agc028_b +// 提交以下的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 Code04_RemovingBlocks { + + public static int MAXN = 100001; + + public static int MOD = 1000000007; + + // 所有数字 + public static int[] arr = new int[MAXN]; + + // 连续数字逆元表 + public static int[] inv = new int[MAXN]; + + // sum[i] = (1/1 + 1/2 + 1/3 + ... + 1/i),%MOD意义下的余数 + public static int[] sum = new int[MAXN]; + + public static int n; + + public static void build() { + inv[1] = 1; + for (int i = 2; i <= n; i++) { + inv[i] = (int) (MOD - (long) inv[MOD % i] * (MOD / i) % MOD); + } + for (int i = 1; i <= n; i++) { + sum[i] = (sum[i - 1] + inv[i]) % MOD; + } + } + + public static long compute() { + build(); + long ans = 0; + 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) { + ans = ans * i % MOD; + } + return ans; + } + + 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; + for (int i = 1; i <= n; i++) { + in.nextToken(); + arr[i] = (int) in.nval; + } + out.println(compute()); + out.flush(); + out.close(); + br.close(); + } + +} From d0f694e5ba32ac886160d19612ca9941c400e712 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 12 Nov 2024 16:24:23 +0800 Subject: [PATCH 0342/2029] modify code --- src/class151/Code01_DescartesTree1.java | 4 +- src/class151/Code02_TreeOrder.java | 4 +- src/class151/Code03_CountingProblem.java | 4 +- src/class151/Code04_RemovingBlocks.java | 4 +- src/class151/Code05_Periodni.java | 130 +++++++++++++++++++++++ 5 files changed, 138 insertions(+), 8 deletions(-) create mode 100644 src/class151/Code05_Periodni.java diff --git a/src/class151/Code01_DescartesTree1.java b/src/class151/Code01_DescartesTree1.java index 4e3713bcb..422f22d80 100644 --- a/src/class151/Code01_DescartesTree1.java +++ b/src/class151/Code01_DescartesTree1.java @@ -18,13 +18,13 @@ public class Code01_DescartesTree1 { public static int MAXN = 10000001; + + public static int[] arr = new int[MAXN]; public static int[] left = new int[MAXN]; public static int[] right = new int[MAXN]; - public static int[] arr = new int[MAXN]; - public static int[] stack = new int[MAXN]; public static int n; diff --git a/src/class151/Code02_TreeOrder.java b/src/class151/Code02_TreeOrder.java index a38e4611e..6e6359a90 100644 --- a/src/class151/Code02_TreeOrder.java +++ b/src/class151/Code02_TreeOrder.java @@ -14,13 +14,13 @@ public class Code02_TreeOrder { public static int MAXN = 100001; + + public static int[] arr = new int[MAXN]; public static int[] left = new int[MAXN]; public static int[] right = new int[MAXN]; - public static int[] arr = new int[MAXN]; - public static int[] stack = new int[MAXN]; public static int n; diff --git a/src/class151/Code03_CountingProblem.java b/src/class151/Code03_CountingProblem.java index 437b19470..6b771e649 100644 --- a/src/class151/Code03_CountingProblem.java +++ b/src/class151/Code03_CountingProblem.java @@ -14,11 +14,11 @@ import java.util.Arrays; public class Code03_CountingProblem { + + public static int MOD = 1000000007; public static int MAXN = 1000001; - public static int MOD = 1000000007; - public static int[] arr = new int[MAXN]; public static int[] left = new int[MAXN]; diff --git a/src/class151/Code04_RemovingBlocks.java b/src/class151/Code04_RemovingBlocks.java index c4cb292ed..98bbe778e 100644 --- a/src/class151/Code04_RemovingBlocks.java +++ b/src/class151/Code04_RemovingBlocks.java @@ -14,10 +14,10 @@ public class Code04_RemovingBlocks { - public static int MAXN = 100001; - public static int MOD = 1000000007; + public static int MAXN = 100001; + // 所有数字 public static int[] arr = new int[MAXN]; diff --git a/src/class151/Code05_Periodni.java b/src/class151/Code05_Periodni.java new file mode 100644 index 000000000..f7bedba53 --- /dev/null +++ b/src/class151/Code05_Periodni.java @@ -0,0 +1,130 @@ +package class151; + +// 表格填数 +// 测试链接 : https://www.luogu.com.cn/problem/P6453 +// 提交以下的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 Code05_Periodni { + + public static int MOD = 1000000007; + + public static int MAXN = 501; + + public static int MAXH = 1000000; + + public static int[] fac = new int[MAXH + 1]; + + public static int[] inv = new int[MAXH + 1]; + + public static int[] arr = new int[MAXN]; + + public static int[] left = new int[MAXN]; + + public static int[] right = new int[MAXN]; + + public static int[] stack = new int[MAXN]; + + public static int[] size = new int[MAXN]; + + public static int[][] dp = new int[MAXN][MAXN]; + + public static int n, k; + + public static int power(long x, long p) { + long ans = 1; + while (p > 0) { + if ((p & 1) == 1) { + ans = (ans * x) % MOD; + } + x = (x * x) % MOD; + p >>= 1; + } + return (int) ans; + } + + public static int c(int n, int k) { + return (int) ((long) fac[n] * inv[k] % MOD * inv[n - k] % MOD); + } + + public static void build() { + fac[0] = fac[1] = inv[0] = 1; + for (int i = 2; i <= MAXH; i++) { + fac[i] = (int) ((long) fac[i - 1] * i % MOD); + } + inv[MAXH] = power(fac[MAXH], MOD - 2); + for (int i = MAXH - 1; i >= 1; i--) { + inv[i] = (int) ((long) inv[i + 1] * (i + 1) % MOD); + } + for (int i = 1, top = 0, pos; i <= n; i++) { + pos = top; + while (pos > 0 && arr[stack[pos]] > arr[i]) { + pos--; + } + if (pos > 0) { + right[stack[pos]] = i; + } + if (pos < top) { + left[i] = stack[pos + 1]; + } + stack[++pos] = i; + top = pos; + } + } + + public static void dfs(int u, int f) { + dp[u][0] = size[u] = 1; + if (left[u] != 0) { + dfs(left[u], u); + size[u] += size[left[u]]; + for (int i = Math.min(size[u], k); i >= 0; i--) { + for (int j = 1; j <= Math.min(size[left[u]], i); j++) { + dp[u][i] = (int) ((dp[u][i] + (long) dp[left[u]][j] * dp[u][i - j] % MOD) % MOD); + } + } + } + if (right[u] != 0) { + dfs(right[u], u); + size[u] += size[right[u]]; + for (int i = Math.min(size[u], k); i >= 0; i--) { + for (int j = 1; j <= Math.min(size[right[u]], i); j++) { + dp[u][i] = (int) ((dp[u][i] + (long) dp[right[u]][j] * dp[u][i - j] % MOD) % MOD); + } + } + } + int val = arr[u] - arr[f]; + for (int i = Math.min(size[u], k); i >= 0; i--) { + for (int j = 1; j <= Math.min(val, i); j++) { + dp[u][i] = (int) ((dp[u][i] + + (long) fac[j] * dp[u][i - j] % MOD * c(val, j) % MOD * c(size[u] - i + j, j)) % MOD); + } + } + } + + 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(); + k = (int) in.nval; + for (int i = 1; i <= n; i++) { + in.nextToken(); + arr[i] = (int) in.nval; + } + build(); + dfs(stack[1], 0); + out.println(dp[stack[1]][k]); + out.flush(); + out.close(); + br.close(); + } + +} From d230336aae94000c17b2638a5b92d5173b0ed698 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 12 Nov 2024 17:04:16 +0800 Subject: [PATCH 0343/2029] modify code --- src/class151/Code05_Periodni.java | 48 +++++++++++++++---------------- 1 file changed, 23 insertions(+), 25 deletions(-) diff --git a/src/class151/Code05_Periodni.java b/src/class151/Code05_Periodni.java index f7bedba53..b6efa487a 100644 --- a/src/class151/Code05_Periodni.java +++ b/src/class151/Code05_Periodni.java @@ -35,6 +35,8 @@ public class Code05_Periodni { public static int[][] dp = new int[MAXN][MAXN]; + public static int[][] tmp = new int[MAXN][MAXN]; + public static int n, k; public static int power(long x, long p) { @@ -50,7 +52,7 @@ public static int power(long x, long p) { } public static int c(int n, int k) { - return (int) ((long) fac[n] * inv[k] % MOD * inv[n - k] % MOD); + return k > n ? 0 : (int) ((long) fac[n] * inv[k] % MOD * inv[n - k] % MOD); } public static void build() { @@ -78,35 +80,33 @@ public static void build() { } } - public static void dfs(int u, int f) { - dp[u][0] = size[u] = 1; - if (left[u] != 0) { + public static void dfs(int u, int fa) { + if (u == 0) { + dp[u][0] = 1; + } else { dfs(left[u], u); - size[u] += size[left[u]]; - for (int i = Math.min(size[u], k); i >= 0; i--) { - for (int j = 1; j <= Math.min(size[left[u]], i); j++) { - dp[u][i] = (int) ((dp[u][i] + (long) dp[left[u]][j] * dp[u][i - j] % MOD) % MOD); - } - } - } - if (right[u] != 0) { dfs(right[u], u); - size[u] += size[right[u]]; - for (int i = Math.min(size[u], k); i >= 0; i--) { - for (int j = 1; j <= Math.min(size[right[u]], i); j++) { - dp[u][i] = (int) ((dp[u][i] + (long) dp[right[u]][j] * dp[u][i - j] % MOD) % MOD); + size[u] = size[left[u]] + size[right[u]] + 1; + for (int i = 0; i <= size[left[u]]; i++) { + for (int j = 0; j <= size[right[u]]; j++) { + tmp[u][i + j] = (int) (tmp[u][i + j] + (long) dp[left[u]][i] * dp[right[u]][j] % MOD) % MOD; } } - } - int val = arr[u] - arr[f]; - for (int i = Math.min(size[u], k); i >= 0; i--) { - for (int j = 1; j <= Math.min(val, i); j++) { - dp[u][i] = (int) ((dp[u][i] - + (long) fac[j] * dp[u][i - j] % MOD * c(val, j) % MOD * c(size[u] - i + j, j)) % MOD); + for (int i = 0; i <= size[u]; i++) { + for (int j = 0; j <= i; j++) { + dp[u][i] = (int) (dp[u][i] + (long) tmp[u][j] * fac[i - j] % MOD * c(size[u] - j, i - j) % MOD + * c(arr[u] - arr[fa], i - j) % MOD) % MOD; + } } } } + public static int compute() { + build(); + dfs(stack[1], 0); + return dp[stack[1]][k]; + } + public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StreamTokenizer in = new StreamTokenizer(br); @@ -119,9 +119,7 @@ public static void main(String[] args) throws IOException { in.nextToken(); arr[i] = (int) in.nval; } - build(); - dfs(stack[1], 0); - out.println(dp[stack[1]][k]); + out.println(compute()); out.flush(); out.close(); br.close(); From 74734e8a1b94eba18342268463b3a288e57ed8ca Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 12 Nov 2024 17:17:25 +0800 Subject: [PATCH 0344/2029] modify code --- src/class151/{Code02_TreeOrder.java => Code03_TreeOrder.java} | 2 +- ...{Code03_CountingProblem.java => Code04_CountingProblem.java} | 2 +- .../{Code04_RemovingBlocks.java => Code05_RemovingBlocks.java} | 2 +- src/class151/{Code05_Periodni.java => Code06_Periodni.java} | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) rename src/class151/{Code02_TreeOrder.java => Code03_TreeOrder.java} (98%) rename src/class151/{Code03_CountingProblem.java => Code04_CountingProblem.java} (98%) rename src/class151/{Code04_RemovingBlocks.java => Code05_RemovingBlocks.java} (97%) rename src/class151/{Code05_Periodni.java => Code06_Periodni.java} (98%) diff --git a/src/class151/Code02_TreeOrder.java b/src/class151/Code03_TreeOrder.java similarity index 98% rename from src/class151/Code02_TreeOrder.java rename to src/class151/Code03_TreeOrder.java index 6e6359a90..ee972a72e 100644 --- a/src/class151/Code02_TreeOrder.java +++ b/src/class151/Code03_TreeOrder.java @@ -11,7 +11,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code02_TreeOrder { +public class Code03_TreeOrder { public static int MAXN = 100001; diff --git a/src/class151/Code03_CountingProblem.java b/src/class151/Code04_CountingProblem.java similarity index 98% rename from src/class151/Code03_CountingProblem.java rename to src/class151/Code04_CountingProblem.java index 6b771e649..779d2c6f8 100644 --- a/src/class151/Code03_CountingProblem.java +++ b/src/class151/Code04_CountingProblem.java @@ -13,7 +13,7 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class Code03_CountingProblem { +public class Code04_CountingProblem { public static int MOD = 1000000007; diff --git a/src/class151/Code04_RemovingBlocks.java b/src/class151/Code05_RemovingBlocks.java similarity index 97% rename from src/class151/Code04_RemovingBlocks.java rename to src/class151/Code05_RemovingBlocks.java index 98bbe778e..14cdb3033 100644 --- a/src/class151/Code04_RemovingBlocks.java +++ b/src/class151/Code05_RemovingBlocks.java @@ -12,7 +12,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code04_RemovingBlocks { +public class Code05_RemovingBlocks { public static int MOD = 1000000007; diff --git a/src/class151/Code05_Periodni.java b/src/class151/Code06_Periodni.java similarity index 98% rename from src/class151/Code05_Periodni.java rename to src/class151/Code06_Periodni.java index b6efa487a..0f6707318 100644 --- a/src/class151/Code05_Periodni.java +++ b/src/class151/Code06_Periodni.java @@ -11,7 +11,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code05_Periodni { +public class Code06_Periodni { public static int MOD = 1000000007; From 0a68151c2f37275e3f11a27665ff0308f86d25a4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 12 Nov 2024 21:07:24 +0800 Subject: [PATCH 0345/2029] modify code --- src/class151/Code04_CountingProblem.java | 18 +++++++++--------- src/class151/Code06_Periodni.java | 9 +++++++-- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/class151/Code04_CountingProblem.java b/src/class151/Code04_CountingProblem.java index 779d2c6f8..38be4ca4d 100644 --- a/src/class151/Code04_CountingProblem.java +++ b/src/class151/Code04_CountingProblem.java @@ -14,7 +14,7 @@ import java.util.Arrays; public class Code04_CountingProblem { - + public static int MOD = 1000000007; public static int MAXN = 1000001; @@ -46,12 +46,6 @@ public static void build() { } } - public static long compute() { - long[][] dp = new long[n + 1][m + 1]; - dfs(stack[1], dp); - return dp[stack[1]][m]; - } - public static void dfs(int i, long[][] dp) { for (int j = 1; j <= m; j++) { dp[i][j] = 1; @@ -78,6 +72,14 @@ public static void clear() { Arrays.fill(right, 1, n + 1, 0); } + public static long compute() { + build(); + long[][] dp = new long[n + 1][m + 1]; + dfs(stack[1], dp); + clear(); + return dp[stack[1]][m]; + } + public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StreamTokenizer in = new StreamTokenizer(br); @@ -93,9 +95,7 @@ public static void main(String[] args) throws IOException { in.nextToken(); arr[i] = (int) in.nval; } - build(); out.println(compute()); - clear(); } out.flush(); out.close(); diff --git a/src/class151/Code06_Periodni.java b/src/class151/Code06_Periodni.java index 0f6707318..79529918a 100644 --- a/src/class151/Code06_Periodni.java +++ b/src/class151/Code06_Periodni.java @@ -19,18 +19,23 @@ public class Code06_Periodni { public static int MAXH = 1000000; + // 所有数字 + public static int[] arr = new int[MAXN]; + + // 阶乘余数表 public static int[] fac = new int[MAXH + 1]; + // 阶乘逆元表 public static int[] inv = new int[MAXH + 1]; - public static int[] arr = new int[MAXN]; - + // 笛卡尔树需要 public static int[] left = new int[MAXN]; public static int[] right = new int[MAXN]; public static int[] stack = new int[MAXN]; + // dfs需要 public static int[] size = new int[MAXN]; public static int[][] dp = new int[MAXN][MAXN]; From 1b8f37a0fda4d7f230bd83d77cf626e3fa164997 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 12 Nov 2024 21:11:49 +0800 Subject: [PATCH 0346/2029] modify code --- src/class151/Code06_Periodni.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/class151/Code06_Periodni.java b/src/class151/Code06_Periodni.java index 79529918a..8a86e64d5 100644 --- a/src/class151/Code06_Periodni.java +++ b/src/class151/Code06_Periodni.java @@ -2,6 +2,7 @@ // 表格填数 // 测试链接 : https://www.luogu.com.cn/problem/P6453 +// 因为本题给定的可用空间很少,所以数组为int类型,不用long类型 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.BufferedReader; From 276c65a80eb2d4323c71f8ccf98efdeb4f27ffc5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 13 Nov 2024 12:59:17 +0800 Subject: [PATCH 0347/2029] modify code --- src/class148/AVL2.java | 98 ++++++------- src/class151/Code02_Treap1.java | 238 ++++++++++++++++++++++++++++++++ src/class151/Code02_Treap2.java | 212 ++++++++++++++++++++++++++++ 3 files changed, 499 insertions(+), 49 deletions(-) create mode 100644 src/class151/Code02_Treap1.java create mode 100644 src/class151/Code02_Treap2.java diff --git a/src/class148/AVL2.java b/src/class148/AVL2.java index 748bb2712..475836d59 100644 --- a/src/class148/AVL2.java +++ b/src/class148/AVL2.java @@ -27,56 +27,56 @@ //int head = 0; //int key[MAXN]; //int height[MAXN]; -//int leftChild[MAXN]; -//int rightChild[MAXN]; +//int ls[MAXN]; +//int rs[MAXN]; //int key_count[MAXN]; //int size[MAXN]; // //void up(int i) { -// size[i] = size[leftChild[i]] + size[rightChild[i]] + key_count[i]; -// height[i] = max(height[leftChild[i]], height[rightChild[i]]) + 1; +// size[i] = size[ls[i]] + size[rs[i]] + key_count[i]; +// height[i] = max(height[ls[i]], height[rs[i]]) + 1; //} // //int leftRotate(int i) { -// int r = rightChild[i]; -// rightChild[i] = leftChild[r]; -// leftChild[r] = i; +// int r = rs[i]; +// rs[i] = ls[r]; +// ls[r] = i; // up(i); // up(r); // return r; //} // //int rightRotate(int i) { -// int l = leftChild[i]; -// leftChild[i] = rightChild[l]; -// rightChild[l] = i; +// int l = ls[i]; +// ls[i] = rs[l]; +// rs[l] = i; // up(i); // up(l); // return l; //} // //int maintain(int i) { -// int lh = height[leftChild[i]]; -// int rh = height[rightChild[i]]; +// int lh = height[ls[i]]; +// int rh = height[rs[i]]; // if (lh - rh > 1) { -// if (height[leftChild[leftChild[i]]] >= height[rightChild[leftChild[i]]]) { +// if (height[ls[ls[i]]] >= height[rs[ls[i]]]) { // i = rightRotate(i); // } else { -// leftChild[i] = leftRotate(leftChild[i]); +// ls[i] = leftRotate(ls[i]); // i = rightRotate(i); // } // } else if (rh - lh > 1) { -// if (height[rightChild[rightChild[i]]] >= height[leftChild[rightChild[i]]]) { +// if (height[rs[rs[i]]] >= height[ls[rs[i]]]) { // i = leftRotate(i); // } else { -// rightChild[i] = rightRotate(rightChild[i]); +// rs[i] = rightRotate(rs[i]); // i = leftRotate(i); // } // } // return i; //} // -//int addNode(int i, int num) { +//int add(int i, int num) { // if (i == 0) { // key[++cnt] = num; // key_count[cnt] = size[cnt] = height[cnt] = 1; @@ -85,16 +85,16 @@ // if (key[i] == num) { // key_count[i]++; // } else if (key[i] > num) { -// leftChild[i] = addNode(leftChild[i], num); +// ls[i] = add(ls[i], num); // } else { -// rightChild[i] = addNode(rightChild[i], num); +// rs[i] = add(rs[i], num); // } // up(i); // return maintain(i); //} // //void add(int num) { -// head = addNode(head, num); +// head = add(head, num); //} // //int getRank(int i, int num) { @@ -102,9 +102,9 @@ // return 0; // } // if (key[i] >= num) { -// return getRank(leftChild[i], num); +// return getRank(ls[i], num); // } else { -// return size[leftChild[i]] + key_count[i] + getRank(rightChild[i], num); +// return size[ls[i]] + key_count[i] + getRank(rs[i], num); // } //} // @@ -114,37 +114,37 @@ // //int removeMostLeft(int i, int mostLeft) { // if (i == mostLeft) { -// return rightChild[i]; +// return rs[i]; // } else { -// leftChild[i] = removeMostLeft(leftChild[i], mostLeft); +// ls[i] = removeMostLeft(ls[i], mostLeft); // up(i); // return maintain(i); // } //} // -//int removeNode(int i, int num) { +//int remove(int i, int num) { // if (key[i] < num) { -// rightChild[i] = removeNode(rightChild[i], num); +// rs[i] = remove(rs[i], num); // } else if (key[i] > num) { -// leftChild[i] = removeNode(leftChild[i], num); +// ls[i] = remove(ls[i], num); // } else { // if (key_count[i] > 1) { // key_count[i]--; // } else { -// if (leftChild[i] == 0 && rightChild[i] == 0) { +// if (ls[i] == 0 && rs[i] == 0) { // return 0; -// } else if (leftChild[i] != 0 && rightChild[i] == 0) { -// i = leftChild[i]; -// } else if (leftChild[i] == 0 && rightChild[i] != 0) { -// i = rightChild[i]; +// } else if (ls[i] != 0 && rs[i] == 0) { +// i = ls[i]; +// } else if (ls[i] == 0 && rs[i] != 0) { +// i = rs[i]; // } else { -// int mostLeft = rightChild[i]; -// while (leftChild[mostLeft] != 0) { -// mostLeft = leftChild[mostLeft]; +// int mostLeft = rs[i]; +// while (ls[mostLeft] != 0) { +// mostLeft = ls[mostLeft]; // } -// rightChild[i] = removeMostLeft(rightChild[i], mostLeft); -// leftChild[mostLeft] = leftChild[i]; -// rightChild[mostLeft] = rightChild[i]; +// rs[i] = removeMostLeft(rs[i], mostLeft); +// ls[mostLeft] = ls[i]; +// rs[mostLeft] = rs[i]; // i = mostLeft; // } // } @@ -155,15 +155,15 @@ // //void remove(int num) { // if (getRank(num) != getRank(num + 1)) { -// head = removeNode(head, num); +// head = remove(head, num); // } //} // //int getIndex(int i, int x) { -// if (size[leftChild[i]] >= x) { -// return getIndex(leftChild[i], x); -// } else if (size[leftChild[i]] + key_count[i] < x) { -// return getIndex(rightChild[i], x - size[leftChild[i]] - key_count[i]); +// if (size[ls[i]] >= x) { +// return getIndex(ls[i], x); +// } else if (size[ls[i]] + key_count[i] < x) { +// return getIndex(rs[i], x - size[ls[i]] - key_count[i]); // } // return key[i]; //} @@ -177,9 +177,9 @@ // return INT_MIN; // } // if (key[i] >= num) { -// return pre(leftChild[i], num); +// return pre(ls[i], num); // } else { -// return max(key[i], pre(rightChild[i], num)); +// return max(key[i], pre(rs[i], num)); // } //} // @@ -192,9 +192,9 @@ // return INT_MAX; // } // if (key[i] <= num) { -// return post(rightChild[i], num); +// return post(rs[i], num); // } else { -// return min(key[i], post(leftChild[i], num)); +// return min(key[i], post(ls[i], num)); // } //} // @@ -205,8 +205,8 @@ //void clear() { // memset(key + 1, 0, cnt * sizeof(int)); // memset(height + 1, 0, cnt * sizeof(int)); -// memset(leftChild + 1, 0, cnt * sizeof(int)); -// memset(rightChild + 1, 0, cnt * sizeof(int)); +// 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)); // cnt = 0; diff --git a/src/class151/Code02_Treap1.java b/src/class151/Code02_Treap1.java new file mode 100644 index 000000000..b40aa7c00 --- /dev/null +++ b/src/class151/Code02_Treap1.java @@ -0,0 +1,238 @@ +package class151; + +// Treap树的实现(java版) +// 实现一种结构,支持如下操作,要求单次调用的时间复杂度O(log n) +// 1,增加x,重复加入算多个词频 +// 2,删除x,如果有多个,只删掉一个 +// 3,查询x的排名,x的排名为,比x小的数的个数+1 +// 4,查询数据中排名为x的数 +// 5,查询x的前驱,x的前驱为,小于x的数中最大的数,不存在返回整数最小值 +// 6,查询x的后继,x的后继为,大于x的数中最小的数,不存在返回整数最大值 +// 所有操作的次数 <= 10^5 +// -10^7 <= x <= +10^7 +// 测试链接 : https://www.luogu.com.cn/problem/P3369 +// 提交以下的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 Code02_Treap1 { + + public static int MAXN = 100001; + + // 整棵树的头节点编号 + public static int head = 0; + + // 空间使用计数 + public static int cnt = 0; + + // 节点的key值 + public static int[] key = new int[MAXN]; + + // 节点key的计数 + public static int[] count = new int[MAXN]; + + // 左孩子 + public static int[] left = new int[MAXN]; + + // 右孩子 + public static int[] right = new int[MAXN]; + + // 数字总数 + public static int[] size = new int[MAXN]; + + // 节点优先级 + public static double[] priority = new double[MAXN]; + + public static void up(int i) { + size[i] = size[left[i]] + size[right[i]] + count[i]; + } + + public static int leftRotate(int i) { + int r = right[i]; + right[i] = left[r]; + left[r] = i; + up(i); + up(r); + return r; + } + + public static int rightRotate(int i) { + int l = left[i]; + left[i] = right[l]; + right[l] = i; + up(i); + up(l); + return l; + } + + public static int add(int i, int num) { + if (i == 0) { + key[++cnt] = num; + count[cnt] = size[cnt] = 1; + priority[cnt] = Math.random(); + return cnt; + } + if (key[i] == num) { + count[i]++; + } else if (key[i] > num) { + left[i] = add(left[i], num); + } else { + right[i] = add(right[i], num); + } + up(i); + if (left[i] != 0 && priority[left[i]] > priority[i]) { + return rightRotate(i); + } + if (right[i] != 0 && priority[right[i]] > priority[i]) { + return leftRotate(i); + } + return i; + } + + public static void add(int num) { + head = add(head, num); + } + + public static int small(int i, int num) { + if (i == 0) { + return 0; + } + if (key[i] >= num) { + return small(left[i], num); + } else { + return size[left[i]] + count[i] + small(right[i], num); + } + } + + public static int rank(int num) { + return small(head, num) + 1; + } + + public static int index(int i, int x) { + if (size[left[i]] >= x) { + return index(left[i], x); + } else if (size[left[i]] + count[i] < x) { + return index(right[i], x - size[left[i]] - count[i]); + } + return key[i]; + } + + public static int index(int x) { + return index(head, x); + } + + public static int pre(int i, int num) { + if (i == 0) { + return Integer.MIN_VALUE; + } + if (key[i] >= num) { + return pre(left[i], num); + } else { + return Math.max(key[i], pre(right[i], num)); + } + } + + public static int pre(int num) { + return pre(head, num); + } + + public static int post(int i, int num) { + if (i == 0) { + return Integer.MAX_VALUE; + } + if (key[i] <= num) { + return post(right[i], num); + } else { + return Math.min(key[i], post(left[i], num)); + } + } + + public static int post(int num) { + return post(head, num); + } + + public static int remove(int i, int num) { + if (key[i] < num) { + right[i] = remove(right[i], num); + } else if (key[i] > num) { + left[i] = remove(left[i], num); + } else { + if (count[i] > 1) { + count[i]--; + } else { + if (left[i] == 0 && right[i] == 0) { + return 0; + } else if (left[i] != 0 && right[i] == 0) { + i = left[i]; + } else if (left[i] == 0 && right[i] != 0) { + i = right[i]; + } else { + if (priority[left[i]] >= priority[right[i]]) { + i = rightRotate(i); + right[i] = remove(right[i], num); + } else { + i = leftRotate(i); + left[i] = remove(left[i], num); + } + } + } + } + up(i); + return i; + } + + public static void remove(int num) { + if (rank(num) != rank(num + 1)) { + head = remove(head, num); + } + } + + public static void clear() { + Arrays.fill(key, 1, cnt + 1, 0); + Arrays.fill(count, 1, cnt + 1, 0); + Arrays.fill(left, 1, cnt + 1, 0); + Arrays.fill(right, 1, cnt + 1, 0); + Arrays.fill(size, 1, cnt + 1, 0); + Arrays.fill(priority, 1, cnt + 1, 0); + cnt = 0; + head = 0; + } + + 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(); + int n = (int) in.nval; + for (int i = 1, op, x; i <= n; i++) { + in.nextToken(); + op = (int) in.nval; + in.nextToken(); + x = (int) in.nval; + if (op == 1) { + add(x); + } else if (op == 2) { + remove(x); + } else if (op == 3) { + out.println(rank(x)); + } else if (op == 4) { + out.println(index(x)); + } else if (op == 5) { + out.println(pre(x)); + } else { + out.println(post(x)); + } + } + clear(); + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class151/Code02_Treap2.java b/src/class151/Code02_Treap2.java new file mode 100644 index 000000000..12b5a4145 --- /dev/null +++ b/src/class151/Code02_Treap2.java @@ -0,0 +1,212 @@ +package class151; + +// Treap树的实现(C++版) +// 实现一种结构,支持如下操作,要求单次调用的时间复杂度O(log n) +// 1,增加x,重复加入算多个词频 +// 2,删除x,如果有多个,只删掉一个 +// 3,查询x的排名,x的排名为,比x小的数的个数+1 +// 4,查询数据中排名为x的数 +// 5,查询x的前驱,x的前驱为,小于x的数中最大的数,不存在返回整数最小值 +// 6,查询x的后继,x的后继为,大于x的数中最小的数,不存在返回整数最大值 +// 所有操作的次数 <= 10^5 +// -10^7 <= x <= +10^7 +// 测试链接 : https://www.luogu.com.cn/problem/P3369 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +//#include +//#include +//#include +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +// +//int cnt = 0; +//int head = 0; +//int key[MAXN]; +//int key_count[MAXN]; +//int ls[MAXN]; +//int rs[MAXN]; +//int size[MAXN]; +//double priority[MAXN]; +// +//void up(int i) { +// size[i] = size[ls[i]] + size[rs[i]] + key_count[i]; +//} +// +//int leftRotate(int i) { +// int r = rs[i]; +// rs[i] = ls[r]; +// ls[r] = i; +// up(i); +// up(r); +// return r; +//} +// +//int rightRotate(int i) { +// int l = ls[i]; +// ls[i] = rs[l]; +// rs[l] = i; +// up(i); +// up(l); +// return l; +//} +// +//int add(int i, int num) { +// if (i == 0) { +// key[++cnt] = num; +// key_count[cnt] = size[cnt] = 1; +// priority[cnt] = static_cast(rand()) / RAND_MAX; +// return cnt; +// } +// if (key[i] == num) { +// key_count[i]++; +// } else if (key[i] > num) { +// ls[i] = add(ls[i], num); +// } else { +// rs[i] = add(rs[i], num); +// } +// up(i); +// if (ls[i] != 0 && priority[ls[i]] > priority[i]) { +// return rightRotate(i); +// } +// if (rs[i] != 0 && priority[rs[i]] > priority[i]) { +// return leftRotate(i); +// } +// return i; +//} +// +//void add(int num) { +// head = add(head, num); +//} +// +//int small(int i, int num) { +// if (i == 0) { +// return 0; +// } +// if (key[i] >= num) { +// return small(ls[i], num); +// } else { +// return size[ls[i]] + key_count[i] + small(rs[i], num); +// } +//} +// +//int getRank(int num) { +// return small(head, num) + 1; +//} +// +//int getIndex(int i, int x) { +// if (size[ls[i]] >= x) { +// return getIndex(ls[i], x); +// } else if (size[ls[i]] + key_count[i] < x) { +// return getIndex(rs[i], x - size[ls[i]] - key_count[i]); +// } +// return key[i]; +//} +// +//int getIndex(int x) { +// return getIndex(head, x); +//} +// +//int pre(int i, int num) { +// if (i == 0) { +// return INT_MIN; +// } +// if (key[i] >= num) { +// return pre(ls[i], num); +// } else { +// return max(key[i], pre(rs[i], num)); +// } +//} +// +//int pre(int num) { +// return pre(head, num); +//} +// +//int post(int i, int num) { +// if (i == 0) { +// return INT_MAX; +// } +// if (key[i] <= num) { +// return post(rs[i], num); +// } else { +// return min(key[i], post(ls[i], num)); +// } +//} +// +//int post(int num) { +// return post(head, num); +//} +// +//int remove(int i, int num) { +// if (key[i] < num) { +// rs[i] = remove(rs[i], num); +// } else if (key[i] > num) { +// ls[i] = remove(ls[i], num); +// } else { +// if (key_count[i] > 1) { +// key_count[i]--; +// } else { +// if (ls[i] == 0 && rs[i] == 0) { +// return 0; +// } else if (ls[i] != 0 && rs[i] == 0) { +// i = ls[i]; +// } else if (ls[i] == 0 && rs[i] != 0) { +// i = rs[i]; +// } else { +// if (priority[ls[i]] >= priority[rs[i]]) { +// i = rightRotate(i); +// rs[i] = remove(rs[i], num); +// } else { +// i = leftRotate(i); +// ls[i] = remove(ls[i], num); +// } +// } +// } +// } +// up(i); +// return i; +//} +// +//void remove(int num) { +// if (getRank(num) != getRank(num + 1)) { +// head = remove(head, num); +// } +//} +// +//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(size + 1, size + cnt + 1, 0); +// fill(priority + 1, priority + cnt + 1, 0); +// cnt = 0; +// head = 0; +//} +// +//int main() { +// int n; +// cin >> n; +// for (int i = 1, op, x; i <= n; i++) { +// cin >> op >> x; +// if (op == 1) { +// add(x); +// } else if (op == 2) { +// remove(x); +// } else if (op == 3) { +// cout << getRank(x) << endl; +// } else if (op == 4) { +// cout << getIndex(x) << endl; +// } else if (op == 5) { +// cout << pre(x) << endl; +// } else { +// cout << post(x) << endl; +// } +// } +// clear(); +// return 0; +//} \ No newline at end of file From 33a8e901902986a33b158bd61a80bb15ec593b5f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 13 Nov 2024 13:01:24 +0800 Subject: [PATCH 0348/2029] modify code --- src/class151/{Code06_Periodni.java => Code05_Periodni.java} | 2 +- .../{Code05_RemovingBlocks.java => Code06_RemovingBlocks.java} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename src/class151/{Code06_Periodni.java => Code05_Periodni.java} (99%) rename src/class151/{Code05_RemovingBlocks.java => Code06_RemovingBlocks.java} (97%) diff --git a/src/class151/Code06_Periodni.java b/src/class151/Code05_Periodni.java similarity index 99% rename from src/class151/Code06_Periodni.java rename to src/class151/Code05_Periodni.java index 8a86e64d5..c78496fb3 100644 --- a/src/class151/Code06_Periodni.java +++ b/src/class151/Code05_Periodni.java @@ -12,7 +12,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code06_Periodni { +public class Code05_Periodni { public static int MOD = 1000000007; diff --git a/src/class151/Code05_RemovingBlocks.java b/src/class151/Code06_RemovingBlocks.java similarity index 97% rename from src/class151/Code05_RemovingBlocks.java rename to src/class151/Code06_RemovingBlocks.java index 14cdb3033..c0664600a 100644 --- a/src/class151/Code05_RemovingBlocks.java +++ b/src/class151/Code06_RemovingBlocks.java @@ -12,7 +12,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code05_RemovingBlocks { +public class Code06_RemovingBlocks { public static int MOD = 1000000007; From 7d52807c7644b00590ab79d4bf802fd184512102 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 13 Nov 2024 13:09:41 +0800 Subject: [PATCH 0349/2029] modify code --- src/class151/Code06_RemovingBlocks.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class151/Code06_RemovingBlocks.java b/src/class151/Code06_RemovingBlocks.java index c0664600a..eb2ac681b 100644 --- a/src/class151/Code06_RemovingBlocks.java +++ b/src/class151/Code06_RemovingBlocks.java @@ -1,6 +1,6 @@ package class151; -// 消除砖头 +// 砖头消除 // 测试链接 : https://www.luogu.com.cn/problem/AT_agc028_b // 测试链接 : https://atcoder.jp/contests/agc028/tasks/agc028_b // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 From e1ed5fc5577f1705f84c8935b445b9ddea1b5075 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 13 Nov 2024 14:58:14 +0800 Subject: [PATCH 0350/2029] modify code --- src/class151/Code01_DescartesTree1.java | 8 +++++++- src/class151/Code01_DescartesTree2.java | 6 ++++++ src/class151/Code03_TreeOrder.java | 6 +++++- src/class151/Code04_CountingProblem.java | 7 +++++++ src/class151/Code05_Periodni.java | 7 +++++++ src/class151/Code06_RemovingBlocks.java | 10 +++++++++- 6 files changed, 41 insertions(+), 3 deletions(-) diff --git a/src/class151/Code01_DescartesTree1.java b/src/class151/Code01_DescartesTree1.java index 422f22d80..ebf4e49e3 100644 --- a/src/class151/Code01_DescartesTree1.java +++ b/src/class151/Code01_DescartesTree1.java @@ -1,6 +1,12 @@ package class151; // 笛卡尔树模版(java版) +// 给定一个长度为n的数组arr,下标从1开始 +// 构建一棵二叉树,下标按照搜索二叉树组织,值按照小根堆组织 +// 建好树的过程要求时间复杂度O(n) +// 建好树之后,为了验证 +// 打印,i * (left[i] + 1),所有信息异或起来的值 +// 打印,i * (right[i] + 1),所有信息异或起来的值 // 测试链接 : https://www.luogu.com.cn/problem/P5854 // 如下实现是正确的,但java的版本无法通过所有测试用例 // 这是洛谷平台没有照顾各种语言的实现所导致的 @@ -18,7 +24,7 @@ public class Code01_DescartesTree1 { public static int MAXN = 10000001; - + public static int[] arr = new int[MAXN]; public static int[] left = new int[MAXN]; diff --git a/src/class151/Code01_DescartesTree2.java b/src/class151/Code01_DescartesTree2.java index c338c8699..6e65a0fad 100644 --- a/src/class151/Code01_DescartesTree2.java +++ b/src/class151/Code01_DescartesTree2.java @@ -1,6 +1,12 @@ package class151; // 笛卡尔树模版(C++版) +// 给定一个长度为n的数组arr,下标从1开始 +// 构建一棵二叉树,下标按照搜索二叉树组织,值按照小根堆组织 +// 建好树的过程要求时间复杂度O(n) +// 建好树之后,为了验证 +// 打印,i * (left[i] + 1),所有信息异或起来的值 +// 打印,i * (right[i] + 1),所有信息异或起来的值 // 测试链接 : https://www.luogu.com.cn/problem/P5854 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class151/Code03_TreeOrder.java b/src/class151/Code03_TreeOrder.java index ee972a72e..82775039b 100644 --- a/src/class151/Code03_TreeOrder.java +++ b/src/class151/Code03_TreeOrder.java @@ -1,6 +1,10 @@ package class151; // 树的序 +// 给定一个长度为n的数组arr,表示依次插入数值,会形成一棵搜索二叉树 +// 也许同样的一个序列,依次插入数组后,也能形成同样形态的搜索二叉树 +// 请返回字典序尽量小的结果 +// 1 <= n <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P1377 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -14,7 +18,7 @@ public class Code03_TreeOrder { public static int MAXN = 100001; - + public static int[] arr = new int[MAXN]; public static int[] left = new int[MAXN]; diff --git a/src/class151/Code04_CountingProblem.java b/src/class151/Code04_CountingProblem.java index 38be4ca4d..258fd1f48 100644 --- a/src/class151/Code04_CountingProblem.java +++ b/src/class151/Code04_CountingProblem.java @@ -1,6 +1,13 @@ package class151; // 序列计数 +// 有一个概念叫,最左端最大值位置,表示一段范围上 +// 如果最大值有一个,那么最大值所在的位置,就是最左端最大值位置 +// 如果最大值有多个,最左的那个所在的位置,就是最左端最大值位置 +// 给定一个长度为n的数组A,那么必然存在等长的数组B +// 两者在任意范围上,最左端最大值位置是相同的,不仅存在数组B,而且是无限多的 +// 现在要求,数组B中的每个值都在[1,m]范围,返回有多少个这样的数组,答案对 1000000007 取模 +// 2 <= n, m <= 2 * 10^5 1 <= A[i] <= m n * m <= 10^6 // 测试链接 : https://www.luogu.com.cn/problem/CF1748E // 测试链接 : https://codeforces.com/problemset/problem/1748/E // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class151/Code05_Periodni.java b/src/class151/Code05_Periodni.java index c78496fb3..c064fabe1 100644 --- a/src/class151/Code05_Periodni.java +++ b/src/class151/Code05_Periodni.java @@ -1,6 +1,13 @@ package class151; // 表格填数 +// 给定一个长度为n的数组arr,arr[i]表示i位置上方的正方形格子数量 +// 那么从1位置到n位置,每个位置就是一个直方图,所有的直方图认为拼在一起 +// 在这片区域中,有k个相同的数字要放进去,不能有任意两个数在同一行或者同一列 +// 注意在直方图中,如果同一行中间断开了,让两个数字无法在这一行联通,则不算违规 +// 返回填入数字的方法数,答案对 1000000007 取模 +// 1 <= n,k <= 500 +// 0 <= arr[i] <= 10^6 // 测试链接 : https://www.luogu.com.cn/problem/P6453 // 因为本题给定的可用空间很少,所以数组为int类型,不用long类型 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class151/Code06_RemovingBlocks.java b/src/class151/Code06_RemovingBlocks.java index eb2ac681b..aedf04cc5 100644 --- a/src/class151/Code06_RemovingBlocks.java +++ b/src/class151/Code06_RemovingBlocks.java @@ -1,6 +1,14 @@ package class151; -// 砖头消除 +// 砖块消除 +// 给定一个长度为n的数组arr,arr[i]为i号砖块的重量 +// 选择一个没有消除的砖块进行消除,收益为消除砖块联通区域的重量之和,比如arr = {3,5,2,1} +// 如果先消除5,那么获得3+5+2+1的收益,arr = {3,X,2,1} +// 如果再消除1,那么获得2+1的收益,arr = {3,X,2,X} +// 如果再消除2,那么获得2的收益,arr = {3,X,X,X} +// 如果再消除3,那么获得3的收益,arr = {X,X,X,X} +// 很明显一共有n!种消除方案,返回所有消除方案的收益之和,答案对 1000000007 取模 +// 1 <= n <= 10^5 1 <= arr[i] <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/AT_agc028_b // 测试链接 : https://atcoder.jp/contests/agc028/tasks/agc028_b // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 From 10542ca2054503f6fa3cff84f83dcd8d3b679704 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 13 Nov 2024 15:06:01 +0800 Subject: [PATCH 0351/2029] modify code --- src/class151/Code06_RemovingBlocks.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class151/Code06_RemovingBlocks.java b/src/class151/Code06_RemovingBlocks.java index aedf04cc5..7b6b3aa77 100644 --- a/src/class151/Code06_RemovingBlocks.java +++ b/src/class151/Code06_RemovingBlocks.java @@ -7,7 +7,7 @@ // 如果再消除1,那么获得2+1的收益,arr = {3,X,2,X} // 如果再消除2,那么获得2的收益,arr = {3,X,X,X} // 如果再消除3,那么获得3的收益,arr = {X,X,X,X} -// 很明显一共有n!种消除方案,返回所有消除方案的收益之和,答案对 1000000007 取模 +// 一共有n!种消除方案,返回所有消除方案的收益之和,答案对 1000000007 取模 // 1 <= n <= 10^5 1 <= arr[i] <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/AT_agc028_b // 测试链接 : https://atcoder.jp/contests/agc028/tasks/agc028_b From b77cc91569129e9f86cdd4050ce833df08d75961 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 13 Nov 2024 15:07:52 +0800 Subject: [PATCH 0352/2029] modify code --- src/class151/Code05_Periodni.java | 3 +-- src/class151/Code06_RemovingBlocks.java | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/class151/Code05_Periodni.java b/src/class151/Code05_Periodni.java index c064fabe1..022a90523 100644 --- a/src/class151/Code05_Periodni.java +++ b/src/class151/Code05_Periodni.java @@ -6,8 +6,7 @@ // 在这片区域中,有k个相同的数字要放进去,不能有任意两个数在同一行或者同一列 // 注意在直方图中,如果同一行中间断开了,让两个数字无法在这一行联通,则不算违规 // 返回填入数字的方法数,答案对 1000000007 取模 -// 1 <= n,k <= 500 -// 0 <= arr[i] <= 10^6 +// 1 <= n,k <= 500 0 <= arr[i] <= 10^6 // 测试链接 : https://www.luogu.com.cn/problem/P6453 // 因为本题给定的可用空间很少,所以数组为int类型,不用long类型 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class151/Code06_RemovingBlocks.java b/src/class151/Code06_RemovingBlocks.java index 7b6b3aa77..b5740af1c 100644 --- a/src/class151/Code06_RemovingBlocks.java +++ b/src/class151/Code06_RemovingBlocks.java @@ -8,7 +8,7 @@ // 如果再消除2,那么获得2的收益,arr = {3,X,X,X} // 如果再消除3,那么获得3的收益,arr = {X,X,X,X} // 一共有n!种消除方案,返回所有消除方案的收益之和,答案对 1000000007 取模 -// 1 <= n <= 10^5 1 <= arr[i] <= 10^9 +// 1 <= n <= 10^5 1 <= arr[i] <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/AT_agc028_b // 测试链接 : https://atcoder.jp/contests/agc028/tasks/agc028_b // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 From 135b78f4233902f9656b2b7490a29eed1ccba57a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 13 Nov 2024 15:22:08 +0800 Subject: [PATCH 0353/2029] modify code --- src/class151/Code01_DescartesTree1.java | 4 ++-- src/class151/Code01_DescartesTree2.java | 4 ++-- src/class151/Code04_CountingProblem.java | 2 +- src/class151/Code05_Periodni.java | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/class151/Code01_DescartesTree1.java b/src/class151/Code01_DescartesTree1.java index ebf4e49e3..4765f62a3 100644 --- a/src/class151/Code01_DescartesTree1.java +++ b/src/class151/Code01_DescartesTree1.java @@ -3,8 +3,8 @@ // 笛卡尔树模版(java版) // 给定一个长度为n的数组arr,下标从1开始 // 构建一棵二叉树,下标按照搜索二叉树组织,值按照小根堆组织 -// 建好树的过程要求时间复杂度O(n) -// 建好树之后,为了验证 +// 建树的过程要求时间复杂度O(n) +// 建树之后,为了验证 // 打印,i * (left[i] + 1),所有信息异或起来的值 // 打印,i * (right[i] + 1),所有信息异或起来的值 // 测试链接 : https://www.luogu.com.cn/problem/P5854 diff --git a/src/class151/Code01_DescartesTree2.java b/src/class151/Code01_DescartesTree2.java index 6e65a0fad..4183984c3 100644 --- a/src/class151/Code01_DescartesTree2.java +++ b/src/class151/Code01_DescartesTree2.java @@ -3,8 +3,8 @@ // 笛卡尔树模版(C++版) // 给定一个长度为n的数组arr,下标从1开始 // 构建一棵二叉树,下标按照搜索二叉树组织,值按照小根堆组织 -// 建好树的过程要求时间复杂度O(n) -// 建好树之后,为了验证 +// 建树的过程要求时间复杂度O(n) +// 建树之后,为了验证 // 打印,i * (left[i] + 1),所有信息异或起来的值 // 打印,i * (right[i] + 1),所有信息异或起来的值 // 测试链接 : https://www.luogu.com.cn/problem/P5854 diff --git a/src/class151/Code04_CountingProblem.java b/src/class151/Code04_CountingProblem.java index 258fd1f48..35b014977 100644 --- a/src/class151/Code04_CountingProblem.java +++ b/src/class151/Code04_CountingProblem.java @@ -7,7 +7,7 @@ // 给定一个长度为n的数组A,那么必然存在等长的数组B // 两者在任意范围上,最左端最大值位置是相同的,不仅存在数组B,而且是无限多的 // 现在要求,数组B中的每个值都在[1,m]范围,返回有多少个这样的数组,答案对 1000000007 取模 -// 2 <= n, m <= 2 * 10^5 1 <= A[i] <= m n * m <= 10^6 +// 2 <= n、m <= 2 * 10^5 1 <= A[i] <= m n * m <= 10^6 // 测试链接 : https://www.luogu.com.cn/problem/CF1748E // 测试链接 : https://codeforces.com/problemset/problem/1748/E // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class151/Code05_Periodni.java b/src/class151/Code05_Periodni.java index 022a90523..2e901231e 100644 --- a/src/class151/Code05_Periodni.java +++ b/src/class151/Code05_Periodni.java @@ -6,7 +6,7 @@ // 在这片区域中,有k个相同的数字要放进去,不能有任意两个数在同一行或者同一列 // 注意在直方图中,如果同一行中间断开了,让两个数字无法在这一行联通,则不算违规 // 返回填入数字的方法数,答案对 1000000007 取模 -// 1 <= n,k <= 500 0 <= arr[i] <= 10^6 +// 1 <= n、k <= 500 0 <= arr[i] <= 10^6 // 测试链接 : https://www.luogu.com.cn/problem/P6453 // 因为本题给定的可用空间很少,所以数组为int类型,不用long类型 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 From da6674e4c02dfbe936e8af4dbb198631cb6b4cbb Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 13 Nov 2024 16:09:05 +0800 Subject: [PATCH 0354/2029] modify code --- src/class151/Code05_Periodni.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/class151/Code05_Periodni.java b/src/class151/Code05_Periodni.java index 2e901231e..aee169a54 100644 --- a/src/class151/Code05_Periodni.java +++ b/src/class151/Code05_Periodni.java @@ -99,12 +99,12 @@ public static void dfs(int u, int fa) { dfs(left[u], u); dfs(right[u], u); size[u] = size[left[u]] + size[right[u]] + 1; - for (int i = 0; i <= size[left[u]]; i++) { - for (int j = 0; j <= size[right[u]]; j++) { + for (int i = 0; i <= Math.min(size[left[u]], k); i++) { + for (int j = 0; j <= Math.min(size[right[u]], k - i); j++) { tmp[u][i + j] = (int) (tmp[u][i + j] + (long) dp[left[u]][i] * dp[right[u]][j] % MOD) % MOD; } } - for (int i = 0; i <= size[u]; i++) { + for (int i = 0; i <= Math.min(size[u], k); i++) { for (int j = 0; j <= i; j++) { dp[u][i] = (int) (dp[u][i] + (long) tmp[u][j] * fac[i - j] % MOD * c(size[u] - j, i - j) % MOD * c(arr[u] - arr[fa], i - j) % MOD) % MOD; From 1b5479f5ddfb8f00cca36a0097ade8aa505335e6 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 13 Nov 2024 16:15:17 +0800 Subject: [PATCH 0355/2029] modify code --- src/class151/Code05_Periodni.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/class151/Code05_Periodni.java b/src/class151/Code05_Periodni.java index aee169a54..5cad6f4b9 100644 --- a/src/class151/Code05_Periodni.java +++ b/src/class151/Code05_Periodni.java @@ -99,11 +99,13 @@ public static void dfs(int u, int fa) { dfs(left[u], u); dfs(right[u], u); size[u] = size[left[u]] + size[right[u]] + 1; + // 所有dfs过程都算上,这一部分的总复杂度O(n^2) for (int i = 0; i <= Math.min(size[left[u]], k); i++) { for (int j = 0; j <= Math.min(size[right[u]], k - i); j++) { tmp[u][i + j] = (int) (tmp[u][i + j] + (long) dp[left[u]][i] * dp[right[u]][j] % MOD) % MOD; } } + // 所有dfs过程都算上,这一部分的总复杂度O(min(n的3次方, n * k平方)) for (int i = 0; i <= Math.min(size[u], k); i++) { for (int j = 0; j <= i; j++) { dp[u][i] = (int) (dp[u][i] + (long) tmp[u][j] * fac[i - j] % MOD * c(size[u] - j, i - j) % MOD From 39fa37bcc5a5e030e7f4207b5c17c0975c942cb3 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 14 Nov 2024 17:35:39 +0800 Subject: [PATCH 0356/2029] modify code --- src/class151/Code01_DescartesTree1.java | 1 + src/class151/Code01_DescartesTree2.java | 1 + 2 files changed, 2 insertions(+) diff --git a/src/class151/Code01_DescartesTree1.java b/src/class151/Code01_DescartesTree1.java index 4765f62a3..98d5e5d22 100644 --- a/src/class151/Code01_DescartesTree1.java +++ b/src/class151/Code01_DescartesTree1.java @@ -7,6 +7,7 @@ // 建树之后,为了验证 // 打印,i * (left[i] + 1),所有信息异或起来的值 // 打印,i * (right[i] + 1),所有信息异或起来的值 +// 1 <= n <= 10^7 // 测试链接 : https://www.luogu.com.cn/problem/P5854 // 如下实现是正确的,但java的版本无法通过所有测试用例 // 这是洛谷平台没有照顾各种语言的实现所导致的 diff --git a/src/class151/Code01_DescartesTree2.java b/src/class151/Code01_DescartesTree2.java index 4183984c3..d79a3c5ee 100644 --- a/src/class151/Code01_DescartesTree2.java +++ b/src/class151/Code01_DescartesTree2.java @@ -7,6 +7,7 @@ // 建树之后,为了验证 // 打印,i * (left[i] + 1),所有信息异或起来的值 // 打印,i * (right[i] + 1),所有信息异或起来的值 +// 1 <= n <= 10^7 // 测试链接 : https://www.luogu.com.cn/problem/P5854 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From 692169b08c91f2cb6789383a75ee3fd004651639 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 14 Nov 2024 17:58:58 +0800 Subject: [PATCH 0357/2029] modify code --- src/class151/Code04_CountingProblem.java | 4 ++-- src/class151/Code05_Periodni.java | 8 ++++---- src/class151/Code06_RemovingBlocks.java | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/class151/Code04_CountingProblem.java b/src/class151/Code04_CountingProblem.java index 35b014977..cec21b01d 100644 --- a/src/class151/Code04_CountingProblem.java +++ b/src/class151/Code04_CountingProblem.java @@ -4,8 +4,8 @@ // 有一个概念叫,最左端最大值位置,表示一段范围上 // 如果最大值有一个,那么最大值所在的位置,就是最左端最大值位置 // 如果最大值有多个,最左的那个所在的位置,就是最左端最大值位置 -// 给定一个长度为n的数组A,那么必然存在等长的数组B -// 两者在任意范围上,最左端最大值位置是相同的,不仅存在数组B,而且是无限多的 +// 给定一个长度为n的数组A,那么必然存在等长的数组B,当选择同样的子范围时 +// 两者在这段范围上,最左端最大值位置是相同的,不仅存在这样的数组B,而且数量无限多 // 现在要求,数组B中的每个值都在[1,m]范围,返回有多少个这样的数组,答案对 1000000007 取模 // 2 <= n、m <= 2 * 10^5 1 <= A[i] <= m n * m <= 10^6 // 测试链接 : https://www.luogu.com.cn/problem/CF1748E diff --git a/src/class151/Code05_Periodni.java b/src/class151/Code05_Periodni.java index 5cad6f4b9..998c5c563 100644 --- a/src/class151/Code05_Periodni.java +++ b/src/class151/Code05_Periodni.java @@ -2,10 +2,10 @@ // 表格填数 // 给定一个长度为n的数组arr,arr[i]表示i位置上方的正方形格子数量 -// 那么从1位置到n位置,每个位置就是一个直方图,所有的直方图认为拼在一起 -// 在这片区域中,有k个相同的数字要放进去,不能有任意两个数在同一行或者同一列 -// 注意在直方图中,如果同一行中间断开了,让两个数字无法在这一行联通,则不算违规 -// 返回填入数字的方法数,答案对 1000000007 取模 +// 那么从1位置到n位置,每个位置就是一个直方图,所有的直方图紧靠在一起 +// 在这片区域中,你要放入k个石头,不能有任意两个石头在同一行或者同一列 +// 注意在这片区域中,如果某一行中间断开了,使得两个石头无法在这一行连通,则不算违规 +// 返回填入石头的方法数,答案对 1000000007 取模 // 1 <= n、k <= 500 0 <= arr[i] <= 10^6 // 测试链接 : https://www.luogu.com.cn/problem/P6453 // 因为本题给定的可用空间很少,所以数组为int类型,不用long类型 diff --git a/src/class151/Code06_RemovingBlocks.java b/src/class151/Code06_RemovingBlocks.java index b5740af1c..346fda77e 100644 --- a/src/class151/Code06_RemovingBlocks.java +++ b/src/class151/Code06_RemovingBlocks.java @@ -2,12 +2,12 @@ // 砖块消除 // 给定一个长度为n的数组arr,arr[i]为i号砖块的重量 -// 选择一个没有消除的砖块进行消除,收益为消除砖块联通区域的重量之和,比如arr = {3,5,2,1} +// 选择一个没有消除的砖块进行消除,收益为被消除砖块联通区域的重量之和,比如arr = {3,5,2,1} // 如果先消除5,那么获得3+5+2+1的收益,arr = {3,X,2,1} // 如果再消除1,那么获得2+1的收益,arr = {3,X,2,X} // 如果再消除2,那么获得2的收益,arr = {3,X,X,X} // 如果再消除3,那么获得3的收益,arr = {X,X,X,X} -// 一共有n!种消除方案,返回所有消除方案的收益之和,答案对 1000000007 取模 +// 一共有n!种消除方案,返回所有消除方案的收益总和,答案对 1000000007 取模 // 1 <= n <= 10^5 1 <= arr[i] <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/AT_agc028_b // 测试链接 : https://atcoder.jp/contests/agc028/tasks/agc028_b From af6fab1acdfe076e3db0ddab1ef25191899c4b44 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 14 Nov 2024 18:00:44 +0800 Subject: [PATCH 0358/2029] modify code --- src/class151/Code05_Periodni.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/class151/Code05_Periodni.java b/src/class151/Code05_Periodni.java index 998c5c563..dbc98b42e 100644 --- a/src/class151/Code05_Periodni.java +++ b/src/class151/Code05_Periodni.java @@ -3,9 +3,9 @@ // 表格填数 // 给定一个长度为n的数组arr,arr[i]表示i位置上方的正方形格子数量 // 那么从1位置到n位置,每个位置就是一个直方图,所有的直方图紧靠在一起 -// 在这片区域中,你要放入k个石头,不能有任意两个石头在同一行或者同一列 -// 注意在这片区域中,如果某一行中间断开了,使得两个石头无法在这一行连通,则不算违规 -// 返回填入石头的方法数,答案对 1000000007 取模 +// 在这片区域中,你要放入k个相同数字,不能有任意两个数字在同一行或者同一列 +// 注意在这片区域中,如果某一行中间断开了,使得两个数字无法在这一行连通,则不算违规 +// 返回填入数字的方法数,答案对 1000000007 取模 // 1 <= n、k <= 500 0 <= arr[i] <= 10^6 // 测试链接 : https://www.luogu.com.cn/problem/P6453 // 因为本题给定的可用空间很少,所以数组为int类型,不用long类型 From cec2eefeb62588c7ecbb7d3fd3f3cfab827ed077 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 14 Nov 2024 22:06:38 +0800 Subject: [PATCH 0359/2029] modify code --- src/class151/Code03_TreeOrder.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class151/Code03_TreeOrder.java b/src/class151/Code03_TreeOrder.java index 82775039b..eb1e7a5ef 100644 --- a/src/class151/Code03_TreeOrder.java +++ b/src/class151/Code03_TreeOrder.java @@ -1,8 +1,8 @@ package class151; // 树的序 -// 给定一个长度为n的数组arr,表示依次插入数值,会形成一棵搜索二叉树 -// 也许同样的一个序列,依次插入数组后,也能形成同样形态的搜索二叉树 +// 给定一个长度为n的数组arr,表示依次插入数字,会形成一棵搜索二叉树 +// 也许同样的一个序列,依次插入数字后,也能形成同样形态的搜索二叉树 // 请返回字典序尽量小的结果 // 1 <= n <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P1377 From 516d2b45585e0c53f77d0253c34fa4678c602733 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 15 Nov 2024 17:16:11 +0800 Subject: [PATCH 0360/2029] modify code --- src/class151/Code05_Periodni.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/class151/Code05_Periodni.java b/src/class151/Code05_Periodni.java index dbc98b42e..be8696fec 100644 --- a/src/class151/Code05_Periodni.java +++ b/src/class151/Code05_Periodni.java @@ -108,8 +108,8 @@ public static void dfs(int u, int fa) { // 所有dfs过程都算上,这一部分的总复杂度O(min(n的3次方, n * k平方)) for (int i = 0; i <= Math.min(size[u], k); i++) { for (int j = 0; j <= i; j++) { - dp[u][i] = (int) (dp[u][i] + (long) tmp[u][j] * fac[i - j] % MOD * c(size[u] - j, i - j) % MOD - * c(arr[u] - arr[fa], i - j) % MOD) % MOD; + dp[u][i] = (int) (dp[u][i] + (long) c(size[u] - j, i - j) * c(arr[u] - arr[fa], i - j) % MOD + * fac[i - j] % MOD * tmp[u][j] % MOD) % MOD; } } } @@ -139,4 +139,4 @@ public static void main(String[] args) throws IOException { br.close(); } -} +} \ No newline at end of file From c6c66dd5cdd62653ebc82ef036cef204494776c6 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 15 Nov 2024 18:01:05 +0800 Subject: [PATCH 0361/2029] modify code --- src/class151/Code04_CountingProblem.java | 43 +++++++++++++++--------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/src/class151/Code04_CountingProblem.java b/src/class151/Code04_CountingProblem.java index cec21b01d..6fec1b727 100644 --- a/src/class151/Code04_CountingProblem.java +++ b/src/class151/Code04_CountingProblem.java @@ -26,14 +26,19 @@ public class Code04_CountingProblem { public static int MAXN = 1000001; + // 所有数字 public static int[] arr = new int[MAXN]; + // 笛卡尔树需要 public static int[] left = new int[MAXN]; public static int[] right = new int[MAXN]; public static int[] stack = new int[MAXN]; + // tmp是动态规划的临时结果 + public static long[] tmp = new long[MAXN]; + public static int n, m; public static void build() { @@ -53,24 +58,21 @@ public static void build() { } } - public static void dfs(int i, long[][] dp) { - for (int j = 1; j <= m; j++) { - dp[i][j] = 1; + public static void dfs(int i, int[][] dp) { + if (i == 0) { + return; } - if (left[i] != 0) { - dfs(left[i], dp); - for (int j = 1; j <= m; j++) { - dp[i][j] = dp[i][j] * dp[left[i]][j - 1] % MOD; - } + dfs(left[i], dp); + dfs(right[i], dp); + Arrays.fill(tmp, 1, m + 1, 1); + for (int j = 1; j <= m; j++) { + tmp[j] = tmp[j] * dp[left[i]][j - 1] % MOD; } - if (right[i] != 0) { - dfs(right[i], dp); - for (int j = 1; j <= m; j++) { - dp[i][j] = dp[i][j] * dp[right[i]][j] % MOD; - } + for (int j = 1; j <= m; j++) { + tmp[j] = tmp[j] * dp[right[i]][j] % MOD; } - for (int j = 2; j <= m; j++) { - dp[i][j] = (dp[i][j] + dp[i][j - 1]) % MOD; + for (int j = 1; j <= m; j++) { + dp[i][j] = (int) ((dp[i][j - 1] + tmp[j]) % MOD); } } @@ -81,7 +83,16 @@ public static void clear() { public static long compute() { build(); - long[][] dp = new long[n + 1][m + 1]; + // 虽然n * m <= 10^6,但是n和m,单独都有可能到达10^6规模 + // 如果提前准备固定大小的动态规划表,那就只能准备10^6 * 10^6规模的表了 + // 这是不可能的,空间根本接受不了 + // 所以根据此时具体的n和m的大小,临时申请动态规划表 + int[][] dp = new int[n + 1][m + 1]; + // 没有节点时,不管要求节点值是什么,都默认有1种形态 + // 因为没有节点时,根本不影响任何决策 + for (int j = 0; j <= m; j++) { + dp[0][j] = 1; + } dfs(stack[1], dp); clear(); return dp[stack[1]][m]; From fe7e49fe3697c757a146a58a62a75d291c055199 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 15 Nov 2024 18:02:45 +0800 Subject: [PATCH 0362/2029] modify code --- src/class151/Code04_CountingProblem.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/class151/Code04_CountingProblem.java b/src/class151/Code04_CountingProblem.java index 6fec1b727..c7b7edc8a 100644 --- a/src/class151/Code04_CountingProblem.java +++ b/src/class151/Code04_CountingProblem.java @@ -86,11 +86,11 @@ public static long compute() { // 虽然n * m <= 10^6,但是n和m,单独都有可能到达10^6规模 // 如果提前准备固定大小的动态规划表,那就只能准备10^6 * 10^6规模的表了 // 这是不可能的,空间根本接受不了 - // 所以根据此时具体的n和m的大小,临时申请动态规划表 + // 所以根据此时具体的n和m的大小,临时申请动态规划表,总大小不超过10^6 int[][] dp = new int[n + 1][m + 1]; - // 没有节点时,不管要求节点值是什么,都默认有1种形态 - // 因为没有节点时,根本不影响任何决策 for (int j = 0; j <= m; j++) { + // 没有节点时,不管要求节点值是什么,都默认有1种形态 + // 因为没有节点时,根本不影响任何决策 dp[0][j] = 1; } dfs(stack[1], dp); From d27864fa82b27147837e365954010a01b98b9e48 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 15 Nov 2024 18:06:47 +0800 Subject: [PATCH 0363/2029] modify code --- src/class151/Code05_Periodni.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/class151/Code05_Periodni.java b/src/class151/Code05_Periodni.java index be8696fec..bb78506a8 100644 --- a/src/class151/Code05_Periodni.java +++ b/src/class151/Code05_Periodni.java @@ -45,8 +45,10 @@ public class Code05_Periodni { // dfs需要 public static int[] size = new int[MAXN]; + // dp是动态规划表 public static int[][] dp = new int[MAXN][MAXN]; + // tmp是动态规划的临时结果 public static int[][] tmp = new int[MAXN][MAXN]; public static int n, k; From 0ae21f713c73f03f2963ae5b0d8aa113a1ce27ab Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 15 Nov 2024 20:02:04 +0800 Subject: [PATCH 0364/2029] modify code --- src/class151/Code04_CountingProblem.java | 6 +--- src/class151/Code05_Periodni.java | 36 ++++++++++++------------ 2 files changed, 19 insertions(+), 23 deletions(-) diff --git a/src/class151/Code04_CountingProblem.java b/src/class151/Code04_CountingProblem.java index c7b7edc8a..d1c2ba048 100644 --- a/src/class151/Code04_CountingProblem.java +++ b/src/class151/Code04_CountingProblem.java @@ -64,12 +64,8 @@ public static void dfs(int i, int[][] dp) { } dfs(left[i], dp); dfs(right[i], dp); - Arrays.fill(tmp, 1, m + 1, 1); for (int j = 1; j <= m; j++) { - tmp[j] = tmp[j] * dp[left[i]][j - 1] % MOD; - } - for (int j = 1; j <= m; j++) { - tmp[j] = tmp[j] * dp[right[i]][j] % MOD; + tmp[j] = (long) dp[left[i]][j - 1] * dp[right[i]][j] % MOD; } for (int j = 1; j <= m; j++) { dp[i][j] = (int) ((dp[i][j - 1] + tmp[j]) % MOD); diff --git a/src/class151/Code05_Periodni.java b/src/class151/Code05_Periodni.java index bb78506a8..2f8e6963a 100644 --- a/src/class151/Code05_Periodni.java +++ b/src/class151/Code05_Periodni.java @@ -94,31 +94,31 @@ public static void build() { } } - public static void dfs(int u, int fa) { - if (u == 0) { - dp[u][0] = 1; - } else { - dfs(left[u], u); - dfs(right[u], u); - size[u] = size[left[u]] + size[right[u]] + 1; - // 所有dfs过程都算上,这一部分的总复杂度O(n^2) - for (int i = 0; i <= Math.min(size[left[u]], k); i++) { - for (int j = 0; j <= Math.min(size[right[u]], k - i); j++) { - tmp[u][i + j] = (int) (tmp[u][i + j] + (long) dp[left[u]][i] * dp[right[u]][j] % MOD) % MOD; - } + public static void dfs(int i, int fa) { + if (i == 0) { + return; + } + dfs(left[i], i); + dfs(right[i], i); + size[i] = size[left[i]] + size[right[i]] + 1; + // 所有dfs过程都算上,这一部分的总复杂度O(n^2) + for (int l = 0; l <= Math.min(size[left[i]], k); l++) { + for (int r = 0; r <= Math.min(size[right[i]], k - l); r++) { + tmp[i][l + r] = (int) (tmp[i][l + r] + (long) dp[left[i]][l] * dp[right[i]][r] % MOD) % MOD; } - // 所有dfs过程都算上,这一部分的总复杂度O(min(n的3次方, n * k平方)) - for (int i = 0; i <= Math.min(size[u], k); i++) { - for (int j = 0; j <= i; j++) { - dp[u][i] = (int) (dp[u][i] + (long) c(size[u] - j, i - j) * c(arr[u] - arr[fa], i - j) % MOD - * fac[i - j] % MOD * tmp[u][j] % MOD) % MOD; - } + } + // 所有dfs过程都算上,这一部分的总复杂度O(min(n的3次方, n * k平方)) + for (int a = 0; a <= Math.min(size[i], k); a++) { + for (int b = 0; b <= a; b++) { + dp[i][a] = (int) (dp[i][a] + (long) c(size[i] - b, a - b) * c(arr[i] - arr[fa], a - b) % MOD + * fac[a - b] % MOD * tmp[i][b] % MOD) % MOD; } } } public static int compute() { build(); + dp[0][0] = 1; dfs(stack[1], 0); return dp[stack[1]][k]; } From 54d3cdebdbadea0e8ff151593f28b75c7482ebb8 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 15 Nov 2024 20:03:22 +0800 Subject: [PATCH 0365/2029] modify code --- src/class151/Code04_CountingProblem.java | 12 ++++++------ src/class151/Code05_Periodni.java | 24 ++++++++++++------------ 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/class151/Code04_CountingProblem.java b/src/class151/Code04_CountingProblem.java index d1c2ba048..405780b53 100644 --- a/src/class151/Code04_CountingProblem.java +++ b/src/class151/Code04_CountingProblem.java @@ -58,17 +58,17 @@ public static void build() { } } - public static void dfs(int i, int[][] dp) { - if (i == 0) { + public static void dfs(int u, int[][] dp) { + if (u == 0) { return; } - dfs(left[i], dp); - dfs(right[i], dp); + dfs(left[u], dp); + dfs(right[u], dp); for (int j = 1; j <= m; j++) { - tmp[j] = (long) dp[left[i]][j - 1] * dp[right[i]][j] % MOD; + tmp[j] = (long) dp[left[u]][j - 1] * dp[right[u]][j] % MOD; } for (int j = 1; j <= m; j++) { - dp[i][j] = (int) ((dp[i][j - 1] + tmp[j]) % MOD); + dp[u][j] = (int) ((dp[u][j - 1] + tmp[j]) % MOD); } } diff --git a/src/class151/Code05_Periodni.java b/src/class151/Code05_Periodni.java index 2f8e6963a..5e2246524 100644 --- a/src/class151/Code05_Periodni.java +++ b/src/class151/Code05_Periodni.java @@ -94,24 +94,24 @@ public static void build() { } } - public static void dfs(int i, int fa) { - if (i == 0) { + public static void dfs(int u, int fa) { + if (u == 0) { return; } - dfs(left[i], i); - dfs(right[i], i); - size[i] = size[left[i]] + size[right[i]] + 1; + dfs(left[u], u); + dfs(right[u], u); + size[u] = size[left[u]] + size[right[u]] + 1; // 所有dfs过程都算上,这一部分的总复杂度O(n^2) - for (int l = 0; l <= Math.min(size[left[i]], k); l++) { - for (int r = 0; r <= Math.min(size[right[i]], k - l); r++) { - tmp[i][l + r] = (int) (tmp[i][l + r] + (long) dp[left[i]][l] * dp[right[i]][r] % MOD) % MOD; + for (int i = 0; i <= Math.min(size[left[u]], k); i++) { + for (int j = 0; j <= Math.min(size[right[u]], k - i); j++) { + tmp[u][i + j] = (int) (tmp[u][i + j] + (long) dp[left[u]][i] * dp[right[u]][j] % MOD) % MOD; } } // 所有dfs过程都算上,这一部分的总复杂度O(min(n的3次方, n * k平方)) - for (int a = 0; a <= Math.min(size[i], k); a++) { - for (int b = 0; b <= a; b++) { - dp[i][a] = (int) (dp[i][a] + (long) c(size[i] - b, a - b) * c(arr[i] - arr[fa], a - b) % MOD - * fac[a - b] % MOD * tmp[i][b] % MOD) % MOD; + for (int i = 0; i <= Math.min(size[u], k); i++) { + for (int j = 0; j <= i; j++) { + dp[u][i] = (int) (dp[u][i] + (long) c(size[u] - j, i - j) * c(arr[u] - arr[fa], i - j) % MOD + * fac[i - j] % MOD * tmp[u][j] % MOD) % MOD; } } } From 96f24463fbf7f492290e8b800cfc2f61c71146c7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 15 Nov 2024 20:15:12 +0800 Subject: [PATCH 0366/2029] modify code --- src/class151/Code04_CountingProblem.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/class151/Code04_CountingProblem.java b/src/class151/Code04_CountingProblem.java index 405780b53..60fbc5238 100644 --- a/src/class151/Code04_CountingProblem.java +++ b/src/class151/Code04_CountingProblem.java @@ -79,9 +79,8 @@ public static void clear() { public static long compute() { build(); - // 虽然n * m <= 10^6,但是n和m,单独都有可能到达10^6规模 - // 如果提前准备固定大小的动态规划表,那就只能准备10^6 * 10^6规模的表了 - // 这是不可能的,空间根本接受不了 + // 虽然n * m <= 10^6,但是n和m,单独都是2 * 10^5规模 + // 所以提前准备固定大小的表是不可能的,空间根本接受不了 // 所以根据此时具体的n和m的大小,临时申请动态规划表,总大小不超过10^6 int[][] dp = new int[n + 1][m + 1]; for (int j = 0; j <= m; j++) { From d4025f53165c11916a0763e515d515c62e3fa97f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 15 Nov 2024 20:31:03 +0800 Subject: [PATCH 0367/2029] modify code --- src/class151/Code05_Periodni.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class151/Code05_Periodni.java b/src/class151/Code05_Periodni.java index 5e2246524..5df2cc432 100644 --- a/src/class151/Code05_Periodni.java +++ b/src/class151/Code05_Periodni.java @@ -66,7 +66,7 @@ public static int power(long x, long p) { } public static int c(int n, int k) { - return k > n ? 0 : (int) ((long) fac[n] * inv[k] % MOD * inv[n - k] % MOD); + return n < k ? 0 : (int) ((long) fac[n] * inv[k] % MOD * inv[n - k] % MOD); } public static void build() { From c26fb822ee9cd6d9ab0ff1b5c213c48855abbf88 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 15 Nov 2024 23:25:40 +0800 Subject: [PATCH 0368/2029] modify code --- src/class151/Code05_Periodni.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/class151/Code05_Periodni.java b/src/class151/Code05_Periodni.java index 5df2cc432..641a8a966 100644 --- a/src/class151/Code05_Periodni.java +++ b/src/class151/Code05_Periodni.java @@ -102,16 +102,16 @@ public static void dfs(int u, int fa) { dfs(right[u], u); size[u] = size[left[u]] + size[right[u]] + 1; // 所有dfs过程都算上,这一部分的总复杂度O(n^2) - for (int i = 0; i <= Math.min(size[left[u]], k); i++) { - for (int j = 0; j <= Math.min(size[right[u]], k - i); j++) { - tmp[u][i + j] = (int) (tmp[u][i + j] + (long) dp[left[u]][i] * dp[right[u]][j] % MOD) % MOD; + for (int l = 0; l <= Math.min(size[left[u]], k); l++) { + for (int r = 0; r <= Math.min(size[right[u]], k - l); r++) { + tmp[u][l + r] = (int) (tmp[u][l + r] + (long) dp[left[u]][l] * dp[right[u]][r] % MOD) % MOD; } } // 所有dfs过程都算上,这一部分的总复杂度O(min(n的3次方, n * k平方)) for (int i = 0; i <= Math.min(size[u], k); i++) { - for (int j = 0; j <= i; j++) { - dp[u][i] = (int) (dp[u][i] + (long) c(size[u] - j, i - j) * c(arr[u] - arr[fa], i - j) % MOD - * fac[i - j] % MOD * tmp[u][j] % MOD) % MOD; + for (int p = 0; p <= i; p++) { + dp[u][i] = (int) (dp[u][i] + (long) c(size[u] - p, i - p) * c(arr[u] - arr[fa], i - p) % MOD + * fac[i - p] % MOD * tmp[u][p] % MOD) % MOD; } } } From d55fbbe8830a5b5d43d32dafeee65709a6005063 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 15 Nov 2024 23:43:13 +0800 Subject: [PATCH 0369/2029] modify code --- src/class151/Code05_Periodni.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/class151/Code05_Periodni.java b/src/class151/Code05_Periodni.java index 641a8a966..31cab91f3 100644 --- a/src/class151/Code05_Periodni.java +++ b/src/class151/Code05_Periodni.java @@ -17,6 +17,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.StreamTokenizer; +import java.util.Arrays; public class Code05_Periodni { @@ -49,7 +50,7 @@ public class Code05_Periodni { public static int[][] dp = new int[MAXN][MAXN]; // tmp是动态规划的临时结果 - public static int[][] tmp = new int[MAXN][MAXN]; + public static int[] tmp = new int[MAXN]; public static int n, k; @@ -101,17 +102,18 @@ public static void dfs(int u, int fa) { dfs(left[u], u); dfs(right[u], u); size[u] = size[left[u]] + size[right[u]] + 1; + Arrays.fill(tmp, 0, k + 1, 0); // 所有dfs过程都算上,这一部分的总复杂度O(n^2) for (int l = 0; l <= Math.min(size[left[u]], k); l++) { for (int r = 0; r <= Math.min(size[right[u]], k - l); r++) { - tmp[u][l + r] = (int) (tmp[u][l + r] + (long) dp[left[u]][l] * dp[right[u]][r] % MOD) % MOD; + tmp[l + r] = (int) (tmp[l + r] + (long) dp[left[u]][l] * dp[right[u]][r] % MOD) % MOD; } } // 所有dfs过程都算上,这一部分的总复杂度O(min(n的3次方, n * k平方)) for (int i = 0; i <= Math.min(size[u], k); i++) { for (int p = 0; p <= i; p++) { dp[u][i] = (int) (dp[u][i] + (long) c(size[u] - p, i - p) * c(arr[u] - arr[fa], i - p) % MOD - * fac[i - p] % MOD * tmp[u][p] % MOD) % MOD; + * fac[i - p] % MOD * tmp[p] % MOD) % MOD; } } } From 9e0c41eab73de8b2d18ce04189cd6b53b8f4856d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 16 Nov 2024 01:38:08 +0800 Subject: [PATCH 0370/2029] modify code --- ...6\240\221\343\200\201Treap\346\240\221.pptx" | Bin 0 -> 54297 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "ppt/\347\256\227\346\263\225\350\256\262\350\247\243151\343\200\220\346\211\251\345\261\225\343\200\221\346\234\211\345\272\217\350\241\250\344\270\223\351\242\2304-\347\254\233\345\215\241\345\260\224\346\240\221\343\200\201Treap\346\240\221.pptx" diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243151\343\200\220\346\211\251\345\261\225\343\200\221\346\234\211\345\272\217\350\241\250\344\270\223\351\242\2304-\347\254\233\345\215\241\345\260\224\346\240\221\343\200\201Treap\346\240\221.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243151\343\200\220\346\211\251\345\261\225\343\200\221\346\234\211\345\272\217\350\241\250\344\270\223\351\242\2304-\347\254\233\345\215\241\345\260\224\346\240\221\343\200\201Treap\346\240\221.pptx" new file mode 100644 index 0000000000000000000000000000000000000000..a80149fcfda0df91ab86c24c82bc161b86b2c28e GIT binary patch literal 54297 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 literal 0 HcmV?d00001 From ef4e7e9ba5ed4cdc3f1747eafced0c55dcdcf22b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 18 Nov 2024 15:13:02 +0800 Subject: [PATCH 0371/2029] modify code --- src/class152/Code01_FHQTreap1.java | 241 +++++++++++++++++++++++++++++ src/class152/Code01_FHQTreap2.java | 214 +++++++++++++++++++++++++ 2 files changed, 455 insertions(+) create mode 100644 src/class152/Code01_FHQTreap1.java create mode 100644 src/class152/Code01_FHQTreap2.java diff --git a/src/class152/Code01_FHQTreap1.java b/src/class152/Code01_FHQTreap1.java new file mode 100644 index 000000000..4cc6d4889 --- /dev/null +++ b/src/class152/Code01_FHQTreap1.java @@ -0,0 +1,241 @@ +package class152; + +// FHQ-Treap实现普通有序表(java版) +// 实现一种结构,支持如下操作,要求单次调用的时间复杂度O(log n) +// 1,增加x,重复加入算多个词频 +// 2,删除x,如果有多个,只删掉一个 +// 3,查询x的排名,x的排名为,比x小的数的个数+1 +// 4,查询数据中排名为x的数 +// 5,查询x的前驱,x的前驱为,小于x的数中最大的数,不存在返回整数最小值 +// 6,查询x的后继,x的后继为,大于x的数中最小的数,不存在返回整数最大值 +// 所有操作的次数 <= 10^5 +// -10^7 <= x <= +10^7 +// 测试链接 : https://www.luogu.com.cn/problem/P3369 +// 提交以下的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 Code01_FHQTreap1 { + + public static int MAXN = 100001; + + // 整棵树的头节点编号 + public static int head = 0; + + // 空间使用计数 + public static int cnt = 0; + + // 节点的key值 + public static int[] key = new int[MAXN]; + + // 节点key的计数 + public static int[] count = new int[MAXN]; + + // 左孩子 + public static int[] left = new int[MAXN]; + + // 右孩子 + public static int[] right = new int[MAXN]; + + // 数字总数 + public static int[] size = new int[MAXN]; + + // 节点优先级 + public static double[] priority = new double[MAXN]; + + public static void up(int i) { + size[i] = size[left[i]] + size[right[i]] + count[i]; + } + + public static void split(int l, int r, int i, int num) { + if (i == 0) { + right[l] = left[r] = 0; + } else { + if (key[i] <= num) { + right[l] = i; + split(i, r, right[i], num); + } else { + left[r] = i; + split(l, i, left[i], num); + } + up(i); + } + } + + public static int merge(int l, int r) { + if (l == 0 || r == 0) { + return l + r; + } + if (priority[l] >= priority[r]) { + right[l] = merge(right[l], r); + up(l); + return l; + } else { + left[r] = merge(l, left[r]); + up(r); + return r; + } + } + + public static int find(int i, int num) { + if (i == 0) { + return 0; + } + if (key[i] == num) { + return i; + } else if (key[i] > num) { + return find(left[i], num); + } else { + return find(right[i], num); + } + } + + public static void changeCount(int i, int num, int change) { + if (key[i] == num) { + count[i] += change; + } else if (key[i] > num) { + changeCount(left[i], num, change); + } else { + changeCount(right[i], num, change); + } + up(i); + } + + public static void add(int num) { + if (find(head, num) != 0) { + changeCount(head, num, 1); + } else { + key[++cnt] = num; + count[cnt] = size[cnt] = 1; + priority[cnt] = Math.random(); + split(0, 0, head, num); + head = merge(merge(right[0], cnt), left[0]); + left[0] = right[0] = 0; + } + } + + public static void remove(int num) { + int i = find(head, num); + if (i != 0) { + if (count[i] > 1) { + changeCount(head, num, -1); + } else { + split(0, 0, head, num); + int lm = right[0]; + int r = left[0]; + left[0] = right[0] = 0; + split(0, 0, lm, num - 1); + int l = right[0]; + left[0] = right[0] = 0; + head = merge(l, r); + } + } + } + + public static int small(int i, int num) { + if (i == 0) { + return 0; + } + if (key[i] >= num) { + return small(left[i], num); + } else { + return size[left[i]] + count[i] + small(right[i], num); + } + } + + public static int rank(int num) { + return small(head, num) + 1; + } + + public static int index(int i, int x) { + if (size[left[i]] >= x) { + return index(left[i], x); + } else if (size[left[i]] + count[i] < x) { + return index(right[i], x - size[left[i]] - count[i]); + } + return key[i]; + } + + public static int index(int x) { + return index(head, x); + } + + public static int pre(int i, int num) { + if (i == 0) { + return Integer.MIN_VALUE; + } + if (key[i] >= num) { + return pre(left[i], num); + } else { + return Math.max(key[i], pre(right[i], num)); + } + } + + public static int pre(int num) { + return pre(head, num); + } + + public static int post(int i, int num) { + if (i == 0) { + return Integer.MAX_VALUE; + } + if (key[i] <= num) { + return post(right[i], num); + } else { + return Math.min(key[i], post(left[i], num)); + } + } + + public static int post(int num) { + return post(head, num); + } + + public static void clear() { + Arrays.fill(key, 1, cnt + 1, 0); + Arrays.fill(count, 1, cnt + 1, 0); + Arrays.fill(left, 1, cnt + 1, 0); + Arrays.fill(right, 1, cnt + 1, 0); + Arrays.fill(size, 1, cnt + 1, 0); + Arrays.fill(priority, 1, cnt + 1, 0); + cnt = 0; + head = 0; + } + + 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(); + int n = (int) in.nval; + for (int i = 1, op, x; i <= n; i++) { + in.nextToken(); + op = (int) in.nval; + in.nextToken(); + x = (int) in.nval; + if (op == 1) { + add(x); + } else if (op == 2) { + remove(x); + } else if (op == 3) { + out.println(rank(x)); + } else if (op == 4) { + out.println(index(x)); + } else if (op == 5) { + out.println(pre(x)); + } else { + out.println(post(x)); + } + } + clear(); + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class152/Code01_FHQTreap2.java b/src/class152/Code01_FHQTreap2.java new file mode 100644 index 000000000..50ed4688a --- /dev/null +++ b/src/class152/Code01_FHQTreap2.java @@ -0,0 +1,214 @@ +package class152; + +// FHQ-Treap实现普通有序表(C++版) +// 实现一种结构,支持如下操作,要求单次调用的时间复杂度O(log n) +// 1,增加x,重复加入算多个词频 +// 2,删除x,如果有多个,只删掉一个 +// 3,查询x的排名,x的排名为,比x小的数的个数+1 +// 4,查询数据中排名为x的数 +// 5,查询x的前驱,x的前驱为,小于x的数中最大的数,不存在返回整数最小值 +// 6,查询x的后继,x的后继为,大于x的数中最小的数,不存在返回整数最大值 +// 所有操作的次数 <= 10^5 +// -10^7 <= x <= +10^7 +// 测试链接 : https://www.luogu.com.cn/problem/P3369 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +//#include +//#include +//#include +//#include +//#include +//using namespace std; +// +//const int MAXN = 100001; +//int head = 0; +//int cnt = 0; +//int key[MAXN]; +//int key_count[MAXN]; +//int ls[MAXN]; +//int rs[MAXN]; +//int size[MAXN]; +//double priority[MAXN]; +// +//void up(int i) { +// size[i] = size[ls[i]] + size[rs[i]] + key_count[i]; +//} +// +//void split(int l, int r, int i, int num) { +// if (i == 0) { +// rs[l] = ls[r] = 0; +// } else { +// if (key[i] <= num) { +// rs[l] = i; +// split(i, r, rs[i], num); +// } else { +// ls[r] = i; +// split(l, i, ls[i], num); +// } +// up(i); +// } +//} +// +//int merge(int l, int r) { +// if (l == 0 || r == 0) { +// return l + r; +// } +// if (priority[l] >= priority[r]) { +// rs[l] = merge(rs[l], r); +// up(l); +// return l; +// } else { +// ls[r] = merge(l, ls[r]); +// up(r); +// return r; +// } +//} +// +//int find(int i, int num) { +// if (i == 0) { +// return 0; +// } +// if (key[i] == num) { +// return i; +// } else if (key[i] > num) { +// return find(ls[i], num); +// } else { +// return find(rs[i], num); +// } +//} +// +//void changeCount(int i, int num, int change) { +// if (key[i] == num) { +// key_count[i] += change; +// } else if (key[i] > num) { +// changeCount(ls[i], num, change); +// } else { +// changeCount(rs[i], num, change); +// } +// up(i); +//} +// +//void add(int num) { +// if (find(head, num) != 0) { +// changeCount(head, num, 1); +// } else { +// key[++cnt] = num; +// key_count[cnt] = size[cnt] = 1; +// priority[cnt] = (double)rand() / RAND_MAX; +// split(0, 0, head, num); +// head = merge(merge(rs[0], cnt), ls[0]); +// ls[0] = rs[0] = 0; +// } +//} +// +//void remove(int num) { +// int i = find(head, num); +// if (i != 0) { +// if (key_count[i] > 1) { +// changeCount(head, num, -1); +// } else { +// split(0, 0, head, num); +// int lm = rs[0]; +// int r = ls[0]; +// ls[0] = rs[0] = 0; +// split(0, 0, lm, num - 1); +// int l = rs[0]; +// ls[0] = rs[0] = 0; +// head = merge(l, r); +// } +// } +//} +// +//int small(int i, int num) { +// if (i == 0) { +// return 0; +// } +// if (key[i] >= num) { +// return small(ls[i], num); +// } else { +// return size[ls[i]] + key_count[i] + small(rs[i], num); +// } +//} +// +//int getRank(int num) { +// return small(head, num) + 1; +//} +// +//int index(int i, int x) { +// if (size[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]); +// } +// return key[i]; +//} +// +//int index(int x) { +// return index(head, x); +//} +// +//int pre(int i, int num) { +// if (i == 0) { +// return INT_MIN; +// } +// if (key[i] >= num) { +// return pre(ls[i], num); +// } else { +// return max(key[i], pre(rs[i], num)); +// } +//} +// +//int pre(int num) { +// return pre(head, num); +//} +// +//int post(int i, int num) { +// if (i == 0) { +// return INT_MAX; +// } +// if (key[i] <= num) { +// return post(rs[i], num); +// } else { +// return min(key[i], post(ls[i], num)); +// } +//} +// +//int post(int num) { +// return post(head, num); +//} +// +//void clear() { +// memset(key, 0, sizeof(key)); +// memset(key_count, 0, sizeof(key_count)); +// memset(ls, 0, sizeof(ls)); +// memset(rs, 0, sizeof(rs)); +// memset(size, 0, sizeof(size)); +// memset(priority, 0, sizeof(priority)); +// cnt = 0; +// head = 0; +//} +// +//int main() { +// int n; +// cin >> n; +// for (int i = 1, op, x; i <= n; i++) { +// cin >> op >> x; +// if (op == 1) { +// add(x); +// } else if (op == 2) { +// remove(x); +// } else if (op == 3) { +// cout << getRank(x) << endl; +// } else if (op == 4) { +// cout << index(x) << endl; +// } else if (op == 5) { +// cout << pre(x) << endl; +// } else { +// cout << post(x) << endl; +// } +// } +// clear(); +// return 0; +//} From 8dfd74bd1fa281cee95fd320a31ab48034f7b6a1 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 18 Nov 2024 16:22:44 +0800 Subject: [PATCH 0372/2029] modify code --- src/class152/Code01_FHQTreap1.java | 2 +- src/class152/Code01_FHQTreap2.java | 387 +++++++++++++--------------- src/class152/Code01_FHQTreap3.java | 214 +++++++++++++++ src/class152/Code01_FHQTreap4.java | 172 +++++++++++++ src/class152/Code02_TextEditor.java | 7 + 5 files changed, 579 insertions(+), 203 deletions(-) create mode 100644 src/class152/Code01_FHQTreap3.java create mode 100644 src/class152/Code01_FHQTreap4.java create mode 100644 src/class152/Code02_TextEditor.java diff --git a/src/class152/Code01_FHQTreap1.java b/src/class152/Code01_FHQTreap1.java index 4cc6d4889..67b5832e9 100644 --- a/src/class152/Code01_FHQTreap1.java +++ b/src/class152/Code01_FHQTreap1.java @@ -1,6 +1,6 @@ package class152; -// FHQ-Treap实现普通有序表(java版) +// FHQ-Treap,保持无重复的key,java版 // 实现一种结构,支持如下操作,要求单次调用的时间复杂度O(log n) // 1,增加x,重复加入算多个词频 // 2,删除x,如果有多个,只删掉一个 diff --git a/src/class152/Code01_FHQTreap2.java b/src/class152/Code01_FHQTreap2.java index 50ed4688a..1a31a7077 100644 --- a/src/class152/Code01_FHQTreap2.java +++ b/src/class152/Code01_FHQTreap2.java @@ -1,6 +1,6 @@ package class152; -// FHQ-Treap实现普通有序表(C++版) +// FHQ-Treap,允许有重复的key,java版 // 实现一种结构,支持如下操作,要求单次调用的时间复杂度O(log n) // 1,增加x,重复加入算多个词频 // 2,删除x,如果有多个,只删掉一个 @@ -11,204 +11,187 @@ // 所有操作的次数 <= 10^5 // -10^7 <= x <= +10^7 // 测试链接 : https://www.luogu.com.cn/problem/P3369 -// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 -// 提交如下代码,可以通过所有测试用例 - -//#include -//#include -//#include -//#include -//#include -//#include -//using namespace std; -// -//const int MAXN = 100001; -//int head = 0; -//int cnt = 0; -//int key[MAXN]; -//int key_count[MAXN]; -//int ls[MAXN]; -//int rs[MAXN]; -//int size[MAXN]; -//double priority[MAXN]; -// -//void up(int i) { -// size[i] = size[ls[i]] + size[rs[i]] + key_count[i]; -//} -// -//void split(int l, int r, int i, int num) { -// if (i == 0) { -// rs[l] = ls[r] = 0; -// } else { -// if (key[i] <= num) { -// rs[l] = i; -// split(i, r, rs[i], num); -// } else { -// ls[r] = i; -// split(l, i, ls[i], num); -// } -// up(i); -// } -//} -// -//int merge(int l, int r) { -// if (l == 0 || r == 0) { -// return l + r; -// } -// if (priority[l] >= priority[r]) { -// rs[l] = merge(rs[l], r); -// up(l); -// return l; -// } else { -// ls[r] = merge(l, ls[r]); -// up(r); -// return r; -// } -//} -// -//int find(int i, int num) { -// if (i == 0) { -// return 0; -// } -// if (key[i] == num) { -// return i; -// } else if (key[i] > num) { -// return find(ls[i], num); -// } else { -// return find(rs[i], num); -// } -//} -// -//void changeCount(int i, int num, int change) { -// if (key[i] == num) { -// key_count[i] += change; -// } else if (key[i] > num) { -// changeCount(ls[i], num, change); -// } else { -// changeCount(rs[i], num, change); -// } -// up(i); -//} -// -//void add(int num) { -// if (find(head, num) != 0) { -// changeCount(head, num, 1); -// } else { -// key[++cnt] = num; -// key_count[cnt] = size[cnt] = 1; -// priority[cnt] = (double)rand() / RAND_MAX; -// split(0, 0, head, num); -// head = merge(merge(rs[0], cnt), ls[0]); -// ls[0] = rs[0] = 0; -// } -//} -// -//void remove(int num) { -// int i = find(head, num); -// if (i != 0) { -// if (key_count[i] > 1) { -// changeCount(head, num, -1); -// } else { -// split(0, 0, head, num); -// int lm = rs[0]; -// int r = ls[0]; -// ls[0] = rs[0] = 0; -// split(0, 0, lm, num - 1); -// int l = rs[0]; -// ls[0] = rs[0] = 0; -// head = merge(l, r); -// } -// } -//} -// -//int small(int i, int num) { -// if (i == 0) { -// return 0; -// } -// if (key[i] >= num) { -// return small(ls[i], num); -// } else { -// return size[ls[i]] + key_count[i] + small(rs[i], num); -// } -//} -// -//int getRank(int num) { -// return small(head, num) + 1; -//} -// -//int index(int i, int x) { -// if (size[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]); -// } -// return key[i]; -//} -// -//int index(int x) { -// return index(head, x); -//} -// -//int pre(int i, int num) { -// if (i == 0) { -// return INT_MIN; -// } -// if (key[i] >= num) { -// return pre(ls[i], num); -// } else { -// return max(key[i], pre(rs[i], num)); -// } -//} -// -//int pre(int num) { -// return pre(head, num); -//} -// -//int post(int i, int num) { -// if (i == 0) { -// return INT_MAX; -// } -// if (key[i] <= num) { -// return post(rs[i], num); -// } else { -// return min(key[i], post(ls[i], num)); -// } -//} -// -//int post(int num) { -// return post(head, num); -//} -// -//void clear() { -// memset(key, 0, sizeof(key)); -// memset(key_count, 0, sizeof(key_count)); -// memset(ls, 0, sizeof(ls)); -// memset(rs, 0, sizeof(rs)); -// memset(size, 0, sizeof(size)); -// memset(priority, 0, sizeof(priority)); -// cnt = 0; -// head = 0; -//} -// -//int main() { -// int n; -// cin >> n; -// for (int i = 1, op, x; i <= n; i++) { -// cin >> op >> x; -// if (op == 1) { -// add(x); -// } else if (op == 2) { -// remove(x); -// } else if (op == 3) { -// cout << getRank(x) << endl; -// } else if (op == 4) { -// cout << index(x) << endl; -// } else if (op == 5) { -// cout << pre(x) << endl; -// } else { -// cout << post(x) << endl; -// } -// } -// clear(); -// return 0; -//} +// 提交以下的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 Code01_FHQTreap2 { + + public static int MAXN = 100001; + + // 整棵树的头节点编号 + public static int head = 0; + + // 空间使用计数 + public static int cnt = 0; + + // 节点的key值 + public static int[] key = new int[MAXN]; + + // 左孩子 + public static int[] left = new int[MAXN]; + + // 右孩子 + public static int[] right = new int[MAXN]; + + // 数字总数 + public static int[] size = new int[MAXN]; + + // 节点优先级 + public static double[] priority = new double[MAXN]; + + public static void up(int i) { + size[i] = size[left[i]] + size[right[i]] + 1; + } + + public static void split(int l, int r, int i, int num) { + if (i == 0) { + right[l] = left[r] = 0; + } else { + if (key[i] <= num) { + right[l] = i; + split(i, r, right[i], num); + } else { + left[r] = i; + split(l, i, left[i], num); + } + up(i); + } + } + + public static int merge(int l, int r) { + if (l == 0 || r == 0) { + return l + r; + } + if (priority[l] >= priority[r]) { + right[l] = merge(right[l], r); + up(l); + return l; + } else { + left[r] = merge(l, left[r]); + up(r); + return r; + } + } + + public static void add(int num) { + key[++cnt] = num; + size[cnt] = 1; + priority[cnt] = Math.random(); + split(0, 0, head, num); + head = merge(merge(right[0], cnt), left[0]); + left[0] = right[0] = 0; + } + + public static void remove(int num) { + split(0, 0, head, num); + int lm = right[0]; + int r = left[0]; + left[0] = right[0] = 0; + split(0, 0, lm, num - 1); + int m = left[0]; + int l = right[0]; + left[0] = right[0] = 0; + head = merge(merge(l, merge(left[m], right[m])), r); + } + + public static int rank(int num) { + split(0, 0, head, num - 1); + int ans = size[right[0]] + 1; + head = merge(right[0], left[0]); + left[0] = right[0] = 0; + return ans; + } + + public static int index(int i, int x) { + if (size[left[i]] >= x) { + return index(left[i], x); + } else if (size[left[i]] + 1 < x) { + return index(right[i], x - size[left[i]] - 1); + } else { + return key[i]; + } + } + + public static int index(int x) { + return index(head, x); + } + + public static int pre(int i, int num) { + if (i == 0) { + return Integer.MIN_VALUE; + } + if (key[i] >= num) { + return pre(left[i], num); + } else { + return Math.max(key[i], pre(right[i], num)); + } + } + + public static int pre(int num) { + return pre(head, num); + } + + public static int post(int i, int num) { + if (i == 0) { + return Integer.MAX_VALUE; + } + if (key[i] <= num) { + return post(right[i], num); + } else { + return Math.min(key[i], post(left[i], num)); + } + } + + public static int post(int num) { + return post(head, num); + } + + public static void clear() { + Arrays.fill(key, 1, cnt + 1, 0); + Arrays.fill(left, 1, cnt + 1, 0); + Arrays.fill(right, 1, cnt + 1, 0); + Arrays.fill(size, 1, cnt + 1, 0); + Arrays.fill(priority, 1, cnt + 1, 0); + cnt = 0; + head = 0; + } + + 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(); + int n = (int) in.nval; + for (int i = 1, op, x; i <= n; i++) { + in.nextToken(); + op = (int) in.nval; + in.nextToken(); + x = (int) in.nval; + if (op == 1) { + add(x); + } else if (op == 2) { + remove(x); + } else if (op == 3) { + out.println(rank(x)); + } else if (op == 4) { + out.println(index(x)); + } else if (op == 5) { + out.println(pre(x)); + } else { + out.println(post(x)); + } + } + clear(); + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class152/Code01_FHQTreap3.java b/src/class152/Code01_FHQTreap3.java new file mode 100644 index 000000000..1c7a6fabb --- /dev/null +++ b/src/class152/Code01_FHQTreap3.java @@ -0,0 +1,214 @@ +package class152; + +// FHQ-Treap,保持无重复的key,C++版 +// 实现一种结构,支持如下操作,要求单次调用的时间复杂度O(log n) +// 1,增加x,重复加入算多个词频 +// 2,删除x,如果有多个,只删掉一个 +// 3,查询x的排名,x的排名为,比x小的数的个数+1 +// 4,查询数据中排名为x的数 +// 5,查询x的前驱,x的前驱为,小于x的数中最大的数,不存在返回整数最小值 +// 6,查询x的后继,x的后继为,大于x的数中最小的数,不存在返回整数最大值 +// 所有操作的次数 <= 10^5 +// -10^7 <= x <= +10^7 +// 测试链接 : https://www.luogu.com.cn/problem/P3369 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +//#include +//#include +//#include +//#include +//#include +//using namespace std; +// +//const int MAXN = 100001; +//int head = 0; +//int cnt = 0; +//int key[MAXN]; +//int key_count[MAXN]; +//int ls[MAXN]; +//int rs[MAXN]; +//int size[MAXN]; +//double priority[MAXN]; +// +//void up(int i) { +// size[i] = size[ls[i]] + size[rs[i]] + key_count[i]; +//} +// +//void split(int l, int r, int i, int num) { +// if (i == 0) { +// rs[l] = ls[r] = 0; +// } else { +// if (key[i] <= num) { +// rs[l] = i; +// split(i, r, rs[i], num); +// } else { +// ls[r] = i; +// split(l, i, ls[i], num); +// } +// up(i); +// } +//} +// +//int merge(int l, int r) { +// if (l == 0 || r == 0) { +// return l + r; +// } +// if (priority[l] >= priority[r]) { +// rs[l] = merge(rs[l], r); +// up(l); +// return l; +// } else { +// ls[r] = merge(l, ls[r]); +// up(r); +// return r; +// } +//} +// +//int find(int i, int num) { +// if (i == 0) { +// return 0; +// } +// if (key[i] == num) { +// return i; +// } else if (key[i] > num) { +// return find(ls[i], num); +// } else { +// return find(rs[i], num); +// } +//} +// +//void changeCount(int i, int num, int change) { +// if (key[i] == num) { +// key_count[i] += change; +// } else if (key[i] > num) { +// changeCount(ls[i], num, change); +// } else { +// changeCount(rs[i], num, change); +// } +// up(i); +//} +// +//void add(int num) { +// if (find(head, num) != 0) { +// changeCount(head, num, 1); +// } else { +// key[++cnt] = num; +// key_count[cnt] = size[cnt] = 1; +// priority[cnt] = (double)rand() / RAND_MAX; +// split(0, 0, head, num); +// head = merge(merge(rs[0], cnt), ls[0]); +// ls[0] = rs[0] = 0; +// } +//} +// +//void remove(int num) { +// int i = find(head, num); +// if (i != 0) { +// if (key_count[i] > 1) { +// changeCount(head, num, -1); +// } else { +// split(0, 0, head, num); +// int lm = rs[0]; +// int r = ls[0]; +// ls[0] = rs[0] = 0; +// split(0, 0, lm, num - 1); +// int l = rs[0]; +// ls[0] = rs[0] = 0; +// head = merge(l, r); +// } +// } +//} +// +//int small(int i, int num) { +// if (i == 0) { +// return 0; +// } +// if (key[i] >= num) { +// return small(ls[i], num); +// } else { +// return size[ls[i]] + key_count[i] + small(rs[i], num); +// } +//} +// +//int getRank(int num) { +// return small(head, num) + 1; +//} +// +//int index(int i, int x) { +// if (size[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]); +// } +// return key[i]; +//} +// +//int index(int x) { +// return index(head, x); +//} +// +//int pre(int i, int num) { +// if (i == 0) { +// return INT_MIN; +// } +// if (key[i] >= num) { +// return pre(ls[i], num); +// } else { +// return max(key[i], pre(rs[i], num)); +// } +//} +// +//int pre(int num) { +// return pre(head, num); +//} +// +//int post(int i, int num) { +// if (i == 0) { +// return INT_MAX; +// } +// if (key[i] <= num) { +// return post(rs[i], num); +// } else { +// return min(key[i], post(ls[i], num)); +// } +//} +// +//int post(int num) { +// return post(head, num); +//} +// +//void clear() { +// memset(key, 0, sizeof(key)); +// memset(key_count, 0, sizeof(key_count)); +// memset(ls, 0, sizeof(ls)); +// memset(rs, 0, sizeof(rs)); +// memset(size, 0, sizeof(size)); +// memset(priority, 0, sizeof(priority)); +// cnt = 0; +// head = 0; +//} +// +//int main() { +// int n; +// cin >> n; +// for (int i = 1, op, x; i <= n; i++) { +// cin >> op >> x; +// if (op == 1) { +// add(x); +// } else if (op == 2) { +// remove(x); +// } else if (op == 3) { +// cout << getRank(x) << endl; +// } else if (op == 4) { +// cout << index(x) << endl; +// } else if (op == 5) { +// cout << pre(x) << endl; +// } else { +// cout << post(x) << endl; +// } +// } +// clear(); +// return 0; +//} diff --git a/src/class152/Code01_FHQTreap4.java b/src/class152/Code01_FHQTreap4.java new file mode 100644 index 000000000..f2425fa09 --- /dev/null +++ b/src/class152/Code01_FHQTreap4.java @@ -0,0 +1,172 @@ +package class152; + +// FHQ-Treap,允许有重复的key,C++版 +// 实现一种结构,支持如下操作,要求单次调用的时间复杂度O(log n) +// 1,增加x,重复加入算多个词频 +// 2,删除x,如果有多个,只删掉一个 +// 3,查询x的排名,x的排名为,比x小的数的个数+1 +// 4,查询数据中排名为x的数 +// 5,查询x的前驱,x的前驱为,小于x的数中最大的数,不存在返回整数最小值 +// 6,查询x的后继,x的后继为,大于x的数中最小的数,不存在返回整数最大值 +// 所有操作的次数 <= 10^5 +// -10^7 <= x <= +10^7 +// 测试链接 : https://www.luogu.com.cn/problem/P3369 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +//#include +//#include +//#include +//#include +//#include +//using namespace std; +// +//const int MAXN = 100001; +//int head = 0; +//int cnt = 0; +//int key[MAXN]; +//int ls[MAXN]; +//int rs[MAXN]; +//int size[MAXN]; +//double priority[MAXN]; +// +//void up(int i) { +// size[i] = size[ls[i]] + size[rs[i]] + 1; +//} +// +//void split(int l, int r, int i, int num) { +// if (i == 0) { +// rs[l] = ls[r] = 0; +// } else { +// if (key[i] <= num) { +// rs[l] = i; +// split(i, r, rs[i], num); +// } else { +// ls[r] = i; +// split(l, i, ls[i], num); +// } +// up(i); +// } +//} +// +//int merge(int l, int r) { +// if (l == 0 || r == 0) { +// return l + r; +// } +// if (priority[l] >= priority[r]) { +// rs[l] = merge(rs[l], r); +// up(l); +// return l; +// } else { +// ls[r] = merge(l, ls[r]); +// up(r); +// return r; +// } +//} +// +//void add(int num) { +// key[++cnt] = num; +// size[cnt] = 1; +// priority[cnt] = (double)rand() / RAND_MAX; +// split(0, 0, head, num); +// head = merge(merge(rs[0], cnt), ls[0]); +// ls[0] = rs[0] = 0; +//} +// +//void remove(int num) { +// split(0, 0, head, num); +// int lm = rs[0]; +// int r = ls[0]; +// ls[0] = rs[0] = 0; +// split(0, 0, lm, num - 1); +// int m = ls[0]; +// int l = rs[0]; +// ls[0] = rs[0] = 0; +// head = merge(merge(l, merge(ls[m], rs[m])), r); +//} +// +//int getRank(int num) { +// split(0, 0, head, num - 1); +// int ans = size[rs[0]] + 1; +// head = merge(rs[0], ls[0]); +// ls[0] = rs[0] = 0; +// return ans; +//} +// +//int index(int i, int x) { +// if (size[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 { +// return key[i]; +// } +//} +// +//int index(int x) { +// return index(head, x); +//} +// +//int pre(int i, int num) { +// if (i == 0) { +// return INT_MIN; +// } +// if (key[i] >= num) { +// return pre(ls[i], num); +// } else { +// return max(key[i], pre(rs[i], num)); +// } +//} +// +//int pre(int num) { +// return pre(head, num); +//} +// +//int post(int i, int num) { +// if (i == 0) { +// return INT_MAX; +// } +// if (key[i] <= num) { +// return post(rs[i], num); +// } else { +// return min(key[i], post(ls[i], num)); +// } +//} +// +//int post(int num) { +// return post(head, num); +//} +// +//void clear() { +// memset(key, 0, sizeof(key)); +// memset(ls, 0, sizeof(ls)); +// memset(rs, 0, sizeof(rs)); +// memset(size, 0, sizeof(size)); +// memset(priority, 0, sizeof(priority)); +// cnt = 0; +// head = 0; +//} +// +//int main() { +// int n; +// cin >> n; +// for (int i = 1, op, x; i <= n; i++) { +// cin >> op >> x; +// if (op == 1) { +// add(x); +// } else if (op == 2) { +// remove(x); +// } else if (op == 3) { +// cout << getRank(x) << endl; +// } else if (op == 4) { +// cout << index(x) << endl; +// } else if (op == 5) { +// cout << pre(x) << endl; +// } else { +// cout << post(x) << endl; +// } +// } +// clear(); +// return 0; +//} \ No newline at end of file diff --git a/src/class152/Code02_TextEditor.java b/src/class152/Code02_TextEditor.java new file mode 100644 index 000000000..33dd1205f --- /dev/null +++ b/src/class152/Code02_TextEditor.java @@ -0,0 +1,7 @@ +package class152; + +// 文本编辑器 +// 测试链接 : https://www.luogu.com.cn/problem/P4008 +public class Code02_TextEditor { + +} From d2911882eb11ebb5d0986c831851e5983a5bca6e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 18 Nov 2024 16:23:56 +0800 Subject: [PATCH 0373/2029] modify code --- src/class152/Code01_FHQTreap1.java | 2 +- src/class152/Code01_FHQTreap2.java | 2 +- src/class152/Code01_FHQTreap3.java | 2 +- src/class152/Code01_FHQTreap4.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class152/Code01_FHQTreap1.java b/src/class152/Code01_FHQTreap1.java index 67b5832e9..7e6d43946 100644 --- a/src/class152/Code01_FHQTreap1.java +++ b/src/class152/Code01_FHQTreap1.java @@ -1,6 +1,6 @@ package class152; -// FHQ-Treap,保持无重复的key,java版 +// FHQ-Treap,树上无重复key,java版 // 实现一种结构,支持如下操作,要求单次调用的时间复杂度O(log n) // 1,增加x,重复加入算多个词频 // 2,删除x,如果有多个,只删掉一个 diff --git a/src/class152/Code01_FHQTreap2.java b/src/class152/Code01_FHQTreap2.java index 1a31a7077..fad671ca3 100644 --- a/src/class152/Code01_FHQTreap2.java +++ b/src/class152/Code01_FHQTreap2.java @@ -1,6 +1,6 @@ package class152; -// FHQ-Treap,允许有重复的key,java版 +// FHQ-Treap,树上有重复key,java版 // 实现一种结构,支持如下操作,要求单次调用的时间复杂度O(log n) // 1,增加x,重复加入算多个词频 // 2,删除x,如果有多个,只删掉一个 diff --git a/src/class152/Code01_FHQTreap3.java b/src/class152/Code01_FHQTreap3.java index 1c7a6fabb..60b7c967c 100644 --- a/src/class152/Code01_FHQTreap3.java +++ b/src/class152/Code01_FHQTreap3.java @@ -1,6 +1,6 @@ package class152; -// FHQ-Treap,保持无重复的key,C++版 +// FHQ-Treap,树上无重复key,C++版 // 实现一种结构,支持如下操作,要求单次调用的时间复杂度O(log n) // 1,增加x,重复加入算多个词频 // 2,删除x,如果有多个,只删掉一个 diff --git a/src/class152/Code01_FHQTreap4.java b/src/class152/Code01_FHQTreap4.java index f2425fa09..233ca23f2 100644 --- a/src/class152/Code01_FHQTreap4.java +++ b/src/class152/Code01_FHQTreap4.java @@ -1,6 +1,6 @@ package class152; -// FHQ-Treap,允许有重复的key,C++版 +// FHQ-Treap,树上有重复key,C++版 // 实现一种结构,支持如下操作,要求单次调用的时间复杂度O(log n) // 1,增加x,重复加入算多个词频 // 2,删除x,如果有多个,只删掉一个 From 4dcddf3e8af06fed5d312515e1c65eb02d618ff2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 18 Nov 2024 16:29:10 +0800 Subject: [PATCH 0374/2029] modify code --- src/class152/Code01_FHQTreap1.java | 2 +- src/class152/Code01_FHQTreap2.java | 2 +- src/class152/Code01_FHQTreap3.java | 2 +- src/class152/Code01_FHQTreap4.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class152/Code01_FHQTreap1.java b/src/class152/Code01_FHQTreap1.java index 7e6d43946..b3f4b2534 100644 --- a/src/class152/Code01_FHQTreap1.java +++ b/src/class152/Code01_FHQTreap1.java @@ -1,6 +1,6 @@ package class152; -// FHQ-Treap,树上无重复key,java版 +// FHQ-Treap,使用词频统计,java版 // 实现一种结构,支持如下操作,要求单次调用的时间复杂度O(log n) // 1,增加x,重复加入算多个词频 // 2,删除x,如果有多个,只删掉一个 diff --git a/src/class152/Code01_FHQTreap2.java b/src/class152/Code01_FHQTreap2.java index fad671ca3..b4e7790e6 100644 --- a/src/class152/Code01_FHQTreap2.java +++ b/src/class152/Code01_FHQTreap2.java @@ -1,6 +1,6 @@ package class152; -// FHQ-Treap,树上有重复key,java版 +// FHQ-Treap,不用词频统计,java版 // 实现一种结构,支持如下操作,要求单次调用的时间复杂度O(log n) // 1,增加x,重复加入算多个词频 // 2,删除x,如果有多个,只删掉一个 diff --git a/src/class152/Code01_FHQTreap3.java b/src/class152/Code01_FHQTreap3.java index 60b7c967c..f4ae6c52a 100644 --- a/src/class152/Code01_FHQTreap3.java +++ b/src/class152/Code01_FHQTreap3.java @@ -1,6 +1,6 @@ package class152; -// FHQ-Treap,树上无重复key,C++版 +// FHQ-Treap,使用词频统计,C++版 // 实现一种结构,支持如下操作,要求单次调用的时间复杂度O(log n) // 1,增加x,重复加入算多个词频 // 2,删除x,如果有多个,只删掉一个 diff --git a/src/class152/Code01_FHQTreap4.java b/src/class152/Code01_FHQTreap4.java index 233ca23f2..04a81cb41 100644 --- a/src/class152/Code01_FHQTreap4.java +++ b/src/class152/Code01_FHQTreap4.java @@ -1,6 +1,6 @@ package class152; -// FHQ-Treap,树上有重复key,C++版 +// FHQ-Treap,不用词频统计,C++版 // 实现一种结构,支持如下操作,要求单次调用的时间复杂度O(log n) // 1,增加x,重复加入算多个词频 // 2,删除x,如果有多个,只删掉一个 From f5e556399c63155b3f99f3818b1bd0a171391585 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 19 Nov 2024 13:09:57 +0800 Subject: [PATCH 0375/2029] modify code --- src/class149/SkipList2.java | 1 + src/class151/Code02_Treap2.java | 1 + src/class152/Code01_FHQTreap3.java | 1 + src/class152/Code01_FHQTreap4.java | 1 + src/class152/Code02_TextEditor.java | 7 -- src/class152/Code02_TextEditor1.java | 170 +++++++++++++++++++++++++++ src/class152/Code02_TextEditor2.java | 138 ++++++++++++++++++++++ 7 files changed, 312 insertions(+), 7 deletions(-) delete mode 100644 src/class152/Code02_TextEditor.java create mode 100644 src/class152/Code02_TextEditor1.java create mode 100644 src/class152/Code02_TextEditor2.java diff --git a/src/class149/SkipList2.java b/src/class149/SkipList2.java index fc69395e1..8a041123c 100644 --- a/src/class149/SkipList2.java +++ b/src/class149/SkipList2.java @@ -236,6 +236,7 @@ //} // //int main() { +// srand(time(0)); // build(); // int n; // cin >> n; diff --git a/src/class151/Code02_Treap2.java b/src/class151/Code02_Treap2.java index 12b5a4145..748ea7bcf 100644 --- a/src/class151/Code02_Treap2.java +++ b/src/class151/Code02_Treap2.java @@ -189,6 +189,7 @@ //} // //int main() { +// srand(time(0)); // int n; // cin >> n; // for (int i = 1, op, x; i <= n; i++) { diff --git a/src/class152/Code01_FHQTreap3.java b/src/class152/Code01_FHQTreap3.java index f4ae6c52a..66d7a2343 100644 --- a/src/class152/Code01_FHQTreap3.java +++ b/src/class152/Code01_FHQTreap3.java @@ -191,6 +191,7 @@ //} // //int main() { +// srand(time(0)); // int n; // cin >> n; // for (int i = 1, op, x; i <= n; i++) { diff --git a/src/class152/Code01_FHQTreap4.java b/src/class152/Code01_FHQTreap4.java index 04a81cb41..b167e1214 100644 --- a/src/class152/Code01_FHQTreap4.java +++ b/src/class152/Code01_FHQTreap4.java @@ -149,6 +149,7 @@ //} // //int main() { +// srand(time(0)); // int n; // cin >> n; // for (int i = 1, op, x; i <= n; i++) { diff --git a/src/class152/Code02_TextEditor.java b/src/class152/Code02_TextEditor.java deleted file mode 100644 index 33dd1205f..000000000 --- a/src/class152/Code02_TextEditor.java +++ /dev/null @@ -1,7 +0,0 @@ -package class152; - -// 文本编辑器 -// 测试链接 : https://www.luogu.com.cn/problem/P4008 -public class Code02_TextEditor { - -} diff --git a/src/class152/Code02_TextEditor1.java b/src/class152/Code02_TextEditor1.java new file mode 100644 index 000000000..bf484c63e --- /dev/null +++ b/src/class152/Code02_TextEditor1.java @@ -0,0 +1,170 @@ +package class152; + +// 文本编辑器(java版本) +// 测试链接 : https://www.luogu.com.cn/problem/P4008 + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; + +public class Code02_TextEditor1 { + + public static int MAXN = 2000001; + + public static int head = 0; + + public static int cnt = 0; + + public static char[] key = new char[MAXN]; + + public static int[] left = new int[MAXN]; + + public static int[] right = new int[MAXN]; + + public static int[] size = new int[MAXN]; + + public static double[] priority = new double[MAXN]; + + public static char[] ans = new char[MAXN]; + + public static int ansi; + + public static void up(int i) { + size[i] = size[left[i]] + size[right[i]] + 1; + } + + public static void split(int l, int r, int i, int rank) { + if (i == 0) { + right[l] = left[r] = 0; + } else { + if (size[left[i]] + 1 <= rank) { + right[l] = i; + split(i, r, right[i], rank - size[left[i]] - 1); + } else { + left[r] = i; + split(l, i, left[i], rank); + } + up(i); + } + } + + public static int merge(int l, int r) { + if (l == 0 || r == 0) { + return l + r; + } + if (priority[l] >= priority[r]) { + right[l] = merge(right[l], r); + up(l); + return l; + } else { + left[r] = merge(l, left[r]); + up(r); + return r; + } + } + + public static void inorder(int i) { + if (i != 0) { + inorder(left[i]); + ans[++ansi] = key[i]; + inorder(right[i]); + } + } + + public static void clear() { + Arrays.fill(left, 1, cnt + 1, 0); + Arrays.fill(right, 1, cnt + 1, 0); + Arrays.fill(size, 1, cnt + 1, 0); + Arrays.fill(priority, 1, cnt + 1, 0); + cnt = 0; + head = 0; + } + + public static void main(String[] args) throws IOException { + BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + int n = Integer.parseInt(in.readLine()); + int pos = 0, len; + String[] input = getInput(in); + String str; + String[] part; + String op; + int l, m, lm, r; + for (int i = 1, inputIndex = 0; i <= n; i++) { + str = input[inputIndex++].trim(); + if (str.equals("Prev")) { + pos--; + } else if (str.equals("Next")) { + pos++; + } else { + part = str.split(" "); + op = part[0]; + len = Integer.parseInt(part[1]); + if (op.equals("Move")) { + pos = len; + } else if (op.equals("Insert")) { + split(0, 0, head, pos); + l = right[0]; + r = left[0]; + left[0] = right[0] = 0; + for (int j = 1; j <= len;) { + for (char c : input[inputIndex++].toCharArray()) { + if (c >= 32 && c <= 126) { + key[++cnt] = c; + size[cnt] = 1; + priority[cnt] = Math.random(); + l = merge(l, cnt); + j++; + } + } + } + head = merge(l, r); + } else if (op.equals("Delete")) { + split(0, 0, head, pos + len); + r = left[0]; + lm = right[0]; + left[0] = right[0] = 0; + split(0, 0, lm, pos); + l = right[0]; + left[0] = right[0] = 0; + head = merge(l, r); + } else { + split(0, 0, head, pos + len); + r = left[0]; + lm = right[0]; + left[0] = right[0] = 0; + split(0, 0, lm, pos); + l = right[0]; + 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(ans[j]); + } + out.println(); + } + } + } + clear(); + out.flush(); + out.close(); + in.close(); + } + + public static String[] getInput(BufferedReader in) throws IOException { + StringBuilder inputBuffer = new StringBuilder(); + char[] tempBuffer = new char[8192]; + int bytesRead; + while ((bytesRead = in.read(tempBuffer)) != -1) { + inputBuffer.append(tempBuffer, 0, bytesRead); + } + String[] input = inputBuffer.toString().split("\n"); + return input; + } + +} diff --git a/src/class152/Code02_TextEditor2.java b/src/class152/Code02_TextEditor2.java new file mode 100644 index 000000000..34bd06fed --- /dev/null +++ b/src/class152/Code02_TextEditor2.java @@ -0,0 +1,138 @@ +package class152; + +// 文本编辑器(C++版本) +// 测试链接 : https://www.luogu.com.cn/problem/P4008 + +//#include +//#include +//#include +//#include +//#include +//using namespace std; +// +//const int MAXN = 2000001; +// +//int head = 0; +//int cnt = 0; +//char key[MAXN]; +//int ls[MAXN]; +//int rs[MAXN]; +//int size[MAXN]; +//double priority[MAXN]; +//char ans[MAXN]; +//int ansi; +// +//void up(int i) { +// size[i] = size[ls[i]] + size[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) { +// rs[l] = i; +// split(i, r, rs[i], rank - size[ls[i]] - 1); +// } else { +// ls[r] = i; +// split(l, i, ls[i], rank); +// } +// up(i); +// } +//} +// +//int merge(int l, int r) { +// if (l == 0 || r == 0) { +// return l + r; +// } +// if (priority[l] >= priority[r]) { +// rs[l] = merge(rs[l], r); +// up(l); +// return l; +// } else { +// ls[r] = merge(l, ls[r]); +// up(r); +// return r; +// } +//} +// +//void inorder(int i) { +// if (i != 0) { +// inorder(ls[i]); +// ans[++ansi] = key[i]; +// inorder(rs[i]); +// } +//} +// +//void clear() { +// memset(ls, 0, sizeof(int) * (cnt + 1)); +// memset(rs, 0, sizeof(int) * (cnt + 1)); +// memset(size, 0, sizeof(int) * (cnt + 1)); +// memset(priority, 0, sizeof(double) * (cnt + 1)); +// cnt = 0; +// head = 0; +//} +// +//int main() { +// srand(time(0)); +// int pos = 0, len, l, m, lm, r; +// int n; +// cin >> n; +// for (int i = 1; i <= n; i++) { +// char op[10]; +// 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; +// split(0, 0, head, pos); +// l = rs[0]; +// r = ls[0]; +// ls[0] = rs[0] = 0; +// for (int j = 1; j <= len; j++) { +// char ch = getchar(); +// while (ch < 32 || ch > 126) { +// ch = getchar(); +// } +// key[++cnt] = ch; +// size[cnt] = 1; +// priority[cnt] = (double)rand() / RAND_MAX; +// l = merge(l, cnt); +// } +// head = merge(l, r); +// } else if (op[0] == 'D') { +// cin >> len; +// split(0, 0, head, pos + len); +// r = ls[0]; +// lm = rs[0]; +// ls[0] = rs[0] = 0; +// split(0, 0, lm, pos); +// l = rs[0]; +// ls[0] = rs[0] = 0; +// head = merge(l, r); +// } else { +// cin >> len; +// split(0, 0, head, pos + len); +// r = ls[0]; +// lm = rs[0]; +// ls[0] = rs[0] = 0; +// split(0, 0, lm, pos); +// l = rs[0]; +// m = ls[0]; +// ls[0] = rs[0] = 0; +// ansi = 0; +// inorder(m); +// head = merge(merge(l, m), r); +// for (int j = 1; j <= ansi; j++) { +// cout << ans[j]; +// } +// cout << '\n'; +// } +// } +// clear(); +// return 0; +//} \ No newline at end of file From 59b9ff85ecfd77a8bb31559246af44d7e6e3e88e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 19 Nov 2024 13:13:25 +0800 Subject: [PATCH 0376/2029] modify code --- src/class152/Code02_TextEditor1.java | 5 +++++ src/class152/Code02_TextEditor2.java | 2 ++ 2 files changed, 7 insertions(+) diff --git a/src/class152/Code02_TextEditor1.java b/src/class152/Code02_TextEditor1.java index bf484c63e..3e02dbcbe 100644 --- a/src/class152/Code02_TextEditor1.java +++ b/src/class152/Code02_TextEditor1.java @@ -2,6 +2,11 @@ // 文本编辑器(java版本) // 测试链接 : https://www.luogu.com.cn/problem/P4008 +// 如下实现是正确的,但java的版本无法通过所有测试用例 +// 这是洛谷平台没有照顾各种语言的实现所导致的 +// java的实现,空间就是无法达标,C++的实现,完全一样的逻辑,就是可以达标 +// C++版本是Code02_TextEditor2文件,可以通过所有测试用例 +// 在真正笔试、比赛时,一定是兼顾各种语言的,该实现是一定正确的 import java.io.BufferedReader; import java.io.IOException; diff --git a/src/class152/Code02_TextEditor2.java b/src/class152/Code02_TextEditor2.java index 34bd06fed..ae4472f51 100644 --- a/src/class152/Code02_TextEditor2.java +++ b/src/class152/Code02_TextEditor2.java @@ -2,6 +2,8 @@ // 文本编辑器(C++版本) // 测试链接 : https://www.luogu.com.cn/problem/P4008 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 //#include //#include From a96f5bc691585470fc4843101df49aca80b5ca92 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 19 Nov 2024 13:16:00 +0800 Subject: [PATCH 0377/2029] modify code --- src/class152/Code02_TextEditor1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class152/Code02_TextEditor1.java b/src/class152/Code02_TextEditor1.java index 3e02dbcbe..eab8a4138 100644 --- a/src/class152/Code02_TextEditor1.java +++ b/src/class152/Code02_TextEditor1.java @@ -4,7 +4,7 @@ // 测试链接 : https://www.luogu.com.cn/problem/P4008 // 如下实现是正确的,但java的版本无法通过所有测试用例 // 这是洛谷平台没有照顾各种语言的实现所导致的 -// java的实现,空间就是无法达标,C++的实现,完全一样的逻辑,就是可以达标 +// java的实现空间就是无法达标,C++的实现完全一样的逻辑,就是可以达标 // C++版本是Code02_TextEditor2文件,可以通过所有测试用例 // 在真正笔试、比赛时,一定是兼顾各种语言的,该实现是一定正确的 From 06207f565276651e4db893f7b17949f9e84aaff3 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 19 Nov 2024 13:18:14 +0800 Subject: [PATCH 0378/2029] modify code --- src/class152/Code02_TextEditor1.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/class152/Code02_TextEditor1.java b/src/class152/Code02_TextEditor1.java index eab8a4138..24c9a1b97 100644 --- a/src/class152/Code02_TextEditor1.java +++ b/src/class152/Code02_TextEditor1.java @@ -88,6 +88,9 @@ public static void clear() { head = 0; } + // 我写了很多个版本的IO实现,空间都无法达标 + // 以下风格只是其中一种,无所谓了,逻辑是对的 + // 想通过这个题看C++版本吧,完全一样的逻辑 public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); From 50d5e870c3e699e7fafaf1782903bae3e6e03352 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 19 Nov 2024 15:58:24 +0800 Subject: [PATCH 0379/2029] modify code --- src/class152/Code02_TextEditor2.java | 2 +- .../Code03_LiteraryBalancedTree1.java | 149 ++++++++++++++++++ .../Code03_LiteraryBalancedTree2.java | 127 +++++++++++++++ 3 files changed, 277 insertions(+), 1 deletion(-) create mode 100644 src/class152/Code03_LiteraryBalancedTree1.java create mode 100644 src/class152/Code03_LiteraryBalancedTree2.java diff --git a/src/class152/Code02_TextEditor2.java b/src/class152/Code02_TextEditor2.java index ae4472f51..f8d967de9 100644 --- a/src/class152/Code02_TextEditor2.java +++ b/src/class152/Code02_TextEditor2.java @@ -76,7 +76,7 @@ //} // //int main() { -// srand(time(0)); +// srand(time(0)); // int pos = 0, len, l, m, lm, r; // int n; // cin >> n; diff --git a/src/class152/Code03_LiteraryBalancedTree1.java b/src/class152/Code03_LiteraryBalancedTree1.java new file mode 100644 index 000000000..ec718bd80 --- /dev/null +++ b/src/class152/Code03_LiteraryBalancedTree1.java @@ -0,0 +1,149 @@ +package class152; + +// 文艺平衡树(java版) +// 测试链接 : https://www.luogu.com.cn/problem/P3391 +// 提交以下的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_LiteraryBalancedTree1 { + + public static int MAXN = 100001; + + public static int head = 0; + + public static int cnt = 0; + + public static int[] key = new int[MAXN]; + + public static int[] left = new int[MAXN]; + + public static int[] right = new int[MAXN]; + + public static int[] size = new int[MAXN]; + + public static double[] priority = new double[MAXN]; + + public static boolean[] reverse = new boolean[MAXN]; + + public static int[] ans = new int[MAXN]; + + public static int ansi; + + public static void up(int i) { + size[i] = size[left[i]] + size[right[i]] + 1; + } + + public static void down(int i) { + if (reverse[i]) { + int tmp = left[i]; + left[i] = right[i]; + right[i] = tmp; + reverse[left[i]] = !reverse[left[i]]; + reverse[right[i]] = !reverse[right[i]]; + reverse[i] = false; + } + } + + public static void split(int l, int r, int i, int rank) { + if (i == 0) { + right[l] = left[r] = 0; + } else { + down(i); + if (size[left[i]] + 1 <= rank) { + right[l] = i; + split(i, r, right[i], rank - size[left[i]] - 1); + } else { + left[r] = i; + split(l, i, left[i], rank); + } + up(i); + } + } + + public static int merge(int l, int r) { + if (l == 0 || r == 0) { + return l + r; + } + if (priority[l] >= priority[r]) { + down(l); + right[l] = merge(right[l], r); + up(l); + return l; + } else { + down(r); + left[r] = merge(l, left[r]); + up(r); + return r; + } + } + + public static void inorder(int i) { + if (i != 0) { + down(i); + inorder(left[i]); + ans[++ansi] = key[i]; + inorder(right[i]); + } + } + + public static void clear() { + Arrays.fill(key, 1, cnt + 1, 0); + Arrays.fill(left, 1, cnt + 1, 0); + Arrays.fill(right, 1, cnt + 1, 0); + Arrays.fill(size, 1, cnt + 1, 0); + Arrays.fill(priority, 1, cnt + 1, 0); + Arrays.fill(reverse, 1, cnt + 1, false); + cnt = 0; + head = 0; + } + + 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(); + int n = (int) in.nval; + in.nextToken(); + int k = (int) in.nval; + for (int i = 1; i <= n; i++) { + key[++cnt] = i; + size[cnt] = 1; + priority[cnt] = Math.random(); + head = merge(head, cnt); + } + for (int i = 1, x, y, l, m, lm, r; i <= k; i++) { + in.nextToken(); + x = (int) in.nval; + in.nextToken(); + y = (int) in.nval; + split(0, 0, head, y); + r = left[0]; + lm = right[0]; + left[0] = right[0] = 0; + split(0, 0, lm, x - 1); + l = right[0]; + m = left[0]; + left[0] = right[0] = 0; + reverse[m] = !reverse[m]; + head = merge(merge(l, m), r); + } + ansi = 0; + inorder(head); + for (int i = 1; i <= ansi; i++) { + out.print(ans[i] + " "); + } + out.println(); + clear(); + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class152/Code03_LiteraryBalancedTree2.java b/src/class152/Code03_LiteraryBalancedTree2.java new file mode 100644 index 000000000..aa5dd7f03 --- /dev/null +++ b/src/class152/Code03_LiteraryBalancedTree2.java @@ -0,0 +1,127 @@ +package class152; + +// 文艺平衡树(C++版) +// 测试链接 : https://www.luogu.com.cn/problem/P3391 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//using namespace std; +// +//const int MAXN = 100001; +// +//int head = 0; +//int cnt = 0; +//int key[MAXN]; +//int ls[MAXN]; +//int rs[MAXN]; +//int size[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; +//} +// +//void down(int i) { +// if (rev[i]) { +// swap(ls[i], rs[i]); +// rev[ls[i]] ^= 1; +// rev[rs[i]] ^= 1; +// rev[i] = false; +// } +//} +// +//void split(int l, int r, int i, int rank) { +// if (i == 0) { +// rs[l] = ls[r] = 0; +// } else { +// down(i); +// if (size[ls[i]] + 1 <= rank) { +// rs[l] = i; +// split(i, r, rs[i], rank - size[ls[i]] - 1); +// } else { +// ls[r] = i; +// split(l, i, ls[i], rank); +// } +// up(i); +// } +//} +// +//int merge(int l, int r) { +// if (l == 0 || r == 0) { +// return l + r; +// } +// if (priority[l] >= priority[r]) { +// down(l); +// rs[l] = merge(rs[l], r); +// up(l); +// return l; +// } else { +// down(r); +// ls[r] = merge(l, ls[r]); +// up(r); +// return r; +// } +//} +// +//void inorder(int i) { +// if (i != 0) { +// down(i); +// inorder(ls[i]); +// ans[++ansi] = key[i]; +// inorder(rs[i]); +// } +//} +// +//void clear() { +// memset(key, 0, sizeof(key)); +// memset(ls, 0, sizeof(ls)); +// memset(rs, 0, sizeof(rs)); +// memset(size, 0, sizeof(size)); +// memset(priority, 0, sizeof(priority)); +// memset(rev, 0, sizeof(rev)); +// cnt = 0; +// head = 0; +//} +// +//int main() { +// srand(time(0)); +// int n, k; +// cin >> n >> k; +// for (int i = 1; i <= n; i++) { +// key[++cnt] = i; +// size[cnt] = 1; +// priority[cnt] = (double)rand() / RAND_MAX; +// head = merge(head, cnt); +// } +// for (int i = 1, x, y, l, m, lm, r; i <= k; i++) { +// cin >> x >> y; +// split(0, 0, head, y); +// r = ls[0]; +// lm = rs[0]; +// ls[0] = rs[0] = 0; +// split(0, 0, lm, x - 1); +// l = rs[0]; +// m = ls[0]; +// ls[0] = rs[0] = 0; +// rev[m] ^= 1; +// head = merge(merge(l, m), r); +// } +// ansi = 0; +// inorder(head); +// for (int i = 1; i <= ansi; i++) { +// cout << ans[i] << " "; +// } +// cout << endl; +// clear(); +// return 0; +//} \ No newline at end of file From aed65dd798250963563922e7a1a70566e8dec21b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 19 Nov 2024 16:02:12 +0800 Subject: [PATCH 0380/2029] modify code --- ...e03_LiteraryBalancedTree1.java => Code03_LiteraryTree1.java} | 2 +- ...e03_LiteraryBalancedTree2.java => Code03_LiteraryTree2.java} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/class152/{Code03_LiteraryBalancedTree1.java => Code03_LiteraryTree1.java} (98%) rename src/class152/{Code03_LiteraryBalancedTree2.java => Code03_LiteraryTree2.java} (100%) diff --git a/src/class152/Code03_LiteraryBalancedTree1.java b/src/class152/Code03_LiteraryTree1.java similarity index 98% rename from src/class152/Code03_LiteraryBalancedTree1.java rename to src/class152/Code03_LiteraryTree1.java index ec718bd80..183e8b119 100644 --- a/src/class152/Code03_LiteraryBalancedTree1.java +++ b/src/class152/Code03_LiteraryTree1.java @@ -12,7 +12,7 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class Code03_LiteraryBalancedTree1 { +public class Code03_LiteraryTree1 { public static int MAXN = 100001; diff --git a/src/class152/Code03_LiteraryBalancedTree2.java b/src/class152/Code03_LiteraryTree2.java similarity index 100% rename from src/class152/Code03_LiteraryBalancedTree2.java rename to src/class152/Code03_LiteraryTree2.java From 32bb0afb1f3dc4f799b953c9fefa2fec90fb3243 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 19 Nov 2024 18:59:29 +0800 Subject: [PATCH 0381/2029] modify code --- src/class152/Code01_FHQTreap1.java | 15 +- src/class152/Code01_FHQTreap2.java | 14 +- src/class152/Code01_FHQTreap3.java | 14 +- src/class152/Code01_FHQTreap4.java | 13 +- src/class152/Code02_TextEditor1.java | 11 -- src/class152/Code02_TextEditor2.java | 10 -- src/class152/Code03_LiteraryTree1.java | 13 -- src/class152/Code03_LiteraryTree2.java | 12 -- src/class152/Code04_FHQTreapPersistent1.java | 175 +++++++++++++++++++ src/class152/Code04_FHQTreapPersistent2.java | 162 +++++++++++++++++ 10 files changed, 341 insertions(+), 98 deletions(-) create mode 100644 src/class152/Code04_FHQTreapPersistent1.java create mode 100644 src/class152/Code04_FHQTreapPersistent2.java diff --git a/src/class152/Code01_FHQTreap1.java b/src/class152/Code01_FHQTreap1.java index b3f4b2534..dc84530f7 100644 --- a/src/class152/Code01_FHQTreap1.java +++ b/src/class152/Code01_FHQTreap1.java @@ -19,7 +19,6 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.StreamTokenizer; -import java.util.Arrays; public class Code01_FHQTreap1 { @@ -111,10 +110,10 @@ public static void add(int num) { if (find(head, num) != 0) { changeCount(head, num, 1); } else { + split(0, 0, head, num); key[++cnt] = num; count[cnt] = size[cnt] = 1; priority[cnt] = Math.random(); - split(0, 0, head, num); head = merge(merge(right[0], cnt), left[0]); left[0] = right[0] = 0; } @@ -196,17 +195,6 @@ public static int post(int num) { return post(head, num); } - public static void clear() { - Arrays.fill(key, 1, cnt + 1, 0); - Arrays.fill(count, 1, cnt + 1, 0); - Arrays.fill(left, 1, cnt + 1, 0); - Arrays.fill(right, 1, cnt + 1, 0); - Arrays.fill(size, 1, cnt + 1, 0); - Arrays.fill(priority, 1, cnt + 1, 0); - cnt = 0; - head = 0; - } - public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StreamTokenizer in = new StreamTokenizer(br); @@ -232,7 +220,6 @@ public static void main(String[] args) throws IOException { out.println(post(x)); } } - clear(); out.flush(); out.close(); br.close(); diff --git a/src/class152/Code01_FHQTreap2.java b/src/class152/Code01_FHQTreap2.java index b4e7790e6..89e935783 100644 --- a/src/class152/Code01_FHQTreap2.java +++ b/src/class152/Code01_FHQTreap2.java @@ -19,7 +19,6 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.StreamTokenizer; -import java.util.Arrays; public class Code01_FHQTreap2 { @@ -81,10 +80,10 @@ public static int merge(int l, int r) { } public static void add(int num) { + split(0, 0, head, num); key[++cnt] = num; size[cnt] = 1; priority[cnt] = Math.random(); - split(0, 0, head, num); head = merge(merge(right[0], cnt), left[0]); left[0] = right[0] = 0; } @@ -153,16 +152,6 @@ public static int post(int num) { return post(head, num); } - public static void clear() { - Arrays.fill(key, 1, cnt + 1, 0); - Arrays.fill(left, 1, cnt + 1, 0); - Arrays.fill(right, 1, cnt + 1, 0); - Arrays.fill(size, 1, cnt + 1, 0); - Arrays.fill(priority, 1, cnt + 1, 0); - cnt = 0; - head = 0; - } - public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StreamTokenizer in = new StreamTokenizer(br); @@ -188,7 +177,6 @@ public static void main(String[] args) throws IOException { out.println(post(x)); } } - clear(); out.flush(); out.close(); br.close(); diff --git a/src/class152/Code01_FHQTreap3.java b/src/class152/Code01_FHQTreap3.java index 66d7a2343..526d8fcff 100644 --- a/src/class152/Code01_FHQTreap3.java +++ b/src/class152/Code01_FHQTreap3.java @@ -94,10 +94,10 @@ // if (find(head, num) != 0) { // changeCount(head, num, 1); // } else { +// split(0, 0, head, num); // key[++cnt] = num; // key_count[cnt] = size[cnt] = 1; // priority[cnt] = (double)rand() / RAND_MAX; -// split(0, 0, head, num); // head = merge(merge(rs[0], cnt), ls[0]); // ls[0] = rs[0] = 0; // } @@ -179,17 +179,6 @@ // return post(head, num); //} // -//void clear() { -// memset(key, 0, sizeof(key)); -// memset(key_count, 0, sizeof(key_count)); -// memset(ls, 0, sizeof(ls)); -// memset(rs, 0, sizeof(rs)); -// memset(size, 0, sizeof(size)); -// memset(priority, 0, sizeof(priority)); -// cnt = 0; -// head = 0; -//} -// //int main() { // srand(time(0)); // int n; @@ -210,6 +199,5 @@ // cout << post(x) << endl; // } // } -// clear(); // return 0; //} diff --git a/src/class152/Code01_FHQTreap4.java b/src/class152/Code01_FHQTreap4.java index b167e1214..736b17b65 100644 --- a/src/class152/Code01_FHQTreap4.java +++ b/src/class152/Code01_FHQTreap4.java @@ -66,10 +66,10 @@ //} // //void add(int num) { +// split(0, 0, head, num); // key[++cnt] = num; // size[cnt] = 1; // priority[cnt] = (double)rand() / RAND_MAX; -// split(0, 0, head, num); // head = merge(merge(rs[0], cnt), ls[0]); // ls[0] = rs[0] = 0; //} @@ -138,16 +138,6 @@ // return post(head, num); //} // -//void clear() { -// memset(key, 0, sizeof(key)); -// memset(ls, 0, sizeof(ls)); -// memset(rs, 0, sizeof(rs)); -// memset(size, 0, sizeof(size)); -// memset(priority, 0, sizeof(priority)); -// cnt = 0; -// head = 0; -//} -// //int main() { // srand(time(0)); // int n; @@ -168,6 +158,5 @@ // cout << post(x) << endl; // } // } -// clear(); // return 0; //} \ No newline at end of file diff --git a/src/class152/Code02_TextEditor1.java b/src/class152/Code02_TextEditor1.java index 24c9a1b97..323f14cb1 100644 --- a/src/class152/Code02_TextEditor1.java +++ b/src/class152/Code02_TextEditor1.java @@ -13,7 +13,6 @@ import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; -import java.util.Arrays; public class Code02_TextEditor1 { @@ -79,15 +78,6 @@ public static void inorder(int i) { } } - public static void clear() { - Arrays.fill(left, 1, cnt + 1, 0); - Arrays.fill(right, 1, cnt + 1, 0); - Arrays.fill(size, 1, cnt + 1, 0); - Arrays.fill(priority, 1, cnt + 1, 0); - cnt = 0; - head = 0; - } - // 我写了很多个版本的IO实现,空间都无法达标 // 以下风格只是其中一种,无所谓了,逻辑是对的 // 想通过这个题看C++版本吧,完全一样的逻辑 @@ -158,7 +148,6 @@ public static void main(String[] args) throws IOException { } } } - clear(); out.flush(); out.close(); in.close(); diff --git a/src/class152/Code02_TextEditor2.java b/src/class152/Code02_TextEditor2.java index f8d967de9..e91f0e8e6 100644 --- a/src/class152/Code02_TextEditor2.java +++ b/src/class152/Code02_TextEditor2.java @@ -66,15 +66,6 @@ // } //} // -//void clear() { -// memset(ls, 0, sizeof(int) * (cnt + 1)); -// memset(rs, 0, sizeof(int) * (cnt + 1)); -// memset(size, 0, sizeof(int) * (cnt + 1)); -// memset(priority, 0, sizeof(double) * (cnt + 1)); -// cnt = 0; -// head = 0; -//} -// //int main() { // srand(time(0)); // int pos = 0, len, l, m, lm, r; @@ -135,6 +126,5 @@ // cout << '\n'; // } // } -// clear(); // return 0; //} \ No newline at end of file diff --git a/src/class152/Code03_LiteraryTree1.java b/src/class152/Code03_LiteraryTree1.java index 183e8b119..53e158574 100644 --- a/src/class152/Code03_LiteraryTree1.java +++ b/src/class152/Code03_LiteraryTree1.java @@ -10,7 +10,6 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.StreamTokenizer; -import java.util.Arrays; public class Code03_LiteraryTree1 { @@ -93,17 +92,6 @@ public static void inorder(int i) { } } - public static void clear() { - Arrays.fill(key, 1, cnt + 1, 0); - Arrays.fill(left, 1, cnt + 1, 0); - Arrays.fill(right, 1, cnt + 1, 0); - Arrays.fill(size, 1, cnt + 1, 0); - Arrays.fill(priority, 1, cnt + 1, 0); - Arrays.fill(reverse, 1, cnt + 1, false); - cnt = 0; - head = 0; - } - public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StreamTokenizer in = new StreamTokenizer(br); @@ -140,7 +128,6 @@ public static void main(String[] args) throws IOException { out.print(ans[i] + " "); } out.println(); - clear(); out.flush(); out.close(); br.close(); diff --git a/src/class152/Code03_LiteraryTree2.java b/src/class152/Code03_LiteraryTree2.java index aa5dd7f03..7d96bd419 100644 --- a/src/class152/Code03_LiteraryTree2.java +++ b/src/class152/Code03_LiteraryTree2.java @@ -82,17 +82,6 @@ // } //} // -//void clear() { -// memset(key, 0, sizeof(key)); -// memset(ls, 0, sizeof(ls)); -// memset(rs, 0, sizeof(rs)); -// memset(size, 0, sizeof(size)); -// memset(priority, 0, sizeof(priority)); -// memset(rev, 0, sizeof(rev)); -// cnt = 0; -// head = 0; -//} -// //int main() { // srand(time(0)); // int n, k; @@ -122,6 +111,5 @@ // cout << ans[i] << " "; // } // cout << endl; -// clear(); // return 0; //} \ No newline at end of file diff --git a/src/class152/Code04_FHQTreapPersistent1.java b/src/class152/Code04_FHQTreapPersistent1.java new file mode 100644 index 000000000..975750e04 --- /dev/null +++ b/src/class152/Code04_FHQTreapPersistent1.java @@ -0,0 +1,175 @@ +package class152; + +// 可持久化有序表,FHQ-Treap实现,不用词频统计,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P3835 +// 提交以下的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 Code04_FHQTreapPersistent1 { + + public static int MAXN = 500001; + + public static int cnt = 0; + + public static int[] head = new int[MAXN]; + + public static int[] key = new int[MAXN * 50]; + + public static int[] left = new int[MAXN * 50]; + + public static int[] right = new int[MAXN * 50]; + + public static int[] size = new int[MAXN * 50]; + + public static double[] priority = new double[MAXN * 50]; + + public static void up(int i) { + size[i] = size[left[i]] + size[right[i]] + 1; + } + + public static int copy(int i) { + key[++cnt] = key[i]; + left[cnt] = left[i]; + right[cnt] = right[i]; + size[cnt] = size[i]; + priority[cnt] = priority[i]; + return cnt; + } + + public static void split(int l, int r, int i, int num) { + if (i == 0) { + right[l] = left[r] = 0; + } else { + i = copy(i); + if (key[i] <= num) { + right[l] = i; + split(i, r, right[i], num); + } else { + left[r] = i; + split(l, i, left[i], num); + } + up(i); + } + } + + public static int merge(int l, int r) { + if (l == 0 || r == 0) { + return l + r; + } + if (priority[l] >= priority[r]) { + l = copy(l); + right[l] = merge(right[l], r); + up(l); + return l; + } else { + r = copy(r); + left[r] = merge(l, left[r]); + up(r); + return r; + } + } + + public static void add(int v, int i, int num) { + split(0, 0, i, num); + key[++cnt] = num; + size[cnt] = 1; + priority[cnt] = Math.random(); + head[v] = merge(merge(right[0], cnt), left[0]); + left[0] = right[0] = 0; + } + + public static void remove(int v, int i, int num) { + split(0, 0, i, num); + int lm = right[0]; + int r = left[0]; + left[0] = right[0] = 0; + split(0, 0, lm, num - 1); + int m = left[0]; + int l = right[0]; + left[0] = right[0] = 0; + head[v] = merge(merge(l, merge(left[m], right[m])), r); + } + + public static int small(int i, int num) { + if (i == 0) { + return 0; + } + if (key[i] >= num) { + return small(left[i], num); + } else { + return size[left[i]] + 1 + small(right[i], num); + } + } + + public static int index(int i, int x) { + if (size[left[i]] >= x) { + return index(left[i], x); + } else if (size[left[i]] + 1 < x) { + return index(right[i], x - size[left[i]] - 1); + } else { + return key[i]; + } + } + + public static int pre(int i, int num) { + if (i == 0) { + return Integer.MIN_VALUE + 1; + } + if (key[i] >= num) { + return pre(left[i], num); + } else { + return Math.max(key[i], pre(right[i], num)); + } + } + + public static int post(int i, int num) { + if (i == 0) { + return Integer.MAX_VALUE; + } + if (key[i] <= num) { + return post(right[i], num); + } else { + return Math.min(key[i], post(left[i], num)); + } + } + + 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(); + int n = (int) in.nval; + for (int i = 1, version, op, x; i <= n; i++) { + in.nextToken(); + version = (int) in.nval; + in.nextToken(); + op = (int) in.nval; + in.nextToken(); + x = (int) in.nval; + head[i] = head[version]; + if (op == 1) { + add(i, head[i], x); + } else if (op == 2) { + remove(i, head[i], x); + } else if (op == 3) { + out.println(small(head[i], x) + 1); + } else if (op == 4) { + out.println(index(head[i], x)); + } else if (op == 5) { + out.println(pre(head[i], x)); + } else { + out.println(post(head[i], x)); + } + } + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class152/Code04_FHQTreapPersistent2.java b/src/class152/Code04_FHQTreapPersistent2.java new file mode 100644 index 000000000..ac445dd40 --- /dev/null +++ b/src/class152/Code04_FHQTreapPersistent2.java @@ -0,0 +1,162 @@ +package class152; + +// 可持久化有序表,FHQ-Treap实现,不用词频统计,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P3835 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +//#include +//#include +//#include +//#include +//#include +// +//using namespace std; +// +//const int MAXN = 500001; +// +//int cnt = 0; +//int head[MAXN]; +//int key[MAXN * 50]; +//int ls[MAXN * 50]; +//int rs[MAXN * 50]; +//int size[MAXN * 50]; +//double priority[MAXN * 50]; +// +//void up(int i) { +// size[i] = size[ls[i]] + size[rs[i]] + 1; +//} +// +//int copy(int i) { +// ++cnt; +// key[cnt] = key[i]; +// ls[cnt] = ls[i]; +// rs[cnt] = rs[i]; +// size[cnt] = size[i]; +// priority[cnt] = priority[i]; +// return cnt; +//} +// +//void split(int l, int r, int i, int num) { +// if (i == 0) { +// rs[l] = ls[r] = 0; +// } else { +// i = copy(i); +// if (key[i] <= num) { +// rs[l] = i; +// split(i, r, rs[i], num); +// } else { +// ls[r] = i; +// split(l, i, ls[i], num); +// } +// up(i); +// } +//} +// +//int merge(int l, int r) { +// if (l == 0 || r == 0) { +// return l + r; +// } +// if (priority[l] >= priority[r]) { +// l = copy(l); +// rs[l] = merge(rs[l], r); +// up(l); +// return l; +// } else { +// r = copy(r); +// ls[r] = merge(l, ls[r]); +// up(r); +// return r; +// } +//} +// +//void add(int v, int i, int num) { +// split(0, 0, i, num); +// ++cnt; +// key[cnt] = num; +// size[cnt] = 1; +// priority[cnt] = (double)rand() / RAND_MAX; +// head[v] = merge(merge(rs[0], cnt), ls[0]); +// ls[0] = rs[0] = 0; +//} +// +//void remove(int v, int i, int num) { +// split(0, 0, i, num); +// int lm = rs[0]; +// int r = ls[0]; +// ls[0] = rs[0] = 0; +// split(0, 0, lm, num - 1); +// int m = ls[0]; +// int l = rs[0]; +// ls[0] = rs[0] = 0; +// head[v] = merge(merge(l, merge(ls[m], rs[m])), r); +//} +// +//int small(int i, int num) { +// if (i == 0) { +// return 0; +// } +// if (key[i] >= num) { +// return small(ls[i], num); +// } else { +// return size[ls[i]] + 1 + small(rs[i], num); +// } +//} +// +//int index(int i, int x) { +// if (size[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 { +// return key[i]; +// } +//} +// +//int pre(int i, int num) { +// if (i == 0) { +// return INT_MIN + 1; +// } +// if (key[i] >= num) { +// return pre(ls[i], num); +// } else { +// return max(key[i], pre(rs[i], num)); +// } +//} +// +//int post(int i, int num) { +// if (i == 0) { +// return INT_MAX; +// } +// if (key[i] <= num) { +// return post(rs[i], num); +// } else { +// return min(key[i], post(ls[i], num)); +// } +//} +// +//int main() { +// srand(time(0)); +// int n; +// cin >> n; +// for (int i = 1; i <= n; ++i) { +// int version, op, x; +// cin >> version >> op >> x; +// head[i] = head[version]; +// if (op == 1) { +// add(i, head[i], x); +// } else if (op == 2) { +// remove(i, head[i], x); +// } else if (op == 3) { +// cout << small(head[i], x) + 1 << "\n"; +// } else if (op == 4) { +// cout << index(head[i], x) << "\n"; +// } else if (op == 5) { +// cout << pre(head[i], x) << "\n"; +// } else if (op == 6) { +// cout << post(head[i], x) << "\n"; +// } +// } +// return 0; +//} \ No newline at end of file From aa216495507c0d2b149ace3758d33639eaba94de Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 19 Nov 2024 19:05:42 +0800 Subject: [PATCH 0382/2029] modify code --- src/class152/Code04_FHQTreapPersistent1.java | 2 +- src/class152/Code04_FHQTreapPersistent2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class152/Code04_FHQTreapPersistent1.java b/src/class152/Code04_FHQTreapPersistent1.java index 975750e04..bfedbffd9 100644 --- a/src/class152/Code04_FHQTreapPersistent1.java +++ b/src/class152/Code04_FHQTreapPersistent1.java @@ -1,6 +1,6 @@ package class152; -// 可持久化有序表,FHQ-Treap实现,不用词频统计,java版 +// 可持久化平衡树,FHQ-Treap实现,不用词频统计,java版 // 测试链接 : https://www.luogu.com.cn/problem/P3835 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class152/Code04_FHQTreapPersistent2.java b/src/class152/Code04_FHQTreapPersistent2.java index ac445dd40..b8313e70e 100644 --- a/src/class152/Code04_FHQTreapPersistent2.java +++ b/src/class152/Code04_FHQTreapPersistent2.java @@ -1,6 +1,6 @@ package class152; -// 可持久化有序表,FHQ-Treap实现,不用词频统计,C++版 +// 可持久化平衡树,FHQ-Treap实现,不用词频统计,C++版 // 测试链接 : https://www.luogu.com.cn/problem/P3835 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From 4c60e6f67f423c79456677cd66313e0209ae2850 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 20 Nov 2024 13:16:00 +0800 Subject: [PATCH 0383/2029] modify code --- src/class019/Code06_FastReaderWriter.java | 256 ++++++++++++++++++ src/class152/Code01_FHQTreap1.java | 3 - src/class152/Code01_FHQTreap2.java | 4 - src/class152/Code01_FHQTreap3.java | 3 - src/class152/Code01_FHQTreap4.java | 4 - src/class152/Code02_TextEditor1.java | 5 - src/class152/Code02_TextEditor2.java | 5 - src/class152/Code03_LiteraryTree1.java | 2 - src/class152/Code03_LiteraryTree2.java | 2 - src/class152/Code04_FHQTreapPersistent1.java | 264 +++++++++++++++++-- src/class152/Code04_FHQTreapPersistent2.java | 5 +- 11 files changed, 503 insertions(+), 50 deletions(-) create mode 100644 src/class019/Code06_FastReaderWriter.java diff --git a/src/class019/Code06_FastReaderWriter.java b/src/class019/Code06_FastReaderWriter.java new file mode 100644 index 000000000..de275d37b --- /dev/null +++ b/src/class019/Code06_FastReaderWriter.java @@ -0,0 +1,256 @@ +package class019; + +// 本文件课上没有讲 +// java同学可以使用FastReader进行快读,可以使用FastWriter进行快写,速度是很快的 +// 如何使用可以参考main函数 + +import java.io.BufferedWriter; +import java.io.ByteArrayOutputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.Writer; +import java.util.InputMismatchException; + +public class Code06_FastReaderWriter { + + public static void main(String[] args) { + FastReader reader = new FastReader(System.in); + FastWriter writer = new FastWriter(System.out); + System.out.println("输入一个字符:"); + int cha = reader.readByte(); // reader会读到字符的ASCII码 + System.out.println("输入一个int类型的数字:"); + int num1 = reader.readInt(); // reader会读到该数字 + System.out.println("输入一个long类型的数字:"); + long num2 = reader.readLong(); // reader会读到该数字 + System.out.println("打印结果:"); + writer.println(cha); + writer.println(num1); + writer.println(num2); + writer.close();// close方法包含flush,会把结果刷出去 + } + + // 快读 + public static class FastReader { + InputStream is; + private byte[] inbuf = new byte[1024]; + public int lenbuf = 0; + public int ptrbuf = 0; + + public FastReader(final InputStream is) { + this.is = is; + } + + public int readByte() { + if (lenbuf == -1) { + throw new InputMismatchException(); + } + if (ptrbuf >= lenbuf) { + ptrbuf = 0; + try { + lenbuf = is.read(inbuf); + } catch (IOException e) { + throw new InputMismatchException(); + } + if (lenbuf <= 0) { + return -1; + } + } + return inbuf[ptrbuf++]; + } + + public int readInt() { + return (int) readLong(); + } + + public long readLong() { + long num = 0; + int b; + boolean minus = false; + while ((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-')) + ; + if (b == '-') { + minus = true; + b = readByte(); + } + while (true) { + if (b >= '0' && b <= '9') { + num = num * 10 + (b - '0'); + } else { + return minus ? -num : num; + } + b = readByte(); + } + } + } + + // 快写 + public static class FastWriter { + private static final int BUF_SIZE = 1 << 13; + private final byte[] buf = new byte[BUF_SIZE]; + private OutputStream out; + private Writer writer; + private int ptr = 0; + + public FastWriter(Writer writer) { + this.writer = new BufferedWriter(writer); + out = new ByteArrayOutputStream(); + } + + public FastWriter(OutputStream os) { + this.out = os; + } + + public FastWriter(String path) { + try { + this.out = new FileOutputStream(path); + } catch (FileNotFoundException e) { + throw new RuntimeException("FastWriter"); + } + } + + public FastWriter write(byte b) { + buf[ptr++] = b; + if (ptr == BUF_SIZE) { + innerflush(); + } + return this; + } + + public FastWriter write(String s) { + s.chars().forEach(c -> { + buf[ptr++] = (byte) c; + if (ptr == BUF_SIZE) { + innerflush(); + } + }); + return this; + } + + private static int countDigits(long l) { + if (l >= 1000000000000000000L) { + return 19; + } + if (l >= 100000000000000000L) { + return 18; + } + if (l >= 10000000000000000L) { + return 17; + } + if (l >= 1000000000000000L) { + return 16; + } + if (l >= 100000000000000L) { + return 15; + } + if (l >= 10000000000000L) { + return 14; + } + if (l >= 1000000000000L) { + return 13; + } + if (l >= 100000000000L) { + return 12; + } + if (l >= 10000000000L) { + return 11; + } + if (l >= 1000000000L) { + return 10; + } + if (l >= 100000000L) { + return 9; + } + if (l >= 10000000L) { + return 8; + } + if (l >= 1000000L) { + return 7; + } + if (l >= 100000L) { + return 6; + } + if (l >= 10000L) { + return 5; + } + if (l >= 1000L) { + return 4; + } + if (l >= 100L) { + return 3; + } + if (l >= 10L) { + return 2; + } + return 1; + } + + public FastWriter write(long x) { + if (x == Long.MIN_VALUE) { + return write("" + x); + } + if (ptr + 21 >= BUF_SIZE) { + innerflush(); + } + if (x < 0) { + write((byte) '-'); + x = -x; + } + int d = countDigits(x); + for (int i = ptr + d - 1; i >= ptr; i--) { + buf[i] = (byte) ('0' + x % 10); + x /= 10; + } + ptr += d; + return this; + } + + public FastWriter writeln(long x) { + return write(x).writeln(); + } + + public FastWriter writeln() { + return write((byte) '\n'); + } + + private void innerflush() { + try { + out.write(buf, 0, ptr); + ptr = 0; + } catch (IOException e) { + throw new RuntimeException("innerflush"); + } + } + + public void flush() { + innerflush(); + try { + if (writer != null) { + writer.write(((ByteArrayOutputStream) out).toString()); + out = new ByteArrayOutputStream(); + writer.flush(); + } else { + out.flush(); + } + } catch (IOException e) { + throw new RuntimeException("flush"); + } + } + + public FastWriter println(long x) { + return writeln(x); + } + + public void close() { + flush(); + try { + out.close(); + } catch (Exception e) { + } + } + + } + +} diff --git a/src/class152/Code01_FHQTreap1.java b/src/class152/Code01_FHQTreap1.java index dc84530f7..11c38186a 100644 --- a/src/class152/Code01_FHQTreap1.java +++ b/src/class152/Code01_FHQTreap1.java @@ -115,7 +115,6 @@ public static void add(int num) { count[cnt] = size[cnt] = 1; priority[cnt] = Math.random(); head = merge(merge(right[0], cnt), left[0]); - left[0] = right[0] = 0; } } @@ -128,10 +127,8 @@ public static void remove(int num) { split(0, 0, head, num); int lm = right[0]; int r = left[0]; - left[0] = right[0] = 0; split(0, 0, lm, num - 1); int l = right[0]; - left[0] = right[0] = 0; head = merge(l, r); } } diff --git a/src/class152/Code01_FHQTreap2.java b/src/class152/Code01_FHQTreap2.java index 89e935783..d8ea68ae4 100644 --- a/src/class152/Code01_FHQTreap2.java +++ b/src/class152/Code01_FHQTreap2.java @@ -85,18 +85,15 @@ public static void add(int num) { size[cnt] = 1; priority[cnt] = Math.random(); head = merge(merge(right[0], cnt), left[0]); - left[0] = right[0] = 0; } public static void remove(int num) { split(0, 0, head, num); int lm = right[0]; int r = left[0]; - left[0] = right[0] = 0; split(0, 0, lm, num - 1); int m = left[0]; int l = right[0]; - left[0] = right[0] = 0; head = merge(merge(l, merge(left[m], right[m])), r); } @@ -104,7 +101,6 @@ public static int rank(int num) { split(0, 0, head, num - 1); int ans = size[right[0]] + 1; head = merge(right[0], left[0]); - left[0] = right[0] = 0; return ans; } diff --git a/src/class152/Code01_FHQTreap3.java b/src/class152/Code01_FHQTreap3.java index 526d8fcff..21a720263 100644 --- a/src/class152/Code01_FHQTreap3.java +++ b/src/class152/Code01_FHQTreap3.java @@ -99,7 +99,6 @@ // key_count[cnt] = size[cnt] = 1; // priority[cnt] = (double)rand() / RAND_MAX; // head = merge(merge(rs[0], cnt), ls[0]); -// ls[0] = rs[0] = 0; // } //} // @@ -112,10 +111,8 @@ // split(0, 0, head, num); // int lm = rs[0]; // int r = ls[0]; -// ls[0] = rs[0] = 0; // split(0, 0, lm, num - 1); // int l = rs[0]; -// ls[0] = rs[0] = 0; // head = merge(l, r); // } // } diff --git a/src/class152/Code01_FHQTreap4.java b/src/class152/Code01_FHQTreap4.java index 736b17b65..ae8dc0992 100644 --- a/src/class152/Code01_FHQTreap4.java +++ b/src/class152/Code01_FHQTreap4.java @@ -71,18 +71,15 @@ // size[cnt] = 1; // priority[cnt] = (double)rand() / RAND_MAX; // head = merge(merge(rs[0], cnt), ls[0]); -// ls[0] = rs[0] = 0; //} // //void remove(int num) { // split(0, 0, head, num); // int lm = rs[0]; // int r = ls[0]; -// ls[0] = rs[0] = 0; // split(0, 0, lm, num - 1); // int m = ls[0]; // int l = rs[0]; -// ls[0] = rs[0] = 0; // head = merge(merge(l, merge(ls[m], rs[m])), r); //} // @@ -90,7 +87,6 @@ // split(0, 0, head, num - 1); // int ans = size[rs[0]] + 1; // head = merge(rs[0], ls[0]); -// ls[0] = rs[0] = 0; // return ans; //} // diff --git a/src/class152/Code02_TextEditor1.java b/src/class152/Code02_TextEditor1.java index 323f14cb1..8dcdad557 100644 --- a/src/class152/Code02_TextEditor1.java +++ b/src/class152/Code02_TextEditor1.java @@ -107,7 +107,6 @@ public static void main(String[] args) throws IOException { split(0, 0, head, pos); l = right[0]; r = left[0]; - left[0] = right[0] = 0; for (int j = 1; j <= len;) { for (char c : input[inputIndex++].toCharArray()) { if (c >= 32 && c <= 126) { @@ -124,20 +123,16 @@ public static void main(String[] args) throws IOException { split(0, 0, head, pos + len); r = left[0]; lm = right[0]; - left[0] = right[0] = 0; split(0, 0, lm, pos); l = right[0]; - left[0] = right[0] = 0; head = merge(l, r); } else { split(0, 0, head, pos + len); r = left[0]; lm = right[0]; - left[0] = right[0] = 0; split(0, 0, lm, pos); l = right[0]; m = left[0]; - left[0] = right[0] = 0; ansi = 0; inorder(m); head = merge(merge(l, m), r); diff --git a/src/class152/Code02_TextEditor2.java b/src/class152/Code02_TextEditor2.java index e91f0e8e6..173090afe 100644 --- a/src/class152/Code02_TextEditor2.java +++ b/src/class152/Code02_TextEditor2.java @@ -85,7 +85,6 @@ // split(0, 0, head, pos); // l = rs[0]; // r = ls[0]; -// ls[0] = rs[0] = 0; // for (int j = 1; j <= len; j++) { // char ch = getchar(); // while (ch < 32 || ch > 126) { @@ -102,21 +101,17 @@ // split(0, 0, head, pos + len); // r = ls[0]; // lm = rs[0]; -// ls[0] = rs[0] = 0; // split(0, 0, lm, pos); // l = rs[0]; -// ls[0] = rs[0] = 0; // head = merge(l, r); // } else { // cin >> len; // split(0, 0, head, pos + len); // r = ls[0]; // lm = rs[0]; -// ls[0] = rs[0] = 0; // split(0, 0, lm, pos); // l = rs[0]; // m = ls[0]; -// ls[0] = rs[0] = 0; // ansi = 0; // inorder(m); // head = merge(merge(l, m), r); diff --git a/src/class152/Code03_LiteraryTree1.java b/src/class152/Code03_LiteraryTree1.java index 53e158574..f30902d0e 100644 --- a/src/class152/Code03_LiteraryTree1.java +++ b/src/class152/Code03_LiteraryTree1.java @@ -114,11 +114,9 @@ public static void main(String[] args) throws IOException { split(0, 0, head, y); r = left[0]; lm = right[0]; - left[0] = right[0] = 0; split(0, 0, lm, x - 1); l = right[0]; m = left[0]; - left[0] = right[0] = 0; reverse[m] = !reverse[m]; head = merge(merge(l, m), r); } diff --git a/src/class152/Code03_LiteraryTree2.java b/src/class152/Code03_LiteraryTree2.java index 7d96bd419..4ccdbc811 100644 --- a/src/class152/Code03_LiteraryTree2.java +++ b/src/class152/Code03_LiteraryTree2.java @@ -97,11 +97,9 @@ // split(0, 0, head, y); // r = ls[0]; // lm = rs[0]; -// ls[0] = rs[0] = 0; // split(0, 0, lm, x - 1); // l = rs[0]; // m = ls[0]; -// ls[0] = rs[0] = 0; // rev[m] ^= 1; // head = merge(merge(l, m), r); // } diff --git a/src/class152/Code04_FHQTreapPersistent1.java b/src/class152/Code04_FHQTreapPersistent1.java index bfedbffd9..908815d11 100644 --- a/src/class152/Code04_FHQTreapPersistent1.java +++ b/src/class152/Code04_FHQTreapPersistent1.java @@ -4,12 +4,15 @@ // 测试链接 : https://www.luogu.com.cn/problem/P3835 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 -import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.ByteArrayOutputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; import java.io.IOException; -import java.io.InputStreamReader; -import java.io.OutputStreamWriter; -import java.io.PrintWriter; -import java.io.StreamTokenizer; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.Writer; +import java.util.InputMismatchException; public class Code04_FHQTreapPersistent1 { @@ -80,18 +83,23 @@ public static void add(int v, int i, int num) { key[++cnt] = num; size[cnt] = 1; priority[cnt] = Math.random(); - head[v] = merge(merge(right[0], cnt), left[0]); + int l = right[0]; + int r = left[0]; + // 后续可能基于0版本,去生成新版本的树 + // 所以这里一定要清空,保证0版本的树正确 left[0] = right[0] = 0; + head[v] = merge(merge(l, cnt), r); } public static void remove(int v, int i, int num) { split(0, 0, i, num); int lm = right[0]; int r = left[0]; - left[0] = right[0] = 0; split(0, 0, lm, num - 1); int m = left[0]; int l = right[0]; + // 后续可能基于0版本,去生成新版本的树 + // 所以这里一定要清空,保证0版本的树正确 left[0] = right[0] = 0; head[v] = merge(merge(l, merge(left[m], right[m])), r); } @@ -139,19 +147,14 @@ public static int post(int i, int num) { } } - 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(); - int n = (int) in.nval; + public static void main(String[] args) { + FastReader in = new FastReader(System.in); + FastWriter out = new FastWriter(System.out); + int n = in.readInt(); for (int i = 1, version, op, x; i <= n; i++) { - in.nextToken(); - version = (int) in.nval; - in.nextToken(); - op = (int) in.nval; - in.nextToken(); - x = (int) in.nval; + version = in.readInt(); + op = in.readInt(); + x = in.readInt(); head[i] = head[version]; if (op == 1) { add(i, head[i], x); @@ -169,7 +172,228 @@ public static void main(String[] args) throws IOException { } out.flush(); out.close(); - br.close(); + } + + // 快读 + public static class FastReader { + InputStream is; + private byte[] inbuf = new byte[1024]; + public int lenbuf = 0; + public int ptrbuf = 0; + + public FastReader(final InputStream is) { + this.is = is; + } + + public int readByte() { + if (lenbuf == -1) { + throw new InputMismatchException(); + } + if (ptrbuf >= lenbuf) { + ptrbuf = 0; + try { + lenbuf = is.read(inbuf); + } catch (IOException e) { + throw new InputMismatchException(); + } + if (lenbuf <= 0) { + return -1; + } + } + return inbuf[ptrbuf++]; + } + + public int readInt() { + return (int) readLong(); + } + + public long readLong() { + long num = 0; + int b; + boolean minus = false; + while ((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-')) + ; + if (b == '-') { + minus = true; + b = readByte(); + } + + while (true) { + if (b >= '0' && b <= '9') { + num = num * 10 + (b - '0'); + } else { + return minus ? -num : num; + } + b = readByte(); + } + } + } + + // 快写 + public static class FastWriter { + private static final int BUF_SIZE = 1 << 13; + private final byte[] buf = new byte[BUF_SIZE]; + private OutputStream out; + private Writer writer; + private int ptr = 0; + + public FastWriter(Writer writer) { + this.writer = new BufferedWriter(writer); + out = new ByteArrayOutputStream(); + } + + public FastWriter(OutputStream os) { + this.out = os; + } + + public FastWriter(String path) { + try { + this.out = new FileOutputStream(path); + } catch (FileNotFoundException e) { + throw new RuntimeException("FastWriter"); + } + } + + public FastWriter write(byte b) { + buf[ptr++] = b; + if (ptr == BUF_SIZE) { + innerflush(); + } + return this; + } + + public FastWriter write(String s) { + s.chars().forEach(c -> { + buf[ptr++] = (byte) c; + if (ptr == BUF_SIZE) { + innerflush(); + } + }); + return this; + } + + private static int countDigits(long l) { + if (l >= 1000000000000000000L) { + return 19; + } + if (l >= 100000000000000000L) { + return 18; + } + if (l >= 10000000000000000L) { + return 17; + } + if (l >= 1000000000000000L) { + return 16; + } + if (l >= 100000000000000L) { + return 15; + } + if (l >= 10000000000000L) { + return 14; + } + if (l >= 1000000000000L) { + return 13; + } + if (l >= 100000000000L) { + return 12; + } + if (l >= 10000000000L) { + return 11; + } + if (l >= 1000000000L) { + return 10; + } + if (l >= 100000000L) { + return 9; + } + if (l >= 10000000L) { + return 8; + } + if (l >= 1000000L) { + return 7; + } + if (l >= 100000L) { + return 6; + } + if (l >= 10000L) { + return 5; + } + if (l >= 1000L) { + return 4; + } + if (l >= 100L) { + return 3; + } + if (l >= 10L) { + return 2; + } + return 1; + } + + public FastWriter write(long x) { + if (x == Long.MIN_VALUE) { + return write("" + x); + } + if (ptr + 21 >= BUF_SIZE) { + innerflush(); + } + if (x < 0) { + write((byte) '-'); + x = -x; + } + int d = countDigits(x); + for (int i = ptr + d - 1; i >= ptr; i--) { + buf[i] = (byte) ('0' + x % 10); + x /= 10; + } + ptr += d; + return this; + } + + public FastWriter writeln(long x) { + return write(x).writeln(); + } + + public FastWriter writeln() { + return write((byte) '\n'); + } + + private void innerflush() { + try { + out.write(buf, 0, ptr); + ptr = 0; + } catch (IOException e) { + throw new RuntimeException("innerflush"); + } + } + + public void flush() { + innerflush(); + try { + if (writer != null) { + writer.write(((ByteArrayOutputStream) out).toString()); + out = new ByteArrayOutputStream(); + writer.flush(); + } else { + out.flush(); + } + } catch (IOException e) { + throw new RuntimeException("flush"); + } + } + + public FastWriter println(long x) { + return writeln(x); + } + + public void close() { + flush(); + try { + out.close(); + } catch (Exception e) { + } + } + } } diff --git a/src/class152/Code04_FHQTreapPersistent2.java b/src/class152/Code04_FHQTreapPersistent2.java index b8313e70e..e20934e20 100644 --- a/src/class152/Code04_FHQTreapPersistent2.java +++ b/src/class152/Code04_FHQTreapPersistent2.java @@ -77,15 +77,16 @@ // key[cnt] = num; // size[cnt] = 1; // priority[cnt] = (double)rand() / RAND_MAX; -// head[v] = merge(merge(rs[0], cnt), ls[0]); +// int l = rs[0]; +// int r = ls[0]; // ls[0] = rs[0] = 0; +// head[v] = merge(merge(l, cnt), r); //} // //void remove(int v, int i, int num) { // split(0, 0, i, num); // int lm = rs[0]; // int r = ls[0]; -// ls[0] = rs[0] = 0; // split(0, 0, lm, num - 1); // int m = ls[0]; // int l = rs[0]; From ddfd55a7ed56965dfe6f1accaab89963fd0876d0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 20 Nov 2024 13:31:27 +0800 Subject: [PATCH 0384/2029] modify code --- src/class152/Code02_TextEditor2.java | 2 +- src/class152/Code03_LiteraryTree2.java | 2 +- src/class152/Code04_FHQTreapPersistent2.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/class152/Code02_TextEditor2.java b/src/class152/Code02_TextEditor2.java index 173090afe..338025753 100644 --- a/src/class152/Code02_TextEditor2.java +++ b/src/class152/Code02_TextEditor2.java @@ -67,7 +67,7 @@ //} // //int main() { -// srand(time(0)); +// srand(time(0)); // int pos = 0, len, l, m, lm, r; // int n; // cin >> n; diff --git a/src/class152/Code03_LiteraryTree2.java b/src/class152/Code03_LiteraryTree2.java index 4ccdbc811..b62d73139 100644 --- a/src/class152/Code03_LiteraryTree2.java +++ b/src/class152/Code03_LiteraryTree2.java @@ -83,7 +83,7 @@ //} // //int main() { -// srand(time(0)); +// srand(time(0)); // int n, k; // cin >> n >> k; // for (int i = 1; i <= n; i++) { diff --git a/src/class152/Code04_FHQTreapPersistent2.java b/src/class152/Code04_FHQTreapPersistent2.java index e20934e20..a26a709d2 100644 --- a/src/class152/Code04_FHQTreapPersistent2.java +++ b/src/class152/Code04_FHQTreapPersistent2.java @@ -138,7 +138,7 @@ //} // //int main() { -// srand(time(0)); +// srand(time(0)); // int n; // cin >> n; // for (int i = 1; i <= n; ++i) { From dccedaade79098f881abe03bac40a4bc4d4dde5b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 20 Nov 2024 16:52:10 +0800 Subject: [PATCH 0385/2029] modify code --- src/class152/Code04_FHQTreapPersistent1.java | 6 ++---- src/class152/Code05.java | 5 +++++ 2 files changed, 7 insertions(+), 4 deletions(-) create mode 100644 src/class152/Code05.java diff --git a/src/class152/Code04_FHQTreapPersistent1.java b/src/class152/Code04_FHQTreapPersistent1.java index 908815d11..f485775e9 100644 --- a/src/class152/Code04_FHQTreapPersistent1.java +++ b/src/class152/Code04_FHQTreapPersistent1.java @@ -85,8 +85,7 @@ public static void add(int v, int i, int num) { priority[cnt] = Math.random(); int l = right[0]; int r = left[0]; - // 后续可能基于0版本,去生成新版本的树 - // 所以这里一定要清空,保证0版本的树正确 + // 后续可能基于0版本,去生成新版本的树,所以一定要清空,保证0版本始终是空树 left[0] = right[0] = 0; head[v] = merge(merge(l, cnt), r); } @@ -98,8 +97,7 @@ public static void remove(int v, int i, int num) { split(0, 0, lm, num - 1); int m = left[0]; int l = right[0]; - // 后续可能基于0版本,去生成新版本的树 - // 所以这里一定要清空,保证0版本的树正确 + // 后续可能基于0版本,去生成新版本的树,所以一定要清空,保证0版本始终是空树 left[0] = right[0] = 0; head[v] = merge(merge(l, merge(left[m], right[m])), r); } diff --git a/src/class152/Code05.java b/src/class152/Code05.java new file mode 100644 index 000000000..2c60f0da2 --- /dev/null +++ b/src/class152/Code05.java @@ -0,0 +1,5 @@ +package class152; + +public class Code05 { + +} From bca566b192c9fd4e705ba49c2718cc9c0a091f4d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 20 Nov 2024 19:40:56 +0800 Subject: [PATCH 0386/2029] modify code --- src/class152/Code01_FHQTreap2.java | 2 +- src/class152/Code01_FHQTreap4.java | 2 +- src/class152/Code02_TextEditor1.java | 4 +- src/class152/Code02_TextEditor2.java | 4 +- src/class152/Code03_LiteraryTree1.java | 2 +- src/class152/Code03_LiteraryTree2.java | 2 +- src/class152/Code04_FHQTreapPersistent1.java | 31 ++-- src/class152/Code04_FHQTreapPersistent2.java | 27 +-- src/class152/Code05.java | 5 - .../Code05_LiteraryTreePersistent1.java | 172 ++++++++++++++++++ .../Code05_LiteraryTreePersistent2.java | 152 ++++++++++++++++ 11 files changed, 364 insertions(+), 39 deletions(-) delete mode 100644 src/class152/Code05.java create mode 100644 src/class152/Code05_LiteraryTreePersistent1.java create mode 100644 src/class152/Code05_LiteraryTreePersistent2.java diff --git a/src/class152/Code01_FHQTreap2.java b/src/class152/Code01_FHQTreap2.java index d8ea68ae4..a9c15859a 100644 --- a/src/class152/Code01_FHQTreap2.java +++ b/src/class152/Code01_FHQTreap2.java @@ -92,8 +92,8 @@ public static void remove(int num) { int lm = right[0]; int r = left[0]; split(0, 0, lm, num - 1); - int m = left[0]; int l = right[0]; + int m = left[0]; head = merge(merge(l, merge(left[m], right[m])), r); } diff --git a/src/class152/Code01_FHQTreap4.java b/src/class152/Code01_FHQTreap4.java index ae8dc0992..031e4bc73 100644 --- a/src/class152/Code01_FHQTreap4.java +++ b/src/class152/Code01_FHQTreap4.java @@ -78,8 +78,8 @@ // int lm = rs[0]; // int r = ls[0]; // split(0, 0, lm, num - 1); -// int m = ls[0]; // int l = rs[0]; +// int m = ls[0]; // head = merge(merge(l, merge(ls[m], rs[m])), r); //} // diff --git a/src/class152/Code02_TextEditor1.java b/src/class152/Code02_TextEditor1.java index 8dcdad557..ef22988f9 100644 --- a/src/class152/Code02_TextEditor1.java +++ b/src/class152/Code02_TextEditor1.java @@ -121,15 +121,15 @@ public static void main(String[] args) throws IOException { head = merge(l, r); } else if (op.equals("Delete")) { split(0, 0, head, pos + len); - r = left[0]; lm = right[0]; + r = left[0]; split(0, 0, lm, pos); l = right[0]; head = merge(l, r); } else { split(0, 0, head, pos + len); - r = left[0]; lm = right[0]; + r = left[0]; split(0, 0, lm, pos); l = right[0]; m = left[0]; diff --git a/src/class152/Code02_TextEditor2.java b/src/class152/Code02_TextEditor2.java index 338025753..e202f3012 100644 --- a/src/class152/Code02_TextEditor2.java +++ b/src/class152/Code02_TextEditor2.java @@ -99,16 +99,16 @@ // } else if (op[0] == 'D') { // cin >> len; // split(0, 0, head, pos + len); -// r = ls[0]; // lm = rs[0]; +// r = ls[0]; // split(0, 0, lm, pos); // l = rs[0]; // head = merge(l, r); // } else { // cin >> len; // split(0, 0, head, pos + len); -// r = ls[0]; // lm = rs[0]; +// r = ls[0]; // split(0, 0, lm, pos); // l = rs[0]; // m = ls[0]; diff --git a/src/class152/Code03_LiteraryTree1.java b/src/class152/Code03_LiteraryTree1.java index f30902d0e..0a0cecf12 100644 --- a/src/class152/Code03_LiteraryTree1.java +++ b/src/class152/Code03_LiteraryTree1.java @@ -112,8 +112,8 @@ public static void main(String[] args) throws IOException { in.nextToken(); y = (int) in.nval; split(0, 0, head, y); - r = left[0]; lm = right[0]; + r = left[0]; split(0, 0, lm, x - 1); l = right[0]; m = left[0]; diff --git a/src/class152/Code03_LiteraryTree2.java b/src/class152/Code03_LiteraryTree2.java index b62d73139..762c78823 100644 --- a/src/class152/Code03_LiteraryTree2.java +++ b/src/class152/Code03_LiteraryTree2.java @@ -95,8 +95,8 @@ // for (int i = 1, x, y, l, m, lm, r; i <= k; i++) { // cin >> x >> y; // split(0, 0, head, y); -// r = ls[0]; // lm = rs[0]; +// r = ls[0]; // split(0, 0, lm, x - 1); // l = rs[0]; // m = ls[0]; diff --git a/src/class152/Code04_FHQTreapPersistent1.java b/src/class152/Code04_FHQTreapPersistent1.java index f485775e9..48215e8cf 100644 --- a/src/class152/Code04_FHQTreapPersistent1.java +++ b/src/class152/Code04_FHQTreapPersistent1.java @@ -18,23 +18,21 @@ public class Code04_FHQTreapPersistent1 { public static int MAXN = 500001; + public static int MAXM = MAXN * 50; + public static int cnt = 0; public static int[] head = new int[MAXN]; - public static int[] key = new int[MAXN * 50]; - - public static int[] left = new int[MAXN * 50]; + public static int[] key = new int[MAXM]; - public static int[] right = new int[MAXN * 50]; + public static int[] left = new int[MAXM]; - public static int[] size = new int[MAXN * 50]; + public static int[] right = new int[MAXM]; - public static double[] priority = new double[MAXN * 50]; + public static int[] size = new int[MAXM]; - public static void up(int i) { - size[i] = size[left[i]] + size[right[i]] + 1; - } + public static double[] priority = new double[MAXM]; public static int copy(int i) { key[++cnt] = key[i]; @@ -45,6 +43,10 @@ public static int copy(int i) { return cnt; } + public static void up(int i) { + size[i] = size[left[i]] + size[right[i]] + 1; + } + public static void split(int l, int r, int i, int num) { if (i == 0) { right[l] = left[r] = 0; @@ -80,13 +82,15 @@ public static int merge(int l, int r) { public static void add(int v, int i, int num) { split(0, 0, i, num); - key[++cnt] = num; - size[cnt] = 1; - priority[cnt] = Math.random(); int l = right[0]; int r = left[0]; // 后续可能基于0版本,去生成新版本的树,所以一定要清空,保证0版本始终是空树 left[0] = right[0] = 0; + // 建立新节点 + key[++cnt] = num; + size[cnt] = 1; + priority[cnt] = Math.random(); + // 新节点,与其他范围合并 head[v] = merge(merge(l, cnt), r); } @@ -95,10 +99,11 @@ public static void remove(int v, int i, int num) { int lm = right[0]; int r = left[0]; split(0, 0, lm, num - 1); - int m = left[0]; int l = right[0]; + int m = left[0]; // 后续可能基于0版本,去生成新版本的树,所以一定要清空,保证0版本始终是空树 left[0] = right[0] = 0; + // 去掉m号节点,其他范围合并 head[v] = merge(merge(l, merge(left[m], right[m])), r); } diff --git a/src/class152/Code04_FHQTreapPersistent2.java b/src/class152/Code04_FHQTreapPersistent2.java index a26a709d2..5967fc0d0 100644 --- a/src/class152/Code04_FHQTreapPersistent2.java +++ b/src/class152/Code04_FHQTreapPersistent2.java @@ -15,18 +15,15 @@ //using namespace std; // //const int MAXN = 500001; +//const int MAXM = MAXN * 50; // //int cnt = 0; //int head[MAXN]; -//int key[MAXN * 50]; -//int ls[MAXN * 50]; -//int rs[MAXN * 50]; -//int size[MAXN * 50]; -//double priority[MAXN * 50]; -// -//void up(int i) { -// size[i] = size[ls[i]] + size[rs[i]] + 1; -//} +//int key[MAXM]; +//int ls[MAXM]; +//int rs[MAXM]; +//int size[MAXM]; +//double priority[MAXM]; // //int copy(int i) { // ++cnt; @@ -38,6 +35,10 @@ // return cnt; //} // +//void up(int i) { +// size[i] = size[ls[i]] + size[rs[i]] + 1; +//} +// //void split(int l, int r, int i, int num) { // if (i == 0) { // rs[l] = ls[r] = 0; @@ -73,13 +74,13 @@ // //void add(int v, int i, int num) { // split(0, 0, i, num); +// int l = rs[0]; +// int r = ls[0]; +// ls[0] = rs[0] = 0; // ++cnt; // key[cnt] = num; // size[cnt] = 1; // priority[cnt] = (double)rand() / RAND_MAX; -// int l = rs[0]; -// int r = ls[0]; -// ls[0] = rs[0] = 0; // head[v] = merge(merge(l, cnt), r); //} // @@ -88,8 +89,8 @@ // int lm = rs[0]; // int r = ls[0]; // split(0, 0, lm, num - 1); -// int m = ls[0]; // int l = rs[0]; +// int m = ls[0]; // ls[0] = rs[0] = 0; // head[v] = merge(merge(l, merge(ls[m], rs[m])), r); //} diff --git a/src/class152/Code05.java b/src/class152/Code05.java deleted file mode 100644 index 2c60f0da2..000000000 --- a/src/class152/Code05.java +++ /dev/null @@ -1,5 +0,0 @@ -package class152; - -public class Code05 { - -} diff --git a/src/class152/Code05_LiteraryTreePersistent1.java b/src/class152/Code05_LiteraryTreePersistent1.java new file mode 100644 index 000000000..f9561286d --- /dev/null +++ b/src/class152/Code05_LiteraryTreePersistent1.java @@ -0,0 +1,172 @@ +package class152; + +// 可持久化文艺平衡树(java版) +// 测试链接 : https://www.luogu.com.cn/problem/P5055 +// 提交以下的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 Code05_LiteraryTreePersistent1 { + + public static int MAXN = 200001; + + public static int MAXM = MAXN * 80; + + public static int cnt = 0; + + public static int[] head = new int[MAXN]; + + public static int[] key = new int[MAXM]; + + public static int[] left = new int[MAXM]; + + public static int[] right = new int[MAXM]; + + public static int[] size = new int[MAXM]; + + public static boolean[] reverse = new boolean[MAXM]; + + public static long[] sum = new long[MAXM]; + + public static double[] priority = new double[MAXM]; + + public static int copy(int i) { + key[++cnt] = key[i]; + left[cnt] = left[i]; + right[cnt] = right[i]; + size[cnt] = size[i]; + reverse[cnt] = reverse[i]; + sum[cnt] = sum[i]; + priority[cnt] = priority[i]; + return cnt; + } + + public static void up(int i) { + size[i] = size[left[i]] + size[right[i]] + 1; + sum[i] = sum[left[i]] + sum[right[i]] + key[i]; + } + + public static void down(int i) { + if (reverse[i]) { + if (left[i] != 0) { + left[i] = copy(left[i]); + reverse[left[i]] = !reverse[left[i]]; + } + if (right[i] != 0) { + right[i] = copy(right[i]); + reverse[right[i]] = !reverse[right[i]]; + } + int tmp = left[i]; + left[i] = right[i]; + right[i] = tmp; + reverse[i] = false; + } + } + + public static void split(int l, int r, int i, int rank) { + if (i == 0) { + right[l] = left[r] = 0; + } else { + down(i); + i = copy(i); + if (size[left[i]] + 1 <= rank) { + right[l] = i; + split(i, r, right[i], rank - size[left[i]] - 1); + } else { + left[r] = i; + split(l, i, left[i], rank); + } + up(i); + } + } + + public static int merge(int l, int r) { + if (l == 0 || r == 0) { + return l + r; + } + if (priority[l] >= priority[r]) { + down(l); + l = copy(l); + right[l] = merge(right[l], r); + up(l); + return l; + } else { + down(r); + r = copy(r); + left[r] = merge(l, left[r]); + up(r); + return r; + } + } + + 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(); + int n = (int) in.nval; + long lastAns = 0; + for (int i = 1, version, op, x = 0, y = 0, l, m, lm, r; i <= n; i++) { + in.nextToken(); + version = (int) in.nval; + in.nextToken(); + op = (int) in.nval; + in.nextToken(); + x = (int) ((long) in.nval ^ lastAns); + if (op != 2) { + in.nextToken(); + y = (int) ((long) in.nval ^ lastAns); + } + if (op == 1) { + split(0, 0, head[version], x); + l = right[0]; + r = left[0]; + left[0] = right[0] = 0; + key[++cnt] = (int) y; + size[cnt] = 1; + sum[cnt] = y; + priority[cnt] = Math.random(); + head[i] = merge(merge(l, cnt), r); + } else if (op == 2) { + split(0, 0, head[version], x); + lm = right[0]; + r = left[0]; + split(0, 0, lm, x - 1); + l = right[0]; + m = left[0]; + left[0] = right[0] = 0; + head[i] = merge(l, r); + } else if (op == 3) { + split(0, 0, head[version], y); + lm = right[0]; + r = left[0]; + split(0, 0, lm, x - 1); + l = right[0]; + m = left[0]; + left[0] = right[0] = 0; + reverse[m] = !reverse[m]; + head[i] = merge(merge(l, m), r); + } else { + split(0, 0, head[version], y); + lm = right[0]; + r = left[0]; + split(0, 0, lm, x - 1); + l = right[0]; + m = left[0]; + lastAns = sum[m]; + left[0] = right[0] = 0; + out.println(lastAns); + head[i] = merge(merge(l, m), r); + } + } + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class152/Code05_LiteraryTreePersistent2.java b/src/class152/Code05_LiteraryTreePersistent2.java new file mode 100644 index 000000000..abb0e11b4 --- /dev/null +++ b/src/class152/Code05_LiteraryTreePersistent2.java @@ -0,0 +1,152 @@ +package class152; + +// 可持久化文艺平衡树(C++版) +// 测试链接 : https://www.luogu.com.cn/problem/P5055 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +//#include +//#include +//#include +//using namespace std; +// +//const int MAXN = 200001; +//const int MAXM = MAXN * 80; +// +//int cnt = 0; +//int head[MAXN]; +//int key[MAXM]; +//int ls[MAXM]; +//int rs[MAXM]; +//int size[MAXM]; +//bool rev[MAXM]; +//long long sum[MAXM]; +//double priority[MAXM]; +// +//int copy(int i) { +// key[++cnt] = key[i]; +// ls[cnt] = ls[i]; +// rs[cnt] = rs[i]; +// size[cnt] = size[i]; +// rev[cnt] = rev[i]; +// sum[cnt] = sum[i]; +// priority[cnt] = priority[i]; +// return cnt; +//} +// +//void up(int i) { +// size[i] = size[ls[i]] + size[rs[i]] + 1; +// sum[i] = sum[ls[i]] + sum[rs[i]] + key[i]; +//} +// +//void down(int i) { +// if (rev[i]) { +// if (ls[i] != 0) { +// ls[i] = copy(ls[i]); +// rev[ls[i]] ^= 1; +// } +// if (rs[i] != 0) { +// rs[i] = copy(rs[i]); +// rev[rs[i]] ^= 1; +// } +// swap(ls[i], rs[i]); +// rev[i] = false; +// } +//} +// +//void split(int l, int r, int i, int rank) { +// if (i == 0) { +// rs[l] = ls[r] = 0; +// } else { +// down(i); +// i = copy(i); +// if (size[ls[i]] + 1 <= rank) { +// rs[l] = i; +// split(i, r, rs[i], rank - size[ls[i]] - 1); +// } else { +// ls[r] = i; +// split(l, i, ls[i], rank); +// } +// up(i); +// } +//} +// +//int merge(int l, int r) { +// if (l == 0 || r == 0) { +// return l + r; +// } +// if (priority[l] >= priority[r]) { +// down(l); +// l = copy(l); +// rs[l] = merge(rs[l], r); +// up(l); +// return l; +// } else { +// down(r); +// r = copy(r); +// ls[r] = merge(l, ls[r]); +// up(r); +// return r; +// } +//} +// +//int main() { +// srand(time(0)); +// int n; +// cin >> n; +// long long lastAns = 0; +// for (int i = 1; i <= n; i++) { +// int version, op; +// long long x, y = 0; +// cin >> version >> op >> x; +// x ^= lastAns; +// if (op != 2) { +// cin >> y; +// y ^= lastAns; +// } +// int l, m, lm, r; +// if (op == 1) { +// split(0, 0, head[version], x); +// l = rs[0]; +// r = ls[0]; +// ls[0] = rs[0] = 0; +// key[++cnt] = y; +// size[cnt] = 1; +// sum[cnt] = y; +// priority[cnt] = (double)rand() / RAND_MAX; +// head[i] = merge(merge(l, cnt), r); +// } else if (op == 2) { +// split(0, 0, head[version], x); +// lm = rs[0]; +// r = ls[0]; +// split(0, 0, lm, x - 1); +// l = rs[0]; +// m = ls[0]; +// ls[0] = rs[0] = 0; +// head[i] = merge(l, r); +// } else if (op == 3) { +// split(0, 0, head[version], y); +// lm = rs[0]; +// r = ls[0]; +// split(0, 0, lm, x - 1); +// l = rs[0]; +// m = ls[0]; +// ls[0] = rs[0] = 0; +// rev[m] ^= 1; +// head[i] = merge(merge(l, m), r); +// } else { +// split(0, 0, head[version], y); +// lm = rs[0]; +// r = ls[0]; +// split(0, 0, lm, x - 1); +// l = rs[0]; +// m = ls[0]; +// lastAns = sum[m]; +// ls[0] = rs[0] = 0; +// cout << lastAns << endl; +// head[i] = merge(merge(l, m), r); +// } +// } +// return 0; +//} \ No newline at end of file From abd15815cd0628c35da2904843d8a8cd07d7050a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 20 Nov 2024 19:48:49 +0800 Subject: [PATCH 0387/2029] modify code --- src/class152/Code04_FHQTreapPersistent1.java | 3 --- src/class152/Code05_LiteraryTreePersistent1.java | 6 +++++- src/class152/Code05_LiteraryTreePersistent2.java | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/class152/Code04_FHQTreapPersistent1.java b/src/class152/Code04_FHQTreapPersistent1.java index 48215e8cf..0bfb6375e 100644 --- a/src/class152/Code04_FHQTreapPersistent1.java +++ b/src/class152/Code04_FHQTreapPersistent1.java @@ -86,11 +86,9 @@ public static void add(int v, int i, int num) { int r = left[0]; // 后续可能基于0版本,去生成新版本的树,所以一定要清空,保证0版本始终是空树 left[0] = right[0] = 0; - // 建立新节点 key[++cnt] = num; size[cnt] = 1; priority[cnt] = Math.random(); - // 新节点,与其他范围合并 head[v] = merge(merge(l, cnt), r); } @@ -103,7 +101,6 @@ public static void remove(int v, int i, int num) { int m = left[0]; // 后续可能基于0版本,去生成新版本的树,所以一定要清空,保证0版本始终是空树 left[0] = right[0] = 0; - // 去掉m号节点,其他范围合并 head[v] = merge(merge(l, merge(left[m], right[m])), r); } diff --git a/src/class152/Code05_LiteraryTreePersistent1.java b/src/class152/Code05_LiteraryTreePersistent1.java index f9561286d..984264bf9 100644 --- a/src/class152/Code05_LiteraryTreePersistent1.java +++ b/src/class152/Code05_LiteraryTreePersistent1.java @@ -126,6 +126,7 @@ public static void main(String[] args) throws IOException { split(0, 0, head[version], x); l = right[0]; r = left[0]; + // 后续可能基于0版本,去生成新版本的树,所以一定要清空,保证0版本始终是空树 left[0] = right[0] = 0; key[++cnt] = (int) y; size[cnt] = 1; @@ -139,6 +140,7 @@ public static void main(String[] args) throws IOException { split(0, 0, lm, x - 1); l = right[0]; m = left[0]; + // 后续可能基于0版本,去生成新版本的树,所以一定要清空,保证0版本始终是空树 left[0] = right[0] = 0; head[i] = merge(l, r); } else if (op == 3) { @@ -148,6 +150,7 @@ public static void main(String[] args) throws IOException { split(0, 0, lm, x - 1); l = right[0]; m = left[0]; + // 后续可能基于0版本,去生成新版本的树,所以一定要清空,保证0版本始终是空树 left[0] = right[0] = 0; reverse[m] = !reverse[m]; head[i] = merge(merge(l, m), r); @@ -158,8 +161,9 @@ public static void main(String[] args) throws IOException { split(0, 0, lm, x - 1); l = right[0]; m = left[0]; - lastAns = sum[m]; + // 后续可能基于0版本,去生成新版本的树,所以一定要清空,保证0版本始终是空树 left[0] = right[0] = 0; + lastAns = sum[m]; out.println(lastAns); head[i] = merge(merge(l, m), r); } diff --git a/src/class152/Code05_LiteraryTreePersistent2.java b/src/class152/Code05_LiteraryTreePersistent2.java index abb0e11b4..57dfe9d6c 100644 --- a/src/class152/Code05_LiteraryTreePersistent2.java +++ b/src/class152/Code05_LiteraryTreePersistent2.java @@ -142,8 +142,8 @@ // split(0, 0, lm, x - 1); // l = rs[0]; // m = ls[0]; -// lastAns = sum[m]; // ls[0] = rs[0] = 0; +// lastAns = sum[m]; // cout << lastAns << endl; // head[i] = merge(merge(l, m), r); // } From 1069ae294cc3c9bc84899bf832576b72d45c1784 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 20 Nov 2024 19:52:43 +0800 Subject: [PATCH 0388/2029] modify code --- ...FHQTreapPersistent1.java => Code04_PersistentFHQTreap1.java} | 2 +- ...FHQTreapPersistent2.java => Code04_PersistentFHQTreap2.java} | 0 ...TreePersistent1.java => Code05_PersistentLiteraryTree1.java} | 2 +- ...TreePersistent2.java => Code05_PersistentLiteraryTree2.java} | 0 4 files changed, 2 insertions(+), 2 deletions(-) rename src/class152/{Code04_FHQTreapPersistent1.java => Code04_PersistentFHQTreap1.java} (99%) rename src/class152/{Code04_FHQTreapPersistent2.java => Code04_PersistentFHQTreap2.java} (100%) rename src/class152/{Code05_LiteraryTreePersistent1.java => Code05_PersistentLiteraryTree1.java} (98%) rename src/class152/{Code05_LiteraryTreePersistent2.java => Code05_PersistentLiteraryTree2.java} (100%) diff --git a/src/class152/Code04_FHQTreapPersistent1.java b/src/class152/Code04_PersistentFHQTreap1.java similarity index 99% rename from src/class152/Code04_FHQTreapPersistent1.java rename to src/class152/Code04_PersistentFHQTreap1.java index 0bfb6375e..b8ba7deaa 100644 --- a/src/class152/Code04_FHQTreapPersistent1.java +++ b/src/class152/Code04_PersistentFHQTreap1.java @@ -14,7 +14,7 @@ import java.io.Writer; import java.util.InputMismatchException; -public class Code04_FHQTreapPersistent1 { +public class Code04_PersistentFHQTreap1 { public static int MAXN = 500001; diff --git a/src/class152/Code04_FHQTreapPersistent2.java b/src/class152/Code04_PersistentFHQTreap2.java similarity index 100% rename from src/class152/Code04_FHQTreapPersistent2.java rename to src/class152/Code04_PersistentFHQTreap2.java diff --git a/src/class152/Code05_LiteraryTreePersistent1.java b/src/class152/Code05_PersistentLiteraryTree1.java similarity index 98% rename from src/class152/Code05_LiteraryTreePersistent1.java rename to src/class152/Code05_PersistentLiteraryTree1.java index 984264bf9..b64f34db8 100644 --- a/src/class152/Code05_LiteraryTreePersistent1.java +++ b/src/class152/Code05_PersistentLiteraryTree1.java @@ -11,7 +11,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code05_LiteraryTreePersistent1 { +public class Code05_PersistentLiteraryTree1 { public static int MAXN = 200001; diff --git a/src/class152/Code05_LiteraryTreePersistent2.java b/src/class152/Code05_PersistentLiteraryTree2.java similarity index 100% rename from src/class152/Code05_LiteraryTreePersistent2.java rename to src/class152/Code05_PersistentLiteraryTree2.java From 1f2ccb129c3ac5d480ae958f25b2b40892d006db Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 21 Nov 2024 13:02:33 +0800 Subject: [PATCH 0389/2029] modify code --- .../{Code01_FHQTreap1.java => Code01_FHQTreapWithCount1.java} | 2 +- .../{Code01_FHQTreap3.java => Code01_FHQTreapWithCount2.java} | 0 ...ode01_FHQTreap2.java => Code02_FHQTreapWithoutCount1.java} | 2 +- ...ode01_FHQTreap4.java => Code02_FHQTreapWithoutCount2.java} | 0 .../{Code02_TextEditor1.java => Code03_TextEditor1.java} | 4 ++-- .../{Code02_TextEditor2.java => Code03_TextEditor2.java} | 0 .../{Code03_LiteraryTree1.java => Code04_LiteraryTree1.java} | 2 +- .../{Code03_LiteraryTree2.java => Code04_LiteraryTree2.java} | 0 ...rsistentFHQTreap1.java => Code05_PersistentFHQTreap1.java} | 2 +- ...rsistentFHQTreap2.java => Code05_PersistentFHQTreap2.java} | 0 ...LiteraryTree1.java => Code06_PersistentLiteraryTree1.java} | 2 +- ...LiteraryTree2.java => Code06_PersistentLiteraryTree2.java} | 0 12 files changed, 7 insertions(+), 7 deletions(-) rename src/class152/{Code01_FHQTreap1.java => Code01_FHQTreapWithCount1.java} (99%) rename src/class152/{Code01_FHQTreap3.java => Code01_FHQTreapWithCount2.java} (100%) rename src/class152/{Code01_FHQTreap2.java => Code02_FHQTreapWithoutCount1.java} (98%) rename src/class152/{Code01_FHQTreap4.java => Code02_FHQTreapWithoutCount2.java} (100%) rename src/class152/{Code02_TextEditor1.java => Code03_TextEditor1.java} (97%) rename src/class152/{Code02_TextEditor2.java => Code03_TextEditor2.java} (100%) rename src/class152/{Code03_LiteraryTree1.java => Code04_LiteraryTree1.java} (98%) rename src/class152/{Code03_LiteraryTree2.java => Code04_LiteraryTree2.java} (100%) rename src/class152/{Code04_PersistentFHQTreap1.java => Code05_PersistentFHQTreap1.java} (99%) rename src/class152/{Code04_PersistentFHQTreap2.java => Code05_PersistentFHQTreap2.java} (100%) rename src/class152/{Code05_PersistentLiteraryTree1.java => Code06_PersistentLiteraryTree1.java} (98%) rename src/class152/{Code05_PersistentLiteraryTree2.java => Code06_PersistentLiteraryTree2.java} (100%) diff --git a/src/class152/Code01_FHQTreap1.java b/src/class152/Code01_FHQTreapWithCount1.java similarity index 99% rename from src/class152/Code01_FHQTreap1.java rename to src/class152/Code01_FHQTreapWithCount1.java index 11c38186a..5f1706631 100644 --- a/src/class152/Code01_FHQTreap1.java +++ b/src/class152/Code01_FHQTreapWithCount1.java @@ -20,7 +20,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code01_FHQTreap1 { +public class Code01_FHQTreapWithCount1 { public static int MAXN = 100001; diff --git a/src/class152/Code01_FHQTreap3.java b/src/class152/Code01_FHQTreapWithCount2.java similarity index 100% rename from src/class152/Code01_FHQTreap3.java rename to src/class152/Code01_FHQTreapWithCount2.java diff --git a/src/class152/Code01_FHQTreap2.java b/src/class152/Code02_FHQTreapWithoutCount1.java similarity index 98% rename from src/class152/Code01_FHQTreap2.java rename to src/class152/Code02_FHQTreapWithoutCount1.java index a9c15859a..339d8c331 100644 --- a/src/class152/Code01_FHQTreap2.java +++ b/src/class152/Code02_FHQTreapWithoutCount1.java @@ -20,7 +20,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code01_FHQTreap2 { +public class Code02_FHQTreapWithoutCount1 { public static int MAXN = 100001; diff --git a/src/class152/Code01_FHQTreap4.java b/src/class152/Code02_FHQTreapWithoutCount2.java similarity index 100% rename from src/class152/Code01_FHQTreap4.java rename to src/class152/Code02_FHQTreapWithoutCount2.java diff --git a/src/class152/Code02_TextEditor1.java b/src/class152/Code03_TextEditor1.java similarity index 97% rename from src/class152/Code02_TextEditor1.java rename to src/class152/Code03_TextEditor1.java index ef22988f9..84758367f 100644 --- a/src/class152/Code02_TextEditor1.java +++ b/src/class152/Code03_TextEditor1.java @@ -5,7 +5,7 @@ // 如下实现是正确的,但java的版本无法通过所有测试用例 // 这是洛谷平台没有照顾各种语言的实现所导致的 // java的实现空间就是无法达标,C++的实现完全一样的逻辑,就是可以达标 -// C++版本是Code02_TextEditor2文件,可以通过所有测试用例 +// C++版本是Code03_TextEditor2文件,可以通过所有测试用例 // 在真正笔试、比赛时,一定是兼顾各种语言的,该实现是一定正确的 import java.io.BufferedReader; @@ -14,7 +14,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code02_TextEditor1 { +public class Code03_TextEditor1 { public static int MAXN = 2000001; diff --git a/src/class152/Code02_TextEditor2.java b/src/class152/Code03_TextEditor2.java similarity index 100% rename from src/class152/Code02_TextEditor2.java rename to src/class152/Code03_TextEditor2.java diff --git a/src/class152/Code03_LiteraryTree1.java b/src/class152/Code04_LiteraryTree1.java similarity index 98% rename from src/class152/Code03_LiteraryTree1.java rename to src/class152/Code04_LiteraryTree1.java index 0a0cecf12..0b32fcf4e 100644 --- a/src/class152/Code03_LiteraryTree1.java +++ b/src/class152/Code04_LiteraryTree1.java @@ -11,7 +11,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code03_LiteraryTree1 { +public class Code04_LiteraryTree1 { public static int MAXN = 100001; diff --git a/src/class152/Code03_LiteraryTree2.java b/src/class152/Code04_LiteraryTree2.java similarity index 100% rename from src/class152/Code03_LiteraryTree2.java rename to src/class152/Code04_LiteraryTree2.java diff --git a/src/class152/Code04_PersistentFHQTreap1.java b/src/class152/Code05_PersistentFHQTreap1.java similarity index 99% rename from src/class152/Code04_PersistentFHQTreap1.java rename to src/class152/Code05_PersistentFHQTreap1.java index b8ba7deaa..80013bbb0 100644 --- a/src/class152/Code04_PersistentFHQTreap1.java +++ b/src/class152/Code05_PersistentFHQTreap1.java @@ -14,7 +14,7 @@ import java.io.Writer; import java.util.InputMismatchException; -public class Code04_PersistentFHQTreap1 { +public class Code05_PersistentFHQTreap1 { public static int MAXN = 500001; diff --git a/src/class152/Code04_PersistentFHQTreap2.java b/src/class152/Code05_PersistentFHQTreap2.java similarity index 100% rename from src/class152/Code04_PersistentFHQTreap2.java rename to src/class152/Code05_PersistentFHQTreap2.java diff --git a/src/class152/Code05_PersistentLiteraryTree1.java b/src/class152/Code06_PersistentLiteraryTree1.java similarity index 98% rename from src/class152/Code05_PersistentLiteraryTree1.java rename to src/class152/Code06_PersistentLiteraryTree1.java index b64f34db8..04c65387c 100644 --- a/src/class152/Code05_PersistentLiteraryTree1.java +++ b/src/class152/Code06_PersistentLiteraryTree1.java @@ -11,7 +11,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code05_PersistentLiteraryTree1 { +public class Code06_PersistentLiteraryTree1 { public static int MAXN = 200001; diff --git a/src/class152/Code05_PersistentLiteraryTree2.java b/src/class152/Code06_PersistentLiteraryTree2.java similarity index 100% rename from src/class152/Code05_PersistentLiteraryTree2.java rename to src/class152/Code06_PersistentLiteraryTree2.java From 5f20d01f4eb2769fdc5346a70d74b81f2193efce Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 21 Nov 2024 13:14:24 +0800 Subject: [PATCH 0390/2029] modify code --- src/class152/Code01_FHQTreapWithCount1.java | 2 +- src/class152/Code01_FHQTreapWithCount2.java | 2 +- src/class152/Code02_FHQTreapWithoutCount1.java | 2 +- src/class152/Code02_FHQTreapWithoutCount2.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class152/Code01_FHQTreapWithCount1.java b/src/class152/Code01_FHQTreapWithCount1.java index 5f1706631..86656c283 100644 --- a/src/class152/Code01_FHQTreapWithCount1.java +++ b/src/class152/Code01_FHQTreapWithCount1.java @@ -1,6 +1,6 @@ package class152; -// FHQ-Treap,使用词频统计,java版 +// FHQ-Treap,使用词频压缩,java版 // 实现一种结构,支持如下操作,要求单次调用的时间复杂度O(log n) // 1,增加x,重复加入算多个词频 // 2,删除x,如果有多个,只删掉一个 diff --git a/src/class152/Code01_FHQTreapWithCount2.java b/src/class152/Code01_FHQTreapWithCount2.java index 21a720263..3b46fdbab 100644 --- a/src/class152/Code01_FHQTreapWithCount2.java +++ b/src/class152/Code01_FHQTreapWithCount2.java @@ -1,6 +1,6 @@ package class152; -// FHQ-Treap,使用词频统计,C++版 +// FHQ-Treap,使用词频压缩,C++版 // 实现一种结构,支持如下操作,要求单次调用的时间复杂度O(log n) // 1,增加x,重复加入算多个词频 // 2,删除x,如果有多个,只删掉一个 diff --git a/src/class152/Code02_FHQTreapWithoutCount1.java b/src/class152/Code02_FHQTreapWithoutCount1.java index 339d8c331..412faa172 100644 --- a/src/class152/Code02_FHQTreapWithoutCount1.java +++ b/src/class152/Code02_FHQTreapWithoutCount1.java @@ -1,6 +1,6 @@ package class152; -// FHQ-Treap,不用词频统计,java版 +// FHQ-Treap,不用词频压缩,java版 // 实现一种结构,支持如下操作,要求单次调用的时间复杂度O(log n) // 1,增加x,重复加入算多个词频 // 2,删除x,如果有多个,只删掉一个 diff --git a/src/class152/Code02_FHQTreapWithoutCount2.java b/src/class152/Code02_FHQTreapWithoutCount2.java index 031e4bc73..97948a497 100644 --- a/src/class152/Code02_FHQTreapWithoutCount2.java +++ b/src/class152/Code02_FHQTreapWithoutCount2.java @@ -1,6 +1,6 @@ package class152; -// FHQ-Treap,不用词频统计,C++版 +// FHQ-Treap,不用词频压缩,C++版 // 实现一种结构,支持如下操作,要求单次调用的时间复杂度O(log n) // 1,增加x,重复加入算多个词频 // 2,删除x,如果有多个,只删掉一个 From 00b35418d92e204e25b82b8c5b23c7170c1e3002 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 21 Nov 2024 15:01:20 +0800 Subject: [PATCH 0391/2029] modify code --- src/class152/Code03_TextEditor1.java | 9 +++++++++ src/class152/Code03_TextEditor2.java | 9 +++++++++ src/class152/Code04_LiteraryTree1.java | 4 ++++ src/class152/Code04_LiteraryTree2.java | 4 ++++ src/class152/Code05_PersistentFHQTreap1.java | 13 ++++++++++++- src/class152/Code05_PersistentFHQTreap2.java | 13 ++++++++++++- src/class152/Code06_PersistentLiteraryTree1.java | 13 +++++++++++-- src/class152/Code06_PersistentLiteraryTree2.java | 9 +++++++++ 8 files changed, 70 insertions(+), 4 deletions(-) diff --git a/src/class152/Code03_TextEditor1.java b/src/class152/Code03_TextEditor1.java index 84758367f..88b3d3b6b 100644 --- a/src/class152/Code03_TextEditor1.java +++ b/src/class152/Code03_TextEditor1.java @@ -1,6 +1,15 @@ package class152; // 文本编辑器(java版本) +// 一开始文本为空,光标在文本开头,也就是0位置,请实现如下6种操作 +// Move k : 将光标移动到第k个字符之后,如果k=0将光标移到文本开头 +// Insert n s : 在光标处插入长度为n的字符串s,光标位置不变 +// Delete n : 删除光标后的n个字符,光标位置不变 +// Get n : 输出光标后的n个字符,光标位置不变 +// Prev : 光标前移一个字符 +// Next : 光标后移一个字符 +// Insert操作时,字符串s中ASCII码在[32,126]范围上的字符一定有n个,其他字符请过滤掉 +// Delete、Get操作执行时光标后有足够的字符,Move、Prev、Next保证光标不会到非法位置 // 测试链接 : https://www.luogu.com.cn/problem/P4008 // 如下实现是正确的,但java的版本无法通过所有测试用例 // 这是洛谷平台没有照顾各种语言的实现所导致的 diff --git a/src/class152/Code03_TextEditor2.java b/src/class152/Code03_TextEditor2.java index e202f3012..e844d7a39 100644 --- a/src/class152/Code03_TextEditor2.java +++ b/src/class152/Code03_TextEditor2.java @@ -1,6 +1,15 @@ package class152; // 文本编辑器(C++版本) +// 一开始文本为空,光标在文本开头,也就是0位置,请实现如下6种操作 +// Move k : 将光标移动到第k个字符之后,如果k=0将光标移到文本开头 +// Insert n s : 在光标处插入长度为n的字符串s,光标位置不变 +// Delete n : 删除光标后的n个字符,光标位置不变 +// Get n : 输出光标后的n个字符,光标位置不变 +// Prev : 光标前移一个字符 +// Next : 光标后移一个字符 +// Insert操作时,字符串s中ASCII码在[32,126]范围上的字符一定有n个,其他字符请过滤掉 +// Delete、Get操作执行时光标后有足够的字符,Move、Prev、Next保证光标不会到非法位置 // 测试链接 : https://www.luogu.com.cn/problem/P4008 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class152/Code04_LiteraryTree1.java b/src/class152/Code04_LiteraryTree1.java index 0b32fcf4e..7aa068a29 100644 --- a/src/class152/Code04_LiteraryTree1.java +++ b/src/class152/Code04_LiteraryTree1.java @@ -1,6 +1,10 @@ package class152; // 文艺平衡树(java版) +// 长度为n的序列,下标从1开始,一开始序列为1, 2, ..., n +// 接下来会有k个操作,每个操作给定l,r,表示从l到r范围上的所有数字翻转 +// 做完k次操作后,从左到右打印所有数字 +// 1 <= n, k <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3391 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class152/Code04_LiteraryTree2.java b/src/class152/Code04_LiteraryTree2.java index 762c78823..6f8c82189 100644 --- a/src/class152/Code04_LiteraryTree2.java +++ b/src/class152/Code04_LiteraryTree2.java @@ -1,6 +1,10 @@ package class152; // 文艺平衡树(C++版) +// 长度为n的序列,下标从1开始,一开始序列为1, 2, ..., n +// 接下来会有k个操作,每个操作给定l,r,表示从l到r范围上的所有数字翻转 +// 做完k次操作后,从左到右打印所有数字 +// 1 <= n, k <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3391 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class152/Code05_PersistentFHQTreap1.java b/src/class152/Code05_PersistentFHQTreap1.java index 80013bbb0..b4c16be6a 100644 --- a/src/class152/Code05_PersistentFHQTreap1.java +++ b/src/class152/Code05_PersistentFHQTreap1.java @@ -1,6 +1,17 @@ package class152; -// 可持久化平衡树,FHQ-Treap实现,不用词频统计,java版 +// 可持久化平衡树,FHQ-Treap实现,不用词频压缩,java版 +// 认为一开始是0版本的树,为空树,实现如下操作,操作一共发生n次 +// v 1 x : 基于v版本的树,增加一个x,生成新版本的树 +// v 2 x : 基于v版本的树,删除一个x,生成新版本的树 +// v 3 x : 基于v版本的树,查询x的排名,生成新版本的树=v版本 +// v 4 x : 基于v版本的树,查询数据中排名为x的数,生成新版本的树=v版本 +// v 5 x : 基于v版本的树,查询x的前驱,生成新版本的树=v版本 +// v 6 x : 基于v版本的树,查询x的后继,生成新版本的树=v版本 +// 不管什么操作,都基于某个v版本,操作完成后得到新版本的树,但v版本不会变化 +// 如果x的前驱不存在,返回-2^31 + 1,如果x的后继不存在,返回+2^31 - 1 +// 1 <= n <= 5 * 10^5 +// -10^9 <= x <= +10^9 // 测试链接 : https://www.luogu.com.cn/problem/P3835 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class152/Code05_PersistentFHQTreap2.java b/src/class152/Code05_PersistentFHQTreap2.java index 5967fc0d0..588956c3e 100644 --- a/src/class152/Code05_PersistentFHQTreap2.java +++ b/src/class152/Code05_PersistentFHQTreap2.java @@ -1,6 +1,17 @@ package class152; -// 可持久化平衡树,FHQ-Treap实现,不用词频统计,C++版 +// 可持久化平衡树,FHQ-Treap实现,不用词频压缩,C++版 +// 认为一开始是0版本的树,为空树,实现如下操作,操作一共发生n次 +// v 1 x : 基于v版本的树,增加一个x,生成新版本的树 +// v 2 x : 基于v版本的树,删除一个x,生成新版本的树 +// v 3 x : 基于v版本的树,查询x的排名,生成新版本的树=v版本 +// v 4 x : 基于v版本的树,查询数据中排名为x的数,生成新版本的树=v版本 +// v 5 x : 基于v版本的树,查询x的前驱,生成新版本的树=v版本 +// v 6 x : 基于v版本的树,查询x的后继,生成新版本的树=v版本 +// 不管什么操作,都基于某个v版本,操作完成后得到新版本的树,但v版本不会变化 +// 如果x的前驱不存在,返回-2^31 + 1,如果x的后继不存在,返回+2^31 - 1 +// 1 <= n <= 5 * 10^5 +// -10^9 <= x <= +10^9 // 测试链接 : https://www.luogu.com.cn/problem/P3835 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class152/Code06_PersistentLiteraryTree1.java b/src/class152/Code06_PersistentLiteraryTree1.java index 04c65387c..74e5f1cb3 100644 --- a/src/class152/Code06_PersistentLiteraryTree1.java +++ b/src/class152/Code06_PersistentLiteraryTree1.java @@ -1,6 +1,15 @@ package class152; // 可持久化文艺平衡树(java版) +// 一开始序列为空,实现如下操作,操作一共发生n次 +// v 1 x y : 基于v版本的序列,在第x个数后插入y,生成新版本的序列 +// v 2 x : 基于v版本的序列,删除第x个数,生成新版本的序列 +// v 3 x y : 基于v版本的序列,范围[x,y]所有数字翻转,生成新版本的序列 +// v 4 x y : 基于v版本的序列,查询范围[x,y]所有数字的和,生成新版本的序列=v版本 +// 不管什么操作,都基于某个v版本,操作完成后得到新版本的序列,但v版本不会变化 +// 每种操作给定的参数都是有效的,插入数字的范围[-10^6, +10^6] +// 1 <= n <= 2 * 10^5 +// 本题目要求强制在线,具体规则可以打开测试链接查看 // 测试链接 : https://www.luogu.com.cn/problem/P5055 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -117,10 +126,10 @@ public static void main(String[] args) throws IOException { in.nextToken(); op = (int) in.nval; in.nextToken(); - x = (int) ((long) in.nval ^ lastAns); + x = (int) ((long) in.nval ^ lastAns); // 强制在线的规则 if (op != 2) { in.nextToken(); - y = (int) ((long) in.nval ^ lastAns); + y = (int) ((long) in.nval ^ lastAns); // 强制在线的规则 } if (op == 1) { split(0, 0, head[version], x); diff --git a/src/class152/Code06_PersistentLiteraryTree2.java b/src/class152/Code06_PersistentLiteraryTree2.java index 57dfe9d6c..e7516a542 100644 --- a/src/class152/Code06_PersistentLiteraryTree2.java +++ b/src/class152/Code06_PersistentLiteraryTree2.java @@ -1,6 +1,15 @@ package class152; // 可持久化文艺平衡树(C++版) +// 一开始序列为空,实现如下操作,操作一共发生n次 +// v 1 x y : 基于v版本的序列,在第x个数后插入y,生成新版本的序列 +// v 2 x : 基于v版本的序列,删除第x个数,生成新版本的序列 +// v 3 x y : 基于v版本的序列,范围[x,y]所有数字翻转,生成新版本的序列 +// v 4 x y : 基于v版本的序列,查询范围[x,y]所有数字的和,生成新版本的序列=v版本 +// 不管什么操作,都基于某个v版本,操作完成后得到新版本的序列,但v版本不会变化 +// 每种操作给定的参数都是有效的,插入数字的范围[-10^6, +10^6] +// 1 <= n <= 2 * 10^5 +// 本题目要求强制在线,具体规则可以打开测试链接查看 // 测试链接 : https://www.luogu.com.cn/problem/P5055 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From 7704050476556565a34d308e34f24bc1fc7ac631 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 21 Nov 2024 15:19:59 +0800 Subject: [PATCH 0392/2029] modify code --- src/class152/Code03_TextEditor1.java | 2 +- src/class152/Code03_TextEditor2.java | 2 +- src/class152/Code04_LiteraryTree1.java | 2 +- src/class152/Code04_LiteraryTree2.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class152/Code03_TextEditor1.java b/src/class152/Code03_TextEditor1.java index 88b3d3b6b..733afc6d8 100644 --- a/src/class152/Code03_TextEditor1.java +++ b/src/class152/Code03_TextEditor1.java @@ -1,6 +1,6 @@ package class152; -// 文本编辑器(java版本) +// 文本编辑器,FHQ-Treap实现区间移动,java版本 // 一开始文本为空,光标在文本开头,也就是0位置,请实现如下6种操作 // Move k : 将光标移动到第k个字符之后,如果k=0将光标移到文本开头 // Insert n s : 在光标处插入长度为n的字符串s,光标位置不变 diff --git a/src/class152/Code03_TextEditor2.java b/src/class152/Code03_TextEditor2.java index e844d7a39..06d22e765 100644 --- a/src/class152/Code03_TextEditor2.java +++ b/src/class152/Code03_TextEditor2.java @@ -1,6 +1,6 @@ package class152; -// 文本编辑器(C++版本) +// 文本编辑器,FHQ-Treap实现区间移动,C++版本 // 一开始文本为空,光标在文本开头,也就是0位置,请实现如下6种操作 // Move k : 将光标移动到第k个字符之后,如果k=0将光标移到文本开头 // Insert n s : 在光标处插入长度为n的字符串s,光标位置不变 diff --git a/src/class152/Code04_LiteraryTree1.java b/src/class152/Code04_LiteraryTree1.java index 7aa068a29..72b220f0b 100644 --- a/src/class152/Code04_LiteraryTree1.java +++ b/src/class152/Code04_LiteraryTree1.java @@ -1,6 +1,6 @@ package class152; -// 文艺平衡树(java版) +// 文艺平衡树,FHQ-Treap实现范围翻转,java版本 // 长度为n的序列,下标从1开始,一开始序列为1, 2, ..., n // 接下来会有k个操作,每个操作给定l,r,表示从l到r范围上的所有数字翻转 // 做完k次操作后,从左到右打印所有数字 diff --git a/src/class152/Code04_LiteraryTree2.java b/src/class152/Code04_LiteraryTree2.java index 6f8c82189..a4f915d83 100644 --- a/src/class152/Code04_LiteraryTree2.java +++ b/src/class152/Code04_LiteraryTree2.java @@ -1,6 +1,6 @@ package class152; -// 文艺平衡树(C++版) +// 文艺平衡树,FHQ-Treap实现范围翻转,C++版本 // 长度为n的序列,下标从1开始,一开始序列为1, 2, ..., n // 接下来会有k个操作,每个操作给定l,r,表示从l到r范围上的所有数字翻转 // 做完k次操作后,从左到右打印所有数字 From 10b74f3a351e65c8591eb8f1d6f8c5c7dc39550c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 21 Nov 2024 15:23:43 +0800 Subject: [PATCH 0393/2029] modify code --- src/class152/Code02_FHQTreapWithoutCount1.java | 2 +- src/class152/Code02_FHQTreapWithoutCount2.java | 2 +- src/class152/Code06_PersistentLiteraryTree1.java | 2 +- src/class152/Code06_PersistentLiteraryTree2.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class152/Code02_FHQTreapWithoutCount1.java b/src/class152/Code02_FHQTreapWithoutCount1.java index 412faa172..4fb6e6a44 100644 --- a/src/class152/Code02_FHQTreapWithoutCount1.java +++ b/src/class152/Code02_FHQTreapWithoutCount1.java @@ -1,6 +1,6 @@ package class152; -// FHQ-Treap,不用词频压缩,java版 +// FHQ-Treap,不用词频压缩,FHQ-Treap最常规的实现,java版 // 实现一种结构,支持如下操作,要求单次调用的时间复杂度O(log n) // 1,增加x,重复加入算多个词频 // 2,删除x,如果有多个,只删掉一个 diff --git a/src/class152/Code02_FHQTreapWithoutCount2.java b/src/class152/Code02_FHQTreapWithoutCount2.java index 97948a497..75da7c2ac 100644 --- a/src/class152/Code02_FHQTreapWithoutCount2.java +++ b/src/class152/Code02_FHQTreapWithoutCount2.java @@ -1,6 +1,6 @@ package class152; -// FHQ-Treap,不用词频压缩,C++版 +// FHQ-Treap,不用词频压缩,FHQ-Treap最常规的实现,C++版 // 实现一种结构,支持如下操作,要求单次调用的时间复杂度O(log n) // 1,增加x,重复加入算多个词频 // 2,删除x,如果有多个,只删掉一个 diff --git a/src/class152/Code06_PersistentLiteraryTree1.java b/src/class152/Code06_PersistentLiteraryTree1.java index 74e5f1cb3..a7cbebc10 100644 --- a/src/class152/Code06_PersistentLiteraryTree1.java +++ b/src/class152/Code06_PersistentLiteraryTree1.java @@ -1,6 +1,6 @@ package class152; -// 可持久化文艺平衡树(java版) +// 可持久化文艺平衡树,FHQ-Treap实现,java版 // 一开始序列为空,实现如下操作,操作一共发生n次 // v 1 x y : 基于v版本的序列,在第x个数后插入y,生成新版本的序列 // v 2 x : 基于v版本的序列,删除第x个数,生成新版本的序列 diff --git a/src/class152/Code06_PersistentLiteraryTree2.java b/src/class152/Code06_PersistentLiteraryTree2.java index e7516a542..3ed2ec2fa 100644 --- a/src/class152/Code06_PersistentLiteraryTree2.java +++ b/src/class152/Code06_PersistentLiteraryTree2.java @@ -1,6 +1,6 @@ package class152; -// 可持久化文艺平衡树(C++版) +// 可持久化文艺平衡树,FHQ-Treap实现,C++版 // 一开始序列为空,实现如下操作,操作一共发生n次 // v 1 x y : 基于v版本的序列,在第x个数后插入y,生成新版本的序列 // v 2 x : 基于v版本的序列,删除第x个数,生成新版本的序列 From 9889485ffac0df7aaf2845e2f4bfbd61b1d26967 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 21 Nov 2024 15:34:25 +0800 Subject: [PATCH 0394/2029] modify code --- src/class152/Code03_TextEditor1.java | 13 ++++++------- src/class152/Code03_TextEditor2.java | 13 ++++++------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/class152/Code03_TextEditor1.java b/src/class152/Code03_TextEditor1.java index 733afc6d8..90caace1f 100644 --- a/src/class152/Code03_TextEditor1.java +++ b/src/class152/Code03_TextEditor1.java @@ -1,15 +1,14 @@ package class152; // 文本编辑器,FHQ-Treap实现区间移动,java版本 -// 一开始文本为空,光标在文本开头,也就是0位置,请实现如下6种操作 -// Move k : 将光标移动到第k个字符之后,如果k=0将光标移到文本开头 +// 一开始文本为空,光标在文本开头,也就是1位置,请实现如下6种操作 +// Move k : 将光标移动到第k个字符之后,操作保证光标不会到非法位置 // Insert n s : 在光标处插入长度为n的字符串s,光标位置不变 -// Delete n : 删除光标后的n个字符,光标位置不变 -// Get n : 输出光标后的n个字符,光标位置不变 -// Prev : 光标前移一个字符 -// Next : 光标后移一个字符 +// Delete n : 删除光标后的n个字符,光标位置不变,操作保证有足够字符 +// Get n : 输出光标后的n个字符,光标位置不变,操作保证有足够字符 +// Prev : 光标前移一个字符,操作保证光标不会到非法位置 +// Next : 光标后移一个字符,操作保证光标不会到非法位置 // Insert操作时,字符串s中ASCII码在[32,126]范围上的字符一定有n个,其他字符请过滤掉 -// Delete、Get操作执行时光标后有足够的字符,Move、Prev、Next保证光标不会到非法位置 // 测试链接 : https://www.luogu.com.cn/problem/P4008 // 如下实现是正确的,但java的版本无法通过所有测试用例 // 这是洛谷平台没有照顾各种语言的实现所导致的 diff --git a/src/class152/Code03_TextEditor2.java b/src/class152/Code03_TextEditor2.java index 06d22e765..cb3bd74ef 100644 --- a/src/class152/Code03_TextEditor2.java +++ b/src/class152/Code03_TextEditor2.java @@ -1,15 +1,14 @@ package class152; // 文本编辑器,FHQ-Treap实现区间移动,C++版本 -// 一开始文本为空,光标在文本开头,也就是0位置,请实现如下6种操作 -// Move k : 将光标移动到第k个字符之后,如果k=0将光标移到文本开头 +// 一开始文本为空,光标在文本开头,也就是1位置,请实现如下6种操作 +// Move k : 将光标移动到第k个字符之后,操作保证光标不会到非法位置 // Insert n s : 在光标处插入长度为n的字符串s,光标位置不变 -// Delete n : 删除光标后的n个字符,光标位置不变 -// Get n : 输出光标后的n个字符,光标位置不变 -// Prev : 光标前移一个字符 -// Next : 光标后移一个字符 +// Delete n : 删除光标后的n个字符,光标位置不变,操作保证有足够字符 +// Get n : 输出光标后的n个字符,光标位置不变,操作保证有足够字符 +// Prev : 光标前移一个字符,操作保证光标不会到非法位置 +// Next : 光标后移一个字符,操作保证光标不会到非法位置 // Insert操作时,字符串s中ASCII码在[32,126]范围上的字符一定有n个,其他字符请过滤掉 -// Delete、Get操作执行时光标后有足够的字符,Move、Prev、Next保证光标不会到非法位置 // 测试链接 : https://www.luogu.com.cn/problem/P4008 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From 5420d992bb69f60fe6ce85c3356a0950cdc7f195 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 21 Nov 2024 16:10:31 +0800 Subject: [PATCH 0395/2029] modify code --- src/class152/Code06_PersistentLiteraryTree1.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/class152/Code06_PersistentLiteraryTree1.java b/src/class152/Code06_PersistentLiteraryTree1.java index a7cbebc10..374e1dc94 100644 --- a/src/class152/Code06_PersistentLiteraryTree1.java +++ b/src/class152/Code06_PersistentLiteraryTree1.java @@ -135,8 +135,7 @@ public static void main(String[] args) throws IOException { split(0, 0, head[version], x); l = right[0]; r = left[0]; - // 后续可能基于0版本,去生成新版本的树,所以一定要清空,保证0版本始终是空树 - left[0] = right[0] = 0; + left[0] = right[0] = 0; // 保证0版本始终是空树 key[++cnt] = (int) y; size[cnt] = 1; sum[cnt] = y; @@ -149,8 +148,7 @@ public static void main(String[] args) throws IOException { split(0, 0, lm, x - 1); l = right[0]; m = left[0]; - // 后续可能基于0版本,去生成新版本的树,所以一定要清空,保证0版本始终是空树 - left[0] = right[0] = 0; + left[0] = right[0] = 0; // 保证0版本始终是空树 head[i] = merge(l, r); } else if (op == 3) { split(0, 0, head[version], y); @@ -159,8 +157,7 @@ public static void main(String[] args) throws IOException { split(0, 0, lm, x - 1); l = right[0]; m = left[0]; - // 后续可能基于0版本,去生成新版本的树,所以一定要清空,保证0版本始终是空树 - left[0] = right[0] = 0; + left[0] = right[0] = 0; // 保证0版本始终是空树 reverse[m] = !reverse[m]; head[i] = merge(merge(l, m), r); } else { @@ -170,8 +167,7 @@ public static void main(String[] args) throws IOException { split(0, 0, lm, x - 1); l = right[0]; m = left[0]; - // 后续可能基于0版本,去生成新版本的树,所以一定要清空,保证0版本始终是空树 - left[0] = right[0] = 0; + left[0] = right[0] = 0; // 保证0版本始终是空树 lastAns = sum[m]; out.println(lastAns); head[i] = merge(merge(l, m), r); From 67489752fa3c8c94b3718e3045745384a0d59d75 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 21 Nov 2024 21:38:23 +0800 Subject: [PATCH 0396/2029] modify code --- src/class152/Code02_FHQTreapWithoutCount1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class152/Code02_FHQTreapWithoutCount1.java b/src/class152/Code02_FHQTreapWithoutCount1.java index 4fb6e6a44..cc294bbbd 100644 --- a/src/class152/Code02_FHQTreapWithoutCount1.java +++ b/src/class152/Code02_FHQTreapWithoutCount1.java @@ -39,7 +39,7 @@ public class Code02_FHQTreapWithoutCount1 { // 右孩子 public static int[] right = new int[MAXN]; - // 数字总数 + // 节点总数 public static int[] size = new int[MAXN]; // 节点优先级 From 2c8c3a0dda0cd2ead267a6ca7fa821e92a989a52 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 22 Nov 2024 15:52:32 +0800 Subject: [PATCH 0397/2029] modify code --- src/class152/Code05_PersistentFHQTreap1.java | 8 ++++---- src/class152/Code05_PersistentFHQTreap2.java | 8 ++++---- src/class152/Code06_PersistentLiteraryTree1.java | 2 +- src/class152/Code06_PersistentLiteraryTree2.java | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/class152/Code05_PersistentFHQTreap1.java b/src/class152/Code05_PersistentFHQTreap1.java index b4c16be6a..b276873b6 100644 --- a/src/class152/Code05_PersistentFHQTreap1.java +++ b/src/class152/Code05_PersistentFHQTreap1.java @@ -4,10 +4,10 @@ // 认为一开始是0版本的树,为空树,实现如下操作,操作一共发生n次 // v 1 x : 基于v版本的树,增加一个x,生成新版本的树 // v 2 x : 基于v版本的树,删除一个x,生成新版本的树 -// v 3 x : 基于v版本的树,查询x的排名,生成新版本的树=v版本 -// v 4 x : 基于v版本的树,查询数据中排名为x的数,生成新版本的树=v版本 -// v 5 x : 基于v版本的树,查询x的前驱,生成新版本的树=v版本 -// v 6 x : 基于v版本的树,查询x的后继,生成新版本的树=v版本 +// v 3 x : 基于v版本的树,查询x的排名,生成新版本的树状况=v版本状况 +// v 4 x : 基于v版本的树,查询数据中排名为x的数,生成新版本的树状况=v版本状况 +// v 5 x : 基于v版本的树,查询x的前驱,生成新版本的树状况=v版本状况 +// v 6 x : 基于v版本的树,查询x的后继,生成新版本的树状况=v版本状况 // 不管什么操作,都基于某个v版本,操作完成后得到新版本的树,但v版本不会变化 // 如果x的前驱不存在,返回-2^31 + 1,如果x的后继不存在,返回+2^31 - 1 // 1 <= n <= 5 * 10^5 diff --git a/src/class152/Code05_PersistentFHQTreap2.java b/src/class152/Code05_PersistentFHQTreap2.java index 588956c3e..a7772dc58 100644 --- a/src/class152/Code05_PersistentFHQTreap2.java +++ b/src/class152/Code05_PersistentFHQTreap2.java @@ -4,10 +4,10 @@ // 认为一开始是0版本的树,为空树,实现如下操作,操作一共发生n次 // v 1 x : 基于v版本的树,增加一个x,生成新版本的树 // v 2 x : 基于v版本的树,删除一个x,生成新版本的树 -// v 3 x : 基于v版本的树,查询x的排名,生成新版本的树=v版本 -// v 4 x : 基于v版本的树,查询数据中排名为x的数,生成新版本的树=v版本 -// v 5 x : 基于v版本的树,查询x的前驱,生成新版本的树=v版本 -// v 6 x : 基于v版本的树,查询x的后继,生成新版本的树=v版本 +// v 3 x : 基于v版本的树,查询x的排名,生成新版本的树状况=v版本状况 +// v 4 x : 基于v版本的树,查询数据中排名为x的数,生成新版本的树状况=v版本状况 +// v 5 x : 基于v版本的树,查询x的前驱,生成新版本的树状况=v版本状况 +// v 6 x : 基于v版本的树,查询x的后继,生成新版本的树状况=v版本状况 // 不管什么操作,都基于某个v版本,操作完成后得到新版本的树,但v版本不会变化 // 如果x的前驱不存在,返回-2^31 + 1,如果x的后继不存在,返回+2^31 - 1 // 1 <= n <= 5 * 10^5 diff --git a/src/class152/Code06_PersistentLiteraryTree1.java b/src/class152/Code06_PersistentLiteraryTree1.java index 374e1dc94..bc2e0325d 100644 --- a/src/class152/Code06_PersistentLiteraryTree1.java +++ b/src/class152/Code06_PersistentLiteraryTree1.java @@ -5,7 +5,7 @@ // v 1 x y : 基于v版本的序列,在第x个数后插入y,生成新版本的序列 // v 2 x : 基于v版本的序列,删除第x个数,生成新版本的序列 // v 3 x y : 基于v版本的序列,范围[x,y]所有数字翻转,生成新版本的序列 -// v 4 x y : 基于v版本的序列,查询范围[x,y]所有数字的和,生成新版本的序列=v版本 +// v 4 x y : 基于v版本的序列,查询范围[x,y]所有数字的和,生成新版本的序列状况=v版本状况 // 不管什么操作,都基于某个v版本,操作完成后得到新版本的序列,但v版本不会变化 // 每种操作给定的参数都是有效的,插入数字的范围[-10^6, +10^6] // 1 <= n <= 2 * 10^5 diff --git a/src/class152/Code06_PersistentLiteraryTree2.java b/src/class152/Code06_PersistentLiteraryTree2.java index 3ed2ec2fa..8961064ee 100644 --- a/src/class152/Code06_PersistentLiteraryTree2.java +++ b/src/class152/Code06_PersistentLiteraryTree2.java @@ -5,7 +5,7 @@ // v 1 x y : 基于v版本的序列,在第x个数后插入y,生成新版本的序列 // v 2 x : 基于v版本的序列,删除第x个数,生成新版本的序列 // v 3 x y : 基于v版本的序列,范围[x,y]所有数字翻转,生成新版本的序列 -// v 4 x y : 基于v版本的序列,查询范围[x,y]所有数字的和,生成新版本的序列=v版本 +// v 4 x y : 基于v版本的序列,查询范围[x,y]所有数字的和,生成新版本的序列状况=v版本状况 // 不管什么操作,都基于某个v版本,操作完成后得到新版本的序列,但v版本不会变化 // 每种操作给定的参数都是有效的,插入数字的范围[-10^6, +10^6] // 1 <= n <= 2 * 10^5 From b36a3510a1c84377fc65a12f7bf09d35b06a557d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 22 Nov 2024 16:11:59 +0800 Subject: [PATCH 0398/2029] modify code --- src/class152/Code05_PersistentFHQTreap1.java | 22 ++++++++++-------- src/class152/Code05_PersistentFHQTreap2.java | 24 +++++++++++--------- 2 files changed, 25 insertions(+), 21 deletions(-) diff --git a/src/class152/Code05_PersistentFHQTreap1.java b/src/class152/Code05_PersistentFHQTreap1.java index b276873b6..f1ade670a 100644 --- a/src/class152/Code05_PersistentFHQTreap1.java +++ b/src/class152/Code05_PersistentFHQTreap1.java @@ -166,19 +166,21 @@ public static void main(String[] args) { version = in.readInt(); op = in.readInt(); x = in.readInt(); - head[i] = head[version]; if (op == 1) { - add(i, head[i], x); + add(i, head[version], x); } else if (op == 2) { - remove(i, head[i], x); - } else if (op == 3) { - out.println(small(head[i], x) + 1); - } else if (op == 4) { - out.println(index(head[i], x)); - } else if (op == 5) { - out.println(pre(head[i], x)); + remove(i, head[version], x); } else { - out.println(post(head[i], x)); + head[i] = head[version]; + if (op == 3) { + out.println(small(head[i], x) + 1); + } else if (op == 4) { + out.println(index(head[i], x)); + } else if (op == 5) { + out.println(pre(head[i], x)); + } else { + out.println(post(head[i], x)); + } } } out.flush(); diff --git a/src/class152/Code05_PersistentFHQTreap2.java b/src/class152/Code05_PersistentFHQTreap2.java index a7772dc58..7381c13d1 100644 --- a/src/class152/Code05_PersistentFHQTreap2.java +++ b/src/class152/Code05_PersistentFHQTreap2.java @@ -156,19 +156,21 @@ // for (int i = 1; i <= n; ++i) { // int version, op, x; // cin >> version >> op >> x; -// head[i] = head[version]; // if (op == 1) { -// add(i, head[i], x); +// add(i, head[version], x); // } else if (op == 2) { -// remove(i, head[i], x); -// } else if (op == 3) { -// cout << small(head[i], x) + 1 << "\n"; -// } else if (op == 4) { -// cout << index(head[i], x) << "\n"; -// } else if (op == 5) { -// cout << pre(head[i], x) << "\n"; -// } else if (op == 6) { -// cout << post(head[i], x) << "\n"; +// remove(i, head[version], x); +// } else { +// head[i] = head[version]; +// if (op == 3) { +// cout << small(head[i], x) + 1 << "\n"; +// } else if (op == 4) { +// cout << index(head[i], x) << "\n"; +// } else if (op == 5) { +// cout << pre(head[i], x) << "\n"; +// } else { +// cout << post(head[i], x) << "\n"; +// } // } // } // return 0; From a2394832662835703878d4e1a7ffb1015cfd3cfc Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 22 Nov 2024 16:14:22 +0800 Subject: [PATCH 0399/2029] modify code --- src/class152/Code05_PersistentFHQTreap1.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/class152/Code05_PersistentFHQTreap1.java b/src/class152/Code05_PersistentFHQTreap1.java index f1ade670a..f060e7c15 100644 --- a/src/class152/Code05_PersistentFHQTreap1.java +++ b/src/class152/Code05_PersistentFHQTreap1.java @@ -91,6 +91,9 @@ public static int merge(int l, int r) { } } + // v : 新生成的版本编号 + // i : 基于的历史版本,树的头节点编号 + // num : 加入的数字 public static void add(int v, int i, int num) { split(0, 0, i, num); int l = right[0]; @@ -103,6 +106,9 @@ public static void add(int v, int i, int num) { head[v] = merge(merge(l, cnt), r); } + // v : 新生成的版本编号 + // i : 基于的历史版本,树的头节点编号 + // num : 加入的数字 public static void remove(int v, int i, int num) { split(0, 0, i, num); int lm = right[0]; From 91458b13ffc0921b11ff41fd268c4fb4a8070255 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 22 Nov 2024 16:32:12 +0800 Subject: [PATCH 0400/2029] modify code --- src/class152/Code06_PersistentLiteraryTree1.java | 8 ++++---- src/class152/Code06_PersistentLiteraryTree2.java | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/class152/Code06_PersistentLiteraryTree1.java b/src/class152/Code06_PersistentLiteraryTree1.java index bc2e0325d..9f2056a5e 100644 --- a/src/class152/Code06_PersistentLiteraryTree1.java +++ b/src/class152/Code06_PersistentLiteraryTree1.java @@ -24,7 +24,7 @@ public class Code06_PersistentLiteraryTree1 { public static int MAXN = 200001; - public static int MAXM = MAXN * 80; + public static int MAXM = MAXN * 100; public static int cnt = 0; @@ -81,8 +81,8 @@ public static void split(int l, int r, int i, int rank) { if (i == 0) { right[l] = left[r] = 0; } else { - down(i); i = copy(i); + down(i); if (size[left[i]] + 1 <= rank) { right[l] = i; split(i, r, right[i], rank - size[left[i]] - 1); @@ -99,14 +99,14 @@ public static int merge(int l, int r) { return l + r; } if (priority[l] >= priority[r]) { - down(l); l = copy(l); + down(l); right[l] = merge(right[l], r); up(l); return l; } else { - down(r); r = copy(r); + down(r); left[r] = merge(l, left[r]); up(r); return r; diff --git a/src/class152/Code06_PersistentLiteraryTree2.java b/src/class152/Code06_PersistentLiteraryTree2.java index 8961064ee..142051f9b 100644 --- a/src/class152/Code06_PersistentLiteraryTree2.java +++ b/src/class152/Code06_PersistentLiteraryTree2.java @@ -21,7 +21,7 @@ //using namespace std; // //const int MAXN = 200001; -//const int MAXM = MAXN * 80; +//const int MAXM = MAXN * 100; // //int cnt = 0; //int head[MAXN]; @@ -68,8 +68,8 @@ // if (i == 0) { // rs[l] = ls[r] = 0; // } else { -// down(i); // i = copy(i); +// down(i); // if (size[ls[i]] + 1 <= rank) { // rs[l] = i; // split(i, r, rs[i], rank - size[ls[i]] - 1); @@ -86,14 +86,14 @@ // return l + r; // } // if (priority[l] >= priority[r]) { -// down(l); // l = copy(l); +// down(l); // rs[l] = merge(rs[l], r); // up(l); // return l; // } else { -// down(r); // r = copy(r); +// down(r); // ls[r] = merge(l, ls[r]); // up(r); // return r; From 3964d4e958ca696aa356027e945d35d1f352caf1 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 22 Nov 2024 17:16:45 +0800 Subject: [PATCH 0401/2029] modify code --- ...250\344\270\223\351\242\2305-FHQ Treap.pptx" | Bin 0 -> 54362 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "ppt/\347\256\227\346\263\225\350\256\262\350\247\243152\343\200\220\346\211\251\345\261\225\343\200\221\346\234\211\345\272\217\350\241\250\344\270\223\351\242\2305-FHQ Treap.pptx" diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243152\343\200\220\346\211\251\345\261\225\343\200\221\346\234\211\345\272\217\350\241\250\344\270\223\351\242\2305-FHQ Treap.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243152\343\200\220\346\211\251\345\261\225\343\200\221\346\234\211\345\272\217\350\241\250\344\270\223\351\242\2305-FHQ Treap.pptx" new file mode 100644 index 0000000000000000000000000000000000000000..0de3a278288c95610a8f78fe1b351310ec59950a GIT binary patch literal 54362 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 Date: Tue, 26 Nov 2024 13:36:57 +0800 Subject: [PATCH 0402/2029] modify code --- src/class148/{AVL1.java => Code01_AVL1.java} | 2 +- src/class148/{AVL2.java => Code01_AVL2.java} | 12 +- ...e.java => Code02_ReconstructionQueue.java} | 2 +- src/class148/Code03_Followup1.java | 263 ++++++++++++++++++ src/class148/Code03_Followup2.java | 241 ++++++++++++++++ ...owDetails.java => Code01_ShowDetails.java} | 2 +- ...ScapeGoat1.java => Code02_ScapeGoat1.java} | 2 +- ...ScapeGoat2.java => Code02_ScapeGoat2.java} | 2 - src/class150/Code03_Followup1.java | 261 +++++++++++++++++ src/class150/Code03_Followup2.java | 234 ++++++++++++++++ 10 files changed, 1009 insertions(+), 12 deletions(-) rename src/class148/{AVL1.java => Code01_AVL1.java} (99%) rename src/class148/{AVL2.java => Code01_AVL2.java} (96%) rename src/class148/{ReconstructionQueue.java => Code02_ReconstructionQueue.java} (98%) create mode 100644 src/class148/Code03_Followup1.java create mode 100644 src/class148/Code03_Followup2.java rename src/class150/{ShowDetails.java => Code01_ShowDetails.java} (99%) rename src/class150/{ScapeGoat1.java => Code02_ScapeGoat1.java} (99%) rename src/class150/{ScapeGoat2.java => Code02_ScapeGoat2.java} (98%) create mode 100644 src/class150/Code03_Followup1.java create mode 100644 src/class150/Code03_Followup2.java diff --git a/src/class148/AVL1.java b/src/class148/Code01_AVL1.java similarity index 99% rename from src/class148/AVL1.java rename to src/class148/Code01_AVL1.java index c186fc0cc..9e3b64f94 100644 --- a/src/class148/AVL1.java +++ b/src/class148/Code01_AVL1.java @@ -21,7 +21,7 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class AVL1 { +public class Code01_AVL1 { public static int MAXN = 100001; diff --git a/src/class148/AVL2.java b/src/class148/Code01_AVL2.java similarity index 96% rename from src/class148/AVL2.java rename to src/class148/Code01_AVL2.java index 475836d59..9b046a864 100644 --- a/src/class148/AVL2.java +++ b/src/class148/Code01_AVL2.java @@ -159,17 +159,17 @@ // } //} // -//int getIndex(int i, int x) { +//int index(int i, int x) { // if (size[ls[i]] >= x) { -// return getIndex(ls[i], x); +// return index(ls[i], x); // } else if (size[ls[i]] + key_count[i] < x) { -// return getIndex(rs[i], x - size[ls[i]] - key_count[i]); +// return index(rs[i], x - size[ls[i]] - key_count[i]); // } // return key[i]; //} // -//int getIndex(int x) { -// return getIndex(head, x); +//int index(int x) { +// return index(head, x); //} // //int pre(int i, int num) { @@ -225,7 +225,7 @@ // } else if (op == 3) { // cout << getRank(x) << endl; // } else if (op == 4) { -// cout << getIndex(x) << endl; +// cout << index(x) << endl; // } else if (op == 5) { // cout << pre(x) << endl; // } else { diff --git a/src/class148/ReconstructionQueue.java b/src/class148/Code02_ReconstructionQueue.java similarity index 98% rename from src/class148/ReconstructionQueue.java rename to src/class148/Code02_ReconstructionQueue.java index df7a2da78..45917ee8f 100644 --- a/src/class148/ReconstructionQueue.java +++ b/src/class148/Code02_ReconstructionQueue.java @@ -9,7 +9,7 @@ // 返回其中一种排列即可,本题的数据保证一定存在这样的排列 // 题解中的绝大多数方法,时间复杂度O(n平方),但是时间复杂度能做到O(n * log n) // 测试链接 : https://leetcode.cn/problems/queue-reconstruction-by-height/ -public class ReconstructionQueue { +public class Code02_ReconstructionQueue { public static int[][] reconstructQueue(int[][] people) { Arrays.sort(people, (a, b) -> a[0] != b[0] ? (b[0] - a[0]) : (a[1] - b[1])); diff --git a/src/class148/Code03_Followup1.java b/src/class148/Code03_Followup1.java new file mode 100644 index 000000000..69df83e92 --- /dev/null +++ b/src/class148/Code03_Followup1.java @@ -0,0 +1,263 @@ +package class148; + +// AVL实现普通有序表,数据加强的测试,java版 +// 这个文件课上没有讲,测试数据加强了,而且有强制在线的要求 +// 基本功能要求都是不变的,可以打开测试链接查看 +// 测试链接 : https://www.luogu.com.cn/problem/P6136 +// 提交以下的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_Followup1 { + + public static int MAXN = 2000001; + + public static int cnt = 0; + + public static int head = 0; + + public static int[] key = new int[MAXN]; + + public static int[] height = new int[MAXN]; + + public static int[] left = new int[MAXN]; + + public static int[] right = new int[MAXN]; + + public static int[] count = new int[MAXN]; + + public static int[] size = new int[MAXN]; + + public static void up(int i) { + size[i] = size[left[i]] + size[right[i]] + count[i]; + height[i] = Math.max(height[left[i]], height[right[i]]) + 1; + } + + public static int leftRotate(int i) { + int r = right[i]; + right[i] = left[r]; + left[r] = i; + up(i); + up(r); + return r; + } + + public static int rightRotate(int i) { + int l = left[i]; + left[i] = right[l]; + right[l] = i; + up(i); + up(l); + return l; + } + + public static int maintain(int i) { + int lh = height[left[i]]; + int rh = height[right[i]]; + if (lh - rh > 1) { + if (height[left[left[i]]] >= height[right[left[i]]]) { + i = rightRotate(i); + } else { + left[i] = leftRotate(left[i]); + i = rightRotate(i); + } + } else if (rh - lh > 1) { + if (height[right[right[i]]] >= height[left[right[i]]]) { + i = leftRotate(i); + } else { + right[i] = rightRotate(right[i]); + i = leftRotate(i); + } + } + return i; + } + + public static void add(int num) { + head = add(head, num); + } + + public static int add(int i, int num) { + if (i == 0) { + key[++cnt] = num; + count[cnt] = size[cnt] = height[cnt] = 1; + return cnt; + } + if (key[i] == num) { + count[i]++; + } else if (key[i] > num) { + left[i] = add(left[i], num); + } else { + right[i] = add(right[i], num); + } + up(i); + return maintain(i); + } + + public static void remove(int num) { + if (rank(num) != rank(num + 1)) { + head = remove(head, num); + } + } + + public static int remove(int i, int num) { + if (key[i] < num) { + right[i] = remove(right[i], num); + } else if (key[i] > num) { + left[i] = remove(left[i], num); + } else { + if (count[i] > 1) { + count[i]--; + } else { + if (left[i] == 0 && right[i] == 0) { + return 0; + } else if (left[i] != 0 && right[i] == 0) { + i = left[i]; + } else if (left[i] == 0 && right[i] != 0) { + i = right[i]; + } else { + int mostLeft = right[i]; + while (left[mostLeft] != 0) { + mostLeft = left[mostLeft]; + } + right[i] = removeMostLeft(right[i], mostLeft); + left[mostLeft] = left[i]; + right[mostLeft] = right[i]; + i = mostLeft; + } + } + } + up(i); + return maintain(i); + } + + public static int removeMostLeft(int i, int mostLeft) { + if (i == mostLeft) { + return right[i]; + } else { + left[i] = removeMostLeft(left[i], mostLeft); + up(i); + return maintain(i); + } + } + + public static int rank(int num) { + return small(head, num) + 1; + } + + public static int small(int i, int num) { + if (i == 0) { + return 0; + } + if (key[i] >= num) { + return small(left[i], num); + } else { + return size[left[i]] + count[i] + small(right[i], num); + } + } + + public static int index(int x) { + return index(head, x); + } + + public static int index(int i, int x) { + if (size[left[i]] >= x) { + return index(left[i], x); + } else if (size[left[i]] + count[i] < x) { + return index(right[i], x - size[left[i]] - count[i]); + } + return key[i]; + } + + public static int pre(int num) { + return pre(head, num); + } + + public static int pre(int i, int num) { + if (i == 0) { + return Integer.MIN_VALUE; + } + if (key[i] >= num) { + return pre(left[i], num); + } else { + return Math.max(key[i], pre(right[i], num)); + } + } + + public static int post(int num) { + return post(head, num); + } + + public static int post(int i, int num) { + if (i == 0) { + return Integer.MAX_VALUE; + } + if (key[i] <= num) { + return post(right[i], num); + } else { + return Math.min(key[i], post(left[i], num)); + } + } + + public static void clear() { + Arrays.fill(key, 1, cnt + 1, 0); + Arrays.fill(height, 1, cnt + 1, 0); + Arrays.fill(left, 1, cnt + 1, 0); + Arrays.fill(right, 1, cnt + 1, 0); + Arrays.fill(count, 1, cnt + 1, 0); + Arrays.fill(size, 1, cnt + 1, 0); + cnt = 0; + head = 0; + } + + 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(); + int n = (int) in.nval; + in.nextToken(); + int m = (int) in.nval; + for (int i = 1, num; i <= n; i++) { + in.nextToken(); + num = (int) in.nval; + add(num); + } + int lastAns = 0; + int ans = 0; + for (int i = 1, op, x; i <= m; i++) { + in.nextToken(); + op = (int) in.nval; + in.nextToken(); + x = (int) in.nval ^ lastAns; + if (op == 1) { + add(x); + } else if (op == 2) { + remove(x); + } else if (op == 3) { + lastAns = rank(x); + ans ^= lastAns; + } else if (op == 4) { + lastAns = index(x); + ans ^= lastAns; + } else if (op == 5) { + lastAns = pre(x); + ans ^= lastAns; + } else { + lastAns = post(x); + ans ^= lastAns; + } + } + out.println(ans); + clear(); + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class148/Code03_Followup2.java b/src/class148/Code03_Followup2.java new file mode 100644 index 000000000..ac3848565 --- /dev/null +++ b/src/class148/Code03_Followup2.java @@ -0,0 +1,241 @@ +package class148; + +// AVL实现普通有序表,数据加强的测试,C++版 +// 这个文件课上没有讲,测试数据加强了,而且有强制在线的要求 +// 基本功能要求都是不变的,可以打开测试链接查看 +// 测试链接 : https://www.luogu.com.cn/problem/P6136 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +//#include +//#include +//#include +// +//using namespace std; +// +//const int MAXN = 2000001; +// +//int cnt = 0; +//int head = 0; +//int key[MAXN]; +//int height[MAXN]; +//int ls[MAXN]; +//int rs[MAXN]; +//int key_count[MAXN]; +//int size[MAXN]; +// +//void up(int i) { +// size[i] = size[ls[i]] + size[rs[i]] + key_count[i]; +// height[i] = max(height[ls[i]], height[rs[i]]) + 1; +//} +// +//int leftRotate(int i) { +// int r = rs[i]; +// rs[i] = ls[r]; +// ls[r] = i; +// up(i); +// up(r); +// return r; +//} +// +//int rightRotate(int i) { +// int l = ls[i]; +// ls[i] = rs[l]; +// rs[l] = i; +// up(i); +// up(l); +// return l; +//} +// +//int maintain(int i) { +// int lh = height[ls[i]]; +// int rh = height[rs[i]]; +// if (lh - rh > 1) { +// if (height[ls[ls[i]]] >= height[rs[ls[i]]]) { +// i = rightRotate(i); +// } else { +// ls[i] = leftRotate(ls[i]); +// i = rightRotate(i); +// } +// } else if (rh - lh > 1) { +// if (height[rs[rs[i]]] >= height[ls[rs[i]]]) { +// i = leftRotate(i); +// } else { +// rs[i] = rightRotate(rs[i]); +// i = leftRotate(i); +// } +// } +// return i; +//} +// +//int add(int i, int num) { +// if (i == 0) { +// key[++cnt] = num; +// key_count[cnt] = size[cnt] = height[cnt] = 1; +// return cnt; +// } +// if (key[i] == num) { +// key_count[i]++; +// } else if (key[i] > num) { +// ls[i] = add(ls[i], num); +// } else { +// rs[i] = add(rs[i], num); +// } +// up(i); +// return maintain(i); +//} +// +//void add(int num) { +// head = add(head, num); +//} +// +//int getRank(int i, int num) { +// if (i == 0) { +// return 0; +// } +// if (key[i] >= num) { +// return getRank(ls[i], num); +// } else { +// return size[ls[i]] + key_count[i] + getRank(rs[i], num); +// } +//} +// +//int getRank(int num) { +// return getRank(head, num) + 1; +//} +// +//int removeMostLeft(int i, int mostLeft) { +// if (i == mostLeft) { +// return rs[i]; +// } else { +// ls[i] = removeMostLeft(ls[i], mostLeft); +// up(i); +// return maintain(i); +// } +//} +// +//int remove(int i, int num) { +// if (key[i] < num) { +// rs[i] = remove(rs[i], num); +// } else if (key[i] > num) { +// ls[i] = remove(ls[i], num); +// } else { +// if (key_count[i] > 1) { +// key_count[i]--; +// } else { +// if (ls[i] == 0 && rs[i] == 0) { +// return 0; +// } else if (ls[i] != 0 && rs[i] == 0) { +// i = ls[i]; +// } else if (ls[i] == 0 && rs[i] != 0) { +// i = rs[i]; +// } else { +// int mostLeft = rs[i]; +// while (ls[mostLeft] != 0) { +// mostLeft = ls[mostLeft]; +// } +// rs[i] = removeMostLeft(rs[i], mostLeft); +// ls[mostLeft] = ls[i]; +// rs[mostLeft] = rs[i]; +// i = mostLeft; +// } +// } +// } +// up(i); +// return maintain(i); +//} +// +//void remove(int num) { +// if (getRank(num) != getRank(num + 1)) { +// head = remove(head, num); +// } +//} +// +//int index(int i, int x) { +// if (size[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]); +// } +// return key[i]; +//} +// +//int index(int x) { +// return index(head, x); +//} +// +//int pre(int i, int num) { +// if (i == 0) { +// return INT_MIN; +// } +// if (key[i] >= num) { +// return pre(ls[i], num); +// } else { +// return max(key[i], pre(rs[i], num)); +// } +//} +// +//int pre(int num) { +// return pre(head, num); +//} +// +//int post(int i, int num) { +// if (i == 0) { +// return INT_MAX; +// } +// if (key[i] <= num) { +// return post(rs[i], num); +// } else { +// return min(key[i], post(ls[i], num)); +// } +//} +// +//int post(int num) { +// return post(head, num); +//} +// +//void clear() { +// memset(key + 1, 0, cnt * sizeof(int)); +// memset(height + 1, 0, cnt * sizeof(int)); +// 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)); +// cnt = 0; +// head = 0; +//} +// +//int main() { +// int n, m, lastAns = 0, ans = 0; +// cin >> n; +// cin >> m; +// for (int i = 1, num; i <= n; i++) { +// cin >> num; +// add(num); +// } +// for (int i = 1, op, x; i <= m; i++) { +// cin >> op >> x; +// x ^= lastAns; +// if (op == 1) { +// add(x); +// } else if (op == 2) { +// remove(x); +// } else if (op == 3) { +// lastAns = getRank(x); +// ans ^= lastAns; +// } else if (op == 4) { +// lastAns = index(x); +// ans ^= lastAns; +// } else if (op == 5) { +// lastAns = pre(x); +// ans ^= lastAns; +// } else { +// lastAns = post(x); +// ans ^= lastAns; +// } +// } +// cout << ans << endl; +// clear(); +// return 0; +//} \ No newline at end of file diff --git a/src/class150/ShowDetails.java b/src/class150/Code01_ShowDetails.java similarity index 99% rename from src/class150/ShowDetails.java rename to src/class150/Code01_ShowDetails.java index 546b884a2..fd049538e 100644 --- a/src/class150/ShowDetails.java +++ b/src/class150/Code01_ShowDetails.java @@ -11,7 +11,7 @@ import java.util.Arrays; -public class ShowDetails { +public class Code01_ShowDetails { public static void main(String[] args) { ALPHA = 0.7; // 设置平衡因子 diff --git a/src/class150/ScapeGoat1.java b/src/class150/Code02_ScapeGoat1.java similarity index 99% rename from src/class150/ScapeGoat1.java rename to src/class150/Code02_ScapeGoat1.java index e69f3bec3..f4d4712da 100644 --- a/src/class150/ScapeGoat1.java +++ b/src/class150/Code02_ScapeGoat1.java @@ -21,7 +21,7 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class ScapeGoat1 { +public class Code02_ScapeGoat1 { // 平衡因子 public static double ALPHA = 0.7; diff --git a/src/class150/ScapeGoat2.java b/src/class150/Code02_ScapeGoat2.java similarity index 98% rename from src/class150/ScapeGoat2.java rename to src/class150/Code02_ScapeGoat2.java index 16bfe5f75..73f0ed757 100644 --- a/src/class150/ScapeGoat2.java +++ b/src/class150/Code02_ScapeGoat2.java @@ -207,8 +207,6 @@ //} // //int main() { -// ios::sync_with_stdio(false); -// cin.tie(nullptr); // int n; // cin >> n; // for (int i = 1; i <= n; i++) { diff --git a/src/class150/Code03_Followup1.java b/src/class150/Code03_Followup1.java new file mode 100644 index 000000000..f002f71f5 --- /dev/null +++ b/src/class150/Code03_Followup1.java @@ -0,0 +1,261 @@ +package class150; + +// 替罪羊树实现普通有序表,数据加强的测试,java版 +// 这个文件课上没有讲,测试数据加强了,而且有强制在线的要求 +// 基本功能要求都是不变的,可以打开测试链接查看 +// 测试链接 : https://www.luogu.com.cn/problem/P6136 +// 提交以下的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_Followup1 { + + public static double ALPHA = 0.7; + + public static int MAXN = 2000001; + + public static int head = 0; + + public static int cnt = 0; + + public static int[] key = new int[MAXN]; + + public static int[] count = new int[MAXN]; + + public static int[] left = new int[MAXN]; + + public static int[] right = new int[MAXN]; + + public static int[] size = new int[MAXN]; + + public static int[] diff = new int[MAXN]; + + public static int[] collect = new int[MAXN]; + + public static int ci; + + public static int top; + + public static int father; + + public static int side; + + public static int init(int num) { + key[++cnt] = num; + left[cnt] = right[cnt] = 0; + count[cnt] = size[cnt] = diff[cnt] = 1; + return cnt; + } + + public static void up(int i) { + size[i] = size[left[i]] + size[right[i]] + count[i]; + diff[i] = diff[left[i]] + diff[right[i]] + (count[i] > 0 ? 1 : 0); + } + + public static void inorder(int i) { + if (i != 0) { + inorder(left[i]); + if (count[i] > 0) { + collect[++ci] = i; + } + inorder(right[i]); + } + } + + public static int build(int l, int r) { + if (l > r) { + return 0; + } + int m = (l + r) / 2; + int h = collect[m]; + left[h] = build(l, m - 1); + right[h] = build(m + 1, r); + up(h); + return h; + } + + public static void rebuild() { + if (top != 0) { + ci = 0; + inorder(top); + if (ci > 0) { + if (father == 0) { + head = build(1, ci); + } else if (side == 1) { + left[father] = build(1, ci); + } else { + right[father] = build(1, ci); + } + } + } + } + + public static boolean balance(int i) { + return ALPHA * diff[i] >= Math.max(diff[left[i]], diff[right[i]]); + } + + public static void add(int i, int f, int s, int num) { + if (i == 0) { + if (f == 0) { + head = init(num); + } else if (s == 1) { + left[f] = init(num); + } else { + right[f] = init(num); + } + } else { + if (key[i] == num) { + count[i]++; + } else if (key[i] > num) { + add(left[i], i, 1, num); + } else { + add(right[i], i, 2, num); + } + up(i); + if (!balance(i)) { + top = i; + father = f; + side = s; + } + } + } + + public static void add(int num) { + top = father = side = 0; + add(head, 0, 0, num); + rebuild(); + } + + public static int small(int i, int num) { + if (i == 0) { + return 0; + } + if (key[i] >= num) { + return small(left[i], num); + } else { + return size[left[i]] + count[i] + small(right[i], num); + } + } + + public static int rank(int num) { + return small(head, num) + 1; + } + + public static int index(int i, int x) { + if (size[left[i]] >= x) { + return index(left[i], x); + } else if (size[left[i]] + count[i] < x) { + return index(right[i], x - size[left[i]] - count[i]); + } + return key[i]; + } + + public static int index(int x) { + return index(head, x); + } + + public static int pre(int num) { + int kth = rank(num); + if (kth == 1) { + return Integer.MIN_VALUE; + } else { + return index(kth - 1); + } + } + + public static int post(int num) { + int kth = rank(num + 1); + if (kth == size[head] + 1) { + return Integer.MAX_VALUE; + } else { + return index(kth); + } + } + + public static void remove(int i, int f, int s, int num) { + if (key[i] == num) { + count[i]--; + } else if (key[i] > num) { + remove(left[i], i, 1, num); + } else { + remove(right[i], i, 2, num); + } + up(i); + if (!balance(i)) { + top = i; + father = f; + side = s; + } + } + + public static void remove(int num) { + if (rank(num) != rank(num + 1)) { + top = father = side = 0; + remove(head, 0, 0, num); + rebuild(); + } + } + + public static void clear() { + Arrays.fill(key, 1, cnt + 1, 0); + Arrays.fill(count, 1, cnt + 1, 0); + Arrays.fill(left, 1, cnt + 1, 0); + Arrays.fill(right, 1, cnt + 1, 0); + Arrays.fill(size, 1, cnt + 1, 0); + Arrays.fill(diff, 1, cnt + 1, 0); + cnt = 0; + head = 0; + } + + 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(); + int n = (int) in.nval; + in.nextToken(); + int m = (int) in.nval; + for (int i = 1, num; i <= n; i++) { + in.nextToken(); + num = (int) in.nval; + add(num); + } + int lastAns = 0; + int ans = 0; + for (int i = 1, op, x; i <= m; i++) { + in.nextToken(); + op = (int) in.nval; + in.nextToken(); + x = (int) in.nval ^ lastAns; + if (op == 1) { + add(x); + } else if (op == 2) { + remove(x); + } else if (op == 3) { + lastAns = rank(x); + ans ^= lastAns; + } else if (op == 4) { + lastAns = index(x); + ans ^= lastAns; + } else if (op == 5) { + lastAns = pre(x); + ans ^= lastAns; + } else { + lastAns = post(x); + ans ^= lastAns; + } + } + out.println(ans); + clear(); + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class150/Code03_Followup2.java b/src/class150/Code03_Followup2.java new file mode 100644 index 000000000..9f6ade08e --- /dev/null +++ b/src/class150/Code03_Followup2.java @@ -0,0 +1,234 @@ +package class150; + +// 替罪羊树实现普通有序表,数据加强的测试,C++版 +// 这个文件课上没有讲,测试数据加强了,而且有强制在线的要求 +// 基本功能要求都是不变的,可以打开测试链接查看 +// 测试链接 : https://www.luogu.com.cn/problem/P6136 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +//#include +//#include +//#include +//#include +//#include +// +//using namespace std; +// +//const double ALPHA = 0.7; +//const int MAXN = 2000001; +//int head = 0; +//int cnt = 0; +//int key[MAXN]; +//int key_count[MAXN]; +//int ls[MAXN]; +//int rs[MAXN]; +//int size[MAXN]; +//int diff[MAXN]; +//int collect[MAXN]; +//int ci; +//int top; +//int father; +//int side; +// +//int init(int num) { +// key[++cnt] = num; +// ls[cnt] = rs[cnt] = 0; +// key_count[cnt] = size[cnt] = diff[cnt] = 1; +// return cnt; +//} +// +//void up(int i) { +// size[i] = size[ls[i]] + size[rs[i]] + key_count[i]; +// diff[i] = diff[ls[i]] + diff[rs[i]] + (key_count[i] > 0 ? 1 : 0); +//} +// +//void inorder(int i) { +// if (i != 0) { +// inorder(ls[i]); +// if (key_count[i] > 0) { +// collect[++ci] = i; +// } +// inorder(rs[i]); +// } +//} +// +//int build(int l, int r) { +// if (l > r) { +// return 0; +// } +// int m = (l + r) / 2; +// int h = collect[m]; +// ls[h] = build(l, m - 1); +// rs[h] = build(m + 1, r); +// up(h); +// return h; +//} +// +//void rebuild() { +// if (top != 0) { +// ci = 0; +// inorder(top); +// if (ci > 0) { +// if (father == 0) { +// head = build(1, ci); +// } else if (side == 1) { +// ls[father] = build(1, ci); +// } else { +// rs[father] = build(1, ci); +// } +// } +// } +//} +// +//bool balance(int i) { +// return ALPHA * diff[i] >= max(diff[ls[i]], diff[rs[i]]); +//} +// +//void add(int i, int f, int s, int num) { +// if (i == 0) { +// if (f == 0) { +// head = init(num); +// } else if (s == 1) { +// ls[f] = init(num); +// } else { +// rs[f] = init(num); +// } +// } else { +// if (key[i] == num) { +// key_count[i]++; +// } else if (key[i] > num) { +// add(ls[i], i, 1, num); +// } else { +// add(rs[i], i, 2, num); +// } +// up(i); +// if (!balance(i)) { +// top = i; +// father = f; +// side = s; +// } +// } +//} +// +//void add(int num) { +// top = father = side = 0; +// add(head, 0, 0, num); +// rebuild(); +//} +// +//int small(int i, int num) { +// if (i == 0) { +// return 0; +// } +// if (key[i] >= num) { +// return small(ls[i], num); +// } else { +// return size[ls[i]] + key_count[i] + small(rs[i], num); +// } +//} +// +//int getRank(int num) { +// return small(head, num) + 1; +//} +// +//int index(int i, int x) { +// if (size[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]); +// } +// return key[i]; +//} +// +//int index(int x) { +// return index(head, x); +//} +// +//int pre(int num) { +// int kth = getRank(num); +// if (kth == 1) { +// return INT_MIN; +// } else { +// return index(kth - 1); +// } +//} +// +//int post(int num) { +// int kth = getRank(num + 1); +// if (kth == size[head] + 1) { +// return INT_MAX; +// } else { +// return index(kth); +// } +//} +// +//void remove(int i, int f, int s, int num) { +// if (key[i] == num) { +// key_count[i]--; +// } else if (key[i] > num) { +// remove(ls[i], i, 1, num); +// } else { +// remove(rs[i], i, 2, num); +// } +// up(i); +// if (!balance(i)) { +// top = i; +// father = f; +// side = s; +// } +//} +// +//void remove(int num) { +// if (getRank(num) != getRank(num + 1)) { +// top = father = side = 0; +// remove(head, 0, 0, num); +// rebuild(); +// } +//} +// +//void clear() { +// memset(key, 0, sizeof(key)); +// memset(key_count, 0, sizeof(key_count)); +// memset(ls, 0, sizeof(ls)); +// memset(rs, 0, sizeof(rs)); +// memset(size, 0, sizeof(size)); +// memset(diff, 0, sizeof(diff)); +// cnt = 0; +// head = 0; +//} +// +//int main() { +// int n, m, lastAns = 0, ans = 0; +// cin >> n; +// cin >> m; +// for (int i = 1, num; i <= n; i++) { +// cin >> num; +// add(num); +// } +// for (int i = 1, op, x; i <= m; i++) { +// cin >> op >> x; +// x ^= lastAns; +// if (op == 1) { +// add(x); +// } else if (op == 2) { +// remove(x); +// } else if (op == 3) { +// lastAns = getRank(x); +// ans ^= lastAns; +// } else if (op == 4) { +// lastAns = index(x); +// ans ^= lastAns; +// } else if (op == 5) { +// lastAns = pre(x); +// ans ^= lastAns; +// } else { +// lastAns = post(x); +// ans ^= lastAns; +// } +// } +// cout << ans << endl; +// clear(); +// return 0; +//} \ No newline at end of file From 2bef8f7981b66776b2b69607e15de5a1c510a06d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 26 Nov 2024 13:54:28 +0800 Subject: [PATCH 0403/2029] modify code --- .../{Code03_Followup1.java => FollowUp1.java} | 2 +- .../{Code03_Followup2.java => FollowUp2.java} | 0 .../{Code03_Followup1.java => FollowUp1.java} | 2 +- .../{Code03_Followup2.java => FollowUp2.java} | 0 src/class151/Code02_Treap2.java | 12 +- src/class151/FollowUp1.java | 237 ++++++++++++++++++ src/class151/FollowUp2.java | 217 ++++++++++++++++ 7 files changed, 462 insertions(+), 8 deletions(-) rename src/class148/{Code03_Followup1.java => FollowUp1.java} (99%) rename src/class148/{Code03_Followup2.java => FollowUp2.java} (100%) rename src/class150/{Code03_Followup1.java => FollowUp1.java} (99%) rename src/class150/{Code03_Followup2.java => FollowUp2.java} (100%) create mode 100644 src/class151/FollowUp1.java create mode 100644 src/class151/FollowUp2.java diff --git a/src/class148/Code03_Followup1.java b/src/class148/FollowUp1.java similarity index 99% rename from src/class148/Code03_Followup1.java rename to src/class148/FollowUp1.java index 69df83e92..4ab38ccfa 100644 --- a/src/class148/Code03_Followup1.java +++ b/src/class148/FollowUp1.java @@ -14,7 +14,7 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class Code03_Followup1 { +public class FollowUp1 { public static int MAXN = 2000001; diff --git a/src/class148/Code03_Followup2.java b/src/class148/FollowUp2.java similarity index 100% rename from src/class148/Code03_Followup2.java rename to src/class148/FollowUp2.java diff --git a/src/class150/Code03_Followup1.java b/src/class150/FollowUp1.java similarity index 99% rename from src/class150/Code03_Followup1.java rename to src/class150/FollowUp1.java index f002f71f5..3a74f0472 100644 --- a/src/class150/Code03_Followup1.java +++ b/src/class150/FollowUp1.java @@ -14,7 +14,7 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class Code03_Followup1 { +public class FollowUp1 { public static double ALPHA = 0.7; diff --git a/src/class150/Code03_Followup2.java b/src/class150/FollowUp2.java similarity index 100% rename from src/class150/Code03_Followup2.java rename to src/class150/FollowUp2.java diff --git a/src/class151/Code02_Treap2.java b/src/class151/Code02_Treap2.java index 748ea7bcf..118eb1c71 100644 --- a/src/class151/Code02_Treap2.java +++ b/src/class151/Code02_Treap2.java @@ -98,17 +98,17 @@ // return small(head, num) + 1; //} // -//int getIndex(int i, int x) { +//int index(int i, int x) { // if (size[ls[i]] >= x) { -// return getIndex(ls[i], x); +// return index(ls[i], x); // } else if (size[ls[i]] + key_count[i] < x) { -// return getIndex(rs[i], x - size[ls[i]] - key_count[i]); +// return index(rs[i], x - size[ls[i]] - key_count[i]); // } // return key[i]; //} // -//int getIndex(int x) { -// return getIndex(head, x); +//int index(int x) { +// return index(head, x); //} // //int pre(int i, int num) { @@ -201,7 +201,7 @@ // } else if (op == 3) { // cout << getRank(x) << endl; // } else if (op == 4) { -// cout << getIndex(x) << endl; +// cout << index(x) << endl; // } else if (op == 5) { // cout << pre(x) << endl; // } else { diff --git a/src/class151/FollowUp1.java b/src/class151/FollowUp1.java new file mode 100644 index 000000000..d8ef068b2 --- /dev/null +++ b/src/class151/FollowUp1.java @@ -0,0 +1,237 @@ +package class151; + +// Treap树实现普通有序表,数据加强的测试,java版 +// 这个文件课上没有讲,测试数据加强了,而且有强制在线的要求 +// 基本功能要求都是不变的,可以打开测试链接查看 +// 测试链接 : https://www.luogu.com.cn/problem/P6136 +// 提交以下的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 FollowUp1 { + + public static int MAXN = 2000001; + + public static int head = 0; + + public static int cnt = 0; + + public static int[] key = new int[MAXN]; + + public static int[] count = new int[MAXN]; + + public static int[] left = new int[MAXN]; + + public static int[] right = new int[MAXN]; + + public static int[] size = new int[MAXN]; + + public static double[] priority = new double[MAXN]; + + public static void up(int i) { + size[i] = size[left[i]] + size[right[i]] + count[i]; + } + + public static int leftRotate(int i) { + int r = right[i]; + right[i] = left[r]; + left[r] = i; + up(i); + up(r); + return r; + } + + public static int rightRotate(int i) { + int l = left[i]; + left[i] = right[l]; + right[l] = i; + up(i); + up(l); + return l; + } + + public static int add(int i, int num) { + if (i == 0) { + key[++cnt] = num; + count[cnt] = size[cnt] = 1; + priority[cnt] = Math.random(); + return cnt; + } + if (key[i] == num) { + count[i]++; + } else if (key[i] > num) { + left[i] = add(left[i], num); + } else { + right[i] = add(right[i], num); + } + up(i); + if (left[i] != 0 && priority[left[i]] > priority[i]) { + return rightRotate(i); + } + if (right[i] != 0 && priority[right[i]] > priority[i]) { + return leftRotate(i); + } + return i; + } + + public static void add(int num) { + head = add(head, num); + } + + public static int small(int i, int num) { + if (i == 0) { + return 0; + } + if (key[i] >= num) { + return small(left[i], num); + } else { + return size[left[i]] + count[i] + small(right[i], num); + } + } + + public static int rank(int num) { + return small(head, num) + 1; + } + + public static int index(int i, int x) { + if (size[left[i]] >= x) { + return index(left[i], x); + } else if (size[left[i]] + count[i] < x) { + return index(right[i], x - size[left[i]] - count[i]); + } + return key[i]; + } + + public static int index(int x) { + return index(head, x); + } + + public static int pre(int i, int num) { + if (i == 0) { + return Integer.MIN_VALUE; + } + if (key[i] >= num) { + return pre(left[i], num); + } else { + return Math.max(key[i], pre(right[i], num)); + } + } + + public static int pre(int num) { + return pre(head, num); + } + + public static int post(int i, int num) { + if (i == 0) { + return Integer.MAX_VALUE; + } + if (key[i] <= num) { + return post(right[i], num); + } else { + return Math.min(key[i], post(left[i], num)); + } + } + + public static int post(int num) { + return post(head, num); + } + + public static int remove(int i, int num) { + if (key[i] < num) { + right[i] = remove(right[i], num); + } else if (key[i] > num) { + left[i] = remove(left[i], num); + } else { + if (count[i] > 1) { + count[i]--; + } else { + if (left[i] == 0 && right[i] == 0) { + return 0; + } else if (left[i] != 0 && right[i] == 0) { + i = left[i]; + } else if (left[i] == 0 && right[i] != 0) { + i = right[i]; + } else { + if (priority[left[i]] >= priority[right[i]]) { + i = rightRotate(i); + right[i] = remove(right[i], num); + } else { + i = leftRotate(i); + left[i] = remove(left[i], num); + } + } + } + } + up(i); + return i; + } + + public static void remove(int num) { + if (rank(num) != rank(num + 1)) { + head = remove(head, num); + } + } + + public static void clear() { + Arrays.fill(key, 1, cnt + 1, 0); + Arrays.fill(count, 1, cnt + 1, 0); + Arrays.fill(left, 1, cnt + 1, 0); + Arrays.fill(right, 1, cnt + 1, 0); + Arrays.fill(size, 1, cnt + 1, 0); + Arrays.fill(priority, 1, cnt + 1, 0); + cnt = 0; + head = 0; + } + + 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(); + int n = (int) in.nval; + in.nextToken(); + int m = (int) in.nval; + for (int i = 1, num; i <= n; i++) { + in.nextToken(); + num = (int) in.nval; + add(num); + } + int lastAns = 0; + int ans = 0; + for (int i = 1, op, x; i <= m; i++) { + in.nextToken(); + op = (int) in.nval; + in.nextToken(); + x = (int) in.nval ^ lastAns; + if (op == 1) { + add(x); + } else if (op == 2) { + remove(x); + } else if (op == 3) { + lastAns = rank(x); + ans ^= lastAns; + } else if (op == 4) { + lastAns = index(x); + ans ^= lastAns; + } else if (op == 5) { + lastAns = pre(x); + ans ^= lastAns; + } else { + lastAns = post(x); + ans ^= lastAns; + } + } + out.println(ans); + clear(); + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class151/FollowUp2.java b/src/class151/FollowUp2.java new file mode 100644 index 000000000..b7c79d79f --- /dev/null +++ b/src/class151/FollowUp2.java @@ -0,0 +1,217 @@ +package class151; + +// Treap树实现普通有序表,数据加强的测试,C++版 +// 这个文件课上没有讲,测试数据加强了,而且有强制在线的要求 +// 基本功能要求都是不变的,可以打开测试链接查看 +// 测试链接 : https://www.luogu.com.cn/problem/P6136 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +//#include +//#include +//#include +//#include +// +//using namespace std; +// +//const int MAXN = 2000001; +// +//int cnt = 0; +//int head = 0; +//int key[MAXN]; +//int key_count[MAXN]; +//int ls[MAXN]; +//int rs[MAXN]; +//int size[MAXN]; +//double priority[MAXN]; +// +//void up(int i) { +// size[i] = size[ls[i]] + size[rs[i]] + key_count[i]; +//} +// +//int leftRotate(int i) { +// int r = rs[i]; +// rs[i] = ls[r]; +// ls[r] = i; +// up(i); +// up(r); +// return r; +//} +// +//int rightRotate(int i) { +// int l = ls[i]; +// ls[i] = rs[l]; +// rs[l] = i; +// up(i); +// up(l); +// return l; +//} +// +//int add(int i, int num) { +// if (i == 0) { +// key[++cnt] = num; +// key_count[cnt] = size[cnt] = 1; +// priority[cnt] = static_cast(rand()) / RAND_MAX; +// return cnt; +// } +// if (key[i] == num) { +// key_count[i]++; +// } else if (key[i] > num) { +// ls[i] = add(ls[i], num); +// } else { +// rs[i] = add(rs[i], num); +// } +// up(i); +// if (ls[i] != 0 && priority[ls[i]] > priority[i]) { +// return rightRotate(i); +// } +// if (rs[i] != 0 && priority[rs[i]] > priority[i]) { +// return leftRotate(i); +// } +// return i; +//} +// +//void add(int num) { +// head = add(head, num); +//} +// +//int small(int i, int num) { +// if (i == 0) { +// return 0; +// } +// if (key[i] >= num) { +// return small(ls[i], num); +// } else { +// return size[ls[i]] + key_count[i] + small(rs[i], num); +// } +//} +// +//int getRank(int num) { +// return small(head, num) + 1; +//} +// +//int index(int i, int x) { +// if (size[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]); +// } +// return key[i]; +//} +// +//int index(int x) { +// return index(head, x); +//} +// +//int pre(int i, int num) { +// if (i == 0) { +// return INT_MIN; +// } +// if (key[i] >= num) { +// return pre(ls[i], num); +// } else { +// return max(key[i], pre(rs[i], num)); +// } +//} +// +//int pre(int num) { +// return pre(head, num); +//} +// +//int post(int i, int num) { +// if (i == 0) { +// return INT_MAX; +// } +// if (key[i] <= num) { +// return post(rs[i], num); +// } else { +// return min(key[i], post(ls[i], num)); +// } +//} +// +//int post(int num) { +// return post(head, num); +//} +// +//int remove(int i, int num) { +// if (key[i] < num) { +// rs[i] = remove(rs[i], num); +// } else if (key[i] > num) { +// ls[i] = remove(ls[i], num); +// } else { +// if (key_count[i] > 1) { +// key_count[i]--; +// } else { +// if (ls[i] == 0 && rs[i] == 0) { +// return 0; +// } else if (ls[i] != 0 && rs[i] == 0) { +// i = ls[i]; +// } else if (ls[i] == 0 && rs[i] != 0) { +// i = rs[i]; +// } else { +// if (priority[ls[i]] >= priority[rs[i]]) { +// i = rightRotate(i); +// rs[i] = remove(rs[i], num); +// } else { +// i = leftRotate(i); +// ls[i] = remove(ls[i], num); +// } +// } +// } +// } +// up(i); +// return i; +//} +// +//void remove(int num) { +// if (getRank(num) != getRank(num + 1)) { +// head = remove(head, num); +// } +//} +// +//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(size + 1, size + cnt + 1, 0); +// fill(priority + 1, priority + cnt + 1, 0); +// cnt = 0; +// head = 0; +//} +// +//int main() { +// srand(time(0)); +// int n, m, lastAns = 0, ans = 0; +// cin >> n; +// cin >> m; +// for (int i = 1, num; i <= n; i++) { +// cin >> num; +// add(num); +// } +// for (int i = 1, op, x; i <= m; i++) { +// cin >> op >> x; +// x ^= lastAns; +// if (op == 1) { +// add(x); +// } else if (op == 2) { +// remove(x); +// } else if (op == 3) { +// lastAns = getRank(x); +// ans ^= lastAns; +// } else if (op == 4) { +// lastAns = index(x); +// ans ^= lastAns; +// } else if (op == 5) { +// lastAns = pre(x); +// ans ^= lastAns; +// } else { +// lastAns = post(x); +// ans ^= lastAns; +// } +// } +// cout << ans << endl; +// clear(); +// return 0; +//} \ No newline at end of file From eadf27ab941a08a5d49cc344239d7be45fe4f3a9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 26 Nov 2024 14:02:17 +0800 Subject: [PATCH 0404/2029] modify code --- src/class152/FollowUp1.java | 181 ++++++++++++++++++++++++++++++++++++ src/class152/FollowUp2.java | 162 ++++++++++++++++++++++++++++++++ 2 files changed, 343 insertions(+) create mode 100644 src/class152/FollowUp1.java create mode 100644 src/class152/FollowUp2.java diff --git a/src/class152/FollowUp1.java b/src/class152/FollowUp1.java new file mode 100644 index 000000000..2b3f5818b --- /dev/null +++ b/src/class152/FollowUp1.java @@ -0,0 +1,181 @@ +package class152; + +// FHQ-Treap实现普通有序表,不用词频压缩,数据加强的测试,java版 +// 这个文件课上没有讲,测试数据加强了,而且有强制在线的要求 +// 基本功能要求都是不变的,可以打开测试链接查看 +// 测试链接 : https://www.luogu.com.cn/problem/P6136 +// 提交以下的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 FollowUp1 { + + public static int MAXN = 2000001; + + public static int head = 0; + + public static int cnt = 0; + + public static int[] key = new int[MAXN]; + + public static int[] left = new int[MAXN]; + + public static int[] right = new int[MAXN]; + + public static int[] size = new int[MAXN]; + + public static double[] priority = new double[MAXN]; + + public static void up(int i) { + size[i] = size[left[i]] + size[right[i]] + 1; + } + + public static void split(int l, int r, int i, int num) { + if (i == 0) { + right[l] = left[r] = 0; + } else { + if (key[i] <= num) { + right[l] = i; + split(i, r, right[i], num); + } else { + left[r] = i; + split(l, i, left[i], num); + } + up(i); + } + } + + public static int merge(int l, int r) { + if (l == 0 || r == 0) { + return l + r; + } + if (priority[l] >= priority[r]) { + right[l] = merge(right[l], r); + up(l); + return l; + } else { + left[r] = merge(l, left[r]); + up(r); + return r; + } + } + + public static void add(int num) { + split(0, 0, head, num); + key[++cnt] = num; + size[cnt] = 1; + priority[cnt] = Math.random(); + head = merge(merge(right[0], cnt), left[0]); + } + + public static void remove(int num) { + split(0, 0, head, num); + int lm = right[0]; + int r = left[0]; + split(0, 0, lm, num - 1); + int l = right[0]; + int m = left[0]; + head = merge(merge(l, merge(left[m], right[m])), r); + } + + public static int rank(int num) { + split(0, 0, head, num - 1); + int ans = size[right[0]] + 1; + head = merge(right[0], left[0]); + return ans; + } + + public static int index(int i, int x) { + if (size[left[i]] >= x) { + return index(left[i], x); + } else if (size[left[i]] + 1 < x) { + return index(right[i], x - size[left[i]] - 1); + } else { + return key[i]; + } + } + + public static int index(int x) { + return index(head, x); + } + + public static int pre(int i, int num) { + if (i == 0) { + return Integer.MIN_VALUE; + } + if (key[i] >= num) { + return pre(left[i], num); + } else { + return Math.max(key[i], pre(right[i], num)); + } + } + + public static int pre(int num) { + return pre(head, num); + } + + public static int post(int i, int num) { + if (i == 0) { + return Integer.MAX_VALUE; + } + if (key[i] <= num) { + return post(right[i], num); + } else { + return Math.min(key[i], post(left[i], num)); + } + } + + public static int post(int num) { + return post(head, num); + } + + 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(); + int n = (int) in.nval; + in.nextToken(); + int m = (int) in.nval; + for (int i = 1, num; i <= n; i++) { + in.nextToken(); + num = (int) in.nval; + add(num); + } + int lastAns = 0; + int ans = 0; + for (int i = 1, op, x; i <= m; i++) { + in.nextToken(); + op = (int) in.nval; + in.nextToken(); + x = (int) in.nval ^ lastAns; + if (op == 1) { + add(x); + } else if (op == 2) { + remove(x); + } else if (op == 3) { + lastAns = rank(x); + ans ^= lastAns; + } else if (op == 4) { + lastAns = index(x); + ans ^= lastAns; + } else if (op == 5) { + lastAns = pre(x); + ans ^= lastAns; + } else { + lastAns = post(x); + ans ^= lastAns; + } + } + out.println(ans); + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class152/FollowUp2.java b/src/class152/FollowUp2.java new file mode 100644 index 000000000..4aa697f88 --- /dev/null +++ b/src/class152/FollowUp2.java @@ -0,0 +1,162 @@ +package class152; + +// FHQ-Treap实现普通有序表,不用词频压缩,数据加强的测试,C++版 +// 这个文件课上没有讲,测试数据加强了,而且有强制在线的要求 +// 基本功能要求都是不变的,可以打开测试链接查看 +// 测试链接 : https://www.luogu.com.cn/problem/P6136 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +//#include +//#include +//#include +//#include +//#include +//using namespace std; +// +//const int MAXN = 2000001; +//int head = 0; +//int cnt = 0; +//int key[MAXN]; +//int ls[MAXN]; +//int rs[MAXN]; +//int size[MAXN]; +//double priority[MAXN]; +// +//void up(int i) { +// size[i] = size[ls[i]] + size[rs[i]] + 1; +//} +// +//void split(int l, int r, int i, int num) { +// if (i == 0) { +// rs[l] = ls[r] = 0; +// } else { +// if (key[i] <= num) { +// rs[l] = i; +// split(i, r, rs[i], num); +// } else { +// ls[r] = i; +// split(l, i, ls[i], num); +// } +// up(i); +// } +//} +// +//int merge(int l, int r) { +// if (l == 0 || r == 0) { +// return l + r; +// } +// if (priority[l] >= priority[r]) { +// rs[l] = merge(rs[l], r); +// up(l); +// return l; +// } else { +// ls[r] = merge(l, ls[r]); +// up(r); +// return r; +// } +//} +// +//void add(int num) { +// split(0, 0, head, num); +// key[++cnt] = num; +// size[cnt] = 1; +// priority[cnt] = (double)rand() / RAND_MAX; +// head = merge(merge(rs[0], cnt), ls[0]); +//} +// +//void remove(int num) { +// split(0, 0, head, num); +// int lm = rs[0]; +// int r = ls[0]; +// split(0, 0, lm, num - 1); +// int l = rs[0]; +// int m = ls[0]; +// head = merge(merge(l, merge(ls[m], rs[m])), r); +//} +// +//int getRank(int num) { +// split(0, 0, head, num - 1); +// int ans = size[rs[0]] + 1; +// head = merge(rs[0], ls[0]); +// return ans; +//} +// +//int index(int i, int x) { +// if (size[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 { +// return key[i]; +// } +//} +// +//int index(int x) { +// return index(head, x); +//} +// +//int pre(int i, int num) { +// if (i == 0) { +// return INT_MIN; +// } +// if (key[i] >= num) { +// return pre(ls[i], num); +// } else { +// return max(key[i], pre(rs[i], num)); +// } +//} +// +//int pre(int num) { +// return pre(head, num); +//} +// +//int post(int i, int num) { +// if (i == 0) { +// return INT_MAX; +// } +// if (key[i] <= num) { +// return post(rs[i], num); +// } else { +// return min(key[i], post(ls[i], num)); +// } +//} +// +//int post(int num) { +// return post(head, num); +//} +// +//int main() { +// srand(time(0)); +// int n, m, lastAns = 0, ans = 0; +// cin >> n; +// cin >> m; +// for (int i = 1, num; i <= n; i++) { +// cin >> num; +// add(num); +// } +// for (int i = 1, op, x; i <= m; i++) { +// cin >> op >> x; +// x ^= lastAns; +// if (op == 1) { +// add(x); +// } else if (op == 2) { +// remove(x); +// } else if (op == 3) { +// lastAns = getRank(x); +// ans ^= lastAns; +// } else if (op == 4) { +// lastAns = index(x); +// ans ^= lastAns; +// } else if (op == 5) { +// lastAns = pre(x); +// ans ^= lastAns; +// } else { +// lastAns = post(x); +// ans ^= lastAns; +// } +// } +// cout << ans << endl; +// return 0; +//} \ No newline at end of file From 2d024b2d89274442a629e95909dfa4e46846d90e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 26 Nov 2024 23:24:25 +0800 Subject: [PATCH 0405/2029] modify code --- src/class153/Code01_Splay1.java | 255 +++++++++++++++++++++++++++++++ src/class153/Code01_Splay2.java | 239 +++++++++++++++++++++++++++++ src/class153/FollowUp1.java | 262 ++++++++++++++++++++++++++++++++ src/class153/FollowUp2.java | 243 +++++++++++++++++++++++++++++ 4 files changed, 999 insertions(+) create mode 100644 src/class153/Code01_Splay1.java create mode 100644 src/class153/Code01_Splay2.java create mode 100644 src/class153/FollowUp1.java create mode 100644 src/class153/FollowUp2.java diff --git a/src/class153/Code01_Splay1.java b/src/class153/Code01_Splay1.java new file mode 100644 index 000000000..3829067db --- /dev/null +++ b/src/class153/Code01_Splay1.java @@ -0,0 +1,255 @@ +package class153; + +// Splay树的实现,不用词频压缩,java版 +// 实现一种结构,支持如下操作,要求单次调用的时间复杂度O(log n) +// 1,增加x,重复加入算多个词频 +// 2,删除x,如果有多个,只删掉一个 +// 3,查询x的排名,x的排名为,比x小的数的个数+1 +// 4,查询数据中排名为x的数 +// 5,查询x的前驱,x的前驱为,小于x的数中最大的数,不存在返回整数最小值 +// 6,查询x的后继,x的后继为,大于x的数中最小的数,不存在返回整数最大值 +// 所有操作的次数 <= 10^5 +// -10^7 <= x <= +10^7 +// 测试链接 : https://www.luogu.com.cn/problem/P3369 +// 提交以下的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 Code01_Splay1 { + + public static int MAXN = 100001; + + public static int head = 0; + + public static int cnt = 0; + + public static int[] key = new int[MAXN]; + + public static int[] father = new int[MAXN]; + + public static int[] left = new int[MAXN]; + + public static int[] right = new int[MAXN]; + + public static int[] size = new int[MAXN]; + + public static void up(int i) { + size[i] = size[left[i]] + size[right[i]] + 1; + } + + public static int leftOrRight(int i) { + return right[father[i]] == i ? 1 : 0; + } + + public static void upRotate(int i) { + int f = father[i], g = father[f], son = leftOrRight(i); + if (son == 1) { + right[f] = left[i]; + if (right[f] != 0) { + father[right[f]] = f; + } + left[i] = f; + } else { + left[f] = right[i]; + if (left[f] != 0) { + father[left[f]] = f; + } + right[i] = f; + } + father[f] = i; + father[i] = g; + if (g != 0) { + if (right[g] == f) { + right[g] = i; + } else { + left[g] = i; + } + } + up(f); + up(i); + } + + public static void splay(int i, int goal) { + int f = father[i], g = father[f]; + while (f != goal) { + if (g != goal) { + if (leftOrRight(i) == leftOrRight(f)) { + upRotate(f); + } else { + upRotate(i); + } + } + upRotate(i); + f = father[i]; + g = father[f]; + } + if (goal == 0) { + head = i; + } + } + + // 返回以i为头的树上第rank名的节点编号 + public static int find(int i, int rank) { + while (i != 0) { + if (size[left[i]] + 1 == rank) { + return i; + } else if (size[left[i]] >= rank) { + i = left[i]; + } else { + rank -= size[left[i]] + 1; + i = right[i]; + } + } + return 0; + } + + public static void add(int num) { + key[++cnt] = num; + size[cnt] = 1; + if (head == 0) { + head = cnt; + } else { + int f = 0, i = head, son = 0; + while (i != 0) { + size[i]++; + f = i; + if (key[i] <= num) { + son = 1; + i = right[i]; + } else { + son = 0; + i = left[i]; + } + } + if (son == 1) { + right[f] = cnt; + } else { + left[f] = cnt; + } + father[cnt] = f; + splay(cnt, 0); + } + } + + public static int rank(int num) { + int i = head, last = head; + int ans = 0; + while (i != 0) { + last = i; + if (key[i] >= num) { + i = left[i]; + } else { + ans += size[left[i]] + 1; + i = right[i]; + } + } + splay(last, 0); + return ans + 1; + } + + public static int index(int x) { + int i = head, last = head; + while (i != 0) { + last = i; + if (size[left[i]] >= x) { + i = left[i]; + } else if (size[left[i]] + 1 < x) { + x -= size[left[i]] + 1; + i = right[i]; + } else { + i = 0; + } + } + splay(last, 0); + return key[last]; + } + + public static int pre(int num) { + int i = head, last = head; + int ans = Integer.MIN_VALUE; + while (i != 0) { + last = i; + if (key[i] >= num) { + i = left[i]; + } else { + ans = Math.max(ans, key[i]); + i = right[i]; + } + } + splay(last, 0); + return ans; + } + + public static int post(int num) { + int i = head, last = head; + int ans = Integer.MAX_VALUE; + while (i != 0) { + last = i; + if (key[i] <= num) { + i = right[i]; + } else { + ans = Math.min(ans, key[i]); + i = left[i]; + } + } + splay(last, 0); + return ans; + } + + public static void remove(int num) { + int kth = rank(num); + if (kth != rank(num + 1)) { + int i = find(head, kth); + splay(i, 0); + if (left[i] == 0) { + head = right[i]; + } else if (right[i] == 0) { + head = left[i]; + } else { + int j = find(right[i], 1); + splay(j, i); + left[j] = left[i]; + father[left[j]] = j; + up(j); + head = j; + } + father[head] = 0; + } + } + + 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(); + int n = (int) in.nval; + for (int i = 1, op, x; i <= n; i++) { + in.nextToken(); + op = (int) in.nval; + in.nextToken(); + x = (int) in.nval; + if (op == 1) { + add(x); + } else if (op == 2) { + remove(x); + } else if (op == 3) { + out.println(rank(x)); + } else if (op == 4) { + out.println(index(x)); + } else if (op == 5) { + out.println(pre(x)); + } else { + out.println(post(x)); + } + } + out.flush(); + out.close(); + br.close(); + } + +} \ No newline at end of file diff --git a/src/class153/Code01_Splay2.java b/src/class153/Code01_Splay2.java new file mode 100644 index 000000000..695f9802a --- /dev/null +++ b/src/class153/Code01_Splay2.java @@ -0,0 +1,239 @@ +package class153; + +// Splay树的实现,不用词频压缩,C++版 +// 实现一种结构,支持如下操作,要求单次调用的时间复杂度O(log n) +// 1,增加x,重复加入算多个词频 +// 2,删除x,如果有多个,只删掉一个 +// 3,查询x的排名,x的排名为,比x小的数的个数+1 +// 4,查询数据中排名为x的数 +// 5,查询x的前驱,x的前驱为,小于x的数中最大的数,不存在返回整数最小值 +// 6,查询x的后继,x的后继为,大于x的数中最小的数,不存在返回整数最大值 +// 所有操作的次数 <= 10^5 +// -10^7 <= x <= +10^7 +// 测试链接 : https://www.luogu.com.cn/problem/P3369 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +//#include +//#include +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +// +//int head = 0; +//int cnt = 0; +//int key[MAXN]; +//int fa[MAXN]; +//int ls[MAXN]; +//int rs[MAXN]; +//int size[MAXN]; +// +//void up(int i) { +// size[i] = size[ls[i]] + size[rs[i]] + 1; +//} +// +//int leftOrRight(int i) { +// return rs[fa[i]] == i ? 1 : 0; +//} +// +//void upRotate(int i) { +// int f = fa[i], g = fa[f], son = leftOrRight(i); +// if (son == 1) { +// rs[f] = ls[i]; +// if (rs[f] != 0) { +// fa[rs[f]] = f; +// } +// ls[i] = f; +// } else { +// ls[f] = rs[i]; +// if (ls[f] != 0) { +// fa[ls[f]] = f; +// } +// rs[i] = f; +// } +// fa[f] = i; +// fa[i] = g; +// if (g != 0) { +// if (rs[g] == f) { +// rs[g] = i; +// } else { +// ls[g] = i; +// } +// } +// up(f); +// up(i); +//} +// +//void splay(int i, int goal) { +// int f = fa[i], g = fa[f]; +// while (f != goal) { +// if (g != goal) { +// if (leftOrRight(i) == leftOrRight(f)) { +// upRotate(f); +// } else { +// upRotate(i); +// } +// } +// upRotate(i); +// f = fa[i]; +// g = fa[f]; +// } +// if (goal == 0) { +// head = i; +// } +//} +// +//int find(int i, int rank) { +// while (i != 0) { +// if (size[ls[i]] + 1 == rank) { +// return i; +// } else if (size[ls[i]] >= rank) { +// i = ls[i]; +// } else { +// rank -= size[ls[i]] + 1; +// i = rs[i]; +// } +// } +// return 0; +//} +// +//void add(int num) { +// key[++cnt] = num; +// size[cnt] = 1; +// if (head == 0) { +// head = cnt; +// } else { +// int f = 0, i = head, son = 0; +// while (i != 0) { +// size[i]++; +// f = i; +// if (key[i] <= num) { +// son = 1; +// i = rs[i]; +// } else { +// son = 0; +// i = ls[i]; +// } +// } +// if (son == 1) { +// rs[f] = cnt; +// } else { +// ls[f] = cnt; +// } +// fa[cnt] = f; +// splay(cnt, 0); +// } +//} +// +//int getRank(int num) { +// int i = head, last = head; +// int ans = 0; +// while (i != 0) { +// last = i; +// if (key[i] >= num) { +// i = ls[i]; +// } else { +// ans += size[ls[i]] + 1; +// i = rs[i]; +// } +// } +// splay(last, 0); +// return ans + 1; +//} +// +//int index(int x) { +// int i = head, last = head; +// while (i != 0) { +// last = i; +// if (size[ls[i]] >= x) { +// i = ls[i]; +// } else if (size[ls[i]] + 1 < x) { +// x -= size[ls[i]] + 1; +// i = rs[i]; +// } else { +// i = 0; +// } +// } +// splay(last, 0); +// return key[last]; +//} +// +//int pre(int num) { +// int i = head, last = head; +// int ans = INT_MIN; +// while (i != 0) { +// last = i; +// if (key[i] >= num) { +// i = ls[i]; +// } else { +// ans = max(ans, key[i]); +// i = rs[i]; +// } +// } +// splay(last, 0); +// return ans; +//} +// +//int post(int num) { +// int i = head, last = head; +// int ans = INT_MAX; +// while (i != 0) { +// last = i; +// if (key[i] <= num) { +// i = rs[i]; +// } else { +// ans = min(ans, key[i]); +// i = ls[i]; +// } +// } +// splay(last, 0); +// return ans; +//} +// +//void remove(int num) { +// int kth = getRank(num); +// if (kth != getRank(num + 1)) { +// int i = find(head, kth); +// splay(i, 0); +// if (ls[i] == 0) { +// head = rs[i]; +// } else if (rs[i] == 0) { +// head = ls[i]; +// } else { +// int j = find(rs[i], 1); +// splay(j, i); +// ls[j] = ls[i]; +// fa[ls[j]] = j; +// up(j); +// head = j; +// } +// if (head != 0) { +// fa[head] = 0; +// } +// } +//} +// +//int main() { +// int n; +// cin >> n; +// for (int i = 0, op, x; i < n; i++) { +// cin >> op >> x; +// if (op == 1) { +// add(x); +// } else if (op == 2) { +// remove(x); +// } else if (op == 3) { +// cout << getRank(x) << endl; +// } else if (op == 4) { +// cout << index(x) << endl; +// } else if (op == 5) { +// cout << pre(x) << endl; +// } else { +// cout << post(x) << endl; +// } +// } +// return 0; +//} \ No newline at end of file diff --git a/src/class153/FollowUp1.java b/src/class153/FollowUp1.java new file mode 100644 index 000000000..be32d1152 --- /dev/null +++ b/src/class153/FollowUp1.java @@ -0,0 +1,262 @@ +package class153; + +// Splay树实现普通有序表,不用词频压缩,数据加强的测试,java版 +// 这个文件课上没有讲,测试数据加强了,而且有强制在线的要求 +// 基本功能要求都是不变的,可以打开测试链接查看 +// 测试链接 : https://www.luogu.com.cn/problem/P6136 +// 提交以下的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 FollowUp1 { + + public static int MAXN = 2000001; + + public static int head = 0; + + public static int cnt = 0; + + public static int[] key = new int[MAXN]; + + public static int[] father = new int[MAXN]; + + public static int[] left = new int[MAXN]; + + public static int[] right = new int[MAXN]; + + public static int[] size = new int[MAXN]; + + public static void up(int i) { + size[i] = size[left[i]] + size[right[i]] + 1; + } + + public static int leftOrRight(int i) { + return right[father[i]] == i ? 1 : 0; + } + + public static void upRotate(int i) { + int f = father[i], g = father[f], son = leftOrRight(i); + if (son == 1) { + right[f] = left[i]; + if (right[f] != 0) { + father[right[f]] = f; + } + left[i] = f; + } else { + left[f] = right[i]; + if (left[f] != 0) { + father[left[f]] = f; + } + right[i] = f; + } + father[f] = i; + father[i] = g; + if (g != 0) { + if (right[g] == f) { + right[g] = i; + } else { + left[g] = i; + } + } + up(f); + up(i); + } + + public static void splay(int i, int goal) { + int f = father[i], g = father[f]; + while (f != goal) { + if (g != goal) { + if (leftOrRight(i) == leftOrRight(f)) { + upRotate(f); + } else { + upRotate(i); + } + } + upRotate(i); + f = father[i]; + g = father[f]; + } + if (goal == 0) { + head = i; + } + } + + // 返回以i为头的树上第rank名的节点编号 + public static int find(int i, int rank) { + while (i != 0) { + if (size[left[i]] + 1 == rank) { + return i; + } else if (size[left[i]] >= rank) { + i = left[i]; + } else { + rank -= size[left[i]] + 1; + i = right[i]; + } + } + return 0; + } + + public static void add(int num) { + key[++cnt] = num; + size[cnt] = 1; + if (head == 0) { + head = cnt; + } else { + int f = 0, i = head, son = 0; + while (i != 0) { + size[i]++; + f = i; + if (key[i] <= num) { + son = 1; + i = right[i]; + } else { + son = 0; + i = left[i]; + } + } + if (son == 1) { + right[f] = cnt; + } else { + left[f] = cnt; + } + father[cnt] = f; + splay(cnt, 0); + } + } + + public static int rank(int num) { + int i = head, last = head; + int ans = 0; + while (i != 0) { + last = i; + if (key[i] >= num) { + i = left[i]; + } else { + ans += size[left[i]] + 1; + i = right[i]; + } + } + splay(last, 0); + return ans + 1; + } + + public static int index(int x) { + int i = head, last = head; + while (i != 0) { + last = i; + if (size[left[i]] >= x) { + i = left[i]; + } else if (size[left[i]] + 1 < x) { + x -= size[left[i]] + 1; + i = right[i]; + } else { + i = 0; + } + } + splay(last, 0); + return key[last]; + } + + public static int pre(int num) { + int i = head, last = head; + int ans = Integer.MIN_VALUE; + while (i != 0) { + last = i; + if (key[i] >= num) { + i = left[i]; + } else { + ans = Math.max(ans, key[i]); + i = right[i]; + } + } + splay(last, 0); + return ans; + } + + public static int post(int num) { + int i = head, last = head; + int ans = Integer.MAX_VALUE; + while (i != 0) { + last = i; + if (key[i] <= num) { + i = right[i]; + } else { + ans = Math.min(ans, key[i]); + i = left[i]; + } + } + splay(last, 0); + return ans; + } + + public static void remove(int num) { + int kth = rank(num); + if (kth != rank(num + 1)) { + int i = find(head, kth); + splay(i, 0); + if (left[i] == 0) { + head = right[i]; + } else if (right[i] == 0) { + head = left[i]; + } else { + int j = find(right[i], 1); + splay(j, i); + left[j] = left[i]; + father[left[j]] = j; + up(j); + head = j; + } + father[head] = 0; + } + } + + 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(); + int n = (int) in.nval; + in.nextToken(); + int m = (int) in.nval; + for (int i = 1, num; i <= n; i++) { + in.nextToken(); + num = (int) in.nval; + add(num); + } + int lastAns = 0; + int ans = 0; + for (int i = 1, op, x; i <= m; i++) { + in.nextToken(); + op = (int) in.nval; + in.nextToken(); + x = (int) in.nval ^ lastAns; + if (op == 1) { + add(x); + } else if (op == 2) { + remove(x); + } else if (op == 3) { + lastAns = rank(x); + ans ^= lastAns; + } else if (op == 4) { + lastAns = index(x); + ans ^= lastAns; + } else if (op == 5) { + lastAns = pre(x); + ans ^= lastAns; + } else { + lastAns = post(x); + ans ^= lastAns; + } + } + out.println(ans); + out.flush(); + out.close(); + br.close(); + } + +} \ No newline at end of file diff --git a/src/class153/FollowUp2.java b/src/class153/FollowUp2.java new file mode 100644 index 000000000..f47800023 --- /dev/null +++ b/src/class153/FollowUp2.java @@ -0,0 +1,243 @@ +package class153; + +// Splay树实现普通有序表,不用词频压缩,数据加强的测试,C++版 +// 这个文件课上没有讲,测试数据加强了,而且有强制在线的要求 +// 基本功能要求都是不变的,可以打开测试链接查看 +// 测试链接 : https://www.luogu.com.cn/problem/P6136 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +//#include +//#include +//#include +// +//using namespace std; +// +//const int MAXN = 2000001; +// +//int head = 0; +//int cnt = 0; +//int key[MAXN]; +//int fa[MAXN]; +//int ls[MAXN]; +//int rs[MAXN]; +//int size[MAXN]; +// +//void up(int i) { +// size[i] = size[ls[i]] + size[rs[i]] + 1; +//} +// +//int leftOrRight(int i) { +// return rs[fa[i]] == i ? 1 : 0; +//} +// +//void upRotate(int i) { +// int f = fa[i], g = fa[f], son = leftOrRight(i); +// if (son == 1) { +// rs[f] = ls[i]; +// if (rs[f] != 0) { +// fa[rs[f]] = f; +// } +// ls[i] = f; +// } else { +// ls[f] = rs[i]; +// if (ls[f] != 0) { +// fa[ls[f]] = f; +// } +// rs[i] = f; +// } +// fa[f] = i; +// fa[i] = g; +// if (g != 0) { +// if (rs[g] == f) { +// rs[g] = i; +// } else { +// ls[g] = i; +// } +// } +// up(f); +// up(i); +//} +// +//void splay(int i, int goal) { +// int f = fa[i], g = fa[f]; +// while (f != goal) { +// if (g != goal) { +// if (leftOrRight(i) == leftOrRight(f)) { +// upRotate(f); +// } else { +// upRotate(i); +// } +// } +// upRotate(i); +// f = fa[i]; +// g = fa[f]; +// } +// if (goal == 0) { +// head = i; +// } +//} +// +//int find(int i, int rank) { +// while (i != 0) { +// if (size[ls[i]] + 1 == rank) { +// return i; +// } else if (size[ls[i]] >= rank) { +// i = ls[i]; +// } else { +// rank -= size[ls[i]] + 1; +// i = rs[i]; +// } +// } +// return 0; +//} +// +//void add(int num) { +// key[++cnt] = num; +// size[cnt] = 1; +// if (head == 0) { +// head = cnt; +// } else { +// int f = 0, i = head, son = 0; +// while (i != 0) { +// size[i]++; +// f = i; +// if (key[i] <= num) { +// son = 1; +// i = rs[i]; +// } else { +// son = 0; +// i = ls[i]; +// } +// } +// if (son == 1) { +// rs[f] = cnt; +// } else { +// ls[f] = cnt; +// } +// fa[cnt] = f; +// splay(cnt, 0); +// } +//} +// +//int getRank(int num) { +// int i = head, last = head; +// int ans = 0; +// while (i != 0) { +// last = i; +// if (key[i] >= num) { +// i = ls[i]; +// } else { +// ans += size[ls[i]] + 1; +// i = rs[i]; +// } +// } +// splay(last, 0); +// return ans + 1; +//} +// +//int index(int x) { +// int i = head, last = head; +// while (i != 0) { +// last = i; +// if (size[ls[i]] >= x) { +// i = ls[i]; +// } else if (size[ls[i]] + 1 < x) { +// x -= size[ls[i]] + 1; +// i = rs[i]; +// } else { +// i = 0; +// } +// } +// splay(last, 0); +// return key[last]; +//} +// +//int pre(int num) { +// int i = head, last = head; +// int ans = INT_MIN; +// while (i != 0) { +// last = i; +// if (key[i] >= num) { +// i = ls[i]; +// } else { +// ans = max(ans, key[i]); +// i = rs[i]; +// } +// } +// splay(last, 0); +// return ans; +//} +// +//int post(int num) { +// int i = head, last = head; +// int ans = INT_MAX; +// while (i != 0) { +// last = i; +// if (key[i] <= num) { +// i = rs[i]; +// } else { +// ans = min(ans, key[i]); +// i = ls[i]; +// } +// } +// splay(last, 0); +// return ans; +//} +// +//void remove(int num) { +// int kth = getRank(num); +// if (kth != getRank(num + 1)) { +// int i = find(head, kth); +// splay(i, 0); +// if (ls[i] == 0) { +// head = rs[i]; +// } else if (rs[i] == 0) { +// head = ls[i]; +// } else { +// int j = find(rs[i], 1); +// splay(j, i); +// ls[j] = ls[i]; +// fa[ls[j]] = j; +// up(j); +// head = j; +// } +// if (head != 0) { +// fa[head] = 0; +// } +// } +//} +// +//int main() { +// int n, m, lastAns = 0, ans = 0; +// cin >> n; +// cin >> m; +// for (int i = 1, num; i <= n; i++) { +// cin >> num; +// add(num); +// } +// for (int i = 1, op, x; i <= m; i++) { +// cin >> op >> x; +// x ^= lastAns; +// if (op == 1) { +// add(x); +// } else if (op == 2) { +// remove(x); +// } else if (op == 3) { +// lastAns = getRank(x); +// ans ^= lastAns; +// } else if (op == 4) { +// lastAns = index(x); +// ans ^= lastAns; +// } else if (op == 5) { +// lastAns = pre(x); +// ans ^= lastAns; +// } else { +// lastAns = post(x); +// ans ^= lastAns; +// } +// } +// cout << ans << endl; +// return 0; +//} \ No newline at end of file From bbc5fdab592e8e21ba3d58a48d394d37f8e4ee74 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 27 Nov 2024 13:14:59 +0800 Subject: [PATCH 0406/2029] modify code --- src/class148/Code01_AVL2.java | 2 ++ src/class148/FollowUp2.java | 2 ++ src/class149/SkipList2.java | 2 ++ src/class150/Code02_ScapeGoat2.java | 2 ++ src/class150/FollowUp2.java | 2 ++ src/class151/Code02_Treap2.java | 2 ++ src/class151/FollowUp2.java | 2 ++ src/class152/Code01_FHQTreapWithCount2.java | 2 ++ src/class152/Code02_FHQTreapWithoutCount2.java | 2 ++ src/class152/Code04_LiteraryTree2.java | 2 ++ src/class152/Code05_PersistentFHQTreap2.java | 2 ++ src/class152/Code06_PersistentLiteraryTree2.java | 2 ++ src/class152/FollowUp2.java | 2 ++ src/class153/Code01_Splay1.java | 14 +++++++------- src/class153/Code01_Splay2.java | 16 +++++++++------- src/class153/FollowUp1.java | 14 +++++++------- src/class153/FollowUp2.java | 16 +++++++++------- 17 files changed, 58 insertions(+), 28 deletions(-) diff --git a/src/class148/Code01_AVL2.java b/src/class148/Code01_AVL2.java index 9b046a864..4202633de 100644 --- a/src/class148/Code01_AVL2.java +++ b/src/class148/Code01_AVL2.java @@ -214,6 +214,8 @@ //} // //int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); // int n; // cin >> n; // for (int i = 1, op, x; i <= n; i++) { diff --git a/src/class148/FollowUp2.java b/src/class148/FollowUp2.java index ac3848565..eb9844f80 100644 --- a/src/class148/FollowUp2.java +++ b/src/class148/FollowUp2.java @@ -207,6 +207,8 @@ //} // //int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); // int n, m, lastAns = 0, ans = 0; // cin >> n; // cin >> m; diff --git a/src/class149/SkipList2.java b/src/class149/SkipList2.java index 8a041123c..29dab5a16 100644 --- a/src/class149/SkipList2.java +++ b/src/class149/SkipList2.java @@ -236,6 +236,8 @@ //} // //int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); // srand(time(0)); // build(); // int n; diff --git a/src/class150/Code02_ScapeGoat2.java b/src/class150/Code02_ScapeGoat2.java index 73f0ed757..16bfe5f75 100644 --- a/src/class150/Code02_ScapeGoat2.java +++ b/src/class150/Code02_ScapeGoat2.java @@ -207,6 +207,8 @@ //} // //int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); // int n; // cin >> n; // for (int i = 1; i <= n; i++) { diff --git a/src/class150/FollowUp2.java b/src/class150/FollowUp2.java index 9f6ade08e..8fe8f4e6f 100644 --- a/src/class150/FollowUp2.java +++ b/src/class150/FollowUp2.java @@ -200,6 +200,8 @@ //} // //int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); // int n, m, lastAns = 0, ans = 0; // cin >> n; // cin >> m; diff --git a/src/class151/Code02_Treap2.java b/src/class151/Code02_Treap2.java index 118eb1c71..ef8b276da 100644 --- a/src/class151/Code02_Treap2.java +++ b/src/class151/Code02_Treap2.java @@ -189,6 +189,8 @@ //} // //int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); // srand(time(0)); // int n; // cin >> n; diff --git a/src/class151/FollowUp2.java b/src/class151/FollowUp2.java index b7c79d79f..6c8793e42 100644 --- a/src/class151/FollowUp2.java +++ b/src/class151/FollowUp2.java @@ -182,6 +182,8 @@ //} // //int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); // srand(time(0)); // int n, m, lastAns = 0, ans = 0; // cin >> n; diff --git a/src/class152/Code01_FHQTreapWithCount2.java b/src/class152/Code01_FHQTreapWithCount2.java index 3b46fdbab..dc5804004 100644 --- a/src/class152/Code01_FHQTreapWithCount2.java +++ b/src/class152/Code01_FHQTreapWithCount2.java @@ -177,6 +177,8 @@ //} // //int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); // srand(time(0)); // int n; // cin >> n; diff --git a/src/class152/Code02_FHQTreapWithoutCount2.java b/src/class152/Code02_FHQTreapWithoutCount2.java index 75da7c2ac..9655a7fd3 100644 --- a/src/class152/Code02_FHQTreapWithoutCount2.java +++ b/src/class152/Code02_FHQTreapWithoutCount2.java @@ -135,6 +135,8 @@ //} // //int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); // srand(time(0)); // int n; // cin >> n; diff --git a/src/class152/Code04_LiteraryTree2.java b/src/class152/Code04_LiteraryTree2.java index a4f915d83..ce492e41e 100644 --- a/src/class152/Code04_LiteraryTree2.java +++ b/src/class152/Code04_LiteraryTree2.java @@ -87,6 +87,8 @@ //} // //int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); // srand(time(0)); // int n, k; // cin >> n >> k; diff --git a/src/class152/Code05_PersistentFHQTreap2.java b/src/class152/Code05_PersistentFHQTreap2.java index 7381c13d1..04e262a99 100644 --- a/src/class152/Code05_PersistentFHQTreap2.java +++ b/src/class152/Code05_PersistentFHQTreap2.java @@ -150,6 +150,8 @@ //} // //int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); // srand(time(0)); // int n; // cin >> n; diff --git a/src/class152/Code06_PersistentLiteraryTree2.java b/src/class152/Code06_PersistentLiteraryTree2.java index 142051f9b..80a34595f 100644 --- a/src/class152/Code06_PersistentLiteraryTree2.java +++ b/src/class152/Code06_PersistentLiteraryTree2.java @@ -101,6 +101,8 @@ //} // //int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); // srand(time(0)); // int n; // cin >> n; diff --git a/src/class152/FollowUp2.java b/src/class152/FollowUp2.java index 4aa697f88..1ac7e8b72 100644 --- a/src/class152/FollowUp2.java +++ b/src/class152/FollowUp2.java @@ -128,6 +128,8 @@ //} // //int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); // srand(time(0)); // int n, m, lastAns = 0, ans = 0; // cin >> n; diff --git a/src/class153/Code01_Splay1.java b/src/class153/Code01_Splay1.java index 3829067db..a11d84c58 100644 --- a/src/class153/Code01_Splay1.java +++ b/src/class153/Code01_Splay1.java @@ -42,13 +42,13 @@ public static void up(int i) { size[i] = size[left[i]] + size[right[i]] + 1; } - public static int leftOrRight(int i) { + public static int lr(int i) { return right[father[i]] == i ? 1 : 0; } public static void upRotate(int i) { - int f = father[i], g = father[f], son = leftOrRight(i); - if (son == 1) { + int f = father[i], g = father[f], soni = lr(i), sonf = lr(f); + if (soni == 1) { right[f] = left[i]; if (right[f] != 0) { father[right[f]] = f; @@ -61,15 +61,15 @@ public static void upRotate(int i) { } right[i] = f; } - father[f] = i; - father[i] = g; if (g != 0) { - if (right[g] == f) { + if (sonf == 1) { right[g] = i; } else { left[g] = i; } } + father[f] = i; + father[i] = g; up(f); up(i); } @@ -78,7 +78,7 @@ public static void splay(int i, int goal) { int f = father[i], g = father[f]; while (f != goal) { if (g != goal) { - if (leftOrRight(i) == leftOrRight(f)) { + if (lr(i) == lr(f)) { upRotate(f); } else { upRotate(i); diff --git a/src/class153/Code01_Splay2.java b/src/class153/Code01_Splay2.java index 695f9802a..596b78485 100644 --- a/src/class153/Code01_Splay2.java +++ b/src/class153/Code01_Splay2.java @@ -35,13 +35,13 @@ // size[i] = size[ls[i]] + size[rs[i]] + 1; //} // -//int leftOrRight(int i) { +//int lr(int i) { // return rs[fa[i]] == i ? 1 : 0; //} // //void upRotate(int i) { -// int f = fa[i], g = fa[f], son = leftOrRight(i); -// if (son == 1) { +// int f = fa[i], g = fa[f], soni = lr(i), sonf = lr(f); +// if (soni == 1) { // rs[f] = ls[i]; // if (rs[f] != 0) { // fa[rs[f]] = f; @@ -54,15 +54,15 @@ // } // rs[i] = f; // } -// fa[f] = i; -// fa[i] = g; // if (g != 0) { -// if (rs[g] == f) { +// if (sonf == 1) { // rs[g] = i; // } else { // ls[g] = i; // } // } +// fa[f] = i; +// fa[i] = g; // up(f); // up(i); //} @@ -71,7 +71,7 @@ // int f = fa[i], g = fa[f]; // while (f != goal) { // if (g != goal) { -// if (leftOrRight(i) == leftOrRight(f)) { +// if (lr(i) == lr(f)) { // upRotate(f); // } else { // upRotate(i); @@ -217,6 +217,8 @@ //} // //int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); // int n; // cin >> n; // for (int i = 0, op, x; i < n; i++) { diff --git a/src/class153/FollowUp1.java b/src/class153/FollowUp1.java index be32d1152..09931bdc4 100644 --- a/src/class153/FollowUp1.java +++ b/src/class153/FollowUp1.java @@ -35,13 +35,13 @@ public static void up(int i) { size[i] = size[left[i]] + size[right[i]] + 1; } - public static int leftOrRight(int i) { + public static int lr(int i) { return right[father[i]] == i ? 1 : 0; } public static void upRotate(int i) { - int f = father[i], g = father[f], son = leftOrRight(i); - if (son == 1) { + int f = father[i], g = father[f], soni = lr(i), sonf = lr(f); + if (soni == 1) { right[f] = left[i]; if (right[f] != 0) { father[right[f]] = f; @@ -54,15 +54,15 @@ public static void upRotate(int i) { } right[i] = f; } - father[f] = i; - father[i] = g; if (g != 0) { - if (right[g] == f) { + if (sonf == 1) { right[g] = i; } else { left[g] = i; } } + father[f] = i; + father[i] = g; up(f); up(i); } @@ -71,7 +71,7 @@ public static void splay(int i, int goal) { int f = father[i], g = father[f]; while (f != goal) { if (g != goal) { - if (leftOrRight(i) == leftOrRight(f)) { + if (lr(i) == lr(f)) { upRotate(f); } else { upRotate(i); diff --git a/src/class153/FollowUp2.java b/src/class153/FollowUp2.java index f47800023..6c3122cb2 100644 --- a/src/class153/FollowUp2.java +++ b/src/class153/FollowUp2.java @@ -28,13 +28,13 @@ // size[i] = size[ls[i]] + size[rs[i]] + 1; //} // -//int leftOrRight(int i) { +//int lr(int i) { // return rs[fa[i]] == i ? 1 : 0; //} // //void upRotate(int i) { -// int f = fa[i], g = fa[f], son = leftOrRight(i); -// if (son == 1) { +// int f = fa[i], g = fa[f], soni = lr(i), sonf = lr(f); +// if (soni == 1) { // rs[f] = ls[i]; // if (rs[f] != 0) { // fa[rs[f]] = f; @@ -47,15 +47,15 @@ // } // rs[i] = f; // } -// fa[f] = i; -// fa[i] = g; // if (g != 0) { -// if (rs[g] == f) { +// if (sonf == 1) { // rs[g] = i; // } else { // ls[g] = i; // } // } +// fa[f] = i; +// fa[i] = g; // up(f); // up(i); //} @@ -64,7 +64,7 @@ // int f = fa[i], g = fa[f]; // while (f != goal) { // if (g != goal) { -// if (leftOrRight(i) == leftOrRight(f)) { +// if (lr(i) == lr(f)) { // upRotate(f); // } else { // upRotate(i); @@ -210,6 +210,8 @@ //} // //int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); // int n, m, lastAns = 0, ans = 0; // cin >> n; // cin >> m; From 0873df497bf215467dbeac0542a8611cd83ca558 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 27 Nov 2024 14:30:40 +0800 Subject: [PATCH 0407/2029] modify code --- src/class153/Code02_LiteraryTree1.java | 225 +++++++++++++++++++++++++ src/class153/Code02_LiteraryTree2.java | 197 ++++++++++++++++++++++ 2 files changed, 422 insertions(+) create mode 100644 src/class153/Code02_LiteraryTree1.java create mode 100644 src/class153/Code02_LiteraryTree2.java diff --git a/src/class153/Code02_LiteraryTree1.java b/src/class153/Code02_LiteraryTree1.java new file mode 100644 index 000000000..401a05938 --- /dev/null +++ b/src/class153/Code02_LiteraryTree1.java @@ -0,0 +1,225 @@ +package class153; + +// 文艺平衡树,Splay实现范围翻转,java版本 +// 长度为n的序列,下标从1开始,一开始序列为1, 2, ..., n +// 接下来会有k个操作,每个操作给定l,r,表示从l到r范围上的所有数字翻转 +// 做完k次操作后,从左到右打印所有数字 +// 1 <= n, k <= 10^5 +// 测试链接 : https://www.luogu.com.cn/problem/P3391 +// 提交以下的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 Code02_LiteraryTree1 { + + public static int MAXN = 100005; + + public static int head = 0; + + public static int cnt = 0; + + public static int[] key = new int[MAXN]; + + public static int[] father = new int[MAXN]; + + public static int[] left = new int[MAXN]; + + public static int[] right = new int[MAXN]; + + public static int[] size = new int[MAXN]; + + public static boolean[] reverse = new boolean[MAXN]; + + public static int[] stack = new int[MAXN]; + + public static int si; + + public static int[] ans = new int[MAXN]; + + public static int ai; + + public static void up(int i) { + size[i] = size[left[i]] + size[right[i]] + 1; + } + + public static int lr(int i) { + return right[father[i]] == i ? 1 : 0; + } + + public static void upRotate(int i) { + int f = father[i], g = father[f], soni = lr(i), sonf = lr(f); + if (soni == 1) { + right[f] = left[i]; + if (right[f] != 0) { + father[right[f]] = f; + } + left[i] = f; + } else { + left[f] = right[i]; + if (left[f] != 0) { + father[left[f]] = f; + } + right[i] = f; + } + if (g != 0) { + if (sonf == 1) { + right[g] = i; + } else { + left[g] = i; + } + } + father[f] = i; + father[i] = g; + up(f); + up(i); + } + + public static void splay(int i, int goal) { + int f = father[i], g = father[f]; + while (f != goal) { + if (g != goal) { + if (lr(i) == lr(f)) { + upRotate(f); + } else { + upRotate(i); + } + } + upRotate(i); + f = father[i]; + g = father[f]; + } + if (goal == 0) { + head = i; + } + } + + public static void down(int i) { + if (reverse[i]) { + reverse[left[i]] = !reverse[left[i]]; + reverse[right[i]] = !reverse[right[i]]; + int tmp = left[i]; + left[i] = right[i]; + right[i] = tmp; + reverse[i] = false; + } + } + + public static int find(int i, int rank) { + while (i != 0) { + down(i); + if (size[left[i]] + 1 == rank) { + return i; + } else if (size[left[i]] >= rank) { + i = left[i]; + } else { + rank -= size[left[i]] + 1; + i = right[i]; + } + } + return 0; + } + + public static void add(int num) { + key[++cnt] = num; + size[cnt] = 1; + if (head == 0) { + head = cnt; + } else { + int f = 0, i = head, son = 0; + while (i != 0) { + size[i]++; + f = i; + if (key[i] <= num) { + son = 1; + i = right[i]; + } else { + son = 0; + i = left[i]; + } + } + if (son == 1) { + right[f] = cnt; + } else { + left[f] = cnt; + } + father[cnt] = f; + splay(cnt, 0); + } + } + + public static void reverse(int l, int r) { + int i = find(head, l - 1); + int j = find(head, r + 1); + splay(i, 0); + splay(j, i); + reverse[left[right[head]]] = !reverse[left[right[head]]]; + } + + // 递归方式实现二叉树中序遍历 + // 对本题来说,递归不会爆栈,但其实是有风险的 + public static void inorder(int i) { + if (i != 0) { + down(i); + inorder(left[i]); + ans[++ai] = key[i]; + inorder(right[i]); + } + } + + // 迭代方式实现二叉树中序遍历,防止递归爆栈 + // 不懂的话,看讲解018,迭代方式实现二叉树中序遍历 + // 遍历时候懒更新任务也要下发 + public static void inorder() { + si = 0; + int i = head; + while (si != 0 || i != 0) { + if (i != 0) { + down(i); + stack[++si] = i; + i = left[i]; + } else { + i = stack[si--]; + ans[++ai] = key[i]; + i = right[i]; + } + } + } + + 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(); + int n = (int) in.nval; + in.nextToken(); + int m = (int) in.nval; + add(Integer.MIN_VALUE); + add(Integer.MAX_VALUE); + for (int i = 1; i <= n; i++) { + add(i); + } + for (int i = 1, x, y; i <= m; i++) { + in.nextToken(); + x = (int) in.nval; + in.nextToken(); + y = (int) in.nval; + reverse(x + 1, y + 1); + } + ai = 0; +// inorder(head); + inorder(); + for (int i = 2; i < ai; i++) { + out.print(ans[i] + " "); + } + out.println(); + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class153/Code02_LiteraryTree2.java b/src/class153/Code02_LiteraryTree2.java new file mode 100644 index 000000000..25589ea4b --- /dev/null +++ b/src/class153/Code02_LiteraryTree2.java @@ -0,0 +1,197 @@ +package class153; + +// 文艺平衡树,Splay实现范围翻转,C++版本 +// 长度为n的序列,下标从1开始,一开始序列为1, 2, ..., n +// 接下来会有k个操作,每个操作给定l,r,表示从l到r范围上的所有数字翻转 +// 做完k次操作后,从左到右打印所有数字 +// 1 <= n, k <= 10^5 +// 测试链接 : https://www.luogu.com.cn/problem/P3391 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +//#include +//#include +//#include +//using namespace std; +// +//const int MAXN = 100005; +// +//int head = 0; +//int cnt = 0; +//int key[MAXN]; +//int fa[MAXN]; +//int ls[MAXN]; +//int rs[MAXN]; +//int size[MAXN]; +//bool rev[MAXN]; +//int sta[MAXN]; +//int si; +//int ans[MAXN]; +//int ai; +// +//void up(int i) { +// size[i] = size[ls[i]] + size[rs[i]] + 1; +//} +// +//int lr(int i) { +// return rs[fa[i]] == i ? 1 : 0; +//} +// +//void upRotate(int i) { +// int f = fa[i], g = fa[f], soni = lr(i), sonf = lr(f); +// if (soni == 1) { +// rs[f] = ls[i]; +// if (rs[f] != 0) { +// fa[rs[f]] = f; +// } +// ls[i] = f; +// } else { +// ls[f] = rs[i]; +// if (ls[f] != 0) { +// fa[ls[f]] = f; +// } +// rs[i] = f; +// } +// if (g != 0) { +// if (sonf == 1) { +// rs[g] = i; +// } else { +// ls[g] = i; +// } +// } +// fa[f] = i; +// fa[i] = g; +// up(f); +// up(i); +//} +// +//void splay(int i, int goal) { +// int f = fa[i], g = fa[f]; +// while (f != goal) { +// if (g != goal) { +// if (lr(i) == lr(f)) { +// upRotate(f); +// } else { +// upRotate(i); +// } +// } +// upRotate(i); +// f = fa[i]; +// g = fa[f]; +// } +// if (goal == 0) { +// head = i; +// } +//} +// +//void down(int i) { +// if (rev[i]) { +// rev[ls[i]] = !rev[ls[i]]; +// rev[rs[i]] = !rev[rs[i]]; +// int tmp = ls[i]; +// ls[i] = rs[i]; +// rs[i] = tmp; +// rev[i] = false; +// } +//} +// +//int find(int i, int rank) { +// while (i != 0) { +// down(i); +// if (size[ls[i]] + 1 == rank) { +// return i; +// } else if (size[ls[i]] >= rank) { +// i = ls[i]; +// } else { +// rank -= size[ls[i]] + 1; +// i = rs[i]; +// } +// } +// return 0; +//} +// +//void add(int num) { +// key[++cnt] = num; +// size[cnt] = 1; +// if (head == 0) { +// head = cnt; +// } else { +// int f = 0, i = head, son = 0; +// while (i != 0) { +// size[i]++; +// f = i; +// if (key[i] <= num) { +// son = 1; +// i = rs[i]; +// } else { +// son = 0; +// i = ls[i]; +// } +// } +// if (son == 1) { +// rs[f] = cnt; +// } else { +// ls[f] = cnt; +// } +// fa[cnt] = f; +// splay(cnt, 0); +// } +//} +// +//void reverse(int l, int r) { +// int i = find(head, l - 1); +// int j = find(head, r + 1); +// splay(i, 0); +// splay(j, i); +// rev[ls[rs[head]]] = !rev[ls[rs[head]]]; +//} +// +//void inorder(int i) { +// if (i != 0) { +// down(i); +// inorder(ls[i]); +// ans[++ai] = key[i]; +// inorder(rs[i]); +// } +//} +// +//void inorder() { +// si = 0; +// int i = head; +// while (si != 0 || i != 0) { +// if (i != 0) { +// down(i); +// sta[++si] = i; +// i = ls[i]; +// } else { +// i = sta[si--]; +// ans[++ai] = key[i]; +// i = rs[i]; +// } +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// int n, m; +// cin >> n >> m; +// add(INT_MIN); +// add(INT_MAX); +// for (int i = 1; i <= n; i++) { +// add(i); +// } +// for (int i = 1, x, y; i <= m; i++) { +// cin >> x >> y; +// reverse(x + 1, y + 1); +// } +// ai = 0; +// // inorder(head); +// inorder(); +// for (int i = 2; i < ai; i++) { +// cout << ans[i] << " "; +// } +// cout << endl; +// return 0; +//} \ No newline at end of file From 82007fd7b7f5694c586cc31eb47798c159a37c26 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 27 Nov 2024 16:24:25 +0800 Subject: [PATCH 0408/2029] modify code --- src/class153/Code03_FrustratedCashier.java | 235 +++++++++++++++++++++ 1 file changed, 235 insertions(+) create mode 100644 src/class153/Code03_FrustratedCashier.java diff --git a/src/class153/Code03_FrustratedCashier.java b/src/class153/Code03_FrustratedCashier.java new file mode 100644 index 000000000..46dd980f7 --- /dev/null +++ b/src/class153/Code03_FrustratedCashier.java @@ -0,0 +1,235 @@ +package class153; + +// 郁闷的出纳员 +// 测试链接 : https://www.luogu.com.cn/problem/P1486 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.util.StringTokenizer; + +public class Code03_FrustratedCashier { + + public static int MAXN = 300001; + + public static int head = 0; + + public static int cnt = 0; + + public static int[] key = new int[MAXN]; + + public static int[] father = new int[MAXN]; + + public static int[] left = new int[MAXN]; + + public static int[] right = new int[MAXN]; + + public static int[] size = new int[MAXN]; + + public static int limit; + + public static int change = 0; + + public static int enter = 0; + + public static void up(int i) { + size[i] = size[left[i]] + size[right[i]] + 1; + } + + public static int lr(int i) { + return right[father[i]] == i ? 1 : 0; + } + + public static void upRotate(int i) { + int f = father[i], g = father[f], soni = lr(i), sonf = lr(f); + if (soni == 1) { + right[f] = left[i]; + if (right[f] != 0) { + father[right[f]] = f; + } + left[i] = f; + } else { + left[f] = right[i]; + if (left[f] != 0) { + father[left[f]] = f; + } + right[i] = f; + } + if (g != 0) { + if (sonf == 1) { + right[g] = i; + } else { + left[g] = i; + } + } + father[f] = i; + father[i] = g; + up(f); + up(i); + } + + public static void splay(int i, int goal) { + int f = father[i], g = father[f]; + while (f != goal) { + if (g != goal) { + if (lr(i) == lr(f)) { + upRotate(f); + } else { + upRotate(i); + } + } + upRotate(i); + f = father[i]; + g = father[f]; + } + if (goal == 0) { + head = i; + } + } + + public static void add(int num) { + key[++cnt] = num; + size[cnt] = 1; + if (head == 0) { + head = cnt; + } else { + int f = 0, i = head, son = 0; + while (i != 0) { + size[i]++; + f = i; + if (key[i] <= num) { + son = 1; + i = right[i]; + } else { + son = 0; + i = left[i]; + } + } + if (son == 1) { + right[f] = cnt; + } else { + left[f] = cnt; + } + father[cnt] = f; + splay(cnt, 0); + } + } + + public static int index(int x) { + int i = head, last = head; + while (i != 0) { + last = i; + if (size[left[i]] >= x) { + i = left[i]; + } else if (size[left[i]] + 1 < x) { + x -= size[left[i]] + 1; + i = right[i]; + } else { + i = 0; + } + } + splay(last, 0); + return key[last]; + } + + public static void departure() { + int num = limit - change - 1; + int i = head, ans = 0; + while (i != 0) { + if (key[i] <= num) { + ans = i; + i = right[i]; + } else { + i = left[i]; + } + } + if (ans == 0) { + return; + } + splay(ans, 0); + head = right[head]; + father[head] = 0; + } + + public static void main(String[] args) { + Kattio io = new Kattio(); + int n = io.nextInt(); + limit = io.nextInt(); + String op; + int x; + for (int i = 1; i <= n; i++) { + op = io.next(); + x = io.nextInt(); + if (op.equals("I")) { + if (x >= limit) { + enter++; + add(x - change); + } + } else if (op.equals("A")) { + change += x; + } else if (op.equals("S")) { + change -= x; + departure(); + } else { + if (x > size[head]) { + io.println(-1); + } else { + io.println(index(size[head] - x + 1) + change); + } + } + } + io.println(enter - size[head]); + io.flush(); + io.close(); + } + + // Kattio类IO效率很好,但还是不如StreamTokenizer + // 只有StreamTokenizer无法正确处理时,才考虑使用这个类 + // 参考链接 : https://oi-wiki.org/lang/java-pro/ + public static class Kattio extends PrintWriter { + private BufferedReader r; + private StringTokenizer st; + + public Kattio() { + this(System.in, System.out); + } + + public Kattio(InputStream i, OutputStream o) { + super(o); + r = new BufferedReader(new InputStreamReader(i)); + } + + public Kattio(String intput, String output) throws IOException { + super(output); + r = new BufferedReader(new FileReader(intput)); + } + + public String next() { + try { + while (st == null || !st.hasMoreTokens()) + st = new StringTokenizer(r.readLine()); + return st.nextToken(); + } catch (Exception e) { + } + return null; + } + + public int nextInt() { + return Integer.parseInt(next()); + } + + public double nextDouble() { + return Double.parseDouble(next()); + } + + public long nextLong() { + return Long.parseLong(next()); + } + } + +} From b4128f8882da3848ba46e4bbb38a44b24f2abb8c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 27 Nov 2024 18:46:50 +0800 Subject: [PATCH 0409/2029] modify code --- ...er.java => Code03_FrustratedCashier1.java} | 4 +- src/class153/Code03_FrustratedCashier2.java | 173 ++++++++++++++++++ src/class153/Code05_MaintainSequence.java | 69 +++++++ 3 files changed, 244 insertions(+), 2 deletions(-) rename src/class153/{Code03_FrustratedCashier.java => Code03_FrustratedCashier1.java} (98%) create mode 100644 src/class153/Code03_FrustratedCashier2.java create mode 100644 src/class153/Code05_MaintainSequence.java diff --git a/src/class153/Code03_FrustratedCashier.java b/src/class153/Code03_FrustratedCashier1.java similarity index 98% rename from src/class153/Code03_FrustratedCashier.java rename to src/class153/Code03_FrustratedCashier1.java index 46dd980f7..c84147375 100644 --- a/src/class153/Code03_FrustratedCashier.java +++ b/src/class153/Code03_FrustratedCashier1.java @@ -1,6 +1,6 @@ package class153; -// 郁闷的出纳员 +// 郁闷的出纳员(java版) // 测试链接 : https://www.luogu.com.cn/problem/P1486 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -13,7 +13,7 @@ import java.io.PrintWriter; import java.util.StringTokenizer; -public class Code03_FrustratedCashier { +public class Code03_FrustratedCashier1 { public static int MAXN = 300001; diff --git a/src/class153/Code03_FrustratedCashier2.java b/src/class153/Code03_FrustratedCashier2.java new file mode 100644 index 000000000..edb54a585 --- /dev/null +++ b/src/class153/Code03_FrustratedCashier2.java @@ -0,0 +1,173 @@ +package class153; + +// 郁闷的出纳员(C++版) +// 测试链接 : https://www.luogu.com.cn/problem/P1486 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +//#include +//#include +//using namespace std; +// +//const int MAXN = 300001; +// +//int head = 0; +//int cnt = 0; +//int key[MAXN]; +//int fa[MAXN]; +//int ls[MAXN]; +//int rs[MAXN]; +//int size[MAXN]; +//int limit; +//int change = 0; +//int enter = 0; +// +//void up(int i) { +// size[i] = size[ls[i]] + size[rs[i]] + 1; +//} +// +//int lr(int i) { +// return rs[fa[i]] == i ? 1 : 0; +//} +// +//void upRotate(int i) { +// int f = fa[i], g = fa[f], soni = lr(i), sonf = lr(f); +// if (soni == 1) { +// rs[f] = ls[i]; +// if (rs[f] != 0) { +// fa[rs[f]] = f; +// } +// ls[i] = f; +// } else { +// ls[f] = rs[i]; +// if (ls[f] != 0) { +// fa[ls[f]] = f; +// } +// rs[i] = f; +// } +// if (g != 0) { +// if (sonf == 1) { +// rs[g] = i; +// } else { +// ls[g] = i; +// } +// } +// fa[f] = i; +// fa[i] = g; +// up(f); +// up(i); +//} +// +//void splay(int i, int goal) { +// int f = fa[i], g = fa[f]; +// while (f != goal) { +// if (g != goal) { +// if (lr(i) == lr(f)) { +// upRotate(f); +// } else { +// upRotate(i); +// } +// } +// upRotate(i); +// f = fa[i]; +// g = fa[f]; +// } +// if (goal == 0) { +// head = i; +// } +//} +// +//void add(int num) { +// key[++cnt] = num; +// size[cnt] = 1; +// if (head == 0) { +// head = cnt; +// } else { +// int f = 0, i = head, son = 0; +// while (i != 0) { +// size[i]++; +// f = i; +// if (key[i] <= num) { +// son = 1; +// i = rs[i]; +// } else { +// son = 0; +// i = ls[i]; +// } +// } +// if (son == 1) { +// rs[f] = cnt; +// } else { +// ls[f] = cnt; +// } +// fa[cnt] = f; +// splay(cnt, 0); +// } +//} +// +//int index(int x) { +// int i = head, last = head; +// while (i != 0) { +// last = i; +// if (size[ls[i]] >= x) { +// i = ls[i]; +// } else if (size[ls[i]] + 1 < x) { +// x -= size[ls[i]] + 1; +// i = rs[i]; +// } else { +// i = 0; +// } +// } +// splay(last, 0); +// return key[last]; +//} +// +//void departure() { +// int num = limit - change - 1; +// int i = head, ans = 0; +// while (i != 0) { +// if (key[i] <= num) { +// ans = i; +// i = rs[i]; +// } else { +// i = ls[i]; +// } +// } +// if (ans == 0) { +// return; +// } +// splay(ans, 0); +// head = rs[head]; +// fa[head] = 0; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// int n, x; +// char op; +// cin >> n >> limit; +// for (int i = 1; i <= n; i++) { +// cin >> op >> x; +// if (op == 'I') { +// if (x >= limit) { +// enter++; +// add(x - change); +// } +// } else if (op == 'A') { +// change += x; +// } else if (op == 'S') { +// change -= x; +// departure(); +// } else if (op == 'F') { +// if (x > size[head]) { +// cout << -1 << endl; +// } else { +// cout << index(size[head] - x + 1) + change << endl; +// } +// } +// } +// cout << enter - size[head] << endl; +// return 0; +//} \ No newline at end of file diff --git a/src/class153/Code05_MaintainSequence.java b/src/class153/Code05_MaintainSequence.java new file mode 100644 index 000000000..00d5c8de7 --- /dev/null +++ b/src/class153/Code05_MaintainSequence.java @@ -0,0 +1,69 @@ +package class153; + +// 维护数列 +// 测试链接 : https://www.luogu.com.cn/problem/P2042 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.util.StringTokenizer; + +public class Code05_MaintainSequence { + + public static void main(String[] args) { + Kattio io = new Kattio(); + + io.flush(); + io.close(); + } + + // Kattio类IO效率很好,但还是不如StreamTokenizer + // 只有StreamTokenizer无法正确处理时,才考虑使用这个类 + // 参考链接 : https://oi-wiki.org/lang/java-pro/ + public static class Kattio extends PrintWriter { + private BufferedReader r; + private StringTokenizer st; + + public Kattio() { + this(System.in, System.out); + } + + public Kattio(InputStream i, OutputStream o) { + super(o); + r = new BufferedReader(new InputStreamReader(i)); + } + + public Kattio(String intput, String output) throws IOException { + super(output); + r = new BufferedReader(new FileReader(intput)); + } + + public String next() { + try { + while (st == null || !st.hasMoreTokens()) + st = new StringTokenizer(r.readLine()); + return st.nextToken(); + } catch (Exception e) { + } + return null; + } + + public int nextInt() { + return Integer.parseInt(next()); + } + + public double nextDouble() { + return Double.parseDouble(next()); + } + + public long nextLong() { + return Long.parseLong(next()); + } + } + +} From a176c37e00132c1780817126c6b73469dc660158 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 27 Nov 2024 18:51:30 +0800 Subject: [PATCH 0410/2029] modify code --- src/class153/Code04_Bookcase1.java | 69 +++++++++++++++++++ ...nce.java => Code05_MaintainSequence1.java} | 4 +- 2 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 src/class153/Code04_Bookcase1.java rename src/class153/{Code05_MaintainSequence.java => Code05_MaintainSequence1.java} (95%) diff --git a/src/class153/Code04_Bookcase1.java b/src/class153/Code04_Bookcase1.java new file mode 100644 index 000000000..df8a43b71 --- /dev/null +++ b/src/class153/Code04_Bookcase1.java @@ -0,0 +1,69 @@ +package class153; + +// 书架(java版) +// 测试链接 : https://www.luogu.com.cn/problem/P2596 +// s提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.util.StringTokenizer; + +public class Code04_Bookcase1 { + + public static void main(String[] args) { + Kattio io = new Kattio(); + + io.flush(); + io.close(); + } + + // Kattio类IO效率很好,但还是不如StreamTokenizer + // 只有StreamTokenizer无法正确处理时,才考虑使用这个类 + // 参考链接 : https://oi-wiki.org/lang/java-pro/ + public static class Kattio extends PrintWriter { + private BufferedReader r; + private StringTokenizer st; + + public Kattio() { + this(System.in, System.out); + } + + public Kattio(InputStream i, OutputStream o) { + super(o); + r = new BufferedReader(new InputStreamReader(i)); + } + + public Kattio(String intput, String output) throws IOException { + super(output); + r = new BufferedReader(new FileReader(intput)); + } + + public String next() { + try { + while (st == null || !st.hasMoreTokens()) + st = new StringTokenizer(r.readLine()); + return st.nextToken(); + } catch (Exception e) { + } + return null; + } + + public int nextInt() { + return Integer.parseInt(next()); + } + + public double nextDouble() { + return Double.parseDouble(next()); + } + + public long nextLong() { + return Long.parseLong(next()); + } + } + +} diff --git a/src/class153/Code05_MaintainSequence.java b/src/class153/Code05_MaintainSequence1.java similarity index 95% rename from src/class153/Code05_MaintainSequence.java rename to src/class153/Code05_MaintainSequence1.java index 00d5c8de7..83e9bccf7 100644 --- a/src/class153/Code05_MaintainSequence.java +++ b/src/class153/Code05_MaintainSequence1.java @@ -1,6 +1,6 @@ package class153; -// 维护数列 +// 维护数列(java版) // 测试链接 : https://www.luogu.com.cn/problem/P2042 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -13,7 +13,7 @@ import java.io.PrintWriter; import java.util.StringTokenizer; -public class Code05_MaintainSequence { +public class Code05_MaintainSequence1 { public static void main(String[] args) { Kattio io = new Kattio(); From 2a5c2a22ba9e5d6515a807bf1997d1015334e638 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 27 Nov 2024 23:04:35 +0800 Subject: [PATCH 0411/2029] modify code --- src/class153/Code01_Splay1.java | 1 - src/class153/Code01_Splay2.java | 1 - src/class153/Code02_LiteraryTree1.java | 32 +--- src/class153/Code02_LiteraryTree2.java | 32 +--- src/class153/Code03_FrustratedCashier1.java | 1 - src/class153/Code03_FrustratedCashier2.java | 1 - src/class153/Code04_Bookcase1.java | 194 ++++++++++++++++++- src/class153/Code04_Bookcase2.java | 197 ++++++++++++++++++++ src/class153/FollowUp1.java | 1 - src/class153/FollowUp2.java | 1 - 10 files changed, 405 insertions(+), 56 deletions(-) create mode 100644 src/class153/Code04_Bookcase2.java diff --git a/src/class153/Code01_Splay1.java b/src/class153/Code01_Splay1.java index a11d84c58..cbf372795 100644 --- a/src/class153/Code01_Splay1.java +++ b/src/class153/Code01_Splay1.java @@ -116,7 +116,6 @@ public static void add(int num) { } else { int f = 0, i = head, son = 0; while (i != 0) { - size[i]++; f = i; if (key[i] <= num) { son = 1; diff --git a/src/class153/Code01_Splay2.java b/src/class153/Code01_Splay2.java index 596b78485..6d2630084 100644 --- a/src/class153/Code01_Splay2.java +++ b/src/class153/Code01_Splay2.java @@ -108,7 +108,6 @@ // } else { // int f = 0, i = head, son = 0; // while (i != 0) { -// size[i]++; // f = i; // if (key[i] <= num) { // son = 1; diff --git a/src/class153/Code02_LiteraryTree1.java b/src/class153/Code02_LiteraryTree1.java index 401a05938..5f992966b 100644 --- a/src/class153/Code02_LiteraryTree1.java +++ b/src/class153/Code02_LiteraryTree1.java @@ -125,31 +125,15 @@ public static int find(int i, int rank) { } public static void add(int num) { + int i = head; + while (right[i] != 0) { + i = right[i]; + } key[++cnt] = num; size[cnt] = 1; - if (head == 0) { - head = cnt; - } else { - int f = 0, i = head, son = 0; - while (i != 0) { - size[i]++; - f = i; - if (key[i] <= num) { - son = 1; - i = right[i]; - } else { - son = 0; - i = left[i]; - } - } - if (son == 1) { - right[f] = cnt; - } else { - left[f] = cnt; - } - father[cnt] = f; - splay(cnt, 0); - } + father[cnt] = i; + right[i] = cnt; + splay(cnt, 0); } public static void reverse(int l, int r) { @@ -199,10 +183,10 @@ public static void main(String[] args) throws IOException { in.nextToken(); int m = (int) in.nval; add(Integer.MIN_VALUE); - add(Integer.MAX_VALUE); for (int i = 1; i <= n; i++) { add(i); } + add(Integer.MAX_VALUE); for (int i = 1, x, y; i <= m; i++) { in.nextToken(); x = (int) in.nval; diff --git a/src/class153/Code02_LiteraryTree2.java b/src/class153/Code02_LiteraryTree2.java index 25589ea4b..856d94966 100644 --- a/src/class153/Code02_LiteraryTree2.java +++ b/src/class153/Code02_LiteraryTree2.java @@ -112,31 +112,15 @@ //} // //void add(int num) { +// int i = head; +// while (rs[i] != 0) { +// i = rs[i]; +// } // key[++cnt] = num; // size[cnt] = 1; -// if (head == 0) { -// head = cnt; -// } else { -// int f = 0, i = head, son = 0; -// while (i != 0) { -// size[i]++; -// f = i; -// if (key[i] <= num) { -// son = 1; -// i = rs[i]; -// } else { -// son = 0; -// i = ls[i]; -// } -// } -// if (son == 1) { -// rs[f] = cnt; -// } else { -// ls[f] = cnt; -// } -// fa[cnt] = f; -// splay(cnt, 0); -// } +// fa[cnt] = i; +// rs[i] = cnt; +// splay(cnt, 0); //} // //void reverse(int l, int r) { @@ -178,10 +162,10 @@ // int n, m; // cin >> n >> m; // add(INT_MIN); -// add(INT_MAX); // for (int i = 1; i <= n; i++) { // add(i); // } +// add(INT_MAX); // for (int i = 1, x, y; i <= m; i++) { // cin >> x >> y; // reverse(x + 1, y + 1); diff --git a/src/class153/Code03_FrustratedCashier1.java b/src/class153/Code03_FrustratedCashier1.java index c84147375..01c353724 100644 --- a/src/class153/Code03_FrustratedCashier1.java +++ b/src/class153/Code03_FrustratedCashier1.java @@ -100,7 +100,6 @@ public static void add(int num) { } else { int f = 0, i = head, son = 0; while (i != 0) { - size[i]++; f = i; if (key[i] <= num) { son = 1; diff --git a/src/class153/Code03_FrustratedCashier2.java b/src/class153/Code03_FrustratedCashier2.java index edb54a585..7446e729e 100644 --- a/src/class153/Code03_FrustratedCashier2.java +++ b/src/class153/Code03_FrustratedCashier2.java @@ -86,7 +86,6 @@ // } else { // int f = 0, i = head, son = 0; // while (i != 0) { -// size[i]++; // f = i; // if (key[i] <= num) { // son = 1; diff --git a/src/class153/Code04_Bookcase1.java b/src/class153/Code04_Bookcase1.java index df8a43b71..2c9bf8485 100644 --- a/src/class153/Code04_Bookcase1.java +++ b/src/class153/Code04_Bookcase1.java @@ -2,7 +2,7 @@ // 书架(java版) // 测试链接 : https://www.luogu.com.cn/problem/P2596 -// s提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.BufferedReader; import java.io.FileReader; @@ -15,9 +15,199 @@ public class Code04_Bookcase1 { + public static int MAXN = 80001; + + public static int head = 0; + + public static int cnt = 0; + + public static int[] num = new int[MAXN]; + + public static int[] pos = new int[MAXN]; + + public static int[] father = new int[MAXN]; + + public static int[] left = new int[MAXN]; + + public static int[] right = new int[MAXN]; + + public static int[] size = new int[MAXN]; + + public static int n, m; + + public static void up(int i) { + size[i] = size[left[i]] + size[right[i]] + 1; + } + + public static int lr(int i) { + return right[father[i]] == i ? 1 : 0; + } + + public static void upRotate(int i) { + int f = father[i], g = father[f], soni = lr(i), sonf = lr(f); + if (soni == 1) { + right[f] = left[i]; + if (right[f] != 0) { + father[right[f]] = f; + } + left[i] = f; + } else { + left[f] = right[i]; + if (left[f] != 0) { + father[left[f]] = f; + } + right[i] = f; + } + if (g != 0) { + if (sonf == 1) { + right[g] = i; + } else { + left[g] = i; + } + } + father[f] = i; + father[i] = g; + up(f); + up(i); + } + + public static void splay(int i, int goal) { + int f = father[i], g = father[f]; + while (f != goal) { + if (g != goal) { + if (lr(i) == lr(f)) { + upRotate(f); + } else { + upRotate(i); + } + } + upRotate(i); + f = father[i]; + g = father[f]; + } + if (goal == 0) { + head = i; + } + } + + // 返回排名为rank的节点编号 + public static int find(int rank) { + int i = head, ans = 0; + while (i != 0) { + if (size[left[i]] + 1 == rank) { + ans = i; + break; + } else if (size[left[i]] >= rank) { + i = left[i]; + } else { + rank -= size[left[i]] + 1; + i = right[i]; + } + } + splay(ans, 0); + return ans; + } + + public static void add(int s) { + int i = head; + while (right[i] != 0) { + i = right[i]; + } + num[++cnt] = s; + pos[s] = cnt; + size[cnt] = 1; + father[cnt] = i; + right[i] = cnt; + splay(cnt, 0); + } + + public static int ask(int s) { + int i = pos[s]; + splay(i, 0); + return size[left[i]]; + } + + public static int query(int s) { + return num[find(s)]; + } + + // 节点编号为i的节点,已知排名是rank,结构上把该节点分离出来 + public static void disconnect(int i, int rank) { + splay(i, 0); + if (rank == 1) { + head = right[head]; + father[head] = 0; + } else if (rank == n) { + head = left[head]; + father[head] = 0; + } else { + int l = find(rank - 1); + splay(l, 0); + splay(i, l); + right[l] = right[i]; + father[right[l]] = l; + up(l); + } + father[i] = left[i] = right[i] = 0; + } + + // 节点编号为i的节点已经分离出来了,插入回结构中,让其排名为rank + public static void connect(int i, int rank) { + if (rank == 1) { + right[i] = head; + father[right[i]] = i; + head = i; + up(i); + } else if (rank == n) { + left[i] = head; + father[left[i]] = i; + head = i; + up(i); + } else { + int r = find(rank - 1); + int next = find(rank); + splay(r, 0); + splay(next, r); + right[r] = i; + father[i] = r; + right[i] = next; + father[next] = i; + up(i); + up(r); + } + } + + // 节点编号为i的节点,现在排名from,移动到排名to的位置 + public static void move(int i, int from, int to) { + disconnect(i, from); + connect(i, to); + } + public static void main(String[] args) { Kattio io = new Kattio(); - + n = io.nextInt(); + m = io.nextInt(); + for (int i = 1; i <= n; i++) { + add(io.nextInt()); + } + String op; + for (int i = 1, s, t, small; i <= m; i++) { + op = io.next(); + s = io.nextInt(); + small = ask(s); + if (op.equals("Top")) { + move(pos[s], small + 1, 1); + } else if (op.equals("Bottom")) { + move(pos[s], small + 1, n); + } else if (op.equals("Insert")) { + t = io.nextInt(); + move(pos[s], small + 1, ask(s) + t + 1); + } else if (op.equals("Ask")) { + io.println(small); + } else { + io.println(query(s)); + } + } io.flush(); io.close(); } diff --git a/src/class153/Code04_Bookcase2.java b/src/class153/Code04_Bookcase2.java new file mode 100644 index 000000000..95402f143 --- /dev/null +++ b/src/class153/Code04_Bookcase2.java @@ -0,0 +1,197 @@ +package class153; + +// 书架(C++版) +// 测试链接 : https://www.luogu.com.cn/problem/P2596 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +//#include +//#include +//using namespace std; +// +//const int MAXN = 80001; +// +//int head = 0; +//int cnt = 0; +//int num[MAXN]; +//int pos[MAXN]; +//int fa[MAXN]; +//int ls[MAXN]; +//int rs[MAXN]; +//int size[MAXN]; +//int n, m; +// +//void up(int i) { +// size[i] = size[ls[i]] + size[rs[i]] + 1; +//} +// +//int lr(int i) { +// return rs[fa[i]] == i ? 1 : 0; +//} +// +//void upRotate(int i) { +// int f = fa[i], g = fa[f], soni = lr(i), sonf = lr(f); +// if (soni == 1) { +// rs[f] = ls[i]; +// if (rs[f] != 0) { +// fa[rs[f]] = f; +// } +// ls[i] = f; +// } else { +// ls[f] = rs[i]; +// if (ls[f] != 0) { +// fa[ls[f]] = f; +// } +// rs[i] = f; +// } +// if (g != 0) { +// if (sonf == 1) { +// rs[g] = i; +// } else { +// ls[g] = i; +// } +// } +// fa[f] = i; +// fa[i] = g; +// up(f); +// up(i); +//} +// +//void splay(int i, int goal) { +// int f = fa[i], g = fa[f]; +// while (f != goal) { +// if (g != goal) { +// if (lr(i) == lr(f)) { +// upRotate(f); +// } else { +// upRotate(i); +// } +// } +// upRotate(i); +// f = fa[i]; +// g = fa[f]; +// } +// if (goal == 0) { +// head = i; +// } +//} +// +//int find(int rank) { +// int i = head, ans = 0; +// while (i != 0) { +// if (size[ls[i]] + 1 == rank) { +// ans = i; +// break; +// } else if (size[ls[i]] >= rank) { +// i = ls[i]; +// } else { +// rank -= size[ls[i]] + 1; +// i = rs[i]; +// } +// } +// splay(ans, 0); +// return ans; +//} +// +//void add(int s) { +// int i = head; +// while (rs[i] != 0) { +// i = rs[i]; +// } +// num[++cnt] = s; +// pos[s] = cnt; +// size[cnt] = 1; +// fa[cnt] = i; +// rs[i] = cnt; +// splay(cnt, 0); +//} +// +//int ask(int s) { +// int i = pos[s]; +// splay(i, 0); +// return size[ls[i]]; +//} +// +//int query(int s) { +// return num[find(s)]; +//} +// +//void disconnect(int i, int rank) { +// splay(i, 0); +// if (rank == 1) { +// head = rs[head]; +// fa[head] = 0; +// } else if (rank == n) { +// head = ls[head]; +// fa[head] = 0; +// } else { +// int l = find(rank - 1); +// splay(l, 0); +// splay(i, l); +// rs[l] = rs[i]; +// fa[rs[l]] = l; +// up(l); +// } +// fa[i] = ls[i] = rs[i] = 0; +//} +// +//void connect(int i, int rank) { +// if (rank == 1) { +// rs[i] = head; +// fa[rs[i]] = i; +// head = i; +// up(i); +// } else if (rank == n) { +// ls[i] = head; +// fa[ls[i]] = i; +// head = i; +// up(i); +// } else { +// int r = find(rank - 1); +// int next = find(rank); +// splay(r, 0); +// splay(next, r); +// rs[r] = i; +// fa[i] = r; +// rs[i] = next; +// fa[next] = i; +// up(i); +// up(r); +// } +//} +// +//void move(int i, int from, int to) { +// disconnect(i, from); +// connect(i, to); +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1; i <= n; i++) { +// int x; +// cin >> x; +// add(x); +// } +// for (int i = 1; i <= m; i++) { +// string op; +// int s, t, small; +// cin >> op >> s; +// small = ask(s); +// if (op == "Top") { +// move(pos[s], small + 1, 1); +// } else if (op == "Bottom") { +// move(pos[s], small + 1, n); +// } else if (op == "Insert") { +// cin >> t; +// move(pos[s], small + 1, ask(s) + t + 1); +// } else if (op == "Ask") { +// cout << small << endl; +// } else { +// cout << query(s) << endl; +// } +// } +// return 0; +//} \ No newline at end of file diff --git a/src/class153/FollowUp1.java b/src/class153/FollowUp1.java index 09931bdc4..6389d659d 100644 --- a/src/class153/FollowUp1.java +++ b/src/class153/FollowUp1.java @@ -109,7 +109,6 @@ public static void add(int num) { } else { int f = 0, i = head, son = 0; while (i != 0) { - size[i]++; f = i; if (key[i] <= num) { son = 1; diff --git a/src/class153/FollowUp2.java b/src/class153/FollowUp2.java index 6c3122cb2..bda072b72 100644 --- a/src/class153/FollowUp2.java +++ b/src/class153/FollowUp2.java @@ -101,7 +101,6 @@ // } else { // int f = 0, i = head, son = 0; // while (i != 0) { -// size[i]++; // f = i; // if (key[i] <= num) { // son = 1; From ae6c65fe335ef3a3004a17eb0d2b58211b1bb052 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 27 Nov 2024 23:06:48 +0800 Subject: [PATCH 0412/2029] modify code --- src/class153/Code04_Bookcase1.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/class153/Code04_Bookcase1.java b/src/class153/Code04_Bookcase1.java index 2c9bf8485..5b8ba89e6 100644 --- a/src/class153/Code04_Bookcase1.java +++ b/src/class153/Code04_Bookcase1.java @@ -151,7 +151,7 @@ public static void disconnect(int i, int rank) { father[i] = left[i] = right[i] = 0; } - // 节点编号为i的节点已经分离出来了,插入回结构中,让其排名为rank + // 节点编号为i的节点已经分离出来了,加入回结构中,让其排名为rank public static void connect(int i, int rank) { if (rank == 1) { right[i] = head; @@ -178,6 +178,7 @@ public static void connect(int i, int rank) { } // 节点编号为i的节点,现在排名from,移动到排名to的位置 + // 本题不需要做到这个功能,但这种扩展性可能是其他题目需要的 public static void move(int i, int from, int to) { disconnect(i, from); connect(i, to); From 4855188ae7db516ee1019103da15a239039e22ac Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 27 Nov 2024 23:08:22 +0800 Subject: [PATCH 0413/2029] modify code --- src/class153/Code04_Bookcase1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class153/Code04_Bookcase1.java b/src/class153/Code04_Bookcase1.java index 5b8ba89e6..c18f3b7d2 100644 --- a/src/class153/Code04_Bookcase1.java +++ b/src/class153/Code04_Bookcase1.java @@ -178,7 +178,7 @@ public static void connect(int i, int rank) { } // 节点编号为i的节点,现在排名from,移动到排名to的位置 - // 本题不需要做到这个功能,但这种扩展性可能是其他题目需要的 + // 本题不需要做到这个程度,但这种扩展性可能是其他题目需要的 public static void move(int i, int from, int to) { disconnect(i, from); connect(i, to); From 897fcc1b9629edf55f6bf810739f18acbcc23269 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 28 Nov 2024 10:21:10 +0800 Subject: [PATCH 0414/2029] modify code --- src/class153/Code04_Bookcase1.java | 21 +++++++++++---------- src/class153/Code04_Bookcase2.java | 13 +++++++------ 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/class153/Code04_Bookcase1.java b/src/class153/Code04_Bookcase1.java index c18f3b7d2..65505a0c5 100644 --- a/src/class153/Code04_Bookcase1.java +++ b/src/class153/Code04_Bookcase1.java @@ -90,7 +90,7 @@ public static void splay(int i, int goal) { } } - // 返回排名为rank的节点编号 + // 返回中序排名为rank的节点编号 public static int find(int rank) { int i = head, ans = 0; while (i != 0) { @@ -131,7 +131,7 @@ public static int query(int s) { return num[find(s)]; } - // 节点编号为i的节点,已知排名是rank,结构上把该节点分离出来 + // 节点编号为i的节点,已知中序排名是rank,结构上把该节点分离出来 public static void disconnect(int i, int rank) { splay(i, 0); if (rank == 1) { @@ -151,7 +151,7 @@ public static void disconnect(int i, int rank) { father[i] = left[i] = right[i] = 0; } - // 节点编号为i的节点已经分离出来了,加入回结构中,让其排名为rank + // 节点编号为i的节点已经分离出来了,加入回结构中,让其中序排名为rank public static void connect(int i, int rank) { if (rank == 1) { right[i] = head; @@ -177,11 +177,12 @@ public static void connect(int i, int rank) { } } - // 节点编号为i的节点,现在排名from,移动到排名to的位置 + // 中序排名为a的节点,移动到中序排名为b的位置 // 本题不需要做到这个程度,但这种扩展性可能是其他题目需要的 - public static void move(int i, int from, int to) { - disconnect(i, from); - connect(i, to); + public static void move(int a, int b) { + int i = find(a); + disconnect(i, a); + connect(i, b); } public static void main(String[] args) { @@ -197,12 +198,12 @@ public static void main(String[] args) { s = io.nextInt(); small = ask(s); if (op.equals("Top")) { - move(pos[s], small + 1, 1); + move(small + 1, 1); } else if (op.equals("Bottom")) { - move(pos[s], small + 1, n); + move(small + 1, n); } else if (op.equals("Insert")) { t = io.nextInt(); - move(pos[s], small + 1, ask(s) + t + 1); + move(small + 1, small + t + 1); } else if (op.equals("Ask")) { io.println(small); } else { diff --git a/src/class153/Code04_Bookcase2.java b/src/class153/Code04_Bookcase2.java index 95402f143..fa85a1cd7 100644 --- a/src/class153/Code04_Bookcase2.java +++ b/src/class153/Code04_Bookcase2.java @@ -161,9 +161,10 @@ // } //} // -//void move(int i, int from, int to) { -// disconnect(i, from); -// connect(i, to); +//void move(int a, int b) { +// int i = find(a); +// disconnect(i, a); +// connect(i, b); //} // //int main() { @@ -181,12 +182,12 @@ // cin >> op >> s; // small = ask(s); // if (op == "Top") { -// move(pos[s], small + 1, 1); +// move(small + 1, 1); // } else if (op == "Bottom") { -// move(pos[s], small + 1, n); +// move(small + 1, n); // } else if (op == "Insert") { // cin >> t; -// move(pos[s], small + 1, ask(s) + t + 1); +// move(small + 1, small + t + 1); // } else if (op == "Ask") { // cout << small << endl; // } else { From 28eaa87c300a9806caa8eba144a8cf87002aa836 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 28 Nov 2024 12:28:37 +0800 Subject: [PATCH 0415/2029] modify code --- src/class153/Code02_LiteraryTree1.java | 14 ++-- src/class153/Code02_LiteraryTree2.java | 18 ++--- src/class153/Code04_Bookcase1.java | 87 ++++++++------------- src/class153/Code04_Bookcase2.java | 90 ++++++++-------------- src/class153/Code05_MaintainSequence1.java | 69 ----------------- 5 files changed, 76 insertions(+), 202 deletions(-) delete mode 100644 src/class153/Code05_MaintainSequence1.java diff --git a/src/class153/Code02_LiteraryTree1.java b/src/class153/Code02_LiteraryTree1.java index 5f992966b..511403a2c 100644 --- a/src/class153/Code02_LiteraryTree1.java +++ b/src/class153/Code02_LiteraryTree1.java @@ -23,7 +23,7 @@ public class Code02_LiteraryTree1 { public static int cnt = 0; - public static int[] key = new int[MAXN]; + public static int[] num = new int[MAXN]; public static int[] father = new int[MAXN]; @@ -124,12 +124,12 @@ public static int find(int i, int rank) { return 0; } - public static void add(int num) { + public static void add(int x) { int i = head; while (right[i] != 0) { i = right[i]; } - key[++cnt] = num; + num[++cnt] = x; size[cnt] = 1; father[cnt] = i; right[i] = cnt; @@ -150,7 +150,7 @@ public static void inorder(int i) { if (i != 0) { down(i); inorder(left[i]); - ans[++ai] = key[i]; + ans[++ai] = num[i]; inorder(right[i]); } } @@ -168,7 +168,7 @@ public static void inorder() { i = left[i]; } else { i = stack[si--]; - ans[++ai] = key[i]; + ans[++ai] = num[i]; i = right[i]; } } @@ -182,11 +182,11 @@ public static void main(String[] args) throws IOException { int n = (int) in.nval; in.nextToken(); int m = (int) in.nval; - add(Integer.MIN_VALUE); + add(0); for (int i = 1; i <= n; i++) { add(i); } - add(Integer.MAX_VALUE); + add(0); for (int i = 1, x, y; i <= m; i++) { in.nextToken(); x = (int) in.nval; diff --git a/src/class153/Code02_LiteraryTree2.java b/src/class153/Code02_LiteraryTree2.java index 856d94966..3f236a181 100644 --- a/src/class153/Code02_LiteraryTree2.java +++ b/src/class153/Code02_LiteraryTree2.java @@ -10,16 +10,14 @@ // 提交如下代码,可以通过所有测试用例 //#include -//#include -//#include -//#include +// //using namespace std; // //const int MAXN = 100005; // //int head = 0; //int cnt = 0; -//int key[MAXN]; +//int num[MAXN]; //int fa[MAXN]; //int ls[MAXN]; //int rs[MAXN]; @@ -111,12 +109,12 @@ // return 0; //} // -//void add(int num) { +//void add(int x) { // int i = head; // while (rs[i] != 0) { // i = rs[i]; // } -// key[++cnt] = num; +// num[++cnt] = x; // size[cnt] = 1; // fa[cnt] = i; // rs[i] = cnt; @@ -135,7 +133,7 @@ // if (i != 0) { // down(i); // inorder(ls[i]); -// ans[++ai] = key[i]; +// ans[++ai] = num[i]; // inorder(rs[i]); // } //} @@ -150,7 +148,7 @@ // i = ls[i]; // } else { // i = sta[si--]; -// ans[++ai] = key[i]; +// ans[++ai] = num[i]; // i = rs[i]; // } // } @@ -161,11 +159,11 @@ // cin.tie(nullptr); // int n, m; // cin >> n >> m; -// add(INT_MIN); +// add(0); // for (int i = 1; i <= n; i++) { // add(i); // } -// add(INT_MAX); +// add(0); // for (int i = 1, x, y; i <= m; i++) { // cin >> x >> y; // reverse(x + 1, y + 1); diff --git a/src/class153/Code04_Bookcase1.java b/src/class153/Code04_Bookcase1.java index 65505a0c5..e8cc8c205 100644 --- a/src/class153/Code04_Bookcase1.java +++ b/src/class153/Code04_Bookcase1.java @@ -15,7 +15,7 @@ public class Code04_Bookcase1 { - public static int MAXN = 80001; + public static int MAXN = 80005; public static int head = 0; @@ -131,83 +131,56 @@ public static int query(int s) { return num[find(s)]; } - // 节点编号为i的节点,已知中序排名是rank,结构上把该节点分离出来 - public static void disconnect(int i, int rank) { - splay(i, 0); - if (rank == 1) { - head = right[head]; - father[head] = 0; - } else if (rank == n) { - head = left[head]; - father[head] = 0; - } else { - int l = find(rank - 1); - splay(l, 0); - splay(i, l); - right[l] = right[i]; - father[right[l]] = l; - up(l); - } - father[i] = left[i] = right[i] = 0; - } - - // 节点编号为i的节点已经分离出来了,加入回结构中,让其中序排名为rank - public static void connect(int i, int rank) { - if (rank == 1) { - right[i] = head; - father[right[i]] = i; - head = i; - up(i); - } else if (rank == n) { - left[i] = head; - father[left[i]] = i; - head = i; - up(i); - } else { - int r = find(rank - 1); - int next = find(rank); - splay(r, 0); - splay(next, r); - right[r] = i; - father[i] = r; - right[i] = next; - father[next] = i; - up(i); - up(r); - } - } - // 中序排名为a的节点,移动到中序排名为b的位置 - // 本题不需要做到这个程度,但这种扩展性可能是其他题目需要的 + // 注意a不会是1和n位置,b也如此 + // 因为1位置和n位置提前加入了预备值 public static void move(int a, int b) { int i = find(a); - disconnect(i, a); - connect(i, b); + int l = find(a - 1); + splay(l, 0); + splay(i, l); + right[l] = right[i]; + father[right[l]] = l; + up(l); + left[i] = right[i] = 0; + int r = find(b - 1); + int next = find(b); + splay(r, 0); + splay(next, r); + right[r] = i; + father[i] = r; + right[i] = next; + father[next] = i; + up(i); + up(r); } public static void main(String[] args) { Kattio io = new Kattio(); n = io.nextInt(); m = io.nextInt(); + add(0); for (int i = 1; i <= n; i++) { add(io.nextInt()); } + add(n + 1); + n = n + 2; String op; - for (int i = 1, s, t, small; i <= m; i++) { + for (int i = 1, s, t, rank; i <= m; i++) { op = io.next(); s = io.nextInt(); - small = ask(s); + rank = ask(s) + 1; if (op.equals("Top")) { - move(small + 1, 1); + move(rank, 2); } else if (op.equals("Bottom")) { - move(small + 1, n); + move(rank, n - 1); } else if (op.equals("Insert")) { t = io.nextInt(); - move(small + 1, small + t + 1); + move(rank, rank + t); } else if (op.equals("Ask")) { - io.println(small); + io.println(rank - 2); } else { - io.println(query(s)); + io.println(query(s + 1)); } } io.flush(); diff --git a/src/class153/Code04_Bookcase2.java b/src/class153/Code04_Bookcase2.java index fa85a1cd7..89149b525 100644 --- a/src/class153/Code04_Bookcase2.java +++ b/src/class153/Code04_Bookcase2.java @@ -6,11 +6,11 @@ // 提交如下代码,可以通过所有测试用例 //#include -//#include //#include +// //using namespace std; // -//const int MAXN = 80001; +//const int MAXN = 80005; // //int head = 0; //int cnt = 0; @@ -20,7 +20,6 @@ //int ls[MAXN]; //int rs[MAXN]; //int size[MAXN]; -//int n, m; // //void up(int i) { // size[i] = size[ls[i]] + size[rs[i]] + 1; @@ -117,81 +116,54 @@ // return num[find(s)]; //} // -//void disconnect(int i, int rank) { -// splay(i, 0); -// if (rank == 1) { -// head = rs[head]; -// fa[head] = 0; -// } else if (rank == n) { -// head = ls[head]; -// fa[head] = 0; -// } else { -// int l = find(rank - 1); -// splay(l, 0); -// splay(i, l); -// rs[l] = rs[i]; -// fa[rs[l]] = l; -// up(l); -// } -// fa[i] = ls[i] = rs[i] = 0; -//} -// -//void connect(int i, int rank) { -// if (rank == 1) { -// rs[i] = head; -// fa[rs[i]] = i; -// head = i; -// up(i); -// } else if (rank == n) { -// ls[i] = head; -// fa[ls[i]] = i; -// head = i; -// up(i); -// } else { -// int r = find(rank - 1); -// int next = find(rank); -// splay(r, 0); -// splay(next, r); -// rs[r] = i; -// fa[i] = r; -// rs[i] = next; -// fa[next] = i; -// up(i); -// up(r); -// } -//} -// //void move(int a, int b) { // int i = find(a); -// disconnect(i, a); -// connect(i, b); +// int l = find(a - 1); +// splay(l, 0); +// splay(i, l); +// rs[l] = rs[i]; +// fa[rs[l]] = l; +// up(l); +// ls[i] = rs[i] = 0; +// int r = find(b - 1); +// int next = find(b); +// splay(r, 0); +// splay(next, r); +// rs[r] = i; +// fa[i] = r; +// rs[i] = next; +// fa[next] = i; +// up(i); +// up(r); //} // //int main() { // ios::sync_with_stdio(false); // cin.tie(nullptr); +// int n, m; // cin >> n >> m; -// for (int i = 1; i <= n; i++) { -// int x; +// add(0); +// for (int i = 1, x; i <= n; i++) { // cin >> x; // add(x); // } -// for (int i = 1; i <= m; i++) { +// add(n + 1); +// n = n + 2; +// for (int i = 1, s, t, rank; i <= m; i++) { // string op; -// int s, t, small; // cin >> op >> s; -// small = ask(s); +// rank = ask(s) + 1; // if (op == "Top") { -// move(small + 1, 1); +// move(rank, 2); // } else if (op == "Bottom") { -// move(small + 1, n); +// move(rank, n - 1); // } else if (op == "Insert") { // cin >> t; -// move(small + 1, small + t + 1); +// move(rank, rank + t); // } else if (op == "Ask") { -// cout << small << endl; +// cout << rank - 2 << endl; // } else { -// cout << query(s) << endl; +// cout << query(s + 1) << endl; // } // } // return 0; diff --git a/src/class153/Code05_MaintainSequence1.java b/src/class153/Code05_MaintainSequence1.java deleted file mode 100644 index 83e9bccf7..000000000 --- a/src/class153/Code05_MaintainSequence1.java +++ /dev/null @@ -1,69 +0,0 @@ -package class153; - -// 维护数列(java版) -// 测试链接 : https://www.luogu.com.cn/problem/P2042 -// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.io.PrintWriter; -import java.util.StringTokenizer; - -public class Code05_MaintainSequence1 { - - public static void main(String[] args) { - Kattio io = new Kattio(); - - io.flush(); - io.close(); - } - - // Kattio类IO效率很好,但还是不如StreamTokenizer - // 只有StreamTokenizer无法正确处理时,才考虑使用这个类 - // 参考链接 : https://oi-wiki.org/lang/java-pro/ - public static class Kattio extends PrintWriter { - private BufferedReader r; - private StringTokenizer st; - - public Kattio() { - this(System.in, System.out); - } - - public Kattio(InputStream i, OutputStream o) { - super(o); - r = new BufferedReader(new InputStreamReader(i)); - } - - public Kattio(String intput, String output) throws IOException { - super(output); - r = new BufferedReader(new FileReader(intput)); - } - - public String next() { - try { - while (st == null || !st.hasMoreTokens()) - st = new StringTokenizer(r.readLine()); - return st.nextToken(); - } catch (Exception e) { - } - return null; - } - - public int nextInt() { - return Integer.parseInt(next()); - } - - public double nextDouble() { - return Double.parseDouble(next()); - } - - public long nextLong() { - return Long.parseLong(next()); - } - } - -} From 70b5398e49a9c9998c2f22a5a763216305645a68 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 28 Nov 2024 12:32:38 +0800 Subject: [PATCH 0416/2029] modify code --- src/class153/Code02_LiteraryTree1.java | 2 ++ src/class153/Code04_Bookcase1.java | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/class153/Code02_LiteraryTree1.java b/src/class153/Code02_LiteraryTree1.java index 511403a2c..3c0b37650 100644 --- a/src/class153/Code02_LiteraryTree1.java +++ b/src/class153/Code02_LiteraryTree1.java @@ -136,6 +136,8 @@ public static void add(int x) { splay(cnt, 0); } + // 注意l永远不会是最左位置,r永远不会是最右位置 + // 因为最左和最右位置提前加入了预备值,永远不会修改 public static void reverse(int l, int r) { int i = find(head, l - 1); int j = find(head, r + 1); diff --git a/src/class153/Code04_Bookcase1.java b/src/class153/Code04_Bookcase1.java index e8cc8c205..926f61607 100644 --- a/src/class153/Code04_Bookcase1.java +++ b/src/class153/Code04_Bookcase1.java @@ -133,7 +133,7 @@ public static int query(int s) { // 中序排名为a的节点,移动到中序排名为b的位置 // 注意a不会是1和n位置,b也如此 - // 因为1位置和n位置提前加入了预备值 + // 因为1位置和n位置提前加入了预备值,永远不会修改 public static void move(int a, int b) { int i = find(a); int l = find(a - 1); From 27cda55ee7cdaf2f12cc491492ba902122496fea Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 28 Nov 2024 19:27:11 +0800 Subject: [PATCH 0417/2029] modify code --- src/class153/Code04_Bookcase1.java | 19 +- src/class153/Code04_Bookcase2.java | 12 +- src/class153/Code05_MaintainSequence1.java | 545 +++++++++++++++++++++ src/class153/Code05_MaintainSequence2.java | 268 ++++++++++ 4 files changed, 832 insertions(+), 12 deletions(-) create mode 100644 src/class153/Code05_MaintainSequence1.java create mode 100644 src/class153/Code05_MaintainSequence2.java diff --git a/src/class153/Code04_Bookcase1.java b/src/class153/Code04_Bookcase1.java index 926f61607..5c14f6613 100644 --- a/src/class153/Code04_Bookcase1.java +++ b/src/class153/Code04_Bookcase1.java @@ -92,11 +92,10 @@ public static void splay(int i, int goal) { // 返回中序排名为rank的节点编号 public static int find(int rank) { - int i = head, ans = 0; + int i = head; while (i != 0) { if (size[left[i]] + 1 == rank) { - ans = i; - break; + return i; } else if (size[left[i]] >= rank) { i = left[i]; } else { @@ -104,8 +103,7 @@ public static int find(int rank) { i = right[i]; } } - splay(ans, 0); - return ans; + return 0; } public static void add(int s) { @@ -128,7 +126,9 @@ public static int ask(int s) { } public static int query(int s) { - return num[find(s)]; + int i = find(s); + splay(i, 0); + return num[i]; } // 中序排名为a的节点,移动到中序排名为b的位置 @@ -164,6 +164,8 @@ public static void main(String[] args) { add(io.nextInt()); } add(n + 1); + // 注意在最左插入了0,最右插入了n+1,作为准备值,所以一共n+2个数 + // 下面操作时,不要忘了最左是0,最右是n+1,并且永远不修改 n = n + 2; String op; for (int i = 1, s, t, rank; i <= m; i++) { @@ -171,15 +173,20 @@ public static void main(String[] args) { s = io.nextInt(); rank = ask(s) + 1; if (op.equals("Top")) { + // 因为有最左侧的准备值,所以开头是中序排名2的位置 move(rank, 2); } else if (op.equals("Bottom")) { + // 因为有最右侧的准备值,所以结尾是中序排名n-1的位置 move(rank, n - 1); } else if (op.equals("Insert")) { t = io.nextInt(); move(rank, rank + t); } else if (op.equals("Ask")) { + // rank代表当前数字的排名,因为有最左侧的准备值 + // 所以排名其实是rank-1,题目要返回小于的数量,所以是rank - 2 io.println(rank - 2); } else { + // 因为有最左侧的准备值,所以查s+1名的数字 io.println(query(s + 1)); } } diff --git a/src/class153/Code04_Bookcase2.java b/src/class153/Code04_Bookcase2.java index 89149b525..23072d50e 100644 --- a/src/class153/Code04_Bookcase2.java +++ b/src/class153/Code04_Bookcase2.java @@ -77,11 +77,10 @@ //} // //int find(int rank) { -// int i = head, ans = 0; +// int i = head; // while (i != 0) { // if (size[ls[i]] + 1 == rank) { -// ans = i; -// break; +// return i; // } else if (size[ls[i]] >= rank) { // i = ls[i]; // } else { @@ -89,8 +88,7 @@ // i = rs[i]; // } // } -// splay(ans, 0); -// return ans; +// return 0; //} // //void add(int s) { @@ -113,7 +111,9 @@ //} // //int query(int s) { -// return num[find(s)]; +// int i = find(s); +// splay(i, 0); +// return num[i]; //} // //void move(int a, int b) { diff --git a/src/class153/Code05_MaintainSequence1.java b/src/class153/Code05_MaintainSequence1.java new file mode 100644 index 000000000..96f08251c --- /dev/null +++ b/src/class153/Code05_MaintainSequence1.java @@ -0,0 +1,545 @@ +package class153; + +// 维护数列(java版) +// 测试链接 : https://www.luogu.com.cn/problem/P2042 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.BufferedWriter; +import java.io.ByteArrayOutputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.Writer; +import java.util.InputMismatchException; + +public class Code05_MaintainSequence1 { + + public static int MAXN = 500005; + + public static int INF = 1000000001; + + public static int head = 0; + + public static int[] space = new int[MAXN]; + + public static int si; + + public static int[] arr = new int[MAXN]; + + public static int[] num = new int[MAXN]; + + public static int[] father = new int[MAXN]; + + public static int[] left = new int[MAXN]; + + public static int[] right = new int[MAXN]; + + public static int[] size = new int[MAXN]; + + public static int[] sum = new int[MAXN]; + + // 整体子数组最大累加和,不能空 + public static int[] all = new int[MAXN]; + + // 前缀子数组最大累加和,可以空 + public static int[] pre = new int[MAXN]; + + // 后缀子数组最大累加和,可以空 + public static int[] suf = new int[MAXN]; + + public static boolean[] update = new boolean[MAXN]; + + public static int[] change = new int[MAXN]; + + public static boolean[] reverse = new boolean[MAXN]; + + public static void up(int i) { + size[i] = size[left[i]] + size[right[i]] + 1; + sum[i] = sum[left[i]] + sum[right[i]] + num[i]; + all[i] = Math.max(Math.max(all[left[i]], all[right[i]]), suf[left[i]] + num[i] + pre[right[i]]); + pre[i] = Math.max(pre[left[i]], sum[left[i]] + num[i] + pre[right[i]]); + suf[i] = Math.max(suf[right[i]], suf[left[i]] + num[i] + sum[right[i]]); + } + + public static int lr(int i) { + return right[father[i]] == i ? 1 : 0; + } + + public static void upRotate(int i) { + int f = father[i], g = father[f], soni = lr(i), sonf = lr(f); + if (soni == 1) { + right[f] = left[i]; + if (right[f] != 0) { + father[right[f]] = f; + } + left[i] = f; + } else { + left[f] = right[i]; + if (left[f] != 0) { + father[left[f]] = f; + } + right[i] = f; + } + if (g != 0) { + if (sonf == 1) { + right[g] = i; + } else { + left[g] = i; + } + } + father[f] = i; + father[i] = g; + up(f); + up(i); + } + + public static void splay(int i, int goal) { + int f = father[i], g = father[f]; + while (f != goal) { + if (g != goal) { + if (lr(i) == lr(f)) { + upRotate(f); + } else { + upRotate(i); + } + } + upRotate(i); + f = father[i]; + g = father[f]; + } + if (goal == 0) { + head = i; + } + } + + public static void setValue(int i, int val) { + if (i != 0) { + update[i] = true; + change[i] = val; + num[i] = val; + sum[i] = size[i] * val; + all[i] = Math.max(sum[i], val); + pre[i] = Math.max(sum[i], 0); + suf[i] = Math.max(sum[i], 0); + } + } + + public static void setReverse(int i) { + if (i != 0) { + int tmp = left[i]; + left[i] = right[i]; + right[i] = tmp; + tmp = pre[i]; + pre[i] = suf[i]; + suf[i] = tmp; + reverse[i] = !reverse[i]; + } + } + + public static void down(int i) { + if (update[i]) { + setValue(left[i], change[i]); + setValue(right[i], change[i]); + update[i] = false; + } + if (reverse[i]) { + setReverse(left[i]); + setReverse(right[i]); + reverse[i] = false; + } + } + + public static int init(int val) { + int i = space[si--]; + size[i] = 1; + num[i] = sum[i] = all[i] = val; + pre[i] = suf[i] = Math.max(val, 0); + father[i] = left[i] = right[i] = 0; + update[i] = reverse[i] = false; + return i; + } + + public static int build(int l, int r) { + int mid = (l + r) / 2; + int root = init(arr[mid]); + if (l < mid) { + left[root] = build(l, mid - 1); + father[left[root]] = root; + } + if (mid < r) { + right[root] = build(mid + 1, r); + father[right[root]] = root; + } + up(root); + return root; + } + + public static int find(int rank) { + int i = head; + while (i != 0) { + down(i); + if (size[left[i]] + 1 == rank) { + return i; + } else if (size[left[i]] >= rank) { + i = left[i]; + } else { + rank -= size[left[i]] + 1; + i = right[i]; + } + } + return 0; + } + + public static void insert(int rank, int n) { + if (rank == 0) { + head = build(1, n); + } else { + int l = find(rank); + int r = find(rank + 1); + splay(l, 0); + splay(r, l); + left[r] = build(1, n); + father[left[r]] = r; + up(r); + up(l); + } + } + + public static void recycle(int i) { + if (i != 0) { + space[++si] = i; + recycle(left[i]); + recycle(right[i]); + } + } + + public static void delete(int rank, int n) { + int l = find(rank - 1); + int r = find(rank + n); + splay(l, 0); + splay(r, l); + recycle(left[r]); + left[r] = 0; + up(r); + up(l); + } + + public static void update(int rank, int n, int val) { + int l = find(rank - 1); + int r = find(rank + n); + splay(l, 0); + splay(r, l); + setValue(left[r], val); + up(r); + up(l); + } + + public static void reverse(int rank, int n) { + int l = find(rank - 1); + int r = find(rank + n); + splay(l, 0); + splay(r, l); + setReverse(left[r]); + up(r); + up(l); + } + + public static int querySum(int rank, int n) { + int l = find(rank - 1); + int r = find(rank + n); + splay(l, 0); + splay(r, l); + return sum[left[r]]; + } + + public static int queryMax() { + return all[head]; + } + + public static void main(String[] args) { + FastReader in = new FastReader(System.in); + FastWriter out = new FastWriter(System.out); + int n = in.readInt(); + int m = in.readInt(); + // 所有可用空间编号,进入space数组 + si = MAXN - 1; + for (int i = 1; i <= si; i++) { + space[i] = i; + } + // 这里很重要,一方面准备好最左和最右的准备值 + // 另一方面设置all[0] = 极小值 + // 表示没有范围时,子数组最大累加和为极小值,因为不能为空 + arr[1] = arr[n + 2] = all[0] = -INF; + for (int i = 1, j = 2; i <= n; i++, j++) { + arr[j] = in.readInt(); + } + // 建立初始树 + insert(0, n + 2); + String op; + for (int i = 1, posi, tot, c; i <= m; i++) { + op = in.readWord(); + if (op.equals("MAX-SUM")) { + out.println(queryMax()); + } else { + // 因为有最左的准备值,所以位置要右移一位 + posi = in.readInt() + 1; + tot = in.readInt(); + if (op.equals("INSERT")) { + for (int j = 1; j <= tot; j++) { + arr[j] = in.readInt(); + } + insert(posi, tot); + } else if (op.equals("DELETE")) { + delete(posi, tot); + } else if (op.equals("MAKE-SAME")) { + c = in.readInt(); + update(posi, tot, c); + } else if (op.equals("REVERSE")) { + reverse(posi, tot); + } else { + out.println(querySum(posi, tot)); + } + } + } + out.flush(); + out.close(); + } + + // 快读 + public static class FastReader { + InputStream is; + private byte[] inbuf = new byte[1024]; + public int lenbuf = 0; + public int ptrbuf = 0; + + public FastReader(final InputStream is) { + this.is = is; + } + + public String readWord() { + char cur; + do { + cur = (char) readByte(); + } while (cur == ' ' || cur == '\n'); + StringBuilder builder = new StringBuilder(); + while (cur != ' ' && cur != '\n') { + builder.append(cur); + cur = (char) readByte(); + } + return builder.toString(); + } + + public int readByte() { + if (lenbuf == -1) { + throw new InputMismatchException(); + } + if (ptrbuf >= lenbuf) { + ptrbuf = 0; + try { + lenbuf = is.read(inbuf); + } catch (IOException e) { + throw new InputMismatchException(); + } + if (lenbuf <= 0) { + return -1; + } + } + return inbuf[ptrbuf++]; + } + + public int readInt() { + return (int) readLong(); + } + + public long readLong() { + long num = 0; + int b; + boolean minus = false; + while ((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-')) + ; + if (b == '-') { + minus = true; + b = readByte(); + } + + while (true) { + if (b >= '0' && b <= '9') { + num = num * 10 + (b - '0'); + } else { + return minus ? -num : num; + } + b = readByte(); + } + } + } + + // 快写 + public static class FastWriter { + private static final int BUF_SIZE = 1 << 13; + private final byte[] buf = new byte[BUF_SIZE]; + private OutputStream out; + private Writer writer; + private int ptr = 0; + + public FastWriter(Writer writer) { + this.writer = new BufferedWriter(writer); + out = new ByteArrayOutputStream(); + } + + public FastWriter(OutputStream os) { + this.out = os; + } + + public FastWriter(String path) { + try { + this.out = new FileOutputStream(path); + } catch (FileNotFoundException e) { + throw new RuntimeException("FastWriter"); + } + } + + public FastWriter write(byte b) { + buf[ptr++] = b; + if (ptr == BUF_SIZE) { + innerflush(); + } + return this; + } + + public FastWriter write(String s) { + s.chars().forEach(c -> { + buf[ptr++] = (byte) c; + if (ptr == BUF_SIZE) { + innerflush(); + } + }); + return this; + } + + private static int countDigits(long l) { + if (l >= 1000000000000000000L) { + return 19; + } + if (l >= 100000000000000000L) { + return 18; + } + if (l >= 10000000000000000L) { + return 17; + } + if (l >= 1000000000000000L) { + return 16; + } + if (l >= 100000000000000L) { + return 15; + } + if (l >= 10000000000000L) { + return 14; + } + if (l >= 1000000000000L) { + return 13; + } + if (l >= 100000000000L) { + return 12; + } + if (l >= 10000000000L) { + return 11; + } + if (l >= 1000000000L) { + return 10; + } + if (l >= 100000000L) { + return 9; + } + if (l >= 10000000L) { + return 8; + } + if (l >= 1000000L) { + return 7; + } + if (l >= 100000L) { + return 6; + } + if (l >= 10000L) { + return 5; + } + if (l >= 1000L) { + return 4; + } + if (l >= 100L) { + return 3; + } + if (l >= 10L) { + return 2; + } + return 1; + } + + public FastWriter write(long x) { + if (x == Long.MIN_VALUE) { + return write("" + x); + } + if (ptr + 21 >= BUF_SIZE) { + innerflush(); + } + if (x < 0) { + write((byte) '-'); + x = -x; + } + int d = countDigits(x); + for (int i = ptr + d - 1; i >= ptr; i--) { + buf[i] = (byte) ('0' + x % 10); + x /= 10; + } + ptr += d; + return this; + } + + public FastWriter writeln(long x) { + return write(x).writeln(); + } + + public FastWriter writeln() { + return write((byte) '\n'); + } + + private void innerflush() { + try { + out.write(buf, 0, ptr); + ptr = 0; + } catch (IOException e) { + throw new RuntimeException("innerflush"); + } + } + + public void flush() { + innerflush(); + try { + if (writer != null) { + writer.write(((ByteArrayOutputStream) out).toString()); + out = new ByteArrayOutputStream(); + writer.flush(); + } else { + out.flush(); + } + } catch (IOException e) { + throw new RuntimeException("flush"); + } + } + + public FastWriter println(long x) { + return writeln(x); + } + + public void close() { + flush(); + try { + out.close(); + } catch (Exception e) { + } + } + + } + +} diff --git a/src/class153/Code05_MaintainSequence2.java b/src/class153/Code05_MaintainSequence2.java new file mode 100644 index 000000000..5f89ddc82 --- /dev/null +++ b/src/class153/Code05_MaintainSequence2.java @@ -0,0 +1,268 @@ +package class153; + +// 维护数列(C++版) +// 测试链接 : https://www.luogu.com.cn/problem/P2042 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +//using namespace std; +// +//const int MAXN = 500005; +//const int INF = 1000000001; +// +//int head = 0; +//int space[MAXN], si; +//int arr[MAXN]; +//int num[MAXN]; +//int fa[MAXN]; +//int ls[MAXN]; +//int rs[MAXN]; +//int size[MAXN]; +//int sum[MAXN]; +//int all[MAXN]; +//int pre[MAXN]; +//int suf[MAXN]; +//bool update[MAXN]; +//int change[MAXN]; +//bool rev[MAXN]; +// +//void up(int i) { +// size[i] = size[ls[i]] + size[rs[i]] + 1; +// sum[i] = sum[ls[i]] + sum[rs[i]] + num[i]; +// all[i] = max({all[ls[i]], all[rs[i]], suf[ls[i]] + num[i] + pre[rs[i]]}); +// pre[i] = max(pre[ls[i]], sum[ls[i]] + num[i] + pre[rs[i]]); +// suf[i] = max(suf[rs[i]], suf[ls[i]] + num[i] + sum[rs[i]]); +//} +// +//int lr(int i) { +// return rs[fa[i]] == i ? 1 : 0; +//} +// +//void upRotate(int i) { +// int f = fa[i], g = fa[f], soni = lr(i), sonf = lr(f); +// if (soni == 1) { +// rs[f] = ls[i]; +// if (rs[f] != 0) { +// fa[rs[f]] = f; +// } +// ls[i] = f; +// } else { +// ls[f] = rs[i]; +// if (ls[f] != 0) { +// fa[ls[f]] = f; +// } +// rs[i] = f; +// } +// if (g != 0) { +// if (sonf == 1) { +// rs[g] = i; +// } else { +// ls[g] = i; +// } +// } +// fa[f] = i; +// fa[i] = g; +// up(f); +// up(i); +//} +// +//void splay(int i, int goal) { +// while (fa[i] != goal) { +// int f = fa[i], g = fa[f]; +// if (g != goal) { +// if (lr(i) == lr(f)) { +// upRotate(f); +// } else { +// upRotate(i); +// } +// } +// upRotate(i); +// } +// if (goal == 0) { +// head = i; +// } +//} +// +//void setValue(int i, int val) { +// if (i != 0) { +// update[i] = true; +// change[i] = val; +// num[i] = val; +// sum[i] = size[i] * val; +// all[i] = max(sum[i], val); +// pre[i] = max(sum[i], 0); +// suf[i] = max(sum[i], 0); +// } +//} +// +//void setReverse(int i) { +// if (i != 0) { +// swap(ls[i], rs[i]); +// swap(pre[i], suf[i]); +// rev[i] ^= 1; +// } +//} +// +//void down(int i) { +// if (update[i]) { +// setValue(ls[i], change[i]); +// setValue(rs[i], change[i]); +// update[i] = false; +// } +// if (rev[i]) { +// setReverse(ls[i]); +// setReverse(rs[i]); +// rev[i] = false; +// } +//} +// +//int init(int val) { +// int i = space[si--]; +// size[i] = 1; +// num[i] = sum[i] = all[i] = val; +// pre[i] = suf[i] = max(val, 0); +// fa[i] = ls[i] = rs[i] = 0; +// update[i] = rev[i] = false; +// return i; +//} +// +//int build(int l, int r) { +// int mid = (l + r) / 2; +// int root = init(arr[mid]); +// if (l < mid) { +// ls[root] = build(l, mid - 1); +// fa[ls[root]] = root; +// } +// if (mid < r) { +// rs[root] = build(mid + 1, r); +// fa[rs[root]] = root; +// } +// up(root); +// return root; +//} +// +//int find(int rank) { +// int i = head; +// while (i != 0) { +// down(i); +// if (size[ls[i]] + 1 == rank) { +// return i; +// } else if (size[ls[i]] >= rank) { +// i = ls[i]; +// } else { +// rank -= size[ls[i]] + 1; +// i = rs[i]; +// } +// } +// return 0; +//} +// +//void insert(int rank, int n) { +// if (rank == 0) { +// head = build(1, n); +// } else { +// int l = find(rank); +// int r = find(rank + 1); +// splay(l, 0); +// splay(r, l); +// ls[r] = build(1, n); +// fa[ls[r]] = r; +// up(r); +// up(l); +// } +//} +// +//void recycle(int i) { +// if (i != 0) { +// space[++si] = i; +// recycle(ls[i]); +// recycle(rs[i]); +// } +//} +// +//void remove(int rank, int n) { +// int l = find(rank - 1); +// int r = find(rank + n); +// splay(l, 0); +// splay(r, l); +// recycle(ls[r]); +// ls[r] = 0; +// up(r); +// up(l); +//} +// +//void updateValue(int rank, int n, int val) { +// int l = find(rank - 1); +// int r = find(rank + n); +// splay(l, 0); +// splay(r, l); +// setValue(ls[r], val); +// up(r); +// up(l); +//} +// +//void reverseRange(int rank, int n) { +// int l = find(rank - 1); +// int r = find(rank + n); +// splay(l, 0); +// splay(r, l); +// setReverse(ls[r]); +// up(r); +// up(l); +//} +// +//int querySum(int rank, int n) { +// int l = find(rank - 1); +// int r = find(rank + n); +// splay(l, 0); +// splay(r, l); +// return sum[ls[r]]; +//} +// +//int queryMax() { +// return all[head]; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// int n, m; +// cin >> n >> m; +// si = MAXN - 1; +// for (int i = 1; i <= si; i++) { +// space[i] = i; +// } +// arr[1] = arr[n + 2] = all[0] = -INF; +// for (int i = 1, j = 2; i <= n; i++, j++) { +// cin >> arr[j]; +// } +// insert(0, n + 2); +// string op; +// for (int i = 0; i < m; i++) { +// cin >> op; +// if (op == "MAX-SUM") { +// cout << queryMax() << endl; +// } else { +// int pos, len, c; +// cin >> pos >> len; +// pos++; +// if (op == "INSERT") { +// for (int j = 1; j <= len; j++) { +// cin >> arr[j]; +// } +// insert(pos, len); +// } else if (op == "DELETE") { +// remove(pos, len); +// } else if (op == "MAKE-SAME") { +// cin >> c; +// updateValue(pos, len, c); +// } else if (op == "REVERSE") { +// reverseRange(pos, len); +// } else if (op == "GET-SUM") { +// cout << querySum(pos, len) << endl; +// } +// } +// } +// return 0; +//} \ No newline at end of file From 4c241311070300f6916f439887dfe829802b835e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 28 Nov 2024 20:15:37 +0800 Subject: [PATCH 0418/2029] modify code --- src/class153/Code05_MaintainSequence1.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class153/Code05_MaintainSequence1.java b/src/class153/Code05_MaintainSequence1.java index 96f08251c..6f761de84 100644 --- a/src/class153/Code05_MaintainSequence1.java +++ b/src/class153/Code05_MaintainSequence1.java @@ -279,7 +279,7 @@ public static void main(String[] args) { insert(0, n + 2); String op; for (int i = 1, posi, tot, c; i <= m; i++) { - op = in.readWord(); + op = in.readString(); if (op.equals("MAX-SUM")) { out.println(queryMax()); } else { @@ -318,7 +318,7 @@ public FastReader(final InputStream is) { this.is = is; } - public String readWord() { + public String readString() { char cur; do { cur = (char) readByte(); From b3fd99cc7d5783ca609696858d23ee7659eda4fd Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 28 Nov 2024 21:38:27 +0800 Subject: [PATCH 0419/2029] modify code --- src/class153/Code01_Splay1.java | 8 ++++---- src/class153/Code01_Splay2.java | 8 ++++---- src/class153/Code02_LiteraryTree1.java | 8 ++++---- src/class153/Code02_LiteraryTree2.java | 8 ++++---- src/class153/Code03_FrustratedCashier1.java | 8 ++++---- src/class153/Code03_FrustratedCashier2.java | 8 ++++---- src/class153/Code04_Bookcase1.java | 8 ++++---- src/class153/Code04_Bookcase2.java | 8 ++++---- src/class153/Code05_MaintainSequence1.java | 14 +++++++------- src/class153/Code05_MaintainSequence2.java | 16 ++++++++-------- src/class153/FollowUp1.java | 8 ++++---- src/class153/FollowUp2.java | 8 ++++---- 12 files changed, 55 insertions(+), 55 deletions(-) diff --git a/src/class153/Code01_Splay1.java b/src/class153/Code01_Splay1.java index cbf372795..d424174eb 100644 --- a/src/class153/Code01_Splay1.java +++ b/src/class153/Code01_Splay1.java @@ -46,7 +46,7 @@ public static int lr(int i) { return right[father[i]] == i ? 1 : 0; } - public static void upRotate(int i) { + public static void rotate(int i) { int f = father[i], g = father[f], soni = lr(i), sonf = lr(f); if (soni == 1) { right[f] = left[i]; @@ -79,12 +79,12 @@ public static void splay(int i, int goal) { while (f != goal) { if (g != goal) { if (lr(i) == lr(f)) { - upRotate(f); + rotate(f); } else { - upRotate(i); + rotate(i); } } - upRotate(i); + rotate(i); f = father[i]; g = father[f]; } diff --git a/src/class153/Code01_Splay2.java b/src/class153/Code01_Splay2.java index 6d2630084..5bbfb69b8 100644 --- a/src/class153/Code01_Splay2.java +++ b/src/class153/Code01_Splay2.java @@ -39,7 +39,7 @@ // return rs[fa[i]] == i ? 1 : 0; //} // -//void upRotate(int i) { +//void rotate(int i) { // int f = fa[i], g = fa[f], soni = lr(i), sonf = lr(f); // if (soni == 1) { // rs[f] = ls[i]; @@ -72,12 +72,12 @@ // while (f != goal) { // if (g != goal) { // if (lr(i) == lr(f)) { -// upRotate(f); +// rotate(f); // } else { -// upRotate(i); +// rotate(i); // } // } -// upRotate(i); +// rotate(i); // f = fa[i]; // g = fa[f]; // } diff --git a/src/class153/Code02_LiteraryTree1.java b/src/class153/Code02_LiteraryTree1.java index 3c0b37650..9542498c3 100644 --- a/src/class153/Code02_LiteraryTree1.java +++ b/src/class153/Code02_LiteraryTree1.java @@ -51,7 +51,7 @@ public static int lr(int i) { return right[father[i]] == i ? 1 : 0; } - public static void upRotate(int i) { + public static void rotate(int i) { int f = father[i], g = father[f], soni = lr(i), sonf = lr(f); if (soni == 1) { right[f] = left[i]; @@ -84,12 +84,12 @@ public static void splay(int i, int goal) { while (f != goal) { if (g != goal) { if (lr(i) == lr(f)) { - upRotate(f); + rotate(f); } else { - upRotate(i); + rotate(i); } } - upRotate(i); + rotate(i); f = father[i]; g = father[f]; } diff --git a/src/class153/Code02_LiteraryTree2.java b/src/class153/Code02_LiteraryTree2.java index 3f236a181..60d243d20 100644 --- a/src/class153/Code02_LiteraryTree2.java +++ b/src/class153/Code02_LiteraryTree2.java @@ -36,7 +36,7 @@ // return rs[fa[i]] == i ? 1 : 0; //} // -//void upRotate(int i) { +//void rotate(int i) { // int f = fa[i], g = fa[f], soni = lr(i), sonf = lr(f); // if (soni == 1) { // rs[f] = ls[i]; @@ -69,12 +69,12 @@ // while (f != goal) { // if (g != goal) { // if (lr(i) == lr(f)) { -// upRotate(f); +// rotate(f); // } else { -// upRotate(i); +// rotate(i); // } // } -// upRotate(i); +// rotate(i); // f = fa[i]; // g = fa[f]; // } diff --git a/src/class153/Code03_FrustratedCashier1.java b/src/class153/Code03_FrustratedCashier1.java index 01c353724..3cf96ba4e 100644 --- a/src/class153/Code03_FrustratedCashier1.java +++ b/src/class153/Code03_FrustratedCashier1.java @@ -45,7 +45,7 @@ public static int lr(int i) { return right[father[i]] == i ? 1 : 0; } - public static void upRotate(int i) { + public static void rotate(int i) { int f = father[i], g = father[f], soni = lr(i), sonf = lr(f); if (soni == 1) { right[f] = left[i]; @@ -78,12 +78,12 @@ public static void splay(int i, int goal) { while (f != goal) { if (g != goal) { if (lr(i) == lr(f)) { - upRotate(f); + rotate(f); } else { - upRotate(i); + rotate(i); } } - upRotate(i); + rotate(i); f = father[i]; g = father[f]; } diff --git a/src/class153/Code03_FrustratedCashier2.java b/src/class153/Code03_FrustratedCashier2.java index 7446e729e..f7f23814a 100644 --- a/src/class153/Code03_FrustratedCashier2.java +++ b/src/class153/Code03_FrustratedCashier2.java @@ -31,7 +31,7 @@ // return rs[fa[i]] == i ? 1 : 0; //} // -//void upRotate(int i) { +//void rotate(int i) { // int f = fa[i], g = fa[f], soni = lr(i), sonf = lr(f); // if (soni == 1) { // rs[f] = ls[i]; @@ -64,12 +64,12 @@ // while (f != goal) { // if (g != goal) { // if (lr(i) == lr(f)) { -// upRotate(f); +// rotate(f); // } else { -// upRotate(i); +// rotate(i); // } // } -// upRotate(i); +// rotate(i); // f = fa[i]; // g = fa[f]; // } diff --git a/src/class153/Code04_Bookcase1.java b/src/class153/Code04_Bookcase1.java index 5c14f6613..a867af698 100644 --- a/src/class153/Code04_Bookcase1.java +++ b/src/class153/Code04_Bookcase1.java @@ -43,7 +43,7 @@ public static int lr(int i) { return right[father[i]] == i ? 1 : 0; } - public static void upRotate(int i) { + public static void rotate(int i) { int f = father[i], g = father[f], soni = lr(i), sonf = lr(f); if (soni == 1) { right[f] = left[i]; @@ -76,12 +76,12 @@ public static void splay(int i, int goal) { while (f != goal) { if (g != goal) { if (lr(i) == lr(f)) { - upRotate(f); + rotate(f); } else { - upRotate(i); + rotate(i); } } - upRotate(i); + rotate(i); f = father[i]; g = father[f]; } diff --git a/src/class153/Code04_Bookcase2.java b/src/class153/Code04_Bookcase2.java index 23072d50e..897b6d2ca 100644 --- a/src/class153/Code04_Bookcase2.java +++ b/src/class153/Code04_Bookcase2.java @@ -29,7 +29,7 @@ // return rs[fa[i]] == i ? 1 : 0; //} // -//void upRotate(int i) { +//void rotate(int i) { // int f = fa[i], g = fa[f], soni = lr(i), sonf = lr(f); // if (soni == 1) { // rs[f] = ls[i]; @@ -62,12 +62,12 @@ // while (f != goal) { // if (g != goal) { // if (lr(i) == lr(f)) { -// upRotate(f); +// rotate(f); // } else { -// upRotate(i); +// rotate(i); // } // } -// upRotate(i); +// rotate(i); // f = fa[i]; // g = fa[f]; // } diff --git a/src/class153/Code05_MaintainSequence1.java b/src/class153/Code05_MaintainSequence1.java index 6f761de84..f31d005d7 100644 --- a/src/class153/Code05_MaintainSequence1.java +++ b/src/class153/Code05_MaintainSequence1.java @@ -67,7 +67,7 @@ public static int lr(int i) { return right[father[i]] == i ? 1 : 0; } - public static void upRotate(int i) { + public static void rotate(int i) { int f = father[i], g = father[f], soni = lr(i), sonf = lr(f); if (soni == 1) { right[f] = left[i]; @@ -100,12 +100,12 @@ public static void splay(int i, int goal) { while (f != goal) { if (g != goal) { if (lr(i) == lr(f)) { - upRotate(f); + rotate(f); } else { - upRotate(i); + rotate(i); } } - upRotate(i); + rotate(i); f = father[i]; g = father[f]; } @@ -226,7 +226,7 @@ public static void delete(int rank, int n) { up(l); } - public static void update(int rank, int n, int val) { + public static void reset(int rank, int n, int val) { int l = find(rank - 1); int r = find(rank + n); splay(l, 0); @@ -283,7 +283,7 @@ public static void main(String[] args) { if (op.equals("MAX-SUM")) { out.println(queryMax()); } else { - // 因为有最左的准备值,所以位置要右移一位 + // 因为有最左的准备值,所以位置要后移一位 posi = in.readInt() + 1; tot = in.readInt(); if (op.equals("INSERT")) { @@ -295,7 +295,7 @@ public static void main(String[] args) { delete(posi, tot); } else if (op.equals("MAKE-SAME")) { c = in.readInt(); - update(posi, tot, c); + reset(posi, tot, c); } else if (op.equals("REVERSE")) { reverse(posi, tot); } else { diff --git a/src/class153/Code05_MaintainSequence2.java b/src/class153/Code05_MaintainSequence2.java index 5f89ddc82..74ac2eea6 100644 --- a/src/class153/Code05_MaintainSequence2.java +++ b/src/class153/Code05_MaintainSequence2.java @@ -39,7 +39,7 @@ // return rs[fa[i]] == i ? 1 : 0; //} // -//void upRotate(int i) { +//void rotate(int i) { // int f = fa[i], g = fa[f], soni = lr(i), sonf = lr(f); // if (soni == 1) { // rs[f] = ls[i]; @@ -72,12 +72,12 @@ // int f = fa[i], g = fa[f]; // if (g != goal) { // if (lr(i) == lr(f)) { -// upRotate(f); +// rotate(f); // } else { -// upRotate(i); +// rotate(i); // } // } -// upRotate(i); +// rotate(i); // } // if (goal == 0) { // head = i; @@ -192,7 +192,7 @@ // up(l); //} // -//void updateValue(int rank, int n, int val) { +//void reset(int rank, int n, int val) { // int l = find(rank - 1); // int r = find(rank + n); // splay(l, 0); @@ -202,7 +202,7 @@ // up(l); //} // -//void reverseRange(int rank, int n) { +//void reverse(int rank, int n) { // int l = find(rank - 1); // int r = find(rank + n); // splay(l, 0); @@ -256,9 +256,9 @@ // remove(pos, len); // } else if (op == "MAKE-SAME") { // cin >> c; -// updateValue(pos, len, c); +// reset(pos, len, c); // } else if (op == "REVERSE") { -// reverseRange(pos, len); +// reverse(pos, len); // } else if (op == "GET-SUM") { // cout << querySum(pos, len) << endl; // } diff --git a/src/class153/FollowUp1.java b/src/class153/FollowUp1.java index 6389d659d..6570d9d4b 100644 --- a/src/class153/FollowUp1.java +++ b/src/class153/FollowUp1.java @@ -39,7 +39,7 @@ public static int lr(int i) { return right[father[i]] == i ? 1 : 0; } - public static void upRotate(int i) { + public static void rotate(int i) { int f = father[i], g = father[f], soni = lr(i), sonf = lr(f); if (soni == 1) { right[f] = left[i]; @@ -72,12 +72,12 @@ public static void splay(int i, int goal) { while (f != goal) { if (g != goal) { if (lr(i) == lr(f)) { - upRotate(f); + rotate(f); } else { - upRotate(i); + rotate(i); } } - upRotate(i); + rotate(i); f = father[i]; g = father[f]; } diff --git a/src/class153/FollowUp2.java b/src/class153/FollowUp2.java index bda072b72..bdbd03932 100644 --- a/src/class153/FollowUp2.java +++ b/src/class153/FollowUp2.java @@ -32,7 +32,7 @@ // return rs[fa[i]] == i ? 1 : 0; //} // -//void upRotate(int i) { +//void rotate(int i) { // int f = fa[i], g = fa[f], soni = lr(i), sonf = lr(f); // if (soni == 1) { // rs[f] = ls[i]; @@ -65,12 +65,12 @@ // while (f != goal) { // if (g != goal) { // if (lr(i) == lr(f)) { -// upRotate(f); +// rotate(f); // } else { -// upRotate(i); +// rotate(i); // } // } -// upRotate(i); +// rotate(i); // f = fa[i]; // g = fa[f]; // } From 572146effdf7278118af92dc24f28e91c1a3c363 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 28 Nov 2024 23:56:03 +0800 Subject: [PATCH 0420/2029] modify code --- ...r1.java => Code02_FrustratedCashier1.java} | 8 ++++- ...r2.java => Code02_FrustratedCashier2.java} | 6 ++++ ...ryTree1.java => Code03_LiteraryTree1.java} | 2 +- ...ryTree2.java => Code03_LiteraryTree2.java} | 0 src/class153/Code04_Bookcase1.java | 31 +++++++++++-------- src/class153/Code04_Bookcase2.java | 31 +++++++++++-------- src/class153/Code05_MaintainSequence1.java | 9 ++++++ src/class153/Code05_MaintainSequence2.java | 9 ++++++ 8 files changed, 68 insertions(+), 28 deletions(-) rename src/class153/{Code03_FrustratedCashier1.java => Code02_FrustratedCashier1.java} (89%) rename src/class153/{Code03_FrustratedCashier2.java => Code02_FrustratedCashier2.java} (88%) rename src/class153/{Code02_LiteraryTree1.java => Code03_LiteraryTree1.java} (99%) rename src/class153/{Code02_LiteraryTree2.java => Code03_LiteraryTree2.java} (100%) diff --git a/src/class153/Code03_FrustratedCashier1.java b/src/class153/Code02_FrustratedCashier1.java similarity index 89% rename from src/class153/Code03_FrustratedCashier1.java rename to src/class153/Code02_FrustratedCashier1.java index 3cf96ba4e..ab47e92e9 100644 --- a/src/class153/Code03_FrustratedCashier1.java +++ b/src/class153/Code02_FrustratedCashier1.java @@ -1,6 +1,12 @@ package class153; // 郁闷的出纳员(java版) +// 最低薪水为limit,一旦员工薪水低于limit,员工会离职,实现如下四种操作 +// I x : 新来员工初始薪水是x,如果x低于limit,该员工不会入职当然也不算离职 +// A x : 所有员工的薪水都加上x +// S x : 所有员工的薪水都减去x,一旦有员工低于limit那么就会离职 +// F x : 查询第k多的工资,如果x大于当前员工数量,打印-1 +// 所有操作完成后,打印有多少员工在操作期间离开了公司 // 测试链接 : https://www.luogu.com.cn/problem/P1486 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -13,7 +19,7 @@ import java.io.PrintWriter; import java.util.StringTokenizer; -public class Code03_FrustratedCashier1 { +public class Code02_FrustratedCashier1 { public static int MAXN = 300001; diff --git a/src/class153/Code03_FrustratedCashier2.java b/src/class153/Code02_FrustratedCashier2.java similarity index 88% rename from src/class153/Code03_FrustratedCashier2.java rename to src/class153/Code02_FrustratedCashier2.java index f7f23814a..0ab6be31f 100644 --- a/src/class153/Code03_FrustratedCashier2.java +++ b/src/class153/Code02_FrustratedCashier2.java @@ -1,6 +1,12 @@ package class153; // 郁闷的出纳员(C++版) +// 最低薪水为limit,一旦员工薪水低于limit,员工会离职,实现如下四种操作 +// I x : 新来员工初始薪水是x,如果x低于limit,该员工不会入职当然也不算离职 +// A x : 所有员工的薪水都加上x +// S x : 所有员工的薪水都减去x,一旦有员工低于limit那么就会离职 +// F x : 查询第k多的工资,如果x大于当前员工数量,打印-1 +// 所有操作完成后,打印有多少员工在操作期间离开了公司 // 测试链接 : https://www.luogu.com.cn/problem/P1486 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class153/Code02_LiteraryTree1.java b/src/class153/Code03_LiteraryTree1.java similarity index 99% rename from src/class153/Code02_LiteraryTree1.java rename to src/class153/Code03_LiteraryTree1.java index 9542498c3..7e700f59a 100644 --- a/src/class153/Code02_LiteraryTree1.java +++ b/src/class153/Code03_LiteraryTree1.java @@ -15,7 +15,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code02_LiteraryTree1 { +public class Code03_LiteraryTree1 { public static int MAXN = 100005; diff --git a/src/class153/Code02_LiteraryTree2.java b/src/class153/Code03_LiteraryTree2.java similarity index 100% rename from src/class153/Code02_LiteraryTree2.java rename to src/class153/Code03_LiteraryTree2.java diff --git a/src/class153/Code04_Bookcase1.java b/src/class153/Code04_Bookcase1.java index a867af698..2970bd7c3 100644 --- a/src/class153/Code04_Bookcase1.java +++ b/src/class153/Code04_Bookcase1.java @@ -1,6 +1,13 @@ package class153; // 书架(java版) +// 给定一个长度为n的排列,由数字1、2、3...n组成,实现如下五种操作 +// Top s : 数字s移动到最左边 +// Bottom s : 数字s移动到最右边 +// Insert s t : 数字s位置假设为rank,现在移动到rank+t位置 +// Ask s : 查询数字s左边有多少数字 +// Query s : 查询从左往右第s位的数字 +// 所有操作保证都是合法的 // 测试链接 : https://www.luogu.com.cn/problem/P2596 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -135,24 +142,22 @@ public static int query(int s) { // 注意a不会是1和n位置,b也如此 // 因为1位置和n位置提前加入了预备值,永远不会修改 public static void move(int a, int b) { - int i = find(a); int l = find(a - 1); + int r = find(a + 1); splay(l, 0); - splay(i, l); - right[l] = right[i]; - father[right[l]] = l; + splay(r, l); + int i = left[r]; + left[r] = 0; + up(r); up(l); - left[i] = right[i] = 0; - int r = find(b - 1); - int next = find(b); - splay(r, 0); - splay(next, r); - right[r] = i; + l = find(b - 1); + r = find(b); + splay(l, 0); + splay(r, l); + left[r] = i; father[i] = r; - right[i] = next; - father[next] = i; - up(i); up(r); + up(l); } public static void main(String[] args) { diff --git a/src/class153/Code04_Bookcase2.java b/src/class153/Code04_Bookcase2.java index 897b6d2ca..87b04fd86 100644 --- a/src/class153/Code04_Bookcase2.java +++ b/src/class153/Code04_Bookcase2.java @@ -1,6 +1,13 @@ package class153; // 书架(C++版) +// 给定一个长度为n的排列,由数字1、2、3...n组成,实现如下五种操作 +// Top s : 数字s移动到最左边 +// Bottom s : 数字s移动到最右边 +// Insert s t : 数字s位置假设为rank,现在移动到rank+t位置 +// Ask s : 查询数字s左边有多少数字 +// Query s : 查询从左往右第s位的数字 +// 所有操作保证都是合法的 // 测试链接 : https://www.luogu.com.cn/problem/P2596 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -117,24 +124,22 @@ //} // //void move(int a, int b) { -// int i = find(a); // int l = find(a - 1); +// int r = find(a + 1); // splay(l, 0); -// splay(i, l); -// rs[l] = rs[i]; -// fa[rs[l]] = l; +// splay(r, l); +// int i = ls[r]; +// ls[r] = 0; +// up(r); // up(l); -// ls[i] = rs[i] = 0; -// int r = find(b - 1); -// int next = find(b); -// splay(r, 0); -// splay(next, r); -// rs[r] = i; +// l = find(b - 1); +// r = find(b); +// splay(l, 0); +// splay(r, l); +// ls[r] = i; // fa[i] = r; -// rs[i] = next; -// fa[next] = i; -// up(i); // up(r); +// up(l); //} // //int main() { diff --git a/src/class153/Code05_MaintainSequence1.java b/src/class153/Code05_MaintainSequence1.java index f31d005d7..f923cfa99 100644 --- a/src/class153/Code05_MaintainSequence1.java +++ b/src/class153/Code05_MaintainSequence1.java @@ -1,6 +1,15 @@ package class153; // 维护数列(java版) +// 初始时给定一个数列,实现如下六种操作 +// INSERT posi tot ... : 在第posi个数字之后,插入长度为tot的数组,由...代表 +// DELETE posi tot : 从第posi个数字开始,删除长度为tot的部分 +// MAKE-SAME posi tot c : 从第posi个数字开始,长度为tot的部分,值都设置成c +// REVERSE posi tot : 从第posi个数字开始,翻转长度为tot的部分 +// GET-SUM posi tot : 从第posi个数字开始,查询长度为tot的部分的累加和 +// MAX-SUM : 查询整个数列中,子数组的最大累加和,子数组不能为空 +// 任何时刻输入保证至少有一个数字在数列中,并且所有操作都合法 +// 插入数字总数可能很多,但是任何时刻数列中最多有5 * 10^5个数,总空间请和这个数量有关 // 测试链接 : https://www.luogu.com.cn/problem/P2042 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class153/Code05_MaintainSequence2.java b/src/class153/Code05_MaintainSequence2.java index 74ac2eea6..356ed637c 100644 --- a/src/class153/Code05_MaintainSequence2.java +++ b/src/class153/Code05_MaintainSequence2.java @@ -1,6 +1,15 @@ package class153; // 维护数列(C++版) +// 初始时给定一个数列,实现如下六种操作 +// INSERT posi tot ... : 在第posi个数字之后,插入长度为tot的数组,由...代表 +// DELETE posi tot : 从第posi个数字开始,删除长度为tot的部分 +// MAKE-SAME posi tot c : 从第posi个数字开始,长度为tot的部分,值都设置成c +// REVERSE posi tot : 从第posi个数字开始,翻转长度为tot的部分 +// GET-SUM posi tot : 从第posi个数字开始,查询长度为tot的部分的累加和 +// MAX-SUM : 查询整个数列中,子数组的最大累加和,子数组不能为空 +// 任何时刻输入保证至少有一个数字在数列中,并且所有操作都合法 +// 插入数字总数可能很多,但是任何时刻数列中最多有5 * 10^5个数,总空间请和这个数量有关 // 测试链接 : https://www.luogu.com.cn/problem/P2042 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From 8cc7e7080cc68839f6c6ac8a1dda9f04a9effed3 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 28 Nov 2024 23:59:22 +0800 Subject: [PATCH 0421/2029] modify code --- src/class153/Code05_MaintainSequence1.java | 2 +- src/class153/Code05_MaintainSequence2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class153/Code05_MaintainSequence1.java b/src/class153/Code05_MaintainSequence1.java index f923cfa99..6780ce9f8 100644 --- a/src/class153/Code05_MaintainSequence1.java +++ b/src/class153/Code05_MaintainSequence1.java @@ -9,7 +9,7 @@ // GET-SUM posi tot : 从第posi个数字开始,查询长度为tot的部分的累加和 // MAX-SUM : 查询整个数列中,子数组的最大累加和,子数组不能为空 // 任何时刻输入保证至少有一个数字在数列中,并且所有操作都合法 -// 插入数字总数可能很多,但是任何时刻数列中最多有5 * 10^5个数,总空间请和这个数量有关 +// 插入数字总数很多,但是任何时刻数列中最多有5 * 10^5个数,使用总空间要和该数量有关 // 测试链接 : https://www.luogu.com.cn/problem/P2042 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class153/Code05_MaintainSequence2.java b/src/class153/Code05_MaintainSequence2.java index 356ed637c..f53fa459b 100644 --- a/src/class153/Code05_MaintainSequence2.java +++ b/src/class153/Code05_MaintainSequence2.java @@ -9,7 +9,7 @@ // GET-SUM posi tot : 从第posi个数字开始,查询长度为tot的部分的累加和 // MAX-SUM : 查询整个数列中,子数组的最大累加和,子数组不能为空 // 任何时刻输入保证至少有一个数字在数列中,并且所有操作都合法 -// 插入数字总数可能很多,但是任何时刻数列中最多有5 * 10^5个数,总空间请和这个数量有关 +// 插入数字总数很多,但是任何时刻数列中最多有5 * 10^5个数,使用总空间要和该数量有关 // 测试链接 : https://www.luogu.com.cn/problem/P2042 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From a3be83a6d028fdccd36d2976d0c64b432cf266ab Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 29 Nov 2024 00:00:33 +0800 Subject: [PATCH 0422/2029] modify code --- src/class153/Code05_MaintainSequence1.java | 2 +- src/class153/Code05_MaintainSequence2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class153/Code05_MaintainSequence1.java b/src/class153/Code05_MaintainSequence1.java index 6780ce9f8..ec21f5d4a 100644 --- a/src/class153/Code05_MaintainSequence1.java +++ b/src/class153/Code05_MaintainSequence1.java @@ -7,7 +7,7 @@ // MAKE-SAME posi tot c : 从第posi个数字开始,长度为tot的部分,值都设置成c // REVERSE posi tot : 从第posi个数字开始,翻转长度为tot的部分 // GET-SUM posi tot : 从第posi个数字开始,查询长度为tot的部分的累加和 -// MAX-SUM : 查询整个数列中,子数组的最大累加和,子数组不能为空 +// MAX-SUM : 查询整个数列中,非空子数组的最大累加和 // 任何时刻输入保证至少有一个数字在数列中,并且所有操作都合法 // 插入数字总数很多,但是任何时刻数列中最多有5 * 10^5个数,使用总空间要和该数量有关 // 测试链接 : https://www.luogu.com.cn/problem/P2042 diff --git a/src/class153/Code05_MaintainSequence2.java b/src/class153/Code05_MaintainSequence2.java index f53fa459b..3087dd7b4 100644 --- a/src/class153/Code05_MaintainSequence2.java +++ b/src/class153/Code05_MaintainSequence2.java @@ -7,7 +7,7 @@ // MAKE-SAME posi tot c : 从第posi个数字开始,长度为tot的部分,值都设置成c // REVERSE posi tot : 从第posi个数字开始,翻转长度为tot的部分 // GET-SUM posi tot : 从第posi个数字开始,查询长度为tot的部分的累加和 -// MAX-SUM : 查询整个数列中,子数组的最大累加和,子数组不能为空 +// MAX-SUM : 查询整个数列中,非空子数组的最大累加和 // 任何时刻输入保证至少有一个数字在数列中,并且所有操作都合法 // 插入数字总数很多,但是任何时刻数列中最多有5 * 10^5个数,使用总空间要和该数量有关 // 测试链接 : https://www.luogu.com.cn/problem/P2042 From 8da159ca467f12a88e37691007a410d1ea909eaa Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 29 Nov 2024 01:21:05 +0800 Subject: [PATCH 0423/2029] modify code --- src/class153/Code01_Splay1.java | 24 +++++++----------------- src/class153/Code01_Splay2.java | 24 +++++++----------------- src/class153/Code03_LiteraryTree1.java | 7 ++++--- src/class153/Code03_LiteraryTree2.java | 7 ++++--- src/class153/FollowUp1.java | 24 +++++++----------------- src/class153/FollowUp2.java | 24 +++++++----------------- 6 files changed, 36 insertions(+), 74 deletions(-) diff --git a/src/class153/Code01_Splay1.java b/src/class153/Code01_Splay1.java index d424174eb..188fe9631 100644 --- a/src/class153/Code01_Splay1.java +++ b/src/class153/Code01_Splay1.java @@ -94,7 +94,8 @@ public static void splay(int i, int goal) { } // 返回以i为头的树上第rank名的节点编号 - public static int find(int i, int rank) { + public static int find(int rank) { + int i = head; while (i != 0) { if (size[left[i]] + 1 == rank) { return i; @@ -152,20 +153,9 @@ public static int rank(int num) { } public static int index(int x) { - int i = head, last = head; - while (i != 0) { - last = i; - if (size[left[i]] >= x) { - i = left[i]; - } else if (size[left[i]] + 1 < x) { - x -= size[left[i]] + 1; - i = right[i]; - } else { - i = 0; - } - } - splay(last, 0); - return key[last]; + int i = find(x); + splay(i, 0); + return key[i]; } public static int pre(int num) { @@ -203,14 +193,14 @@ public static int post(int num) { public static void remove(int num) { int kth = rank(num); if (kth != rank(num + 1)) { - int i = find(head, kth); + int i = find(kth); splay(i, 0); if (left[i] == 0) { head = right[i]; } else if (right[i] == 0) { head = left[i]; } else { - int j = find(right[i], 1); + int j = find(kth + 1); splay(j, i); left[j] = left[i]; father[left[j]] = j; diff --git a/src/class153/Code01_Splay2.java b/src/class153/Code01_Splay2.java index 5bbfb69b8..b00ee7ba7 100644 --- a/src/class153/Code01_Splay2.java +++ b/src/class153/Code01_Splay2.java @@ -86,7 +86,8 @@ // } //} // -//int find(int i, int rank) { +//int find(int rank) { +// int i = head; // while (i != 0) { // if (size[ls[i]] + 1 == rank) { // return i; @@ -144,20 +145,9 @@ //} // //int index(int x) { -// int i = head, last = head; -// while (i != 0) { -// last = i; -// if (size[ls[i]] >= x) { -// i = ls[i]; -// } else if (size[ls[i]] + 1 < x) { -// x -= size[ls[i]] + 1; -// i = rs[i]; -// } else { -// i = 0; -// } -// } -// splay(last, 0); -// return key[last]; +// int i = find(x); +// splay(i, 0); +// return key[i]; //} // //int pre(int num) { @@ -195,14 +185,14 @@ //void remove(int num) { // int kth = getRank(num); // if (kth != getRank(num + 1)) { -// int i = find(head, kth); +// int i = find(kth); // splay(i, 0); // if (ls[i] == 0) { // head = rs[i]; // } else if (rs[i] == 0) { // head = ls[i]; // } else { -// int j = find(rs[i], 1); +// int j = find(kth + 1); // splay(j, i); // ls[j] = ls[i]; // fa[ls[j]] = j; diff --git a/src/class153/Code03_LiteraryTree1.java b/src/class153/Code03_LiteraryTree1.java index 7e700f59a..d2c78e47a 100644 --- a/src/class153/Code03_LiteraryTree1.java +++ b/src/class153/Code03_LiteraryTree1.java @@ -109,7 +109,8 @@ public static void down(int i) { } } - public static int find(int i, int rank) { + public static int find(int rank) { + int i = head; while (i != 0) { down(i); if (size[left[i]] + 1 == rank) { @@ -139,8 +140,8 @@ public static void add(int x) { // 注意l永远不会是最左位置,r永远不会是最右位置 // 因为最左和最右位置提前加入了预备值,永远不会修改 public static void reverse(int l, int r) { - int i = find(head, l - 1); - int j = find(head, r + 1); + int i = find(l - 1); + int j = find(r + 1); splay(i, 0); splay(j, i); reverse[left[right[head]]] = !reverse[left[right[head]]]; diff --git a/src/class153/Code03_LiteraryTree2.java b/src/class153/Code03_LiteraryTree2.java index 60d243d20..96e362fb1 100644 --- a/src/class153/Code03_LiteraryTree2.java +++ b/src/class153/Code03_LiteraryTree2.java @@ -94,7 +94,8 @@ // } //} // -//int find(int i, int rank) { +//int find(int rank) { +// int i = head; // while (i != 0) { // down(i); // if (size[ls[i]] + 1 == rank) { @@ -122,8 +123,8 @@ //} // //void reverse(int l, int r) { -// int i = find(head, l - 1); -// int j = find(head, r + 1); +// int i = find(l - 1); +// int j = find(r + 1); // splay(i, 0); // splay(j, i); // rev[ls[rs[head]]] = !rev[ls[rs[head]]]; diff --git a/src/class153/FollowUp1.java b/src/class153/FollowUp1.java index 6570d9d4b..47c72b942 100644 --- a/src/class153/FollowUp1.java +++ b/src/class153/FollowUp1.java @@ -87,7 +87,8 @@ public static void splay(int i, int goal) { } // 返回以i为头的树上第rank名的节点编号 - public static int find(int i, int rank) { + public static int find(int rank) { + int i = head; while (i != 0) { if (size[left[i]] + 1 == rank) { return i; @@ -145,20 +146,9 @@ public static int rank(int num) { } public static int index(int x) { - int i = head, last = head; - while (i != 0) { - last = i; - if (size[left[i]] >= x) { - i = left[i]; - } else if (size[left[i]] + 1 < x) { - x -= size[left[i]] + 1; - i = right[i]; - } else { - i = 0; - } - } - splay(last, 0); - return key[last]; + int i = find(x); + splay(i, 0); + return key[i]; } public static int pre(int num) { @@ -196,14 +186,14 @@ public static int post(int num) { public static void remove(int num) { int kth = rank(num); if (kth != rank(num + 1)) { - int i = find(head, kth); + int i = find(kth); splay(i, 0); if (left[i] == 0) { head = right[i]; } else if (right[i] == 0) { head = left[i]; } else { - int j = find(right[i], 1); + int j = find(kth + 1); splay(j, i); left[j] = left[i]; father[left[j]] = j; diff --git a/src/class153/FollowUp2.java b/src/class153/FollowUp2.java index bdbd03932..13f127ab1 100644 --- a/src/class153/FollowUp2.java +++ b/src/class153/FollowUp2.java @@ -79,7 +79,8 @@ // } //} // -//int find(int i, int rank) { +//int find(int rank) { +// int i = head; // while (i != 0) { // if (size[ls[i]] + 1 == rank) { // return i; @@ -137,20 +138,9 @@ //} // //int index(int x) { -// int i = head, last = head; -// while (i != 0) { -// last = i; -// if (size[ls[i]] >= x) { -// i = ls[i]; -// } else if (size[ls[i]] + 1 < x) { -// x -= size[ls[i]] + 1; -// i = rs[i]; -// } else { -// i = 0; -// } -// } -// splay(last, 0); -// return key[last]; +// int i = find(x); +// splay(i, 0); +// return key[i]; //} // //int pre(int num) { @@ -188,14 +178,14 @@ //void remove(int num) { // int kth = getRank(num); // if (kth != getRank(num + 1)) { -// int i = find(head, kth); +// int i = find(kth); // splay(i, 0); // if (ls[i] == 0) { // head = rs[i]; // } else if (rs[i] == 0) { // head = ls[i]; // } else { -// int j = find(rs[i], 1); +// int j = find(kth + 1); // splay(j, i); // ls[j] = ls[i]; // fa[ls[j]] = j; From 1ff822797a4dafb1f5e773bad746548edeb9b9ea Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 29 Nov 2024 10:40:11 +0800 Subject: [PATCH 0424/2029] modify code --- src/class152/Code03_TextEditor1.java | 74 +++++++++++++--------------- 1 file changed, 34 insertions(+), 40 deletions(-) diff --git a/src/class152/Code03_TextEditor1.java b/src/class152/Code03_TextEditor1.java index 90caace1f..929823b3c 100644 --- a/src/class152/Code03_TextEditor1.java +++ b/src/class152/Code03_TextEditor1.java @@ -86,66 +86,71 @@ public static void inorder(int i) { } } - // 我写了很多个版本的IO实现,空间都无法达标 + // 我做了很多个版本的IO尝试,空间都无法达标 // 以下风格只是其中一种,无所谓了,逻辑是对的 // 想通过这个题看C++版本吧,完全一样的逻辑 public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); - int n = Integer.parseInt(in.readLine()); - int pos = 0, len; - String[] input = getInput(in); + int n = Integer.valueOf(in.readLine()); + int pos = 0; String str; - String[] part; String op; - int l, m, lm, r; - for (int i = 1, inputIndex = 0; i <= n; i++) { - str = input[inputIndex++].trim(); + int x; + for (int i = 1; i <= n; i++) { + str = in.readLine(); if (str.equals("Prev")) { pos--; } else if (str.equals("Next")) { pos++; } else { - part = str.split(" "); - op = part[0]; - len = Integer.parseInt(part[1]); + String[] input = str.split(" "); + op = input[0]; + x = Integer.valueOf(input[1]); if (op.equals("Move")) { - pos = len; + pos = x; } else if (op.equals("Insert")) { split(0, 0, head, pos); - l = right[0]; - r = left[0]; - for (int j = 1; j <= len;) { - for (char c : input[inputIndex++].toCharArray()) { - if (c >= 32 && c <= 126) { - key[++cnt] = c; + 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); - j++; + add++; } } } head = merge(l, r); } else if (op.equals("Delete")) { - split(0, 0, head, pos + len); - lm = right[0]; - r = left[0]; + split(0, 0, head, pos + x); + int r = left[0]; + int lm = right[0]; + left[0] = right[0] = 0; split(0, 0, lm, pos); - l = right[0]; + int l = right[0]; + left[0] = right[0] = 0; head = merge(l, r); } else { - split(0, 0, head, pos + len); - lm = right[0]; - r = left[0]; + split(0, 0, head, pos + x); + int r = left[0]; + int lm = right[0]; + left[0] = right[0] = 0; split(0, 0, lm, pos); - l = right[0]; - m = left[0]; + 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(ans[j]); + out.print((char) ans[j]); } out.println(); } @@ -156,15 +161,4 @@ public static void main(String[] args) throws IOException { in.close(); } - public static String[] getInput(BufferedReader in) throws IOException { - StringBuilder inputBuffer = new StringBuilder(); - char[] tempBuffer = new char[8192]; - int bytesRead; - while ((bytesRead = in.read(tempBuffer)) != -1) { - inputBuffer.append(tempBuffer, 0, bytesRead); - } - String[] input = inputBuffer.toString().split("\n"); - return input; - } - } From db1c53a6d76e9e99d23ccd2cd6f0ddc776d05fe1 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 29 Nov 2024 11:17:57 +0800 Subject: [PATCH 0425/2029] modify code --- ...TwoDimensionIntervalAddIntervalQuery1.java | 47 ++++++++++--------- src/class140/Code01_DiophantineEquation2.java | 1 - 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/class108/Code05_TwoDimensionIntervalAddIntervalQuery1.java b/src/class108/Code05_TwoDimensionIntervalAddIntervalQuery1.java index a4a712448..6cc18e57a 100644 --- a/src/class108/Code05_TwoDimensionIntervalAddIntervalQuery1.java +++ b/src/class108/Code05_TwoDimensionIntervalAddIntervalQuery1.java @@ -2,18 +2,11 @@ // 二维数组上范围增加、范围查询,使用树状数组的模版(java) // 测试链接 : https://www.luogu.com.cn/problem/P4514 -// 如下实现是正确的,但是洛谷平台对空间卡的很严,只有使用C++能全部通过 -// java的版本就是无法完全通过的,空间会超过限制,主要是IO空间占用大 -// 这是洛谷平台没有照顾各种语言的实现所导致的 -// 在真正笔试、比赛时,一定是兼顾各种语言的,该实现是一定正确的 -// C++版本就是Code05_TwoDimensionIntervalAddIntervalQuery2文件 -// C++版本和java版本逻辑完全一样,但只有C++版本可以通过所有测试用例 +// 提交以下的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 Code05_TwoDimensionIntervalAddIntervalQuery1 { @@ -80,31 +73,39 @@ public static int range(int a, int b, int c, int d) { 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)); String op; int a, b, c, d, v; while (in.nextToken() != StreamTokenizer.TT_EOF) { op = in.sval; if (op.equals("X")) { - in.nextToken(); n = (int) in.nval; - in.nextToken(); m = (int) in.nval; + in.nextToken(); + n = (int) in.nval; + in.nextToken(); + m = (int) in.nval; } else if (op.equals("L")) { - in.nextToken(); a = (int) in.nval; - in.nextToken(); b = (int) in.nval; - in.nextToken(); c = (int) in.nval; - in.nextToken(); d = (int) in.nval; - in.nextToken(); v = (int) in.nval; + in.nextToken(); + a = (int) in.nval; + in.nextToken(); + b = (int) in.nval; + in.nextToken(); + c = (int) in.nval; + in.nextToken(); + d = (int) in.nval; + in.nextToken(); + v = (int) in.nval; add(a, b, c, d, v); } else { - in.nextToken(); a = (int) in.nval; - in.nextToken(); b = (int) in.nval; - in.nextToken(); c = (int) in.nval; - in.nextToken(); d = (int) in.nval; - out.println(range(a, b, c, d)); + in.nextToken(); + a = (int) in.nval; + in.nextToken(); + b = (int) in.nval; + in.nextToken(); + c = (int) in.nval; + in.nextToken(); + d = (int) in.nval; + System.out.println(range(a, b, c, d)); // 改用System.out.println可以通过了 } } - out.flush(); - out.close(); br.close(); } diff --git a/src/class140/Code01_DiophantineEquation2.java b/src/class140/Code01_DiophantineEquation2.java index 74bad0de5..0b6e4855f 100644 --- a/src/class140/Code01_DiophantineEquation2.java +++ b/src/class140/Code01_DiophantineEquation2.java @@ -13,7 +13,6 @@ // 提交如下代码,可以通过所有测试用例 //#include -// //#include // //using namespace std; From 187c183341d9daf644401dd278c1eefb4d06585d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 29 Nov 2024 16:36:25 +0800 Subject: [PATCH 0426/2029] modify code --- src/class153/ShowDetail.java | 140 +++++++++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 src/class153/ShowDetail.java diff --git a/src/class153/ShowDetail.java b/src/class153/ShowDetail.java new file mode 100644 index 000000000..d3cfbd6a8 --- /dev/null +++ b/src/class153/ShowDetail.java @@ -0,0 +1,140 @@ +package class153; + +// splay处理长链的效果实验 +// 分别去生成一字型长链和之字型长链 +// 每一种长链都让最下方节点splay上去 +// 然后看看长链的高度变化 +public class ShowDetail { + + public static int MAXN = 100001; + + public static int head = 0; + + public static int cnt = 0; + + public static int[] key = new int[MAXN]; + + public static int[] father = new int[MAXN]; + + public static int[] left = new int[MAXN]; + + public static int[] right = new int[MAXN]; + + public static int[] size = new int[MAXN]; + + public static void up(int i) { + size[i] = size[left[i]] + size[right[i]] + 1; + } + + public static int lr(int i) { + return right[father[i]] == i ? 1 : 0; + } + + public static void rotate(int i) { + int f = father[i], g = father[f], soni = lr(i), sonf = lr(f); + if (soni == 1) { + right[f] = left[i]; + if (right[f] != 0) { + father[right[f]] = f; + } + left[i] = f; + } else { + left[f] = right[i]; + if (left[f] != 0) { + father[left[f]] = f; + } + right[i] = f; + } + if (g != 0) { + if (sonf == 1) { + right[g] = i; + } else { + left[g] = i; + } + } + father[f] = i; + father[i] = g; + up(f); + up(i); + } + + public static void splay(int i, int goal) { + int f = father[i], g = father[f]; + while (f != goal) { + if (g != goal) { + if (lr(i) == lr(f)) { + rotate(f); + } else { + rotate(i); + } + } + rotate(i); + f = father[i]; + g = father[f]; + } + if (goal == 0) { + head = i; + } + } + + public static int build1(int l, int r) { + int h = cnt + 1; + for (int i = l, last = 0; i <= r; i++, last = cnt) { + key[++cnt] = i; + father[cnt] = last; + left[cnt] = right[cnt] = 0; + size[cnt] = r - i + 1; + if (last != 0) { + right[last] = cnt; + } + } + return h; + } + + public static int build2(int l, int r, int fa) { + if (l > r) { + return 0; + } + key[++cnt] = l; + father[cnt] = fa; + left[cnt] = right[cnt] = 0; + int h = cnt; + if (l < r) { + key[++cnt] = r; + father[cnt] = h; + left[cnt] = right[cnt] = 0; + int c = cnt; + right[h] = c; + left[c] = build2(l + 1, r - 1, c); + up(c); + } + up(h); + return h; + } + + public static int height(int i) { + if (i == 0) { + return 0; + } + return Math.max(height(left[i]), height(right[i])) + 1; + } + + public static void main(String[] args) { + System.out.println("构建一字型长链"); + System.out.println("最下方节点执行splay,观察高度变化"); + head = build1(1, 1000); + System.out.println("splay之前的链长度 : " + height(head)); + splay(cnt, 0); + System.out.println("splay之后的链长度 : " + height(head)); + + System.out.println("=================="); + + System.out.println("构建之字型长链"); + System.out.println("最下方节点执行splay,观察高度变化"); + head = build2(1, 1000, 0); + System.out.println("splay之前的链长度 : " + height(head)); + splay(cnt, 0); + System.out.println("splay之后的链长度 : " + height(head)); + } + +} From a62ed16746603ce4eee6645d87d73af6de8be556 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 2 Dec 2024 15:35:46 +0800 Subject: [PATCH 0427/2029] modify code --- .../{ShowDetail.java => ShowDetail1.java} | 6 +- src/class153/ShowDetail2.java | 157 ++++++++++++++++++ 2 files changed, 160 insertions(+), 3 deletions(-) rename src/class153/{ShowDetail.java => ShowDetail1.java} (95%) create mode 100644 src/class153/ShowDetail2.java diff --git a/src/class153/ShowDetail.java b/src/class153/ShowDetail1.java similarity index 95% rename from src/class153/ShowDetail.java rename to src/class153/ShowDetail1.java index d3cfbd6a8..6b067973a 100644 --- a/src/class153/ShowDetail.java +++ b/src/class153/ShowDetail1.java @@ -1,10 +1,10 @@ package class153; -// splay处理长链的效果实验 +// 底层节点提根操作后长链高度变化的实验 // 分别去生成一字型长链和之字型长链 -// 每一种长链都让最下方节点splay上去 +// 每一种长链都让最下方节点提根上去 // 然后看看长链的高度变化 -public class ShowDetail { +public class ShowDetail1 { public static int MAXN = 100001; diff --git a/src/class153/ShowDetail2.java b/src/class153/ShowDetail2.java new file mode 100644 index 000000000..a10e4ffb6 --- /dev/null +++ b/src/class153/ShowDetail2.java @@ -0,0 +1,157 @@ +package class153; + +// 底层节点提根操作后子树大小变化的实验 +// 分别去生成一字型长链和之字型长链 +// 每一种长链都让最下方节点提根上去 +// 然后看看每个节点子树大小的变化并统计数量 +public class ShowDetail2 { + + public static int MAXN = 100001; + + public static int head = 0; + + public static int cnt = 0; + + public static int[] key = new int[MAXN]; + + public static int[] father = new int[MAXN]; + + public static int[] left = new int[MAXN]; + + public static int[] right = new int[MAXN]; + + public static int[] size = new int[MAXN]; + + public static int[] before = new int[MAXN]; + + public static void up(int i) { + size[i] = size[left[i]] + size[right[i]] + 1; + } + + public static int lr(int i) { + return right[father[i]] == i ? 1 : 0; + } + + public static void rotate(int i) { + int f = father[i], g = father[f], soni = lr(i), sonf = lr(f); + if (soni == 1) { + right[f] = left[i]; + if (right[f] != 0) { + father[right[f]] = f; + } + left[i] = f; + } else { + left[f] = right[i]; + if (left[f] != 0) { + father[left[f]] = f; + } + right[i] = f; + } + if (g != 0) { + if (sonf == 1) { + right[g] = i; + } else { + left[g] = i; + } + } + father[f] = i; + father[i] = g; + up(f); + up(i); + } + + public static void splay(int i, int goal) { + int f = father[i], g = father[f]; + while (f != goal) { + if (g != goal) { + if (lr(i) == lr(f)) { + rotate(f); + } else { + rotate(i); + } + } + rotate(i); + f = father[i]; + g = father[f]; + } + if (goal == 0) { + head = i; + } + } + + public static int build1(int l, int r) { + int h = cnt + 1; + for (int i = l, last = 0; i <= r; i++, last = cnt) { + key[++cnt] = i; + father[cnt] = last; + left[cnt] = right[cnt] = 0; + size[cnt] = r - i + 1; + if (last != 0) { + right[last] = cnt; + } + } + return h; + } + + public static int build2(int l, int r, int fa) { + if (l > r) { + return 0; + } + key[++cnt] = l; + father[cnt] = fa; + left[cnt] = right[cnt] = 0; + int h = cnt; + if (l < r) { + key[++cnt] = r; + father[cnt] = h; + left[cnt] = right[cnt] = 0; + int c = cnt; + right[h] = c; + left[c] = build2(l + 1, r - 1, c); + up(c); + } + up(h); + return h; + } + + public static void experiment(int top, int bottom) { + for (int i = top; i <= bottom; i++) { + before[i] = size[i]; + } + int all = bottom - top + 1; + splay(bottom, 0); + int half = 0; + int beyond = 0; + int other = 0; + for (int i = top; i <= bottom; i++) { + if (size[i] <= before[i] / 2) { + half++; + } else if (size[i] > before[i]) { + beyond++; + } else { + other++; + } + } + System.out.println("子树总数 : " + all); + System.out.println("子树大小至少减半的数量 : " + half); + System.out.println("子树大小得到增长的数量 : " + beyond); + System.out.println("其他子树的数量 : " + other); + } + + public static void main(String[] args) { + System.out.println("构建一字型长链"); + head = build1(1, 1000); + System.out.println("实验开始"); + experiment(head, cnt); + System.out.println("实验结束"); + + System.out.println(); + + System.out.println("构建之字型长链"); + System.out.println("实验开始"); + head = build2(1, 1000, 0); + experiment(head, cnt); + System.out.println("实验结束"); + } + +} From 6b75879dd0d04cb99a7764e11548cce56e72d6df Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 2 Dec 2024 20:13:20 +0800 Subject: [PATCH 0428/2029] modify code --- .../{ShowDetail1.java => ShowDetail.java} | 2 +- src/class153/ShowDetail2.java | 157 ------------------ 2 files changed, 1 insertion(+), 158 deletions(-) rename src/class153/{ShowDetail1.java => ShowDetail.java} (99%) delete mode 100644 src/class153/ShowDetail2.java diff --git a/src/class153/ShowDetail1.java b/src/class153/ShowDetail.java similarity index 99% rename from src/class153/ShowDetail1.java rename to src/class153/ShowDetail.java index 6b067973a..335c4bedf 100644 --- a/src/class153/ShowDetail1.java +++ b/src/class153/ShowDetail.java @@ -4,7 +4,7 @@ // 分别去生成一字型长链和之字型长链 // 每一种长链都让最下方节点提根上去 // 然后看看长链的高度变化 -public class ShowDetail1 { +public class ShowDetail { public static int MAXN = 100001; diff --git a/src/class153/ShowDetail2.java b/src/class153/ShowDetail2.java deleted file mode 100644 index a10e4ffb6..000000000 --- a/src/class153/ShowDetail2.java +++ /dev/null @@ -1,157 +0,0 @@ -package class153; - -// 底层节点提根操作后子树大小变化的实验 -// 分别去生成一字型长链和之字型长链 -// 每一种长链都让最下方节点提根上去 -// 然后看看每个节点子树大小的变化并统计数量 -public class ShowDetail2 { - - public static int MAXN = 100001; - - public static int head = 0; - - public static int cnt = 0; - - public static int[] key = new int[MAXN]; - - public static int[] father = new int[MAXN]; - - public static int[] left = new int[MAXN]; - - public static int[] right = new int[MAXN]; - - public static int[] size = new int[MAXN]; - - public static int[] before = new int[MAXN]; - - public static void up(int i) { - size[i] = size[left[i]] + size[right[i]] + 1; - } - - public static int lr(int i) { - return right[father[i]] == i ? 1 : 0; - } - - public static void rotate(int i) { - int f = father[i], g = father[f], soni = lr(i), sonf = lr(f); - if (soni == 1) { - right[f] = left[i]; - if (right[f] != 0) { - father[right[f]] = f; - } - left[i] = f; - } else { - left[f] = right[i]; - if (left[f] != 0) { - father[left[f]] = f; - } - right[i] = f; - } - if (g != 0) { - if (sonf == 1) { - right[g] = i; - } else { - left[g] = i; - } - } - father[f] = i; - father[i] = g; - up(f); - up(i); - } - - public static void splay(int i, int goal) { - int f = father[i], g = father[f]; - while (f != goal) { - if (g != goal) { - if (lr(i) == lr(f)) { - rotate(f); - } else { - rotate(i); - } - } - rotate(i); - f = father[i]; - g = father[f]; - } - if (goal == 0) { - head = i; - } - } - - public static int build1(int l, int r) { - int h = cnt + 1; - for (int i = l, last = 0; i <= r; i++, last = cnt) { - key[++cnt] = i; - father[cnt] = last; - left[cnt] = right[cnt] = 0; - size[cnt] = r - i + 1; - if (last != 0) { - right[last] = cnt; - } - } - return h; - } - - public static int build2(int l, int r, int fa) { - if (l > r) { - return 0; - } - key[++cnt] = l; - father[cnt] = fa; - left[cnt] = right[cnt] = 0; - int h = cnt; - if (l < r) { - key[++cnt] = r; - father[cnt] = h; - left[cnt] = right[cnt] = 0; - int c = cnt; - right[h] = c; - left[c] = build2(l + 1, r - 1, c); - up(c); - } - up(h); - return h; - } - - public static void experiment(int top, int bottom) { - for (int i = top; i <= bottom; i++) { - before[i] = size[i]; - } - int all = bottom - top + 1; - splay(bottom, 0); - int half = 0; - int beyond = 0; - int other = 0; - for (int i = top; i <= bottom; i++) { - if (size[i] <= before[i] / 2) { - half++; - } else if (size[i] > before[i]) { - beyond++; - } else { - other++; - } - } - System.out.println("子树总数 : " + all); - System.out.println("子树大小至少减半的数量 : " + half); - System.out.println("子树大小得到增长的数量 : " + beyond); - System.out.println("其他子树的数量 : " + other); - } - - public static void main(String[] args) { - System.out.println("构建一字型长链"); - head = build1(1, 1000); - System.out.println("实验开始"); - experiment(head, cnt); - System.out.println("实验结束"); - - System.out.println(); - - System.out.println("构建之字型长链"); - System.out.println("实验开始"); - head = build2(1, 1000, 0); - experiment(head, cnt); - System.out.println("实验结束"); - } - -} From 9becc4c987f55ce799471fc244c62cf7e2fc4477 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 3 Dec 2024 15:36:56 +0800 Subject: [PATCH 0429/2029] modify code --- src/class153/Code01_Splay1.java | 2 ++ src/class153/FollowUp1.java | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/class153/Code01_Splay1.java b/src/class153/Code01_Splay1.java index 188fe9631..fc12cb20e 100644 --- a/src/class153/Code01_Splay1.java +++ b/src/class153/Code01_Splay1.java @@ -94,6 +94,8 @@ public static void splay(int i, int goal) { } // 返回以i为头的树上第rank名的节点编号 + // 这个方法查询后没有splay操作 + // 因为remove方法使用该方法时,要求find不能提根! public static int find(int rank) { int i = head; while (i != 0) { diff --git a/src/class153/FollowUp1.java b/src/class153/FollowUp1.java index 47c72b942..2bdd0a453 100644 --- a/src/class153/FollowUp1.java +++ b/src/class153/FollowUp1.java @@ -87,6 +87,8 @@ public static void splay(int i, int goal) { } // 返回以i为头的树上第rank名的节点编号 + // 这个方法查询后没有splay操作 + // 因为remove方法使用该方法时,要求find不能提根! public static int find(int rank) { int i = head; while (i != 0) { From 324ae2f03bc437b37b31485ee46ec819acc82ca1 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 3 Dec 2024 15:38:57 +0800 Subject: [PATCH 0430/2029] modify code --- src/class153/Code01_Splay1.java | 3 ++- src/class153/FollowUp1.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/class153/Code01_Splay1.java b/src/class153/Code01_Splay1.java index fc12cb20e..778566baf 100644 --- a/src/class153/Code01_Splay1.java +++ b/src/class153/Code01_Splay1.java @@ -94,7 +94,8 @@ public static void splay(int i, int goal) { } // 返回以i为头的树上第rank名的节点编号 - // 这个方法查询后没有splay操作 + // 这个方法不是题目要求的查询操作,作为内部方法使用 + // 为什么该方法不进行提根操作? // 因为remove方法使用该方法时,要求find不能提根! public static int find(int rank) { int i = head; diff --git a/src/class153/FollowUp1.java b/src/class153/FollowUp1.java index 2bdd0a453..d52b3121f 100644 --- a/src/class153/FollowUp1.java +++ b/src/class153/FollowUp1.java @@ -87,7 +87,8 @@ public static void splay(int i, int goal) { } // 返回以i为头的树上第rank名的节点编号 - // 这个方法查询后没有splay操作 + // 这个方法不是题目要求的查询操作,作为内部方法使用 + // 为什么该方法不进行提根操作? // 因为remove方法使用该方法时,要求find不能提根! public static int find(int rank) { int i = head; From 896779d04e9a919ce671fbda4fc9468545c97753 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 3 Dec 2024 19:36:18 +0800 Subject: [PATCH 0431/2029] modify code --- src/class153/ShowDetail.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class153/ShowDetail.java b/src/class153/ShowDetail.java index 335c4bedf..9edf5ce16 100644 --- a/src/class153/ShowDetail.java +++ b/src/class153/ShowDetail.java @@ -1,6 +1,6 @@ package class153; -// 底层节点提根操作后长链高度变化的实验 +// 提根操作的代码 + 长链高度变化的实验 // 分别去生成一字型长链和之字型长链 // 每一种长链都让最下方节点提根上去 // 然后看看长链的高度变化 From 2377b24d6e6d1b3e8915f6cef0d7670c13c83668 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 4 Dec 2024 14:16:24 +0800 Subject: [PATCH 0432/2029] modify code --- src/class153/ShowDetail.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/class153/ShowDetail.java b/src/class153/ShowDetail.java index 9edf5ce16..1777672ce 100644 --- a/src/class153/ShowDetail.java +++ b/src/class153/ShowDetail.java @@ -8,28 +8,38 @@ public class ShowDetail { public static int MAXN = 100001; + // 整棵树的头节点编号 public static int head = 0; + // 分配了多少节点编号 public static int cnt = 0; + // key[i] : 编号为i的节点的key public static int[] key = new int[MAXN]; + // father[i] : 编号为i的节点的父节点编号 public static int[] father = new int[MAXN]; + // left[i] : 编号为i的节点的左孩子编号 public static int[] left = new int[MAXN]; + // right[i] : 编号为i的节点的右孩子编号 public static int[] right = new int[MAXN]; + // size[i] : 以编号为i的节点做头的子树上,一共有多少个节点 public static int[] size = new int[MAXN]; public static void up(int i) { size[i] = size[left[i]] + size[right[i]] + 1; } + // 判断编号为i的节点,是其父亲的什么儿子 + // 0代表左儿子,1代表右儿子 public static int lr(int i) { return right[father[i]] == i ? 1 : 0; } + // 编号为i的节点上升一步,在结构上做调整 public static void rotate(int i) { int f = father[i], g = father[f], soni = lr(i), sonf = lr(f); if (soni == 1) { @@ -58,6 +68,8 @@ public static void rotate(int i) { up(i); } + // 编号为i的节点提根,变成编号为goal的节点的儿子 + // 如果goal == 0,表示把编号为i的节点变成整棵树的头 public static void splay(int i, int goal) { int f = father[i], g = father[f]; while (f != goal) { @@ -77,6 +89,7 @@ public static void splay(int i, int goal) { } } + // 构建一字型长链 public static int build1(int l, int r) { int h = cnt + 1; for (int i = l, last = 0; i <= r; i++, last = cnt) { @@ -91,6 +104,7 @@ public static int build1(int l, int r) { return h; } + // 构建之字形长链 public static int build2(int l, int r, int fa) { if (l > r) { return 0; @@ -112,6 +126,7 @@ public static int build2(int l, int r, int fa) { return h; } + // 返回以i为头的树的高度 public static int height(int i) { if (i == 0) { return 0; From 669e802796746d50555b4bd6f9708db6ca49c90c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 4 Dec 2024 14:19:11 +0800 Subject: [PATCH 0433/2029] modify code --- src/class153/ShowDetail.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/class153/ShowDetail.java b/src/class153/ShowDetail.java index 1777672ce..f8b8d59d3 100644 --- a/src/class153/ShowDetail.java +++ b/src/class153/ShowDetail.java @@ -27,6 +27,7 @@ public class ShowDetail { public static int[] right = new int[MAXN]; // size[i] : 以编号为i的节点做头的子树上,一共有多少个节点 + // 这个数组和具体要实现的功能有关,属于常用信息 public static int[] size = new int[MAXN]; public static void up(int i) { From 986121fd07336cc80d29a4b29e87aad0fb87d1f4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 4 Dec 2024 14:22:45 +0800 Subject: [PATCH 0434/2029] modify code --- src/class153/ShowDetail.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/class153/ShowDetail.java b/src/class153/ShowDetail.java index f8b8d59d3..33b071a20 100644 --- a/src/class153/ShowDetail.java +++ b/src/class153/ShowDetail.java @@ -14,20 +14,20 @@ public class ShowDetail { // 分配了多少节点编号 public static int cnt = 0; - // key[i] : 编号为i的节点的key + // key[i] : 编号为i的节点的key public static int[] key = new int[MAXN]; // father[i] : 编号为i的节点的父节点编号 public static int[] father = new int[MAXN]; - // left[i] : 编号为i的节点的左孩子编号 + // left[i] : 编号为i的节点的左孩子编号 public static int[] left = new int[MAXN]; - // right[i] : 编号为i的节点的右孩子编号 + // right[i] : 编号为i的节点的右孩子编号 public static int[] right = new int[MAXN]; - // size[i] : 以编号为i的节点做头的子树上,一共有多少个节点 - // 这个数组和具体要实现的功能有关,属于常用信息 + // size[i] : 以编号为i的节点做头的子树,一共有多少个节点 + // 这个数组和具体要实现的功能有关,属于常用信息 public static int[] size = new int[MAXN]; public static void up(int i) { From 08a0e4238aba9141bc43c2a35570ed76d5261252 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 4 Dec 2024 15:25:47 +0800 Subject: [PATCH 0435/2029] modify code --- src/class153/Code01_Splay1.java | 2 +- src/class153/FollowUp1.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class153/Code01_Splay1.java b/src/class153/Code01_Splay1.java index 778566baf..189062abb 100644 --- a/src/class153/Code01_Splay1.java +++ b/src/class153/Code01_Splay1.java @@ -93,7 +93,7 @@ public static void splay(int i, int goal) { } } - // 返回以i为头的树上第rank名的节点编号 + // 树上找到中序排名为rank的节点,返回节点编号 // 这个方法不是题目要求的查询操作,作为内部方法使用 // 为什么该方法不进行提根操作? // 因为remove方法使用该方法时,要求find不能提根! diff --git a/src/class153/FollowUp1.java b/src/class153/FollowUp1.java index d52b3121f..a62a146b5 100644 --- a/src/class153/FollowUp1.java +++ b/src/class153/FollowUp1.java @@ -86,7 +86,7 @@ public static void splay(int i, int goal) { } } - // 返回以i为头的树上第rank名的节点编号 + // 树上找到中序排名为rank的节点,返回节点编号 // 这个方法不是题目要求的查询操作,作为内部方法使用 // 为什么该方法不进行提根操作? // 因为remove方法使用该方法时,要求find不能提根! From 23ae1899e84503ed74eb24664b20c8f5a1617d84 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 4 Dec 2024 15:27:35 +0800 Subject: [PATCH 0436/2029] modify code --- src/class153/Code01_Splay1.java | 2 +- src/class153/FollowUp1.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class153/Code01_Splay1.java b/src/class153/Code01_Splay1.java index 189062abb..4fe607544 100644 --- a/src/class153/Code01_Splay1.java +++ b/src/class153/Code01_Splay1.java @@ -93,7 +93,7 @@ public static void splay(int i, int goal) { } } - // 树上找到中序排名为rank的节点,返回节点编号 + // 整棵树上找到中序排名为rank的节点,返回节点编号 // 这个方法不是题目要求的查询操作,作为内部方法使用 // 为什么该方法不进行提根操作? // 因为remove方法使用该方法时,要求find不能提根! diff --git a/src/class153/FollowUp1.java b/src/class153/FollowUp1.java index a62a146b5..81df6b3fb 100644 --- a/src/class153/FollowUp1.java +++ b/src/class153/FollowUp1.java @@ -86,7 +86,7 @@ public static void splay(int i, int goal) { } } - // 树上找到中序排名为rank的节点,返回节点编号 + // 整棵树上找到中序排名为rank的节点,返回节点编号 // 这个方法不是题目要求的查询操作,作为内部方法使用 // 为什么该方法不进行提根操作? // 因为remove方法使用该方法时,要求find不能提根! From 44140efb4d544ce8752641699fca4c8680996a7d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 5 Dec 2024 12:28:39 +0800 Subject: [PATCH 0437/2029] modify code --- src/class153/Code02_FrustratedCashier1.java | 15 ++++++++------- src/class153/Code02_FrustratedCashier2.java | 15 ++++++++------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/class153/Code02_FrustratedCashier1.java b/src/class153/Code02_FrustratedCashier1.java index ab47e92e9..576a62a76 100644 --- a/src/class153/Code02_FrustratedCashier1.java +++ b/src/class153/Code02_FrustratedCashier1.java @@ -146,19 +146,20 @@ public static void departure() { int num = limit - change - 1; int i = head, ans = 0; while (i != 0) { - if (key[i] <= num) { + if (key[i] > num) { ans = i; - i = right[i]; - } else { i = left[i]; + } else { + i = right[i]; } } if (ans == 0) { - return; + head = 0; + } else { + splay(ans, 0); + left[head] = 0; + up(head); } - splay(ans, 0); - head = right[head]; - father[head] = 0; } public static void main(String[] args) { diff --git a/src/class153/Code02_FrustratedCashier2.java b/src/class153/Code02_FrustratedCashier2.java index 0ab6be31f..e371c8352 100644 --- a/src/class153/Code02_FrustratedCashier2.java +++ b/src/class153/Code02_FrustratedCashier2.java @@ -132,19 +132,20 @@ // int num = limit - change - 1; // int i = head, ans = 0; // while (i != 0) { -// if (key[i] <= num) { +// if (key[i] > num) { // ans = i; -// i = rs[i]; -// } else { // i = ls[i]; +// } else { +// i = rs[i]; // } // } // if (ans == 0) { -// return; +// head = 0; +// } else { +// splay(ans, 0); +// ls[head] = 0; +// up(head); // } -// splay(ans, 0); -// head = rs[head]; -// fa[head] = 0; //} // //int main() { From 11c5ef217bb3913ce55fea182ce59d4efbb5d992 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 5 Dec 2024 13:49:40 +0800 Subject: [PATCH 0438/2029] modify code --- src/class153/Code02_FrustratedCashier1.java | 2 +- src/class153/Code02_FrustratedCashier2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class153/Code02_FrustratedCashier1.java b/src/class153/Code02_FrustratedCashier1.java index 576a62a76..c068be723 100644 --- a/src/class153/Code02_FrustratedCashier1.java +++ b/src/class153/Code02_FrustratedCashier1.java @@ -5,7 +5,7 @@ // I x : 新来员工初始薪水是x,如果x低于limit,该员工不会入职当然也不算离职 // A x : 所有员工的薪水都加上x // S x : 所有员工的薪水都减去x,一旦有员工低于limit那么就会离职 -// F x : 查询第k多的工资,如果x大于当前员工数量,打印-1 +// F x : 查询第x多的工资,如果x大于当前员工数量,打印-1 // 所有操作完成后,打印有多少员工在操作期间离开了公司 // 测试链接 : https://www.luogu.com.cn/problem/P1486 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class153/Code02_FrustratedCashier2.java b/src/class153/Code02_FrustratedCashier2.java index e371c8352..00850dfc5 100644 --- a/src/class153/Code02_FrustratedCashier2.java +++ b/src/class153/Code02_FrustratedCashier2.java @@ -5,7 +5,7 @@ // I x : 新来员工初始薪水是x,如果x低于limit,该员工不会入职当然也不算离职 // A x : 所有员工的薪水都加上x // S x : 所有员工的薪水都减去x,一旦有员工低于limit那么就会离职 -// F x : 查询第k多的工资,如果x大于当前员工数量,打印-1 +// F x : 查询第x多的工资,如果x大于当前员工数量,打印-1 // 所有操作完成后,打印有多少员工在操作期间离开了公司 // 测试链接 : https://www.luogu.com.cn/problem/P1486 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 From 3e688e1fd25b6ae9a39578cbedcee1caae535002 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 5 Dec 2024 15:40:42 +0800 Subject: [PATCH 0439/2029] modify code --- src/class153/Code03_LiteraryTree1.java | 8 ++------ src/class153/Code03_LiteraryTree2.java | 8 ++------ 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/src/class153/Code03_LiteraryTree1.java b/src/class153/Code03_LiteraryTree1.java index d2c78e47a..b939a5aa1 100644 --- a/src/class153/Code03_LiteraryTree1.java +++ b/src/class153/Code03_LiteraryTree1.java @@ -126,14 +126,10 @@ public static int find(int rank) { } public static void add(int x) { - int i = head; - while (right[i] != 0) { - i = right[i]; - } num[++cnt] = x; size[cnt] = 1; - father[cnt] = i; - right[i] = cnt; + father[cnt] = head; + right[head] = cnt; splay(cnt, 0); } diff --git a/src/class153/Code03_LiteraryTree2.java b/src/class153/Code03_LiteraryTree2.java index 96e362fb1..e1fc072c0 100644 --- a/src/class153/Code03_LiteraryTree2.java +++ b/src/class153/Code03_LiteraryTree2.java @@ -111,14 +111,10 @@ //} // //void add(int x) { -// int i = head; -// while (rs[i] != 0) { -// i = rs[i]; -// } // num[++cnt] = x; // size[cnt] = 1; -// fa[cnt] = i; -// rs[i] = cnt; +// fa[cnt] = head; +// rs[head] = cnt; // splay(cnt, 0); //} // From 8cb4e941e52fee8ac394eb711a95360c35519e6b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 5 Dec 2024 15:53:13 +0800 Subject: [PATCH 0440/2029] modify code --- src/class153/Code04_Bookcase1.java | 5 +++-- src/class153/Code04_Bookcase2.java | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/class153/Code04_Bookcase1.java b/src/class153/Code04_Bookcase1.java index 2970bd7c3..f169cdc92 100644 --- a/src/class153/Code04_Bookcase1.java +++ b/src/class153/Code04_Bookcase1.java @@ -30,8 +30,6 @@ public class Code04_Bookcase1 { public static int[] num = new int[MAXN]; - public static int[] pos = new int[MAXN]; - public static int[] father = new int[MAXN]; public static int[] left = new int[MAXN]; @@ -40,6 +38,9 @@ public class Code04_Bookcase1 { public static int[] size = new int[MAXN]; + // pos[i] : 数字i是中序遍历的第几位,相当于rank + public static int[] pos = new int[MAXN]; + public static int n, m; public static void up(int i) { diff --git a/src/class153/Code04_Bookcase2.java b/src/class153/Code04_Bookcase2.java index 87b04fd86..abc94a648 100644 --- a/src/class153/Code04_Bookcase2.java +++ b/src/class153/Code04_Bookcase2.java @@ -22,11 +22,11 @@ //int head = 0; //int cnt = 0; //int num[MAXN]; -//int pos[MAXN]; //int fa[MAXN]; //int ls[MAXN]; //int rs[MAXN]; //int size[MAXN]; +//int pos[MAXN]; // //void up(int i) { // size[i] = size[ls[i]] + size[rs[i]] + 1; From ebc8f36c316f5159b010da50fe7f07bad17d3e9f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 5 Dec 2024 15:55:52 +0800 Subject: [PATCH 0441/2029] modify code --- src/class153/Code04_Bookcase1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class153/Code04_Bookcase1.java b/src/class153/Code04_Bookcase1.java index f169cdc92..caab32027 100644 --- a/src/class153/Code04_Bookcase1.java +++ b/src/class153/Code04_Bookcase1.java @@ -38,7 +38,7 @@ public class Code04_Bookcase1 { public static int[] size = new int[MAXN]; - // pos[i] : 数字i是中序遍历的第几位,相当于rank + // pos[num] : 数字num所在节点的编号 public static int[] pos = new int[MAXN]; public static int n, m; From 5ee52ca822a948cb7f6c4f3b57eaac89bddd1195 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 5 Dec 2024 16:22:47 +0800 Subject: [PATCH 0442/2029] modify code --- src/class153/Code04_Bookcase1.java | 8 ++------ src/class153/Code04_Bookcase2.java | 8 ++------ 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/src/class153/Code04_Bookcase1.java b/src/class153/Code04_Bookcase1.java index caab32027..82098eb7a 100644 --- a/src/class153/Code04_Bookcase1.java +++ b/src/class153/Code04_Bookcase1.java @@ -115,15 +115,11 @@ public static int find(int rank) { } public static void add(int s) { - int i = head; - while (right[i] != 0) { - i = right[i]; - } num[++cnt] = s; pos[s] = cnt; size[cnt] = 1; - father[cnt] = i; - right[i] = cnt; + father[cnt] = head; + right[head] = cnt; splay(cnt, 0); } diff --git a/src/class153/Code04_Bookcase2.java b/src/class153/Code04_Bookcase2.java index abc94a648..d9a81bb32 100644 --- a/src/class153/Code04_Bookcase2.java +++ b/src/class153/Code04_Bookcase2.java @@ -99,15 +99,11 @@ //} // //void add(int s) { -// int i = head; -// while (rs[i] != 0) { -// i = rs[i]; -// } // num[++cnt] = s; // pos[s] = cnt; // size[cnt] = 1; -// fa[cnt] = i; -// rs[i] = cnt; +// fa[cnt] = head; +// rs[head] = cnt; // splay(cnt, 0); //} // From 56c60e5b8d48ec65cec58c6f4517cf996b4316f4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 5 Dec 2024 16:47:57 +0800 Subject: [PATCH 0443/2029] modify code --- src/class153/Code05_MaintainSequence1.java | 19 ++++++++++++------- src/class153/Code05_MaintainSequence2.java | 2 +- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/class153/Code05_MaintainSequence1.java b/src/class153/Code05_MaintainSequence1.java index ec21f5d4a..a597cda35 100644 --- a/src/class153/Code05_MaintainSequence1.java +++ b/src/class153/Code05_MaintainSequence1.java @@ -31,10 +31,6 @@ public class Code05_MaintainSequence1 { public static int head = 0; - public static int[] space = new int[MAXN]; - - public static int si; - public static int[] arr = new int[MAXN]; public static int[] num = new int[MAXN]; @@ -47,21 +43,30 @@ public class Code05_MaintainSequence1 { public static int[] size = new int[MAXN]; + // 这个数组里拿空间编号 + public static int[] space = new int[MAXN]; + + public static int si; + + // 维护区间累加和信息 public static int[] sum = new int[MAXN]; - // 整体子数组最大累加和,不能空 + // 维护区间子数组最大累加和信息,要求不能为空 public static int[] all = new int[MAXN]; - // 前缀子数组最大累加和,可以空 + // 维护区间前缀最大累加和信息,可以空 public static int[] pre = new int[MAXN]; - // 后缀子数组最大累加和,可以空 + // 维护区间后缀最大累加和信息,可以空 public static int[] suf = new int[MAXN]; + // 懒更新信息,区间是否重新设了值 public static boolean[] update = new boolean[MAXN]; + // 懒更新信息,如果区间重新设了值,设置成了什么 public static int[] change = new int[MAXN]; + // 懒更新信息,区间是否发生了翻转 public static boolean[] reverse = new boolean[MAXN]; public static void up(int i) { diff --git a/src/class153/Code05_MaintainSequence2.java b/src/class153/Code05_MaintainSequence2.java index 3087dd7b4..076cc19d8 100644 --- a/src/class153/Code05_MaintainSequence2.java +++ b/src/class153/Code05_MaintainSequence2.java @@ -21,13 +21,13 @@ //const int INF = 1000000001; // //int head = 0; -//int space[MAXN], si; //int arr[MAXN]; //int num[MAXN]; //int fa[MAXN]; //int ls[MAXN]; //int rs[MAXN]; //int size[MAXN]; +//int space[MAXN], si; //int sum[MAXN]; //int all[MAXN]; //int pre[MAXN]; From ff333a79f20556ce7e89aad4bd67f328e5b005b3 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 5 Dec 2024 17:30:24 +0800 Subject: [PATCH 0444/2029] modify code --- src/class153/Code05_MaintainSequence1.java | 11 ++++++----- src/class153/Code05_MaintainSequence2.java | 12 +++++++----- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/class153/Code05_MaintainSequence1.java b/src/class153/Code05_MaintainSequence1.java index a597cda35..cb5d040d1 100644 --- a/src/class153/Code05_MaintainSequence1.java +++ b/src/class153/Code05_MaintainSequence1.java @@ -70,11 +70,12 @@ public class Code05_MaintainSequence1 { public static boolean[] reverse = new boolean[MAXN]; public static void up(int i) { - size[i] = size[left[i]] + size[right[i]] + 1; - sum[i] = sum[left[i]] + sum[right[i]] + num[i]; - all[i] = Math.max(Math.max(all[left[i]], all[right[i]]), suf[left[i]] + num[i] + pre[right[i]]); - pre[i] = Math.max(pre[left[i]], sum[left[i]] + num[i] + pre[right[i]]); - suf[i] = Math.max(suf[right[i]], suf[left[i]] + num[i] + sum[right[i]]); + int l = left[i], r = right[i]; + size[i] = size[l] + size[r] + 1; + sum[i] = sum[l] + sum[r] + num[i]; + all[i] = Math.max(Math.max(all[l], all[r]), suf[l] + num[i] + pre[r]); + pre[i] = Math.max(pre[l], sum[l] + num[i] + pre[r]); + suf[i] = Math.max(suf[r], suf[l] + num[i] + sum[r]); } public static int lr(int i) { diff --git a/src/class153/Code05_MaintainSequence2.java b/src/class153/Code05_MaintainSequence2.java index 076cc19d8..13848996d 100644 --- a/src/class153/Code05_MaintainSequence2.java +++ b/src/class153/Code05_MaintainSequence2.java @@ -15,6 +15,7 @@ // 提交如下代码,可以通过所有测试用例 //#include +// //using namespace std; // //const int MAXN = 500005; @@ -37,11 +38,12 @@ //bool rev[MAXN]; // //void up(int i) { -// size[i] = size[ls[i]] + size[rs[i]] + 1; -// sum[i] = sum[ls[i]] + sum[rs[i]] + num[i]; -// all[i] = max({all[ls[i]], all[rs[i]], suf[ls[i]] + num[i] + pre[rs[i]]}); -// pre[i] = max(pre[ls[i]], sum[ls[i]] + num[i] + pre[rs[i]]); -// suf[i] = max(suf[rs[i]], suf[ls[i]] + num[i] + sum[rs[i]]); +// int l = ls[i], r = rs[i]; +// size[i] = size[l] + size[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]); +// suf[i] = max(suf[r], suf[l] + num[i] + sum[r]); //} // //int lr(int i) { From 25a695b30d4b093d9f28c04a5d7d4c026656e62a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 5 Dec 2024 18:03:01 +0800 Subject: [PATCH 0445/2029] modify code --- src/class153/Code05_MaintainSequence1.java | 8 ++++---- src/class153/Code05_MaintainSequence2.java | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/class153/Code05_MaintainSequence1.java b/src/class153/Code05_MaintainSequence1.java index cb5d040d1..e8694c647 100644 --- a/src/class153/Code05_MaintainSequence1.java +++ b/src/class153/Code05_MaintainSequence1.java @@ -143,10 +143,7 @@ public static void setValue(int i, int val) { public static void setReverse(int i) { if (i != 0) { - int tmp = left[i]; - left[i] = right[i]; - right[i] = tmp; - tmp = pre[i]; + int tmp = pre[i]; pre[i] = suf[i]; suf[i] = tmp; reverse[i] = !reverse[i]; @@ -160,6 +157,9 @@ public static void down(int i) { update[i] = false; } if (reverse[i]) { + int tmp = left[i]; + left[i] = right[i]; + right[i] = tmp; setReverse(left[i]); setReverse(right[i]); reverse[i] = false; diff --git a/src/class153/Code05_MaintainSequence2.java b/src/class153/Code05_MaintainSequence2.java index 13848996d..8c4255941 100644 --- a/src/class153/Code05_MaintainSequence2.java +++ b/src/class153/Code05_MaintainSequence2.java @@ -109,7 +109,6 @@ // //void setReverse(int i) { // if (i != 0) { -// swap(ls[i], rs[i]); // swap(pre[i], suf[i]); // rev[i] ^= 1; // } @@ -122,6 +121,7 @@ // update[i] = false; // } // if (rev[i]) { +// swap(ls[i], rs[i]); // setReverse(ls[i]); // setReverse(rs[i]); // rev[i] = false; From 1a6a8eccc6e582ece6e6610a3767ebbff12fa185 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 5 Dec 2024 18:33:20 +0800 Subject: [PATCH 0446/2029] modify code --- ...270\223\351\242\2306-Splay\346\240\221.pdf" | Bin 0 -> 325745 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "ppt/\347\256\227\346\263\225\350\256\262\350\247\243153\343\200\220\346\211\251\345\261\225\343\200\221\346\234\211\345\272\217\350\241\250\344\270\223\351\242\2306-Splay\346\240\221.pdf" diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243153\343\200\220\346\211\251\345\261\225\343\200\221\346\234\211\345\272\217\350\241\250\344\270\223\351\242\2306-Splay\346\240\221.pdf" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243153\343\200\220\346\211\251\345\261\225\343\200\221\346\234\211\345\272\217\350\241\250\344\270\223\351\242\2306-Splay\346\240\221.pdf" new file mode 100644 index 0000000000000000000000000000000000000000..b7ba9cf170a12103ae84293da1e457052aa81e08 GIT binary patch literal 325745 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�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 z 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

    tfQeSXUf>|k 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�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 z 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 Date: Mon, 9 Dec 2024 15:25:48 +0800 Subject: [PATCH 0447/2029] modify code --- src/class154/Code01_LeftistTree1.java | 114 ++++++++++++++++++++++++++ src/class154/Code01_LeftistTree2.java | 89 ++++++++++++++++++++ 2 files changed, 203 insertions(+) create mode 100644 src/class154/Code01_LeftistTree1.java create mode 100644 src/class154/Code01_LeftistTree2.java diff --git a/src/class154/Code01_LeftistTree1.java b/src/class154/Code01_LeftistTree1.java new file mode 100644 index 000000000..6e4d863cb --- /dev/null +++ b/src/class154/Code01_LeftistTree1.java @@ -0,0 +1,114 @@ +package class154; + +// 左偏树模版,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P3377 +// 提交以下的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 Code01_LeftistTree1 { + + public static int MAXN = 100001; + + public static int INF = 1000000001; + + public static int[] num = new int[MAXN]; + + public static int[] father = new int[MAXN]; + + public static int[] left = new int[MAXN]; + + public static int[] right = new int[MAXN]; + + public static int[] dist = new int[MAXN]; + + public static int find(int i) { + if (father[i] != i) { + father[i] = find(father[i]); + } + return father[i]; + } + + public static int merge(int i, int j) { + if (i == 0 || j == 0) { + return i + j; + } + int tmp; + if (num[i] > num[j]) { + tmp = i; + i = j; + j = tmp; + } + right[i] = merge(right[i], j); + if (dist[left[i]] < dist[right[i]]) { + tmp = left[i]; + left[i] = right[i]; + right[i] = tmp; + } + dist[i] = dist[right[i]] + 1; + father[i] = father[left[i]] = father[right[i]] = i; + return i; + } + + public static void pop(int i) { + num[i] = -INF; + father[left[i]] = left[i]; + father[right[i]] = right[i]; + // 下面这一句的功能 + // 因为有路径压缩,所以i下方的某个节点x,可能有father[x] = i + // 但是现在堆要去掉i了,所以x一直往上找到i是无效的 + // 为了i能再往上找到正确的头,所以有下面这句 + father[i] = merge(left[i], right[i]); + } + + 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(); + int n = (int) in.nval; + in.nextToken(); + int m = (int) in.nval; + for (int i = 1; i <= n; i++) { + father[i] = i; + in.nextToken(); + num[i] = (int) in.nval; + } + for (int i = 1, op, x, y; i <= m; i++) { + in.nextToken(); + op = (int) in.nval; + if (op == 1) { + in.nextToken(); + x = (int) in.nval; + in.nextToken(); + y = (int) in.nval; + if (num[x] != -INF && num[y] != -INF) { + int l = find(x); + int r = find(y); + if (l != r) { + father[l] = father[r] = merge(l, r); + } + } + } else { + in.nextToken(); + x = (int) in.nval; + if (num[x] == -INF) { + out.println(-1); + } else { + int ans = find(x); + out.println(num[ans]); + pop(ans); + } + } + } + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class154/Code01_LeftistTree2.java b/src/class154/Code01_LeftistTree2.java new file mode 100644 index 000000000..685fd8767 --- /dev/null +++ b/src/class154/Code01_LeftistTree2.java @@ -0,0 +1,89 @@ +package class154; + +// 左偏树模版,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P3377 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +//const int INF = 1000000001; +//int num[MAXN]; +//int fa[MAXN]; +//int ls[MAXN]; +//int rs[MAXN]; +//int dist[MAXN]; +// +//int find(int i) { +// if (fa[i] != i) { +// fa[i] = find(fa[i]); +// } +// return fa[i]; +//} +// +//int merge(int i, int j) { +// if (i == 0 || j == 0) { +// return i + j; +// } +// if (num[i] > num[j]) { +// int tmp = i; +// i = j; +// j = tmp; +// } +// rs[i] = merge(rs[i], j); +// if (dist[ls[i]] < dist[rs[i]]) { +// int tmp = ls[i]; +// ls[i] = rs[i]; +// rs[i] = tmp; +// } +// dist[i] = dist[rs[i]] + 1; +// fa[i] = fa[ls[i]] = fa[rs[i]] = i; +// return i; +//} +// +//void pop(int i) { +// num[i] = -INF; +// fa[ls[i]] = ls[i]; +// fa[rs[i]] = rs[i]; +// fa[i] = merge(ls[i], rs[i]); +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// int n, m; +// cin >> n >> m; +// for (int i = 1; i <= n; i++) { +// fa[i] = i; +// cin >> num[i]; +// } +// for (int i = 1; i <= m; i++) { +// int op; +// cin >> op; +// if (op == 1) { +// int x, y; +// cin >> x >> y; +// if (num[x] != -INF && num[y] != -INF) { +// int l = find(x); +// int r = find(y); +// if (l != r) { +// fa[l] = fa[r] = merge(l, r); +// } +// } +// } else { +// int x; +// cin >> x; +// if (num[x] == -INF) { +// cout << -1 << "\n"; +// } else { +// int ans = find(x); +// cout << num[ans] << "\n"; +// pop(ans); +// } +// } +// } +// return 0; +//} \ No newline at end of file From 62f4fee4c4521e864c62c6e00ce3905a6fb12a68 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 9 Dec 2024 19:27:35 +0800 Subject: [PATCH 0448/2029] modify code --- src/class154/Code02_RomanGame1.java | 344 ++++++++++++++++++++++++++++ src/class154/Code02_RomanGame2.java | 87 +++++++ 2 files changed, 431 insertions(+) create mode 100644 src/class154/Code02_RomanGame1.java create mode 100644 src/class154/Code02_RomanGame2.java diff --git a/src/class154/Code02_RomanGame1.java b/src/class154/Code02_RomanGame1.java new file mode 100644 index 000000000..4bdcf6c2d --- /dev/null +++ b/src/class154/Code02_RomanGame1.java @@ -0,0 +1,344 @@ +package class154; + +// 罗马游戏,左偏树模版,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P2713 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.BufferedWriter; +import java.io.ByteArrayOutputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.Writer; +import java.util.InputMismatchException; + +public class Code02_RomanGame1 { + + public static int MAXN = 1000001; + + public static int INF = 1000000001; + + public static int[] num = new int[MAXN]; + + public static int[] father = new int[MAXN]; + + public static int[] left = new int[MAXN]; + + public static int[] right = new int[MAXN]; + + public static int[] dist = new int[MAXN]; + + public static int find(int i) { + if (father[i] != i) { + father[i] = find(father[i]); + } + return father[i]; + } + + public static int merge(int i, int j) { + if (i == 0 || j == 0) { + return i + j; + } + int tmp; + if (num[i] > num[j]) { + tmp = i; + i = j; + j = tmp; + } + right[i] = merge(right[i], j); + if (dist[left[i]] < dist[right[i]]) { + tmp = left[i]; + left[i] = right[i]; + right[i] = tmp; + } + dist[i] = dist[right[i]] + 1; + father[i] = father[left[i]] = father[right[i]] = i; + return i; + } + + public static void pop(int i) { + num[i] = -INF; + father[left[i]] = left[i]; + father[right[i]] = right[i]; + // 下面这一句的功能 + // 因为有路径压缩,所以i下方的某个节点x,可能有father[x] = i + // 但是现在堆要去掉i了,所以x一直往上找到i是无效的 + // 为了i能再往上找到正确的头,所以有下面这句 + father[i] = merge(left[i], right[i]); + } + + public static void main(String[] args) { + FastReader in = new FastReader(System.in); + FastWriter out = new FastWriter(System.out); + int n = in.readInt(); + for (int i = 1; i <= n; i++) { + father[i] = i; + num[i] = in.readInt(); + } + int m = in.readInt(); + String op; + for (int i = 1, x, y; i <= m; i++) { + op = in.readString(); + if (op.equals("M")) { + x = in.readInt(); + y = in.readInt(); + if (num[x] != -INF && num[y] != -INF) { + int l = find(x); + int r = find(y); + if (l != r) { + father[l] = father[r] = merge(l, r); + } + } + } else { + x = in.readInt(); + if (num[x] == -INF) { + out.println(0); + } else { + int ans = find(x); + out.println(num[ans]); + pop(ans); + } + } + } + out.flush(); + out.close(); + } + + // 快读 + public static class FastReader { + InputStream is; + private byte[] inbuf = new byte[1024]; + public int lenbuf = 0; + public int ptrbuf = 0; + + public FastReader(final InputStream is) { + this.is = is; + } + + public String readString() { + char cur; + do { + cur = (char) readByte(); + } while (cur == ' ' || cur == '\n'); + StringBuilder builder = new StringBuilder(); + while (cur != ' ' && cur != '\n') { + builder.append(cur); + cur = (char) readByte(); + } + return builder.toString(); + } + + public int readByte() { + if (lenbuf == -1) { + throw new InputMismatchException(); + } + if (ptrbuf >= lenbuf) { + ptrbuf = 0; + try { + lenbuf = is.read(inbuf); + } catch (IOException e) { + throw new InputMismatchException(); + } + if (lenbuf <= 0) { + return -1; + } + } + return inbuf[ptrbuf++]; + } + + public int readInt() { + return (int) readLong(); + } + + public long readLong() { + long num = 0; + int b; + boolean minus = false; + while ((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-')) + ; + if (b == '-') { + minus = true; + b = readByte(); + } + + while (true) { + if (b >= '0' && b <= '9') { + num = num * 10 + (b - '0'); + } else { + return minus ? -num : num; + } + b = readByte(); + } + } + } + + // 快写 + public static class FastWriter { + private static final int BUF_SIZE = 1 << 13; + private final byte[] buf = new byte[BUF_SIZE]; + private OutputStream out; + private Writer writer; + private int ptr = 0; + + public FastWriter(Writer writer) { + this.writer = new BufferedWriter(writer); + out = new ByteArrayOutputStream(); + } + + public FastWriter(OutputStream os) { + this.out = os; + } + + public FastWriter(String path) { + try { + this.out = new FileOutputStream(path); + } catch (FileNotFoundException e) { + throw new RuntimeException("FastWriter"); + } + } + + public FastWriter write(byte b) { + buf[ptr++] = b; + if (ptr == BUF_SIZE) { + innerflush(); + } + return this; + } + + public FastWriter write(String s) { + s.chars().forEach(c -> { + buf[ptr++] = (byte) c; + if (ptr == BUF_SIZE) { + innerflush(); + } + }); + return this; + } + + private static int countDigits(long l) { + if (l >= 1000000000000000000L) { + return 19; + } + if (l >= 100000000000000000L) { + return 18; + } + if (l >= 10000000000000000L) { + return 17; + } + if (l >= 1000000000000000L) { + return 16; + } + if (l >= 100000000000000L) { + return 15; + } + if (l >= 10000000000000L) { + return 14; + } + if (l >= 1000000000000L) { + return 13; + } + if (l >= 100000000000L) { + return 12; + } + if (l >= 10000000000L) { + return 11; + } + if (l >= 1000000000L) { + return 10; + } + if (l >= 100000000L) { + return 9; + } + if (l >= 10000000L) { + return 8; + } + if (l >= 1000000L) { + return 7; + } + if (l >= 100000L) { + return 6; + } + if (l >= 10000L) { + return 5; + } + if (l >= 1000L) { + return 4; + } + if (l >= 100L) { + return 3; + } + if (l >= 10L) { + return 2; + } + return 1; + } + + public FastWriter write(long x) { + if (x == Long.MIN_VALUE) { + return write("" + x); + } + if (ptr + 21 >= BUF_SIZE) { + innerflush(); + } + if (x < 0) { + write((byte) '-'); + x = -x; + } + int d = countDigits(x); + for (int i = ptr + d - 1; i >= ptr; i--) { + buf[i] = (byte) ('0' + x % 10); + x /= 10; + } + ptr += d; + return this; + } + + public FastWriter writeln(long x) { + return write(x).writeln(); + } + + public FastWriter writeln() { + return write((byte) '\n'); + } + + private void innerflush() { + try { + out.write(buf, 0, ptr); + ptr = 0; + } catch (IOException e) { + throw new RuntimeException("innerflush"); + } + } + + public void flush() { + innerflush(); + try { + if (writer != null) { + writer.write(((ByteArrayOutputStream) out).toString()); + out = new ByteArrayOutputStream(); + writer.flush(); + } else { + out.flush(); + } + } catch (IOException e) { + throw new RuntimeException("flush"); + } + } + + public FastWriter println(long x) { + return writeln(x); + } + + public void close() { + flush(); + try { + out.close(); + } catch (Exception e) { + } + } + + } + +} diff --git a/src/class154/Code02_RomanGame2.java b/src/class154/Code02_RomanGame2.java new file mode 100644 index 000000000..87ee06b37 --- /dev/null +++ b/src/class154/Code02_RomanGame2.java @@ -0,0 +1,87 @@ +package class154; + +// 罗马游戏,左偏树模版,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P2713 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 1000001; +//const int INF = 1000000001; +//int num[MAXN]; +//int fa[MAXN]; +//int ls[MAXN]; +//int rs[MAXN]; +//int dist[MAXN]; +// +//int find(int i) { +// if (fa[i] != i) { +// fa[i] = find(fa[i]); +// } +// return fa[i]; +//} +// +//int merge(int i, int j) { +// if (i == 0 || j == 0) { +// return i + j; +// } +// if (num[i] > num[j]) { +// int tmp = i; +// i = j; +// j = tmp; +// } +// rs[i] = merge(rs[i], j); +// if (dist[ls[i]] < dist[rs[i]]) { +// int tmp = ls[i]; +// ls[i] = rs[i]; +// rs[i] = tmp; +// } +// dist[i] = dist[rs[i]] + 1; +// fa[i] = fa[ls[i]] = fa[rs[i]] = i; +// return i; +//} +// +//void pop(int i) { +// num[i] = -INF; +// fa[ls[i]] = ls[i]; +// fa[rs[i]] = rs[i]; +// fa[i] = merge(ls[i], rs[i]); +//} +// +//int main() { +// ios_base::sync_with_stdio(false); +// cin.tie(nullptr); +// int n; cin >> n; +// for (int i = 1; i <= n; i++) { +// fa[i] = i; +// cin >> num[i]; +// } +// int m; cin >> m; +// for (int i = 1; i <= m; i++) { +// string op; cin >> op; +// if (op == "M") { +// int x, y; cin >> x >> y; +// if (num[x] != -INF && num[y] != -INF) { +// int l = find(x); +// int r = find(y); +// if (l != r) { +// int rt = merge(l, r); +// fa[l] = fa[r] = rt; +// } +// } +// } else { +// int x; cin >> x; +// if (num[x] == -INF) { +// cout << 0 << endl; +// } else { +// int ans = find(x); +// cout << num[ans] << endl; +// pop(ans); +// } +// } +// } +// return 0; +//} \ No newline at end of file From afe62773f5666b2088ba5368634abf2dde2f8ec9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 9 Dec 2024 19:29:23 +0800 Subject: [PATCH 0449/2029] modify code --- src/class154/Code02_RomanGame1.java | 2 +- src/class154/Code02_RomanGame2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class154/Code02_RomanGame1.java b/src/class154/Code02_RomanGame1.java index 4bdcf6c2d..5c0a76cc6 100644 --- a/src/class154/Code02_RomanGame1.java +++ b/src/class154/Code02_RomanGame1.java @@ -1,6 +1,6 @@ package class154; -// 罗马游戏,左偏树模版,java版 +// 罗马游戏,依然是左偏树模版,java版 // 测试链接 : https://www.luogu.com.cn/problem/P2713 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class154/Code02_RomanGame2.java b/src/class154/Code02_RomanGame2.java index 87ee06b37..3073ebf6a 100644 --- a/src/class154/Code02_RomanGame2.java +++ b/src/class154/Code02_RomanGame2.java @@ -1,6 +1,6 @@ package class154; -// 罗马游戏,左偏树模版,C++版 +// 罗马游戏,依然是左偏树模版,C++版 // 测试链接 : https://www.luogu.com.cn/problem/P2713 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From d966b968daafd0defa853faeb406ee12177a5348 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 9 Dec 2024 22:19:19 +0800 Subject: [PATCH 0450/2029] modify code --- src/class154/Code01_LeftistTree1.java | 16 ++--- src/class154/Code01_LeftistTree2.java | 15 ++-- src/class154/Code02_RomanGame1.java | 20 +++--- src/class154/Code02_RomanGame2.java | 16 ++--- src/class154/Code03_MonkeyKing1.java | 99 +++++++++++++++++++++++++++ src/class154/Code03_MonkeyKing2.java | 80 ++++++++++++++++++++++ 6 files changed, 211 insertions(+), 35 deletions(-) create mode 100644 src/class154/Code03_MonkeyKing1.java create mode 100644 src/class154/Code03_MonkeyKing2.java diff --git a/src/class154/Code01_LeftistTree1.java b/src/class154/Code01_LeftistTree1.java index 6e4d863cb..a8f8027fc 100644 --- a/src/class154/Code01_LeftistTree1.java +++ b/src/class154/Code01_LeftistTree1.java @@ -1,6 +1,6 @@ package class154; -// 左偏树模版,java版 +// 左偏树模版题1,java版 // 测试链接 : https://www.luogu.com.cn/problem/P3377 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -15,8 +15,6 @@ public class Code01_LeftistTree1 { public static int MAXN = 100001; - public static int INF = 1000000001; - public static int[] num = new int[MAXN]; public static int[] father = new int[MAXN]; @@ -55,8 +53,7 @@ public static int merge(int i, int j) { return i; } - public static void pop(int i) { - num[i] = -INF; + public static int pop(int i) { father[left[i]] = left[i]; father[right[i]] = right[i]; // 下面这一句的功能 @@ -64,6 +61,9 @@ public static void pop(int i) { // 但是现在堆要去掉i了,所以x一直往上找到i是无效的 // 为了i能再往上找到正确的头,所以有下面这句 father[i] = merge(left[i], right[i]); + num[i] = -1; + left[i] = right[i] = 0; + return father[i]; } public static void main(String[] args) throws IOException { @@ -87,17 +87,17 @@ public static void main(String[] args) throws IOException { x = (int) in.nval; in.nextToken(); y = (int) in.nval; - if (num[x] != -INF && num[y] != -INF) { + if (num[x] != -1 && num[y] != -1) { int l = find(x); int r = find(y); if (l != r) { - father[l] = father[r] = merge(l, r); + merge(l, r); } } } else { in.nextToken(); x = (int) in.nval; - if (num[x] == -INF) { + if (num[x] == -1) { out.println(-1); } else { int ans = find(x); diff --git a/src/class154/Code01_LeftistTree2.java b/src/class154/Code01_LeftistTree2.java index 685fd8767..ce54fd8c9 100644 --- a/src/class154/Code01_LeftistTree2.java +++ b/src/class154/Code01_LeftistTree2.java @@ -1,6 +1,6 @@ package class154; -// 左偏树模版,C++版 +// 左偏树模版题1,C++版 // 测试链接 : https://www.luogu.com.cn/problem/P3377 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -10,7 +10,6 @@ //using namespace std; // //const int MAXN = 100001; -//const int INF = 1000000001; //int num[MAXN]; //int fa[MAXN]; //int ls[MAXN]; @@ -44,11 +43,13 @@ // return i; //} // -//void pop(int i) { -// num[i] = -INF; +//int pop(int i) { // fa[ls[i]] = ls[i]; // fa[rs[i]] = rs[i]; // fa[i] = merge(ls[i], rs[i]); +// num[i] = -1; +// ls[i] = rs[i] = 0; +// return fa[i]; //} // //int main() { @@ -66,17 +67,17 @@ // if (op == 1) { // int x, y; // cin >> x >> y; -// if (num[x] != -INF && num[y] != -INF) { +// if (num[x] != -1 && num[y] != -1) { // int l = find(x); // int r = find(y); // if (l != r) { -// fa[l] = fa[r] = merge(l, r); +// merge(l, r); // } // } // } else { // int x; // cin >> x; -// if (num[x] == -INF) { +// if (num[x] == -1) { // cout << -1 << "\n"; // } else { // int ans = find(x); diff --git a/src/class154/Code02_RomanGame1.java b/src/class154/Code02_RomanGame1.java index 5c0a76cc6..8023d0b22 100644 --- a/src/class154/Code02_RomanGame1.java +++ b/src/class154/Code02_RomanGame1.java @@ -1,6 +1,6 @@ package class154; -// 罗马游戏,依然是左偏树模版,java版 +// 罗马游戏,左偏树模版题2,java版 // 测试链接 : https://www.luogu.com.cn/problem/P2713 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -18,8 +18,6 @@ public class Code02_RomanGame1 { public static int MAXN = 1000001; - public static int INF = 1000000001; - public static int[] num = new int[MAXN]; public static int[] father = new int[MAXN]; @@ -58,15 +56,13 @@ public static int merge(int i, int j) { return i; } - public static void pop(int i) { - num[i] = -INF; + public static int pop(int i) { father[left[i]] = left[i]; father[right[i]] = right[i]; - // 下面这一句的功能 - // 因为有路径压缩,所以i下方的某个节点x,可能有father[x] = i - // 但是现在堆要去掉i了,所以x一直往上找到i是无效的 - // 为了i能再往上找到正确的头,所以有下面这句 father[i] = merge(left[i], right[i]); + num[i] = -1; + left[i] = right[i] = 0; + return father[i]; } public static void main(String[] args) { @@ -84,16 +80,16 @@ public static void main(String[] args) { if (op.equals("M")) { x = in.readInt(); y = in.readInt(); - if (num[x] != -INF && num[y] != -INF) { + if (num[x] != -1 && num[y] != -1) { int l = find(x); int r = find(y); if (l != r) { - father[l] = father[r] = merge(l, r); + merge(l, r); } } } else { x = in.readInt(); - if (num[x] == -INF) { + if (num[x] == -1) { out.println(0); } else { int ans = find(x); diff --git a/src/class154/Code02_RomanGame2.java b/src/class154/Code02_RomanGame2.java index 3073ebf6a..0e0a12f4e 100644 --- a/src/class154/Code02_RomanGame2.java +++ b/src/class154/Code02_RomanGame2.java @@ -1,6 +1,6 @@ package class154; -// 罗马游戏,依然是左偏树模版,C++版 +// 罗马游戏,左偏树模版题2,C++版 // 测试链接 : https://www.luogu.com.cn/problem/P2713 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -10,7 +10,6 @@ //using namespace std; // //const int MAXN = 1000001; -//const int INF = 1000000001; //int num[MAXN]; //int fa[MAXN]; //int ls[MAXN]; @@ -44,11 +43,13 @@ // return i; //} // -//void pop(int i) { -// num[i] = -INF; +//int pop(int i) { // fa[ls[i]] = ls[i]; // fa[rs[i]] = rs[i]; // fa[i] = merge(ls[i], rs[i]); +// num[i] = -1; +// ls[i] = rs[i] = 0; +// return fa[i]; //} // //int main() { @@ -64,17 +65,16 @@ // string op; cin >> op; // if (op == "M") { // int x, y; cin >> x >> y; -// if (num[x] != -INF && num[y] != -INF) { +// if (num[x] != -1 && num[y] != -1) { // int l = find(x); // int r = find(y); // if (l != r) { -// int rt = merge(l, r); -// fa[l] = fa[r] = rt; +// merge(l, r); // } // } // } else { // int x; cin >> x; -// if (num[x] == -INF) { +// if (num[x] == -1) { // cout << 0 << endl; // } else { // int ans = find(x); diff --git a/src/class154/Code03_MonkeyKing1.java b/src/class154/Code03_MonkeyKing1.java new file mode 100644 index 000000000..8dda6c6a5 --- /dev/null +++ b/src/class154/Code03_MonkeyKing1.java @@ -0,0 +1,99 @@ +package class154; + +// 猴王,左偏树模版题3,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P1456 +// 提交以下的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 Code03_MonkeyKing1 { + + public static int MAXN = 100001; + + public static int[] num = new int[MAXN]; + + public static int[] father = new int[MAXN]; + + public static int[] left = new int[MAXN]; + + public static int[] right = new int[MAXN]; + + public static int[] dist = new int[MAXN]; + + public static int find(int i) { + if (father[i] != i) { + father[i] = find(father[i]); + } + return father[i]; + } + + public static int merge(int i, int j) { + if (i == 0 || j == 0) { + return i + j; + } + int tmp; + // 本题是维护大根堆 + if (num[i] < num[j]) { + tmp = i; + i = j; + j = tmp; + } + right[i] = merge(right[i], j); + if (dist[left[i]] < dist[right[i]]) { + tmp = left[i]; + left[i] = right[i]; + right[i] = tmp; + } + dist[i] = dist[right[i]] + 1; + father[i] = father[left[i]] = father[right[i]] = i; + return i; + } + + public static int pop(int i) { + father[left[i]] = left[i]; + father[right[i]] = right[i]; + father[i] = merge(left[i], right[i]); + num[i] /= 2; // 根据题目要求,这里是除以2 + left[i] = right[i] = 0; + return father[i]; + } + + public static int fight(int x, int y) { + int l = find(x); + int r = find(y); + return l == r ? -1 : num[merge(merge(pop(l), l), merge(pop(r), r))]; + } + + 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) { + int n = (int) in.nval; + for (int i = 1; i <= n; i++) { + father[i] = i; + left[i] = right[i] = dist[i] = 0; + in.nextToken(); + num[i] = (int) in.nval; + } + in.nextToken(); + int m = (int) in.nval; + for (int i = 1, x, y; i <= m; i++) { + in.nextToken(); + x = (int) in.nval; + in.nextToken(); + y = (int) in.nval; + System.out.println(fight(x, y)); + } + } + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class154/Code03_MonkeyKing2.java b/src/class154/Code03_MonkeyKing2.java new file mode 100644 index 000000000..15454ebcd --- /dev/null +++ b/src/class154/Code03_MonkeyKing2.java @@ -0,0 +1,80 @@ +package class154; + +// 猴王,左偏树模版题3,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P1456 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +//int num[MAXN]; +//int fa[MAXN]; +//int ls[MAXN]; +//int rs[MAXN]; +//int dist[MAXN]; +// +//int find(int i) { +// if (fa[i] != i) { +// fa[i] = find(fa[i]); +// } +// return fa[i]; +//} +// +//int merge(int i, int j) { +// if (i == 0 || j == 0) { +// return i + j; +// } +// int tmp; +// if (num[i] < num[j]) { +// tmp = i; +// i = j; +// j = tmp; +// } +// rs[i] = merge(rs[i], j); +// if (dist[ls[i]] < dist[rs[i]]) { +// tmp = ls[i]; +// ls[i] = rs[i]; +// rs[i] = tmp; +// } +// dist[i] = dist[rs[i]] + 1; +// fa[i] = fa[ls[i]] = fa[rs[i]] = i; +// return i; +//} +// +//int pop(int i) { +// fa[ls[i]] = ls[i]; +// fa[rs[i]] = rs[i]; +// fa[i] = merge(ls[i], rs[i]); +// num[i] /= 2; +// ls[i] = rs[i] = 0; +// return fa[i]; +//} +// +//int fight(int x, int y) { +// int l = find(x); +// int r = find(y); +// return l == r ? -1 : num[merge(merge(pop(l), l), merge(pop(r), r))]; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// int n, m; +// while (cin >> n) { +// for (int i = 1; i <= n; i++) { +// fa[i] = i; +// ls[i] = rs[i] = dist[i] = 0; +// cin >> num[i]; +// } +// cin >> m; +// for (int i = 1; i <= m; i++) { +// int x, y; +// cin >> x >> y; +// cout << fight(x, y) << "\n"; +// } +// } +// return 0; +//} \ No newline at end of file From 239073167f2d18bf5a88d81c83873cad1340fd6e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 9 Dec 2024 22:44:02 +0800 Subject: [PATCH 0451/2029] modify code --- src/class154/Code01_LeftistTree1.java | 6 ++++-- src/class154/Code01_LeftistTree2.java | 2 +- src/class154/Code02_RomanGame1.java | 4 ++-- src/class154/Code02_RomanGame2.java | 2 +- src/class154/Code03_MonkeyKing1.java | 4 ++-- src/class154/Code03_MonkeyKing2.java | 2 +- 6 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/class154/Code01_LeftistTree1.java b/src/class154/Code01_LeftistTree1.java index a8f8027fc..397ad3c28 100644 --- a/src/class154/Code01_LeftistTree1.java +++ b/src/class154/Code01_LeftistTree1.java @@ -15,16 +15,18 @@ public class Code01_LeftistTree1 { public static int MAXN = 100001; + // 左偏树需要 public static int[] num = new int[MAXN]; - public static int[] father = new int[MAXN]; - public static int[] left = new int[MAXN]; public static int[] right = new int[MAXN]; public static int[] dist = new int[MAXN]; + // 并查集需要 + public static int[] father = new int[MAXN]; + public static int find(int i) { if (father[i] != i) { father[i] = find(father[i]); diff --git a/src/class154/Code01_LeftistTree2.java b/src/class154/Code01_LeftistTree2.java index ce54fd8c9..27b2f6717 100644 --- a/src/class154/Code01_LeftistTree2.java +++ b/src/class154/Code01_LeftistTree2.java @@ -11,10 +11,10 @@ // //const int MAXN = 100001; //int num[MAXN]; -//int fa[MAXN]; //int ls[MAXN]; //int rs[MAXN]; //int dist[MAXN]; +//int fa[MAXN]; // //int find(int i) { // if (fa[i] != i) { diff --git a/src/class154/Code02_RomanGame1.java b/src/class154/Code02_RomanGame1.java index 8023d0b22..0362351f9 100644 --- a/src/class154/Code02_RomanGame1.java +++ b/src/class154/Code02_RomanGame1.java @@ -20,14 +20,14 @@ public class Code02_RomanGame1 { public static int[] num = new int[MAXN]; - public static int[] father = new int[MAXN]; - public static int[] left = new int[MAXN]; public static int[] right = new int[MAXN]; public static int[] dist = new int[MAXN]; + public static int[] father = new int[MAXN]; + public static int find(int i) { if (father[i] != i) { father[i] = find(father[i]); diff --git a/src/class154/Code02_RomanGame2.java b/src/class154/Code02_RomanGame2.java index 0e0a12f4e..d82302d70 100644 --- a/src/class154/Code02_RomanGame2.java +++ b/src/class154/Code02_RomanGame2.java @@ -11,10 +11,10 @@ // //const int MAXN = 1000001; //int num[MAXN]; -//int fa[MAXN]; //int ls[MAXN]; //int rs[MAXN]; //int dist[MAXN]; +//int fa[MAXN]; // //int find(int i) { // if (fa[i] != i) { diff --git a/src/class154/Code03_MonkeyKing1.java b/src/class154/Code03_MonkeyKing1.java index 8dda6c6a5..f2f7429cb 100644 --- a/src/class154/Code03_MonkeyKing1.java +++ b/src/class154/Code03_MonkeyKing1.java @@ -17,14 +17,14 @@ public class Code03_MonkeyKing1 { public static int[] num = new int[MAXN]; - public static int[] father = new int[MAXN]; - public static int[] left = new int[MAXN]; public static int[] right = new int[MAXN]; public static int[] dist = new int[MAXN]; + public static int[] father = new int[MAXN]; + public static int find(int i) { if (father[i] != i) { father[i] = find(father[i]); diff --git a/src/class154/Code03_MonkeyKing2.java b/src/class154/Code03_MonkeyKing2.java index 15454ebcd..2007b68c4 100644 --- a/src/class154/Code03_MonkeyKing2.java +++ b/src/class154/Code03_MonkeyKing2.java @@ -11,10 +11,10 @@ // //const int MAXN = 100001; //int num[MAXN]; -//int fa[MAXN]; //int ls[MAXN]; //int rs[MAXN]; //int dist[MAXN]; +//int fa[MAXN]; // //int find(int i) { // if (fa[i] != i) { From 1d6e4e9361b0db726c4f0a4a8eb6d4a361244a53 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 10 Dec 2024 17:42:29 +0800 Subject: [PATCH 0452/2029] modify code --- src/class154/Code04_Dispatch1.java | 169 ++++++++++++++++++++++++++ src/class154/Code04_Dispatch2.java | 188 +++++++++++++++++++++++++++++ src/class154/Code04_Dispatch3.java | 124 +++++++++++++++++++ 3 files changed, 481 insertions(+) create mode 100644 src/class154/Code04_Dispatch1.java create mode 100644 src/class154/Code04_Dispatch2.java create mode 100644 src/class154/Code04_Dispatch3.java diff --git a/src/class154/Code04_Dispatch1.java b/src/class154/Code04_Dispatch1.java new file mode 100644 index 000000000..410cba3fe --- /dev/null +++ b/src/class154/Code04_Dispatch1.java @@ -0,0 +1,169 @@ +package class154; + +// 派遣,dfs用递归实现,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P1552 +// 提交以下的code,提交时请把类名改成"Main",会有一些测试用例通过不了 +// 这是因为java语言用递归方式实现dfs,递归会爆栈 +// 需要把dfs实现成迭代版,才能全部通过,就是Code04_Dispatch2文件 +// 但是C++语言用递归方式实现,可以直接通过,就是Code04_Dispatch3文件 + +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 Code04_Dispatch1 { + + public static int MAXN = 100001; + + public static int n, m; + + public static long ans; + + // 链式前向星需要 + 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; + + // 薪水 + public static long[] cost = new long[MAXN]; + + // 领导力 + public static long[] lead = new long[MAXN]; + + // 左孩子 + public static int[] left = new int[MAXN]; + + // 右孩子 + public static int[] right = new int[MAXN]; + + // 距离 + public static int[] dist = new int[MAXN]; + + // 寻找堆顶需要 + public static int[] father = new int[MAXN]; + + // 堆的大小 + public static int[] size = new int[MAXN]; + + // 堆的费用和 + public static long[] sum = new long[MAXN]; + + public static void prepare() { + ans = 0; + cnt = 1; + for (int i = 1; i <= n; i++) { + head[i] = left[i] = right[i] = dist[i] = size[i] = 0; + sum[i] = 0; + father[i] = i; + } + } + + public static void addEdge(int u, int v) { + next[cnt] = head[u]; + to[cnt] = v; + head[u] = cnt++; + } + + public static int find(int i) { + if (father[i] != i) { + father[i] = find(father[i]); + } + return father[i]; + } + + public static int merge(int i, int j) { + if (i == 0 || j == 0) { + return i + j; + } + int tmp; + // 本题是维护大根堆 + if (cost[i] < cost[j]) { + tmp = i; + i = j; + j = tmp; + } + right[i] = merge(right[i], j); + if (dist[left[i]] < dist[right[i]]) { + tmp = left[i]; + left[i] = right[i]; + right[i] = tmp; + } + dist[i] = dist[right[i]] + 1; + father[i] = father[left[i]] = father[right[i]] = i; + return i; + } + + public static int pop(int i) { + father[left[i]] = left[i]; + father[right[i]] = right[i]; + father[i] = merge(left[i], right[i]); + left[i] = right[i] = 0; + return father[i]; + } + + // dfs用递归实现 + public static void dfs(int u) { + for (int ei = head[u]; ei > 0; ei = next[ei]) { + dfs(to[ei]); + } + int usize = 1; + long usum = cost[u]; + for (int ei = head[u], v, l, r; ei > 0; ei = next[ei]) { + v = to[ei]; + l = find(u); + r = find(v); + usize += size[r]; + usum += sum[r]; + merge(l, r); + } + int i; + while (usum > m) { + i = find(u); + usize--; + usum -= cost[i]; + pop(i); + } + i = find(u); + size[i] = usize; + sum[i] = usum; + ans = Math.max(ans, (long) usize * lead[u]); + } + + 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; + prepare(); + int root = 0; + for (int i = 1, f; i <= n; i++) { + in.nextToken(); + f = (int) in.nval; + in.nextToken(); + cost[i] = (int) in.nval; + in.nextToken(); + lead[i] = (int) in.nval; + if (f == 0) { + root = i; + } else { + addEdge(f, i); + } + } + dfs(root); + out.println(ans); + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class154/Code04_Dispatch2.java b/src/class154/Code04_Dispatch2.java new file mode 100644 index 000000000..6e871b31a --- /dev/null +++ b/src/class154/Code04_Dispatch2.java @@ -0,0 +1,188 @@ +package class154; + +// 派遣,dfs用迭代实现,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P1552 +// 提交以下的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 Code04_Dispatch2 { + + public static int MAXN = 100001; + + public static int n, m; + + public static long ans; + + 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; + + public static long[] cost = new long[MAXN]; + + public static long[] lead = new long[MAXN]; + + public static int[] left = new int[MAXN]; + + public static int[] right = new int[MAXN]; + + public static int[] dist = new int[MAXN]; + + public static int[] father = new int[MAXN]; + + public static int[] size = new int[MAXN]; + + public static long[] sum = new long[MAXN]; + + public static void prepare() { + ans = 0; + cnt = 1; + for (int i = 1; i <= n; i++) { + head[i] = left[i] = right[i] = dist[i] = size[i] = 0; + sum[i] = 0; + father[i] = i; + } + } + + public static void addEdge(int u, int v) { + next[cnt] = head[u]; + to[cnt] = v; + head[u] = cnt++; + } + + public static int find(int i) { + if (father[i] != i) { + father[i] = find(father[i]); + } + return father[i]; + } + + public static int merge(int i, int j) { + if (i == 0 || j == 0) { + return i + j; + } + int tmp; + if (cost[i] < cost[j]) { + tmp = i; + i = j; + j = tmp; + } + right[i] = merge(right[i], j); + if (dist[left[i]] < dist[right[i]]) { + tmp = left[i]; + left[i] = right[i]; + right[i] = tmp; + } + dist[i] = dist[right[i]] + 1; + father[i] = father[left[i]] = father[right[i]] = i; + return i; + } + + public static int pop(int i) { + father[left[i]] = left[i]; + father[right[i]] = right[i]; + father[i] = merge(left[i], right[i]); + left[i] = right[i] = 0; + return father[i]; + } + + // dfs从递归版改成迭代版,不会看讲解118 + // 重点讲了树上问题从递归改成迭代版的方法 + public static int[][] ue = new int[MAXN][2]; + + public static int u, ei; + + public static int ssize; + + public static void push(int u, int ei) { + ue[ssize][0] = u; + ue[ssize][1] = ei; + ssize++; + } + + public static void pop() { + --ssize; + u = ue[ssize][0]; + ei = ue[ssize][1]; + } + + // dfs用迭代实现 + public static void dfs(int root) { + ssize = 0; + push(root, -1); + while (ssize > 0) { + pop(); + if (ei == -1) { + ei = head[u]; + } else { + ei = next[ei]; + } + if (ei > 0) { + push(u, ei); + push(to[ei], -1); + } else { + int usize = 1; + long usum = cost[u]; + for (int ei = head[u], v, l, r; ei > 0; ei = next[ei]) { + v = to[ei]; + l = find(u); + r = find(v); + usize += size[r]; + usum += sum[r]; + merge(l, r); + } + int i; + while (usum > m) { + i = find(u); + usize--; + usum -= cost[i]; + pop(i); + } + i = find(u); + size[i] = usize; + sum[i] = usum; + ans = Math.max(ans, (long) usize * lead[u]); + } + } + } + + 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; + prepare(); + int root = 0; + for (int i = 1, f; i <= n; i++) { + in.nextToken(); + f = (int) in.nval; + in.nextToken(); + cost[i] = (int) in.nval; + in.nextToken(); + lead[i] = (int) in.nval; + if (f == 0) { + root = i; + } else { + addEdge(f, i); + } + } + dfs(root); + out.println(ans); + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class154/Code04_Dispatch3.java b/src/class154/Code04_Dispatch3.java new file mode 100644 index 000000000..15d117938 --- /dev/null +++ b/src/class154/Code04_Dispatch3.java @@ -0,0 +1,124 @@ +package class154; + +// 派遣,dfs用递归实现,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P1552 +// 逻辑和java的递归版完全一样,java的递归版就过不了,C++的递归版就能过 +// 这是洛谷没有考虑其他语言导致的,提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +//int n, m; +//long long ans; +//int head[MAXN]; +//int nxt[MAXN]; +//int to[MAXN]; +//int cnt; +//long long cost[MAXN]; +//long long lead[MAXN]; +//int ls[MAXN]; +//int rs[MAXN]; +//int dist[MAXN]; +//int father[MAXN]; +//int siz[MAXN]; +//long long sum[MAXN]; +// +//void prepare() { +// ans = 0; +// cnt = 1; +// for (int i = 1; i <= n; i++) { +// head[i] = ls[i] = rs[i] = dist[i] = siz[i] = 0; +// sum[i] = 0; +// father[i] = i; +// } +//} +// +//void addEdge(int u, int v) { +// nxt[cnt] = head[u]; +// to[cnt] = v; +// head[u] = cnt++; +//} +// +//int find(int i) { +// if (father[i] != i) { +// father[i] = find(father[i]); +// } +// return father[i]; +//} +// +//int merge(int i, int j) { +// if (i == 0 || j == 0) { +// return i + j; +// } +// if (cost[i] < cost[j]) { +// int tmp = i; +// i = j; +// j = tmp; +// } +// rs[i] = merge(rs[i], j); +// if (dist[ls[i]] < dist[rs[i]]) { +// int tmp = ls[i]; +// ls[i] = rs[i]; +// rs[i] = tmp; +// } +// dist[i] = dist[rs[i]] + 1; +// father[i] = father[ls[i]] = father[rs[i]] = i; +// return i; +//} +// +//int pop(int i) { +// father[ls[i]] = ls[i]; +// father[rs[i]] = rs[i]; +// father[i] = merge(ls[i], rs[i]); +// ls[i] = rs[i] = 0; +// return father[i]; +//} +// +//void dfs(int u) { +// for (int ei = head[u]; ei > 0; ei = nxt[ei]) { +// dfs(to[ei]); +// } +// int usize = 1; +// long long usum = cost[u]; +// for (int ei = head[u], v, l, r; ei > 0; ei = nxt[ei]) { +// v = to[ei]; +// l = find(u); +// r = find(v); +// usize += siz[r]; +// usum += sum[r]; +// merge(l, r); +// } +// int i; +// while (usum > m) { +// i = find(u); +// usize--; +// usum -= cost[i]; +// pop(i); +// } +// i = find(u); +// siz[i] = usize; +// sum[i] = usum; +// ans = max(ans, (long long)usize * lead[u]); +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// prepare(); +// int root = 0; +// for (int i = 1; i <= n; i++) { +// int f; +// cin >> f >> cost[i] >> lead[i]; +// if (f == 0) { +// root = i; +// } else { +// addEdge(f, i); +// } +// } +// dfs(root); +// cout << ans << endl; +// return 0; +//} \ No newline at end of file From 7c7d18d7a4c57ba3f25798f42c525f7f54982978 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 11 Dec 2024 10:07:13 +0800 Subject: [PATCH 0453/2029] modify code --- src/class154/Code04_Dispatch2.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class154/Code04_Dispatch2.java b/src/class154/Code04_Dispatch2.java index 6e871b31a..4588627ef 100644 --- a/src/class154/Code04_Dispatch2.java +++ b/src/class154/Code04_Dispatch2.java @@ -95,8 +95,8 @@ public static int pop(int i) { return father[i]; } - // dfs从递归版改成迭代版,不会看讲解118 - // 重点讲了树上问题从递归改成迭代版的方法 + // dfs从递归版改成迭代版,不会的话,看讲解118 + // 重点讲了树上问题从递归版改成迭代版的方法 public static int[][] ue = new int[MAXN][2]; public static int u, ei; From 706dae3ab601b76a1847c55521e4bf377ec9f521 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 11 Dec 2024 13:57:53 +0800 Subject: [PATCH 0454/2029] modify code --- src/class154/Code05_CityCapture1.java | 405 ++++++++++++++++++++++++++ src/class154/Code05_CityCapture2.java | 156 ++++++++++ 2 files changed, 561 insertions(+) create mode 100644 src/class154/Code05_CityCapture1.java create mode 100644 src/class154/Code05_CityCapture2.java diff --git a/src/class154/Code05_CityCapture1.java b/src/class154/Code05_CityCapture1.java new file mode 100644 index 000000000..a40e33355 --- /dev/null +++ b/src/class154/Code05_CityCapture1.java @@ -0,0 +1,405 @@ +package class154; + +// 城池攻占,java版 +// 不和并查集结合,和懒更新结合, +// 输入保证,如果城市a管辖城市b,必有a < b +// 测试链接 : https://www.luogu.com.cn/problem/P3261 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.BufferedWriter; +import java.io.ByteArrayOutputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.Writer; +import java.util.InputMismatchException; + +public class Code05_CityCapture1 { + + public static int MAXN = 300001; + + public static int n, m; + + public static long[] defend = new long[MAXN]; + + public static int[] belong = new int[MAXN]; + + public static int[] op = new int[MAXN]; + + public static long[] gain = new long[MAXN]; + + public static int[] deep = new int[MAXN]; + + public static int[] top = new int[MAXN]; + + public static int[] sacrifice = new int[MAXN]; + + public static long[] attack = new long[MAXN]; + + public static int[] born = new int[MAXN]; + + public static int[] die = new int[MAXN]; + + public static int[] left = new int[MAXN]; + + public static int[] right = new int[MAXN]; + + public static int[] dist = new int[MAXN]; + + public static long[] mul = new long[MAXN]; + + public static long[] add = new long[MAXN]; + + public static void prepare() { + for (int i = 1; i <= n; i++) { + sacrifice[i] = top[i] = 0; + } + for (int i = 1; i <= m; i++) { + left[i] = right[i] = dist[i] = 0; + mul[i] = 1; + add[i] = 0; + } + } + + public static void down(int i) { + if (mul[i] != 1 || add[i] != 0) { + int l = left[i]; + int r = right[i]; + if (l != 0) { + attack[l] = attack[l] * mul[i] + add[i]; + mul[l] *= mul[i]; + add[l] = add[l] * mul[i] + add[i]; + } + if (r != 0) { + attack[r] = attack[r] * mul[i] + add[i]; + mul[r] *= mul[i]; + add[r] = add[r] * mul[i] + add[i]; + } + mul[i] = 1; + add[i] = 0; + } + } + + public static int merge(int i, int j) { + if (i == 0 || j == 0) { + return i + j; + } + int tmp; + if (attack[i] > attack[j]) { + tmp = i; + i = j; + j = tmp; + } + down(i); + down(j); + right[i] = merge(right[i], j); + if (dist[left[i]] < dist[right[i]]) { + tmp = left[i]; + left[i] = right[i]; + right[i] = tmp; + } + dist[i] = dist[right[i]] + 1; + return i; + } + + public static int pop(int i) { + down(i); + int ans = merge(left[i], right[i]); + left[i] = right[i] = 0; + return ans; + } + + public static void upgrade(int i, int t, long v) { + if (t == 0) { + add[i] += v; + attack[i] += v; + } else { + mul[i] *= v; + add[i] *= v; + attack[i] *= v; + } + } + + public static void compute() { + deep[1] = 1; + for (int i = 2; i <= n; i++) { + deep[i] = deep[belong[i]] + 1; + } + for (int i = 1; i <= m; i++) { + if (top[born[i]] == 0) { + top[born[i]] = i; + } else { + top[born[i]] = merge(top[born[i]], i); + } + } + for (int i = n; i >= 1; i--) { + while (top[i] != 0 && attack[top[i]] < defend[i]) { + die[top[i]] = i; + sacrifice[i]++; + top[i] = pop(top[i]); + } + if (top[i] != 0) { + upgrade(top[i], op[i], gain[i]); + if (top[belong[i]] == 0) { + top[belong[i]] = top[i]; + } else { + top[belong[i]] = merge(top[belong[i]], top[i]); + } + } + } + } + + public static void main(String[] args) { + FastReader in = new FastReader(System.in); + FastWriter out = new FastWriter(System.out); + n = in.readInt(); + m = in.readInt(); + prepare(); + for (int i = 1; i <= n; i++) { + defend[i] = in.readLong(); + } + for (int i = 2; i <= n; i++) { + belong[i] = in.readInt(); + op[i] = in.readInt(); + gain[i] = in.readLong(); + } + for (int i = 1; i <= m; i++) { + attack[i] = in.readLong(); + born[i] = in.readInt(); + } + compute(); + for (int i = 1; i <= n; i++) { + out.println(sacrifice[i]); + } + for (int i = 1; i <= m; i++) { + out.println(deep[born[i]] - deep[die[i]]); + } + out.flush(); + out.close(); + } + + // 快读 + public static class FastReader { + InputStream is; + private byte[] inbuf = new byte[1024]; + public int lenbuf = 0; + public int ptrbuf = 0; + + public FastReader(final InputStream is) { + this.is = is; + } + + public int readByte() { + if (lenbuf == -1) { + throw new InputMismatchException(); + } + if (ptrbuf >= lenbuf) { + ptrbuf = 0; + try { + lenbuf = is.read(inbuf); + } catch (IOException e) { + throw new InputMismatchException(); + } + if (lenbuf <= 0) { + return -1; + } + } + return inbuf[ptrbuf++]; + } + + public int readInt() { + return (int) readLong(); + } + + public long readLong() { + long num = 0; + int b; + boolean minus = false; + while ((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-')) + ; + if (b == '-') { + minus = true; + b = readByte(); + } + + while (true) { + if (b >= '0' && b <= '9') { + num = num * 10 + (b - '0'); + } else { + return minus ? -num : num; + } + b = readByte(); + } + } + } + + // 快写 + public static class FastWriter { + private static final int BUF_SIZE = 1 << 13; + private final byte[] buf = new byte[BUF_SIZE]; + private OutputStream out; + private Writer writer; + private int ptr = 0; + + public FastWriter(Writer writer) { + this.writer = new BufferedWriter(writer); + out = new ByteArrayOutputStream(); + } + + public FastWriter(OutputStream os) { + this.out = os; + } + + public FastWriter(String path) { + try { + this.out = new FileOutputStream(path); + } catch (FileNotFoundException e) { + throw new RuntimeException("FastWriter"); + } + } + + public FastWriter write(byte b) { + buf[ptr++] = b; + if (ptr == BUF_SIZE) { + innerflush(); + } + return this; + } + + public FastWriter write(String s) { + s.chars().forEach(c -> { + buf[ptr++] = (byte) c; + if (ptr == BUF_SIZE) { + innerflush(); + } + }); + return this; + } + + private static int countDigits(long l) { + if (l >= 1000000000000000000L) { + return 19; + } + if (l >= 100000000000000000L) { + return 18; + } + if (l >= 10000000000000000L) { + return 17; + } + if (l >= 1000000000000000L) { + return 16; + } + if (l >= 100000000000000L) { + return 15; + } + if (l >= 10000000000000L) { + return 14; + } + if (l >= 1000000000000L) { + return 13; + } + if (l >= 100000000000L) { + return 12; + } + if (l >= 10000000000L) { + return 11; + } + if (l >= 1000000000L) { + return 10; + } + if (l >= 100000000L) { + return 9; + } + if (l >= 10000000L) { + return 8; + } + if (l >= 1000000L) { + return 7; + } + if (l >= 100000L) { + return 6; + } + if (l >= 10000L) { + return 5; + } + if (l >= 1000L) { + return 4; + } + if (l >= 100L) { + return 3; + } + if (l >= 10L) { + return 2; + } + return 1; + } + + public FastWriter write(long x) { + if (x == Long.MIN_VALUE) { + return write("" + x); + } + if (ptr + 21 >= BUF_SIZE) { + innerflush(); + } + if (x < 0) { + write((byte) '-'); + x = -x; + } + int d = countDigits(x); + for (int i = ptr + d - 1; i >= ptr; i--) { + buf[i] = (byte) ('0' + x % 10); + x /= 10; + } + ptr += d; + return this; + } + + public FastWriter writeln(long x) { + return write(x).writeln(); + } + + public FastWriter writeln() { + return write((byte) '\n'); + } + + private void innerflush() { + try { + out.write(buf, 0, ptr); + ptr = 0; + } catch (IOException e) { + throw new RuntimeException("innerflush"); + } + } + + public void flush() { + innerflush(); + try { + if (writer != null) { + writer.write(((ByteArrayOutputStream) out).toString()); + out = new ByteArrayOutputStream(); + writer.flush(); + } else { + out.flush(); + } + } catch (IOException e) { + throw new RuntimeException("flush"); + } + } + + public FastWriter println(long x) { + return writeln(x); + } + + public void close() { + flush(); + try { + out.close(); + } catch (Exception e) { + } + } + + } + +} diff --git a/src/class154/Code05_CityCapture2.java b/src/class154/Code05_CityCapture2.java new file mode 100644 index 000000000..57862e49a --- /dev/null +++ b/src/class154/Code05_CityCapture2.java @@ -0,0 +1,156 @@ +package class154; + +// 城池攻占,C++版 +// 输入保证,如果城市a管辖城市b,必有a < b +// 测试链接 : https://www.luogu.com.cn/problem/P3261 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 300001; +//int n, m; +//long long defend[MAXN]; +//int belong[MAXN]; +//int op[MAXN]; +//long long gain[MAXN]; +//int deep[MAXN]; +//int top[MAXN]; +//int sacrifice[MAXN]; +//long long attack[MAXN]; +//int born[MAXN]; +//int die[MAXN]; +//int ls[MAXN]; +//int rs[MAXN]; +//int dist[MAXN]; +//long long mul[MAXN]; +//long long add[MAXN]; +// +//void prepare() { +// for (int i = 1; i <= n; i++) { +// sacrifice[i] = 0; +// top[i] = 0; +// } +// for (int i = 1; i <= m; i++) { +// ls[i] = 0; +// rs[i] = 0; +// dist[i] = 0; +// mul[i] = 1; +// add[i] = 0; +// } +//} +// +//void down(int i) { +// if (mul[i] != 1 || add[i] != 0) { +// int l = ls[i]; +// int r = rs[i]; +// if (l != 0) { +// attack[l] = attack[l] * mul[i] + add[i]; +// mul[l] *= mul[i]; +// add[l] = add[l] * mul[i] + add[i]; +// } +// if (r != 0) { +// attack[r] = attack[r] * mul[i] + add[i]; +// mul[r] *= mul[i]; +// add[r] = add[r] * mul[i] + add[i]; +// } +// mul[i] = 1; +// add[i] = 0; +// } +//} +// +//int merge(int i, int j) { +// if (i == 0 || j == 0) { +// return i + j; +// } +// int tmp; +// if (attack[i] > attack[j]) { +// tmp = i; +// i = j; +// j = tmp; +// } +// down(i); +// down(j); +// rs[i] = merge(rs[i], j); +// if (dist[ls[i]] < dist[rs[i]]) { +// tmp = ls[i]; +// ls[i] = rs[i]; +// rs[i] = tmp; +// } +// dist[i] = dist[rs[i]] + 1; +// return i; +//} +// +//int pop(int i) { +// down(i); +// int ans = merge(ls[i], rs[i]); +// ls[i] = 0; +// rs[i] = 0; +// return ans; +//} +// +//void upgrade(int i, int t, long long v) { +// if (t == 0) { +// add[i] += v; +// attack[i] += v; +// } else { +// mul[i] *= v; +// add[i] = add[i] * v; +// attack[i] = attack[i] * v; +// } +//} +// +//void compute() { +// deep[1] = 1; +// for (int i = 2; i <= n; i++) { +// deep[i] = deep[belong[i]] + 1; +// } +// for (int i = 1; i <= m; i++) { +// if (top[born[i]] == 0) { +// top[born[i]] = i; +// } else { +// top[born[i]] = merge(top[born[i]], i); +// } +// } +// for (int i = n; i >= 1; i--) { +// while (top[i] != 0 && attack[top[i]] < defend[i]) { +// die[top[i]] = i; +// sacrifice[i]++; +// top[i] = pop(top[i]); +// } +// if (top[i] != 0) { +// upgrade(top[i], op[i], gain[i]); +// if (top[belong[i]] == 0) { +// top[belong[i]] = top[i]; +// } else { +// top[belong[i]] = merge(top[belong[i]], top[i]); +// } +// } +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// prepare(); +// for (int i = 1; i <= n; i++) { +// cin >> defend[i]; +// } +// for (int i = 2; i <= n; i++) { +// cin >> belong[i] >> op[i] >> gain[i]; +// } +// for (int i = 1; i <= m; i++) { +// cin >> attack[i] >> born[i]; +// } +// compute(); +// for (int i = 1; i <= n; i++) { +// cout << sacrifice[i] << "\n"; +// } +// for (int i = 1; i <= m; i++) { +// cout << deep[born[i]] - deep[die[i]] << endl; +// } +// return 0; +//} \ No newline at end of file From c433c487acf1511ca5c6189b97b2d355d24a49d5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 11 Dec 2024 19:19:00 +0800 Subject: [PATCH 0455/2029] modify code --- src/class154/Code03_MonkeyKing1.java | 2 +- src/class154/Code03_MonkeyKing2.java | 2 +- src/class154/Code04_Convict1.java | 8 ++++++++ src/class154/Code05_NumberSequence1.java | 8 ++++++++ .../{Code04_Dispatch1.java => Code06_Dispatch1.java} | 6 +++--- .../{Code04_Dispatch2.java => Code06_Dispatch2.java} | 2 +- .../{Code04_Dispatch3.java => Code06_Dispatch3.java} | 0 .../Code01_CityCapture1.java} | 4 ++-- .../Code01_CityCapture2.java} | 2 +- 9 files changed, 25 insertions(+), 9 deletions(-) create mode 100644 src/class154/Code04_Convict1.java create mode 100644 src/class154/Code05_NumberSequence1.java rename src/class154/{Code04_Dispatch1.java => Code06_Dispatch1.java} (97%) rename src/class154/{Code04_Dispatch2.java => Code06_Dispatch2.java} (99%) rename src/class154/{Code04_Dispatch3.java => Code06_Dispatch3.java} (100%) rename src/{class154/Code05_CityCapture1.java => class155/Code01_CityCapture1.java} (99%) rename src/{class154/Code05_CityCapture2.java => class155/Code01_CityCapture2.java} (99%) diff --git a/src/class154/Code03_MonkeyKing1.java b/src/class154/Code03_MonkeyKing1.java index f2f7429cb..c267c7f11 100644 --- a/src/class154/Code03_MonkeyKing1.java +++ b/src/class154/Code03_MonkeyKing1.java @@ -1,6 +1,6 @@ package class154; -// 猴王,左偏树模版题3,java版 +// 猴王,java版 // 测试链接 : https://www.luogu.com.cn/problem/P1456 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class154/Code03_MonkeyKing2.java b/src/class154/Code03_MonkeyKing2.java index 2007b68c4..a6f63ef62 100644 --- a/src/class154/Code03_MonkeyKing2.java +++ b/src/class154/Code03_MonkeyKing2.java @@ -1,6 +1,6 @@ package class154; -// 猴王,左偏树模版题3,C++版 +// 猴王,C++版 // 测试链接 : https://www.luogu.com.cn/problem/P1456 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class154/Code04_Convict1.java b/src/class154/Code04_Convict1.java new file mode 100644 index 000000000..8c32cbda3 --- /dev/null +++ b/src/class154/Code04_Convict1.java @@ -0,0 +1,8 @@ +package class154; + +// 断罪者,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P4971 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 +public class Code04_Convict1 { + +} diff --git a/src/class154/Code05_NumberSequence1.java b/src/class154/Code05_NumberSequence1.java new file mode 100644 index 000000000..e2a8a9026 --- /dev/null +++ b/src/class154/Code05_NumberSequence1.java @@ -0,0 +1,8 @@ +package class154; + +// 数字序列,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P4331 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 +public class Code05_NumberSequence1 { + +} diff --git a/src/class154/Code04_Dispatch1.java b/src/class154/Code06_Dispatch1.java similarity index 97% rename from src/class154/Code04_Dispatch1.java rename to src/class154/Code06_Dispatch1.java index 410cba3fe..1e4fea156 100644 --- a/src/class154/Code04_Dispatch1.java +++ b/src/class154/Code06_Dispatch1.java @@ -4,8 +4,8 @@ // 测试链接 : https://www.luogu.com.cn/problem/P1552 // 提交以下的code,提交时请把类名改成"Main",会有一些测试用例通过不了 // 这是因为java语言用递归方式实现dfs,递归会爆栈 -// 需要把dfs实现成迭代版,才能全部通过,就是Code04_Dispatch2文件 -// 但是C++语言用递归方式实现,可以直接通过,就是Code04_Dispatch3文件 +// 需要把dfs实现成迭代版,才能全部通过,就是Code06_Dispatch2文件 +// 但是C++语言用递归方式实现,可以直接通过,就是Code06_Dispatch3文件 import java.io.BufferedReader; import java.io.IOException; @@ -14,7 +14,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code04_Dispatch1 { +public class Code06_Dispatch1 { public static int MAXN = 100001; diff --git a/src/class154/Code04_Dispatch2.java b/src/class154/Code06_Dispatch2.java similarity index 99% rename from src/class154/Code04_Dispatch2.java rename to src/class154/Code06_Dispatch2.java index 4588627ef..07edd9e46 100644 --- a/src/class154/Code04_Dispatch2.java +++ b/src/class154/Code06_Dispatch2.java @@ -11,7 +11,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code04_Dispatch2 { +public class Code06_Dispatch2 { public static int MAXN = 100001; diff --git a/src/class154/Code04_Dispatch3.java b/src/class154/Code06_Dispatch3.java similarity index 100% rename from src/class154/Code04_Dispatch3.java rename to src/class154/Code06_Dispatch3.java diff --git a/src/class154/Code05_CityCapture1.java b/src/class155/Code01_CityCapture1.java similarity index 99% rename from src/class154/Code05_CityCapture1.java rename to src/class155/Code01_CityCapture1.java index a40e33355..a6c27f09f 100644 --- a/src/class154/Code05_CityCapture1.java +++ b/src/class155/Code01_CityCapture1.java @@ -1,4 +1,4 @@ -package class154; +package class155; // 城池攻占,java版 // 不和并查集结合,和懒更新结合, @@ -16,7 +16,7 @@ import java.io.Writer; import java.util.InputMismatchException; -public class Code05_CityCapture1 { +public class Code01_CityCapture1 { public static int MAXN = 300001; diff --git a/src/class154/Code05_CityCapture2.java b/src/class155/Code01_CityCapture2.java similarity index 99% rename from src/class154/Code05_CityCapture2.java rename to src/class155/Code01_CityCapture2.java index 57862e49a..697df738b 100644 --- a/src/class154/Code05_CityCapture2.java +++ b/src/class155/Code01_CityCapture2.java @@ -1,4 +1,4 @@ -package class154; +package class155; // 城池攻占,C++版 // 输入保证,如果城市a管辖城市b,必有a < b From 16ca6aa93bcb07e5af950f53937901f925b7cc8d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 11 Dec 2024 19:20:14 +0800 Subject: [PATCH 0456/2029] modify code --- src/class155/Code01_CityCapture1.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/class155/Code01_CityCapture1.java b/src/class155/Code01_CityCapture1.java index a6c27f09f..a11093864 100644 --- a/src/class155/Code01_CityCapture1.java +++ b/src/class155/Code01_CityCapture1.java @@ -1,7 +1,6 @@ package class155; // 城池攻占,java版 -// 不和并查集结合,和懒更新结合, // 输入保证,如果城市a管辖城市b,必有a < b // 测试链接 : https://www.luogu.com.cn/problem/P3261 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 From 28e1683b0401d872aaaef9c22c047814ec46daa9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 11 Dec 2024 23:08:01 +0800 Subject: [PATCH 0457/2029] modify code --- ...6_Dispatch1.java => Code05_Dispatch1.java} | 8 +- ...6_Dispatch2.java => Code05_Dispatch2.java} | 2 +- ...6_Dispatch3.java => Code05_Dispatch3.java} | 2 +- src/class154/Code05_NumberSequence1.java | 8 - src/class154/Code06_NumberSequence1.java | 364 ++++++++++++++++++ src/class154/Code06_NumberSequence2.java | 114 ++++++ 6 files changed, 484 insertions(+), 14 deletions(-) rename src/class154/{Code06_Dispatch1.java => Code05_Dispatch1.java} (93%) rename src/class154/{Code06_Dispatch2.java => Code05_Dispatch2.java} (99%) rename src/class154/{Code06_Dispatch3.java => Code05_Dispatch3.java} (96%) delete mode 100644 src/class154/Code05_NumberSequence1.java create mode 100644 src/class154/Code06_NumberSequence1.java create mode 100644 src/class154/Code06_NumberSequence2.java diff --git a/src/class154/Code06_Dispatch1.java b/src/class154/Code05_Dispatch1.java similarity index 93% rename from src/class154/Code06_Dispatch1.java rename to src/class154/Code05_Dispatch1.java index 1e4fea156..31844a897 100644 --- a/src/class154/Code06_Dispatch1.java +++ b/src/class154/Code05_Dispatch1.java @@ -2,10 +2,10 @@ // 派遣,dfs用递归实现,java版 // 测试链接 : https://www.luogu.com.cn/problem/P1552 -// 提交以下的code,提交时请把类名改成"Main",会有一些测试用例通过不了 +// 提交以下的code,提交时请把类名改成"Main",一些测试用例通过不了 // 这是因为java语言用递归方式实现dfs,递归会爆栈 -// 需要把dfs实现成迭代版,才能全部通过,就是Code06_Dispatch2文件 -// 但是C++语言用递归方式实现,可以直接通过,就是Code06_Dispatch3文件 +// 需要把dfs实现成迭代版,才能全部通过,就是Code05_Dispatch2文件 +// C++语言用递归方式实现,可以直接通过,就是Code05_Dispatch3文件 import java.io.BufferedReader; import java.io.IOException; @@ -14,7 +14,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code06_Dispatch1 { +public class Code05_Dispatch1 { public static int MAXN = 100001; diff --git a/src/class154/Code06_Dispatch2.java b/src/class154/Code05_Dispatch2.java similarity index 99% rename from src/class154/Code06_Dispatch2.java rename to src/class154/Code05_Dispatch2.java index 07edd9e46..a6296b121 100644 --- a/src/class154/Code06_Dispatch2.java +++ b/src/class154/Code05_Dispatch2.java @@ -11,7 +11,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code06_Dispatch2 { +public class Code05_Dispatch2 { public static int MAXN = 100001; diff --git a/src/class154/Code06_Dispatch3.java b/src/class154/Code05_Dispatch3.java similarity index 96% rename from src/class154/Code06_Dispatch3.java rename to src/class154/Code05_Dispatch3.java index 15d117938..4c1b8423b 100644 --- a/src/class154/Code06_Dispatch3.java +++ b/src/class154/Code05_Dispatch3.java @@ -2,7 +2,7 @@ // 派遣,dfs用递归实现,C++版 // 测试链接 : https://www.luogu.com.cn/problem/P1552 -// 逻辑和java的递归版完全一样,java的递归版就过不了,C++的递归版就能过 +// 逻辑和java的递归版完全一样,java必须改迭代版才能通过,C++的递归版就能通过 // 这是洛谷没有考虑其他语言导致的,提交如下代码,可以通过所有测试用例 //#include diff --git a/src/class154/Code05_NumberSequence1.java b/src/class154/Code05_NumberSequence1.java deleted file mode 100644 index e2a8a9026..000000000 --- a/src/class154/Code05_NumberSequence1.java +++ /dev/null @@ -1,8 +0,0 @@ -package class154; - -// 数字序列,java版 -// 测试链接 : https://www.luogu.com.cn/problem/P4331 -// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 -public class Code05_NumberSequence1 { - -} diff --git a/src/class154/Code06_NumberSequence1.java b/src/class154/Code06_NumberSequence1.java new file mode 100644 index 000000000..e3aa5120b --- /dev/null +++ b/src/class154/Code06_NumberSequence1.java @@ -0,0 +1,364 @@ +package class154; + +// 数字序列,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P4331 +// 提交以下的code,提交时请把类名改成"Main",一些测试用例通过不了,空间超了 +// 这是洛谷平台没有考虑其他语言导致的,同样的逻辑,C++实现就能完全通过 +// C++实现的版本,就是Code06_NumberSequence2文件 + +import java.io.BufferedWriter; +import java.io.ByteArrayOutputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.Writer; +import java.util.InputMismatchException; + +public class Code06_NumberSequence1 { + + public static int MAXN = 1000001; + + public static int n; + + public static long[] arr = new long[MAXN]; + + public static int[] left = new int[MAXN]; + + public static int[] right = new int[MAXN]; + + public static int[] dist = new int[MAXN]; + + public static int[] father = new int[MAXN]; + + public static int[] from = new int[MAXN]; + + public static int[] to = new int[MAXN]; + + public static int[] size = new int[MAXN]; + + public static int[] stack = new int[MAXN]; + + public static long[] ans = new long[MAXN]; + + public static void prepare() { + for (int i = 1; i <= n; i++) { + left[i] = right[i] = dist[i] = 0; + } + } + + public static int find(int i) { + if (father[i] != i) { + father[i] = find(father[i]); + } + return father[i]; + } + + public static int merge(int i, int j) { + if (i == 0 || j == 0) { + return i + j; + } + int tmp; + if (arr[i] < arr[j]) { + tmp = i; + i = j; + j = tmp; + } + right[i] = merge(right[i], j); + if (dist[left[i]] < dist[right[i]]) { + tmp = left[i]; + left[i] = right[i]; + right[i] = tmp; + } + dist[i] = dist[right[i]] + 1; + father[i] = father[left[i]] = father[right[i]] = i; + return i; + } + + public static int pop(int i) { + father[left[i]] = left[i]; + father[right[i]] = right[i]; + father[i] = merge(left[i], right[i]); + left[i] = right[i] = 0; + return father[i]; + } + + public static long compute() { + for (int i = 1; i <= n; i++) { + father[i] = from[i] = to[i] = i; + size[i] = 1; + } + int stackSize = 0; + for (int i = 1, pre, cur, s; i <= n; i++) { + while (stackSize > 0) { + pre = find(stack[stackSize]); + cur = find(i); + if (arr[pre] <= arr[cur]) { + break; + } + s = size[pre] + size[cur]; + cur = merge(pre, cur); + while (s > (i - from[pre] + 1 + 2) / 2) { + cur = pop(cur); + s--; + } + from[cur] = from[pre]; + to[cur] = i; + size[cur] = s; + stackSize--; + } + stack[++stackSize] = i; + } + long sum = 0; + for (int i = 1, cur; i <= stackSize; i++) { + cur = find(stack[i]); + for (int j = from[cur]; j <= to[cur]; j++) { + ans[j] = arr[cur]; + sum += Math.abs(ans[j] - arr[j]); + } + } + return sum; + } + + public static void main(String[] args) { + FastReader in = new FastReader(System.in); + FastWriter out = new FastWriter(System.out); + n = in.readInt(); + prepare(); + for (int i = 1; i <= n; i++) { + arr[i] = in.readLong() - i; + } + out.println(compute()); + for (int i = 1; i <= n; i++) { + out.write((ans[i] + i)); + out.write(" "); + } + out.writeln(); + out.flush(); + out.close(); + } + + // 快读 + public static class FastReader { + InputStream is; + private byte[] inbuf = new byte[1024]; + public int lenbuf = 0; + public int ptrbuf = 0; + + public FastReader(final InputStream is) { + this.is = is; + } + + public int readByte() { + if (lenbuf == -1) { + throw new InputMismatchException(); + } + if (ptrbuf >= lenbuf) { + ptrbuf = 0; + try { + lenbuf = is.read(inbuf); + } catch (IOException e) { + throw new InputMismatchException(); + } + if (lenbuf <= 0) { + return -1; + } + } + return inbuf[ptrbuf++]; + } + + public int readInt() { + return (int) readLong(); + } + + public long readLong() { + long num = 0; + int b; + boolean minus = false; + while ((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-')) + ; + if (b == '-') { + minus = true; + b = readByte(); + } + + while (true) { + if (b >= '0' && b <= '9') { + num = num * 10 + (b - '0'); + } else { + return minus ? -num : num; + } + b = readByte(); + } + } + } + + // 快写 + public static class FastWriter { + private static final int BUF_SIZE = 1 << 13; + private final byte[] buf = new byte[BUF_SIZE]; + private OutputStream out; + private Writer writer; + private int ptr = 0; + + public FastWriter(Writer writer) { + this.writer = new BufferedWriter(writer); + out = new ByteArrayOutputStream(); + } + + public FastWriter(OutputStream os) { + this.out = os; + } + + public FastWriter(String path) { + try { + this.out = new FileOutputStream(path); + } catch (FileNotFoundException e) { + throw new RuntimeException("FastWriter"); + } + } + + public FastWriter write(byte b) { + buf[ptr++] = b; + if (ptr == BUF_SIZE) { + innerflush(); + } + return this; + } + + public FastWriter write(String s) { + s.chars().forEach(c -> { + buf[ptr++] = (byte) c; + if (ptr == BUF_SIZE) { + innerflush(); + } + }); + return this; + } + + private static int countDigits(long l) { + if (l >= 1000000000000000000L) { + return 19; + } + if (l >= 100000000000000000L) { + return 18; + } + if (l >= 10000000000000000L) { + return 17; + } + if (l >= 1000000000000000L) { + return 16; + } + if (l >= 100000000000000L) { + return 15; + } + if (l >= 10000000000000L) { + return 14; + } + if (l >= 1000000000000L) { + return 13; + } + if (l >= 100000000000L) { + return 12; + } + if (l >= 10000000000L) { + return 11; + } + if (l >= 1000000000L) { + return 10; + } + if (l >= 100000000L) { + return 9; + } + if (l >= 10000000L) { + return 8; + } + if (l >= 1000000L) { + return 7; + } + if (l >= 100000L) { + return 6; + } + if (l >= 10000L) { + return 5; + } + if (l >= 1000L) { + return 4; + } + if (l >= 100L) { + return 3; + } + if (l >= 10L) { + return 2; + } + return 1; + } + + public FastWriter write(long x) { + if (x == Long.MIN_VALUE) { + return write("" + x); + } + if (ptr + 21 >= BUF_SIZE) { + innerflush(); + } + if (x < 0) { + write((byte) '-'); + x = -x; + } + int d = countDigits(x); + for (int i = ptr + d - 1; i >= ptr; i--) { + buf[i] = (byte) ('0' + x % 10); + x /= 10; + } + ptr += d; + return this; + } + + public FastWriter writeln(long x) { + return write(x).writeln(); + } + + public FastWriter writeln() { + return write((byte) '\n'); + } + + private void innerflush() { + try { + out.write(buf, 0, ptr); + ptr = 0; + } catch (IOException e) { + throw new RuntimeException("innerflush"); + } + } + + public void flush() { + innerflush(); + try { + if (writer != null) { + writer.write(((ByteArrayOutputStream) out).toString()); + out = new ByteArrayOutputStream(); + writer.flush(); + } else { + out.flush(); + } + } catch (IOException e) { + throw new RuntimeException("flush"); + } + } + + public FastWriter println(long x) { + return writeln(x); + } + + public void close() { + flush(); + try { + out.close(); + } catch (Exception e) { + } + } + + } + +} diff --git a/src/class154/Code06_NumberSequence2.java b/src/class154/Code06_NumberSequence2.java new file mode 100644 index 000000000..7dda16fe4 --- /dev/null +++ b/src/class154/Code06_NumberSequence2.java @@ -0,0 +1,114 @@ +package class154; + +// 数字序列,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P4331 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 1000001; +//int n; +//long long arr[MAXN]; +//int ls[MAXN]; +//int rs[MAXN]; +//int dist[MAXN]; +//int fa[MAXN]; +//int from[MAXN]; +//int to[MAXN]; +//int siz[MAXN]; +//int stk[MAXN]; +//long long ans[MAXN]; +// +//void prepare() { +// for (int i = 1; i <= n; i++) { +// ls[i] = rs[i] = dist[i] = 0; +// } +//} +// +//int find(int i) { +// if (fa[i] != i) { +// fa[i] = find(fa[i]); +// } +// return fa[i]; +//} +// +//int merge(int i, int j) { +// if (i == 0 || j == 0) return i + j; +// int tmp; +// if (arr[i] < arr[j]) { +// tmp = i; i = j; j = tmp; +// } +// rs[i] = merge(rs[i], j); +// if (dist[ls[i]] < dist[rs[i]]) { +// tmp = ls[i]; ls[i] = rs[i]; rs[i] = tmp; +// } +// dist[i] = dist[rs[i]] + 1; +// fa[i] = fa[ls[i]] = fa[rs[i]] = i; +// return i; +//} +// +//int pop(int i) { +// fa[ls[i]] = ls[i]; +// fa[rs[i]] = rs[i]; +// fa[i] = merge(ls[i], rs[i]); +// ls[i] = rs[i] = 0; +// return fa[i]; +//} +// +//long long compute() { +// for (int i = 1; i <= n; i++) { +// fa[i] = from[i] = to[i] = i; +// siz[i] = 1; +// } +// int stackSize = 0; +// for (int i = 1, pre, cur, s; i <= n; i++) { +// while (stackSize > 0) { +// pre = find(stk[stackSize]); +// cur = find(i); +// if (arr[pre] <= arr[cur]) { +// break; +// } +// s = siz[pre] + siz[cur]; +// cur = merge(pre, cur); +// while (s > ((i - from[pre] + 1 + 2) / 2)) { +// cur = pop(cur); +// s--; +// } +// from[cur] = from[pre]; +// to[cur] = i; +// siz[cur] = s; +// stackSize--; +// } +// stk[++stackSize] = i; +// } +// long long sum = 0; +// for (int i = 1, cur; i <= stackSize; i++) { +// cur = find(stk[i]); +// for (int j = from[cur]; j <= to[cur]; j++) { +// ans[j] = arr[cur]; +// sum += llabs(ans[j] - arr[j]); +// } +// } +// return sum; +//} +// +//int main() { +// ios_base::sync_with_stdio(false); +// cin.tie(NULL); +// cin >> n; +// prepare(); +// long long x; +// for (int i = 1; i <= n; i++) { +// cin >> x; +// arr[i] = x - i; +// } +// long long res = compute(); +// cout << res << "\n"; +// for (int i = 1; i <= n; i++) { +// cout << ans[i] + i << (i == n ? '\n' : ' '); +// } +// return 0; +//} \ No newline at end of file From 9186d62de93f52765b0fdaa1d2aea4400776610e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 11 Dec 2024 23:55:35 +0800 Subject: [PATCH 0458/2029] modify code --- src/class154/Code06_NumberSequence1.java | 2 +- src/class154/Code06_NumberSequence2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class154/Code06_NumberSequence1.java b/src/class154/Code06_NumberSequence1.java index e3aa5120b..b4ff57022 100644 --- a/src/class154/Code06_NumberSequence1.java +++ b/src/class154/Code06_NumberSequence1.java @@ -99,7 +99,7 @@ public static long compute() { } s = size[pre] + size[cur]; cur = merge(pre, cur); - while (s > (i - from[pre] + 1 + 2) / 2) { + while (s > (i - from[pre] + 1 + 1) / 2) { cur = pop(cur); s--; } diff --git a/src/class154/Code06_NumberSequence2.java b/src/class154/Code06_NumberSequence2.java index 7dda16fe4..17ba24fb6 100644 --- a/src/class154/Code06_NumberSequence2.java +++ b/src/class154/Code06_NumberSequence2.java @@ -73,7 +73,7 @@ // } // s = siz[pre] + siz[cur]; // cur = merge(pre, cur); -// while (s > ((i - from[pre] + 1 + 2) / 2)) { +// while (s > ((i - from[pre] + 1 + 1) / 2)) { // cur = pop(cur); // s--; // } From df5943e4fcb29567ca866308c0fd456cde279c80 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 12 Dec 2024 18:47:49 +0800 Subject: [PATCH 0459/2029] modify code --- src/class154/Code01_LeftistTree1.java | 8 +- src/class154/Code01_LeftistTree2.java | 8 +- src/class154/Code02_RomanGame1.java | 8 +- src/class154/Code02_RomanGame2.java | 8 +- src/class154/Code03_MonkeyKing1.java | 14 +- src/class154/Code03_MonkeyKing2.java | 14 +- src/class154/Code04_Convict1.java | 355 ++++++++++++++++++++++- src/class154/Code04_Convict2.java | 112 +++++++ src/class154/Code05_Dispatch1.java | 8 +- src/class154/Code05_Dispatch2.java | 8 +- src/class154/Code05_Dispatch3.java | 22 +- src/class154/Code06_NumberSequence1.java | 8 +- src/class154/Code06_NumberSequence2.java | 8 +- src/class155/Code01_CityCapture1.java | 2 +- src/class155/Code01_CityCapture2.java | 3 +- 15 files changed, 518 insertions(+), 68 deletions(-) create mode 100644 src/class154/Code04_Convict2.java diff --git a/src/class154/Code01_LeftistTree1.java b/src/class154/Code01_LeftistTree1.java index 397ad3c28..32af34f91 100644 --- a/src/class154/Code01_LeftistTree1.java +++ b/src/class154/Code01_LeftistTree1.java @@ -28,9 +28,7 @@ public class Code01_LeftistTree1 { public static int[] father = new int[MAXN]; public static int find(int i) { - if (father[i] != i) { - father[i] = find(father[i]); - } + father[i] = father[i] == i ? i : find(father[i]); return father[i]; } @@ -51,7 +49,7 @@ public static int merge(int i, int j) { right[i] = tmp; } dist[i] = dist[right[i]] + 1; - father[i] = father[left[i]] = father[right[i]] = i; + father[left[i]] = father[right[i]] = i; return i; } @@ -64,7 +62,7 @@ public static int pop(int i) { // 为了i能再往上找到正确的头,所以有下面这句 father[i] = merge(left[i], right[i]); num[i] = -1; - left[i] = right[i] = 0; + left[i] = right[i] = dist[i] = 0; return father[i]; } diff --git a/src/class154/Code01_LeftistTree2.java b/src/class154/Code01_LeftistTree2.java index 27b2f6717..d1e22167b 100644 --- a/src/class154/Code01_LeftistTree2.java +++ b/src/class154/Code01_LeftistTree2.java @@ -17,9 +17,7 @@ //int fa[MAXN]; // //int find(int i) { -// if (fa[i] != i) { -// fa[i] = find(fa[i]); -// } +// fa[i] = fa[i] == i ? i : find(fa[i]); // return fa[i]; //} // @@ -39,7 +37,7 @@ // rs[i] = tmp; // } // dist[i] = dist[rs[i]] + 1; -// fa[i] = fa[ls[i]] = fa[rs[i]] = i; +// fa[ls[i]] = fa[rs[i]] = i; // return i; //} // @@ -48,7 +46,7 @@ // fa[rs[i]] = rs[i]; // fa[i] = merge(ls[i], rs[i]); // num[i] = -1; -// ls[i] = rs[i] = 0; +// ls[i] = rs[i] = dist[i] = 0; // return fa[i]; //} // diff --git a/src/class154/Code02_RomanGame1.java b/src/class154/Code02_RomanGame1.java index 0362351f9..1f6db36f2 100644 --- a/src/class154/Code02_RomanGame1.java +++ b/src/class154/Code02_RomanGame1.java @@ -29,9 +29,7 @@ public class Code02_RomanGame1 { public static int[] father = new int[MAXN]; public static int find(int i) { - if (father[i] != i) { - father[i] = find(father[i]); - } + father[i] = father[i] == i ? i : find(father[i]); return father[i]; } @@ -52,7 +50,7 @@ public static int merge(int i, int j) { right[i] = tmp; } dist[i] = dist[right[i]] + 1; - father[i] = father[left[i]] = father[right[i]] = i; + father[left[i]] = father[right[i]] = i; return i; } @@ -61,7 +59,7 @@ public static int pop(int i) { father[right[i]] = right[i]; father[i] = merge(left[i], right[i]); num[i] = -1; - left[i] = right[i] = 0; + left[i] = right[i] = dist[i] = 0; return father[i]; } diff --git a/src/class154/Code02_RomanGame2.java b/src/class154/Code02_RomanGame2.java index d82302d70..11f9f7dea 100644 --- a/src/class154/Code02_RomanGame2.java +++ b/src/class154/Code02_RomanGame2.java @@ -17,9 +17,7 @@ //int fa[MAXN]; // //int find(int i) { -// if (fa[i] != i) { -// fa[i] = find(fa[i]); -// } +// fa[i] = fa[i] == i ? i : find(fa[i]); // return fa[i]; //} // @@ -39,7 +37,7 @@ // rs[i] = tmp; // } // dist[i] = dist[rs[i]] + 1; -// fa[i] = fa[ls[i]] = fa[rs[i]] = i; +// fa[ls[i]] = fa[rs[i]] = i; // return i; //} // @@ -48,7 +46,7 @@ // fa[rs[i]] = rs[i]; // fa[i] = merge(ls[i], rs[i]); // num[i] = -1; -// ls[i] = rs[i] = 0; +// ls[i] = rs[i] = dist[i] = 0; // return fa[i]; //} // diff --git a/src/class154/Code03_MonkeyKing1.java b/src/class154/Code03_MonkeyKing1.java index c267c7f11..0b9a9c954 100644 --- a/src/class154/Code03_MonkeyKing1.java +++ b/src/class154/Code03_MonkeyKing1.java @@ -26,9 +26,7 @@ public class Code03_MonkeyKing1 { public static int[] father = new int[MAXN]; public static int find(int i) { - if (father[i] != i) { - father[i] = find(father[i]); - } + father[i] = father[i] == i ? i : find(father[i]); return father[i]; } @@ -50,7 +48,7 @@ public static int merge(int i, int j) { right[i] = tmp; } dist[i] = dist[right[i]] + 1; - father[i] = father[left[i]] = father[right[i]] = i; + father[left[i]] = father[right[i]] = i; return i; } @@ -59,14 +57,18 @@ public static int pop(int i) { father[right[i]] = right[i]; father[i] = merge(left[i], right[i]); num[i] /= 2; // 根据题目要求,这里是除以2 - left[i] = right[i] = 0; + left[i] = right[i] = dist[i] = 0; return father[i]; } public static int fight(int x, int y) { int l = find(x); int r = find(y); - return l == r ? -1 : num[merge(merge(pop(l), l), merge(pop(r), r))]; + if (l == r) { + return -1; + } + father[l] = father[r] = merge(merge(pop(l), l), merge(pop(r), r)); + return num[father[l]]; } public static void main(String[] args) throws IOException { diff --git a/src/class154/Code03_MonkeyKing2.java b/src/class154/Code03_MonkeyKing2.java index a6f63ef62..17766aa27 100644 --- a/src/class154/Code03_MonkeyKing2.java +++ b/src/class154/Code03_MonkeyKing2.java @@ -17,9 +17,7 @@ //int fa[MAXN]; // //int find(int i) { -// if (fa[i] != i) { -// fa[i] = find(fa[i]); -// } +// fa[i] = fa[i] == i ? i : find(fa[i]); // return fa[i]; //} // @@ -40,7 +38,7 @@ // rs[i] = tmp; // } // dist[i] = dist[rs[i]] + 1; -// fa[i] = fa[ls[i]] = fa[rs[i]] = i; +// fa[ls[i]] = fa[rs[i]] = i; // return i; //} // @@ -49,14 +47,18 @@ // fa[rs[i]] = rs[i]; // fa[i] = merge(ls[i], rs[i]); // num[i] /= 2; -// ls[i] = rs[i] = 0; +// ls[i] = rs[i] = dist[i] = 0; // return fa[i]; //} // //int fight(int x, int y) { // int l = find(x); // int r = find(y); -// return l == r ? -1 : num[merge(merge(pop(l), l), merge(pop(r), r))]; +// if (l == r) { +// return -1; +// } +// fa[l] = fa[r] = merge(merge(pop(l), l), merge(pop(r), r)); +// return num[fa[l]]; //} // //int main() { diff --git a/src/class154/Code04_Convict1.java b/src/class154/Code04_Convict1.java index 8c32cbda3..02fa32a72 100644 --- a/src/class154/Code04_Convict1.java +++ b/src/class154/Code04_Convict1.java @@ -3,6 +3,359 @@ // 断罪者,java版 // 测试链接 : https://www.luogu.com.cn/problem/P4971 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.BufferedWriter; +import java.io.ByteArrayOutputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.Writer; +import java.util.InputMismatchException; + public class Code04_Convict1 { -} + public static int MAXN = 2000001; + + public static long[] num = new long[MAXN]; + + public static int[] left = new int[MAXN]; + + public static int[] right = new int[MAXN]; + + public static int[] dist = new int[MAXN]; + + public static int[] father = new int[MAXN]; + + public static int t, w, n, m; + + public static long k; + + public static void prepare() { + for (int i = 1; i <= n; i++) { + left[i] = right[i] = dist[i] = 0; + father[i] = i; + } + } + + public static int find(int i) { + father[i] = father[i] == i ? i : find(father[i]); + return father[i]; + } + + public static int merge(int i, int j) { + if (i == 0 || j == 0) { + return i + j; + } + int tmp; + if (num[i] < num[j] || (num[i] == num[j] && i > j)) { + tmp = i; + i = j; + j = tmp; + } + right[i] = merge(right[i], j); + if (dist[left[i]] < dist[right[i]]) { + tmp = left[i]; + left[i] = right[i]; + right[i] = tmp; + } + dist[i] = dist[right[i]] + 1; + father[left[i]] = father[right[i]] = i; + return i; + } + + public static void reduce(int i, long v) { + num[i] = Math.max(num[i] - v, 0); + int l = find(i); + father[left[i]] = left[i]; + father[right[i]] = right[i]; + int r = merge(left[i], right[i]); + left[i] = right[i] = dist[i] = 0; + father[i] = merge(l, r); + } + + public static long compute() { + long ans = 0; + long max = 0; + for (int i = 1; i <= n; i++) { + if (father[i] == i) { + ans += num[i]; + max = Math.max(max, num[i]); + } + } + if (w == 2) { + ans -= max; + } else if (w == 3) { + ans += max; + } + return ans; + } + + public static void main(String[] args) { + FastReader in = new FastReader(System.in); + FastWriter out = new FastWriter(System.out); + t = in.readInt(); + w = in.readInt(); + k = in.readLong(); + for (int i = 1; i <= t; i++) { + n = in.readInt(); + m = in.readInt(); + prepare(); + for (int j = 1; j <= n; j++) { + num[j] = in.readLong(); + } + for (int j = 1, op, a, b; j <= m; j++) { + op = in.readInt(); + a = in.readInt(); + if (op == 2) { + reduce(a, num[a]); + } else if (op == 3) { + b = in.readInt(); + reduce(find(a), b); + } else { + b = in.readInt(); + int l = find(a); + int r = find(b); + if (l != r) { + merge(l, r); + } + } + } + long ans = compute(); + if (ans == 0) { + out.write("Gensokyo "); + } else if (ans > k) { + out.write("Hell "); + } else { + out.write("Heaven "); + } + out.println(ans); + } + out.flush(); + out.close(); + } + + // 快读 + public static class FastReader { + InputStream is; + private byte[] inbuf = new byte[1024]; + public int lenbuf = 0; + public int ptrbuf = 0; + + public FastReader(final InputStream is) { + this.is = is; + } + + public int readByte() { + if (lenbuf == -1) { + throw new InputMismatchException(); + } + if (ptrbuf >= lenbuf) { + ptrbuf = 0; + try { + lenbuf = is.read(inbuf); + } catch (IOException e) { + throw new InputMismatchException(); + } + if (lenbuf <= 0) { + return -1; + } + } + return inbuf[ptrbuf++]; + } + + public int readInt() { + return (int) readLong(); + } + + public long readLong() { + long num = 0; + int b; + boolean minus = false; + while ((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-')) + ; + if (b == '-') { + minus = true; + b = readByte(); + } + + while (true) { + if (b >= '0' && b <= '9') { + num = num * 10 + (b - '0'); + } else { + return minus ? -num : num; + } + b = readByte(); + } + } + } + + // 快写 + public static class FastWriter { + private static final int BUF_SIZE = 1 << 13; + private final byte[] buf = new byte[BUF_SIZE]; + private OutputStream out; + private Writer writer; + private int ptr = 0; + + public FastWriter(Writer writer) { + this.writer = new BufferedWriter(writer); + out = new ByteArrayOutputStream(); + } + + public FastWriter(OutputStream os) { + this.out = os; + } + + public FastWriter(String path) { + try { + this.out = new FileOutputStream(path); + } catch (FileNotFoundException e) { + throw new RuntimeException("FastWriter"); + } + } + + public FastWriter write(byte b) { + buf[ptr++] = b; + if (ptr == BUF_SIZE) { + innerflush(); + } + return this; + } + + public FastWriter write(String s) { + s.chars().forEach(c -> { + buf[ptr++] = (byte) c; + if (ptr == BUF_SIZE) { + innerflush(); + } + }); + return this; + } + + private static int countDigits(long l) { + if (l >= 1000000000000000000L) { + return 19; + } + if (l >= 100000000000000000L) { + return 18; + } + if (l >= 10000000000000000L) { + return 17; + } + if (l >= 1000000000000000L) { + return 16; + } + if (l >= 100000000000000L) { + return 15; + } + if (l >= 10000000000000L) { + return 14; + } + if (l >= 1000000000000L) { + return 13; + } + if (l >= 100000000000L) { + return 12; + } + if (l >= 10000000000L) { + return 11; + } + if (l >= 1000000000L) { + return 10; + } + if (l >= 100000000L) { + return 9; + } + if (l >= 10000000L) { + return 8; + } + if (l >= 1000000L) { + return 7; + } + if (l >= 100000L) { + return 6; + } + if (l >= 10000L) { + return 5; + } + if (l >= 1000L) { + return 4; + } + if (l >= 100L) { + return 3; + } + if (l >= 10L) { + return 2; + } + return 1; + } + + public FastWriter write(long x) { + if (x == Long.MIN_VALUE) { + return write("" + x); + } + if (ptr + 21 >= BUF_SIZE) { + innerflush(); + } + if (x < 0) { + write((byte) '-'); + x = -x; + } + int d = countDigits(x); + for (int i = ptr + d - 1; i >= ptr; i--) { + buf[i] = (byte) ('0' + x % 10); + x /= 10; + } + ptr += d; + return this; + } + + public FastWriter writeln(long x) { + return write(x).writeln(); + } + + public FastWriter writeln() { + return write((byte) '\n'); + } + + private void innerflush() { + try { + out.write(buf, 0, ptr); + ptr = 0; + } catch (IOException e) { + throw new RuntimeException("innerflush"); + } + } + + public void flush() { + innerflush(); + try { + if (writer != null) { + writer.write(((ByteArrayOutputStream) out).toString()); + out = new ByteArrayOutputStream(); + writer.flush(); + } else { + out.flush(); + } + } catch (IOException e) { + throw new RuntimeException("flush"); + } + } + + public FastWriter println(long x) { + return writeln(x); + } + + public void close() { + flush(); + try { + out.close(); + } catch (Exception e) { + } + } + + } + +} \ No newline at end of file diff --git a/src/class154/Code04_Convict2.java b/src/class154/Code04_Convict2.java new file mode 100644 index 000000000..079d62bd1 --- /dev/null +++ b/src/class154/Code04_Convict2.java @@ -0,0 +1,112 @@ +package class154; + +// 断罪者,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P4971 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 2000001; +//int t, w, n, m; +//long long k; +//long long num[MAXN]; +//int ls[MAXN]; +//int rs[MAXN]; +//int dist[MAXN]; +//int fa[MAXN]; +// +//int find(int i) { +// return fa[i] == i ? i : (fa[i] = find(fa[i])); +//} +// +//int merge(int i, int j) { +// if (i == 0 || j == 0) { +// return i + j; +// } +// int tmp; +// if (num[i] < num[j] || (num[i] == num[j] && i > j)) { +// tmp = i; i = j; j = tmp; +// } +// rs[i] = merge(rs[i], j); +// if (dist[ls[i]] < dist[rs[i]]) { +// tmp = ls[i]; ls[i] = rs[i]; rs[i] = tmp; +// } +// dist[i] = dist[rs[i]] + 1; +// fa[ls[i]] = fa[rs[i]] = i; +// return i; +//} +// +//void reduce(int i, long long v) { +// num[i] = max(num[i] - v, 0LL); +// int l = find(i); +// fa[ls[i]] = ls[i]; +// fa[rs[i]] = rs[i]; +// int r = merge(ls[i], rs[i]); +// ls[i] = rs[i] = dist[i] = 0; +// fa[i] = merge(l, r); +//} +// +//void prepare() { +// for (int i = 1; i <= n; i++) { +// ls[i] = rs[i] = dist[i] = 0; +// fa[i] = i; +// } +//} +// +//long long compute() { +// long long ans = 0; +// long long mx = 0; +// for (int i = 1; i <= n; i++) { +// if (fa[i] == i) { +// ans += num[i]; +// if (num[i] > mx) mx = num[i]; +// } +// } +// if (w == 2) { +// ans -= mx; +// } else if (w == 3) { +// ans += mx; +// } +// return ans; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(NULL); +// cin >> t >> w >> k; +// for(int i = 1; i <= t; i++) { +// cin >> n >> m; +// prepare(); +// for (int j = 1; j <= n; j++) { +// cin >> num[j]; +// } +// for (int j = 1, op, a, b; j <= m; j++) { +// cin >> op >> a; +// if (op == 2) { +// reduce(a, num[a]); +// } else if (op == 3) { +// cin >> b; +// reduce(find(a), b); +// } else { +// cin >> b; +// int l = find(a); +// int r = find(b); +// if (l != r) { +// merge(l, r); +// } +// } +// } +// long long ans = compute(); +// if (ans == 0) { +// cout << "Gensokyo " << ans << endl; +// } else if (ans > k) { +// cout << "Hell " << ans << endl; +// } else { +// cout << "Heaven " << ans << endl; +// } +// } +// return 0; +//} \ No newline at end of file diff --git a/src/class154/Code05_Dispatch1.java b/src/class154/Code05_Dispatch1.java index 31844a897..32d4314e1 100644 --- a/src/class154/Code05_Dispatch1.java +++ b/src/class154/Code05_Dispatch1.java @@ -72,9 +72,7 @@ public static void addEdge(int u, int v) { } public static int find(int i) { - if (father[i] != i) { - father[i] = find(father[i]); - } + father[i] = father[i] == i ? i : find(father[i]); return father[i]; } @@ -96,7 +94,7 @@ public static int merge(int i, int j) { right[i] = tmp; } dist[i] = dist[right[i]] + 1; - father[i] = father[left[i]] = father[right[i]] = i; + father[left[i]] = father[right[i]] = i; return i; } @@ -104,7 +102,7 @@ public static int pop(int i) { father[left[i]] = left[i]; father[right[i]] = right[i]; father[i] = merge(left[i], right[i]); - left[i] = right[i] = 0; + left[i] = right[i] = dist[i] = 0; return father[i]; } diff --git a/src/class154/Code05_Dispatch2.java b/src/class154/Code05_Dispatch2.java index a6296b121..fa7cd13f4 100644 --- a/src/class154/Code05_Dispatch2.java +++ b/src/class154/Code05_Dispatch2.java @@ -60,9 +60,7 @@ public static void addEdge(int u, int v) { } public static int find(int i) { - if (father[i] != i) { - father[i] = find(father[i]); - } + father[i] = father[i] == i ? i : find(father[i]); return father[i]; } @@ -83,7 +81,7 @@ public static int merge(int i, int j) { right[i] = tmp; } dist[i] = dist[right[i]] + 1; - father[i] = father[left[i]] = father[right[i]] = i; + father[left[i]] = father[right[i]] = i; return i; } @@ -91,7 +89,7 @@ public static int pop(int i) { father[left[i]] = left[i]; father[right[i]] = right[i]; father[i] = merge(left[i], right[i]); - left[i] = right[i] = 0; + left[i] = right[i] = dist[i] = 0; return father[i]; } diff --git a/src/class154/Code05_Dispatch3.java b/src/class154/Code05_Dispatch3.java index 4c1b8423b..7fae7c264 100644 --- a/src/class154/Code05_Dispatch3.java +++ b/src/class154/Code05_Dispatch3.java @@ -21,7 +21,7 @@ //int ls[MAXN]; //int rs[MAXN]; //int dist[MAXN]; -//int father[MAXN]; +//int fa[MAXN]; //int siz[MAXN]; //long long sum[MAXN]; // @@ -31,7 +31,7 @@ // for (int i = 1; i <= n; i++) { // head[i] = ls[i] = rs[i] = dist[i] = siz[i] = 0; // sum[i] = 0; -// father[i] = i; +// fa[i] = i; // } //} // @@ -42,10 +42,8 @@ //} // //int find(int i) { -// if (father[i] != i) { -// father[i] = find(father[i]); -// } -// return father[i]; +// fa[i] = fa[i] == i ? i : find(fa[i]); +// return fa[i]; //} // //int merge(int i, int j) { @@ -64,16 +62,16 @@ // rs[i] = tmp; // } // dist[i] = dist[rs[i]] + 1; -// father[i] = father[ls[i]] = father[rs[i]] = i; +// fa[ls[i]] = fa[rs[i]] = i; // return i; //} // //int pop(int i) { -// father[ls[i]] = ls[i]; -// father[rs[i]] = rs[i]; -// father[i] = merge(ls[i], rs[i]); -// ls[i] = rs[i] = 0; -// return father[i]; +// fa[ls[i]] = ls[i]; +// fa[rs[i]] = rs[i]; +// fa[i] = merge(ls[i], rs[i]); +// ls[i] = rs[i] = dist[i] = 0; +// return fa[i]; //} // //void dfs(int u) { diff --git a/src/class154/Code06_NumberSequence1.java b/src/class154/Code06_NumberSequence1.java index b4ff57022..53bc868dc 100644 --- a/src/class154/Code06_NumberSequence1.java +++ b/src/class154/Code06_NumberSequence1.java @@ -49,9 +49,7 @@ public static void prepare() { } public static int find(int i) { - if (father[i] != i) { - father[i] = find(father[i]); - } + father[i] = father[i] == i ? i : find(father[i]); return father[i]; } @@ -72,7 +70,7 @@ public static int merge(int i, int j) { right[i] = tmp; } dist[i] = dist[right[i]] + 1; - father[i] = father[left[i]] = father[right[i]] = i; + father[left[i]] = father[right[i]] = i; return i; } @@ -80,7 +78,7 @@ public static int pop(int i) { father[left[i]] = left[i]; father[right[i]] = right[i]; father[i] = merge(left[i], right[i]); - left[i] = right[i] = 0; + left[i] = right[i] = dist[i] = 0; return father[i]; } diff --git a/src/class154/Code06_NumberSequence2.java b/src/class154/Code06_NumberSequence2.java index 17ba24fb6..792e6f37e 100644 --- a/src/class154/Code06_NumberSequence2.java +++ b/src/class154/Code06_NumberSequence2.java @@ -29,9 +29,7 @@ //} // //int find(int i) { -// if (fa[i] != i) { -// fa[i] = find(fa[i]); -// } +// fa[i] = fa[i] == i ? i : find(fa[i]); // return fa[i]; //} // @@ -46,7 +44,7 @@ // tmp = ls[i]; ls[i] = rs[i]; rs[i] = tmp; // } // dist[i] = dist[rs[i]] + 1; -// fa[i] = fa[ls[i]] = fa[rs[i]] = i; +// fa[ls[i]] = fa[rs[i]] = i; // return i; //} // @@ -54,7 +52,7 @@ // fa[ls[i]] = ls[i]; // fa[rs[i]] = rs[i]; // fa[i] = merge(ls[i], rs[i]); -// ls[i] = rs[i] = 0; +// ls[i] = rs[i] = dist[i] = 0; // return fa[i]; //} // diff --git a/src/class155/Code01_CityCapture1.java b/src/class155/Code01_CityCapture1.java index a11093864..82a34031b 100644 --- a/src/class155/Code01_CityCapture1.java +++ b/src/class155/Code01_CityCapture1.java @@ -106,7 +106,7 @@ public static int merge(int i, int j) { public static int pop(int i) { down(i); int ans = merge(left[i], right[i]); - left[i] = right[i] = 0; + left[i] = right[i] = dist[i] = 0; return ans; } diff --git a/src/class155/Code01_CityCapture2.java b/src/class155/Code01_CityCapture2.java index 697df738b..a08e83f00 100644 --- a/src/class155/Code01_CityCapture2.java +++ b/src/class155/Code01_CityCapture2.java @@ -86,8 +86,7 @@ //int pop(int i) { // down(i); // int ans = merge(ls[i], rs[i]); -// ls[i] = 0; -// rs[i] = 0; +// ls[i] = rs[i] = dist[i] = 0; // return ans; //} // From 940ab12dadbcd0287048e7d3bb4229d190c5ea62 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 12 Dec 2024 18:50:49 +0800 Subject: [PATCH 0460/2029] modify code --- src/class154/Code04_Convict1.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/class154/Code04_Convict1.java b/src/class154/Code04_Convict1.java index 02fa32a72..8fa8371cd 100644 --- a/src/class154/Code04_Convict1.java +++ b/src/class154/Code04_Convict1.java @@ -65,6 +65,8 @@ public static int merge(int i, int j) { return i; } + // reduce过程中不用关心每个节点的dist是否更新正确 + // 错误也只是略微影响平衡性,而且随着新节点的加入,平衡性会逐渐恢复 public static void reduce(int i, long v) { num[i] = Math.max(num[i] - v, 0); int l = find(i); From 7d95e47b035e7114914f7ccf44c19e31637c521b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 12 Dec 2024 22:09:34 +0800 Subject: [PATCH 0461/2029] modify code --- src/class154/Code01_LeftistTree1.java | 18 ++++++++++++++---- src/class154/Code01_LeftistTree2.java | 14 +++++++++++--- src/class154/Code02_RomanGame1.java | 18 ++++++++++++++---- src/class154/Code02_RomanGame2.java | 17 +++++++++++++---- src/class154/Code03_MonkeyKing1.java | 17 +++++++++++++---- src/class154/Code03_MonkeyKing2.java | 11 ++++++++++- src/class154/Code04_Convict1.java | 1 + src/class154/Code04_Convict2.java | 1 + src/class154/Code05_Dispatch1.java | 1 + src/class154/Code05_Dispatch2.java | 1 + src/class154/Code05_Dispatch3.java | 1 + src/class154/Code06_NumberSequence1.java | 1 + src/class154/Code06_NumberSequence2.java | 1 + src/class155/Code01_CityCapture1.java | 7 ++++--- src/class155/Code01_CityCapture2.java | 12 +++++------- 15 files changed, 91 insertions(+), 30 deletions(-) diff --git a/src/class154/Code01_LeftistTree1.java b/src/class154/Code01_LeftistTree1.java index 32af34f91..037e57a03 100644 --- a/src/class154/Code01_LeftistTree1.java +++ b/src/class154/Code01_LeftistTree1.java @@ -15,6 +15,8 @@ public class Code01_LeftistTree1 { public static int MAXN = 100001; + public static int n, m; + // 左偏树需要 public static int[] num = new int[MAXN]; @@ -27,6 +29,14 @@ public class Code01_LeftistTree1 { // 并查集需要 public static int[] father = new int[MAXN]; + public static void prepare() { + dist[0] = -1; + for (int i = 1; i <= n; i++) { + left[i] = right[i] = dist[i] = 0; + father[i] = i; + } + } + public static int find(int i) { father[i] = father[i] == i ? i : find(father[i]); return father[i]; @@ -37,7 +47,7 @@ public static int merge(int i, int j) { return i + j; } int tmp; - if (num[i] > num[j]) { + if (num[i] > num[j] || (num[i] == num[j] && i > j)) { tmp = i; i = j; j = tmp; @@ -71,11 +81,11 @@ public static void main(String[] args) throws IOException { StreamTokenizer in = new StreamTokenizer(br); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); in.nextToken(); - int n = (int) in.nval; + n = (int) in.nval; in.nextToken(); - int m = (int) in.nval; + m = (int) in.nval; + prepare(); for (int i = 1; i <= n; i++) { - father[i] = i; in.nextToken(); num[i] = (int) in.nval; } diff --git a/src/class154/Code01_LeftistTree2.java b/src/class154/Code01_LeftistTree2.java index d1e22167b..3b0ae7681 100644 --- a/src/class154/Code01_LeftistTree2.java +++ b/src/class154/Code01_LeftistTree2.java @@ -10,12 +10,21 @@ //using namespace std; // //const int MAXN = 100001; +//int n, m; //int num[MAXN]; //int ls[MAXN]; //int rs[MAXN]; //int dist[MAXN]; //int fa[MAXN]; // +//void prepare() { +// dist[0] = -1; +// for(int i = 1; i <= n; i++) { +// ls[i] = rs[i] = dist[i] = 0; +// fa[i] = i; +// } +//} +// //int find(int i) { // fa[i] = fa[i] == i ? i : find(fa[i]); // return fa[i]; @@ -25,7 +34,7 @@ // if (i == 0 || j == 0) { // return i + j; // } -// if (num[i] > num[j]) { +// if (num[i] > num[j] || (num[i] == num[j] && i > j)) { // int tmp = i; // i = j; // j = tmp; @@ -53,10 +62,9 @@ //int main() { // ios::sync_with_stdio(false); // cin.tie(nullptr); -// int n, m; // cin >> n >> m; +// prepare(); // for (int i = 1; i <= n; i++) { -// fa[i] = i; // cin >> num[i]; // } // for (int i = 1; i <= m; i++) { diff --git a/src/class154/Code02_RomanGame1.java b/src/class154/Code02_RomanGame1.java index 1f6db36f2..5feeb1723 100644 --- a/src/class154/Code02_RomanGame1.java +++ b/src/class154/Code02_RomanGame1.java @@ -18,6 +18,8 @@ public class Code02_RomanGame1 { public static int MAXN = 1000001; + public static int n, m; + public static int[] num = new int[MAXN]; public static int[] left = new int[MAXN]; @@ -28,6 +30,14 @@ public class Code02_RomanGame1 { public static int[] father = new int[MAXN]; + public static void prepare() { + dist[0] = -1; + for (int i = 1; i <= n; i++) { + left[i] = right[i] = dist[i] = 0; + father[i] = i; + } + } + public static int find(int i) { father[i] = father[i] == i ? i : find(father[i]); return father[i]; @@ -38,7 +48,7 @@ public static int merge(int i, int j) { return i + j; } int tmp; - if (num[i] > num[j]) { + if (num[i] > num[j] || (num[i] == num[j] && i > j)) { tmp = i; i = j; j = tmp; @@ -66,12 +76,12 @@ public static int pop(int i) { public static void main(String[] args) { FastReader in = new FastReader(System.in); FastWriter out = new FastWriter(System.out); - int n = in.readInt(); + n = in.readInt(); + prepare(); for (int i = 1; i <= n; i++) { - father[i] = i; num[i] = in.readInt(); } - int m = in.readInt(); + m = in.readInt(); String op; for (int i = 1, x, y; i <= m; i++) { op = in.readString(); diff --git a/src/class154/Code02_RomanGame2.java b/src/class154/Code02_RomanGame2.java index 11f9f7dea..8eca8aadb 100644 --- a/src/class154/Code02_RomanGame2.java +++ b/src/class154/Code02_RomanGame2.java @@ -10,12 +10,21 @@ //using namespace std; // //const int MAXN = 1000001; +//int n, m; //int num[MAXN]; //int ls[MAXN]; //int rs[MAXN]; //int dist[MAXN]; //int fa[MAXN]; // +//void prepare() { +// dist[0] = -1; +// for(int i = 1; i <= n; i++) { +// ls[i] = rs[i] = dist[i] = 0; +// fa[i] = i; +// } +//} +// //int find(int i) { // fa[i] = fa[i] == i ? i : find(fa[i]); // return fa[i]; @@ -25,7 +34,7 @@ // if (i == 0 || j == 0) { // return i + j; // } -// if (num[i] > num[j]) { +// if (num[i] > num[j] || (num[i] == num[j] && i > j)) { // int tmp = i; // i = j; // j = tmp; @@ -53,12 +62,12 @@ //int main() { // ios_base::sync_with_stdio(false); // cin.tie(nullptr); -// int n; cin >> n; +// cin >> n; +// prepare(); // for (int i = 1; i <= n; i++) { -// fa[i] = i; // cin >> num[i]; // } -// int m; cin >> m; +// cin >> m; // for (int i = 1; i <= m; i++) { // string op; cin >> op; // if (op == "M") { diff --git a/src/class154/Code03_MonkeyKing1.java b/src/class154/Code03_MonkeyKing1.java index 0b9a9c954..f7b7c04a9 100644 --- a/src/class154/Code03_MonkeyKing1.java +++ b/src/class154/Code03_MonkeyKing1.java @@ -15,6 +15,8 @@ public class Code03_MonkeyKing1 { public static int MAXN = 100001; + public static int n, m; + public static int[] num = new int[MAXN]; public static int[] left = new int[MAXN]; @@ -25,6 +27,14 @@ public class Code03_MonkeyKing1 { public static int[] father = new int[MAXN]; + public static void prepare() { + dist[0] = -1; + for (int i = 1; i <= n; i++) { + left[i] = right[i] = dist[i] = 0; + father[i] = i; + } + } + public static int find(int i) { father[i] = father[i] == i ? i : find(father[i]); return father[i]; @@ -76,15 +86,14 @@ public static void main(String[] args) throws IOException { StreamTokenizer in = new StreamTokenizer(br); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); while (in.nextToken() != StreamTokenizer.TT_EOF) { - int n = (int) in.nval; + n = (int) in.nval; + prepare(); for (int i = 1; i <= n; i++) { - father[i] = i; - left[i] = right[i] = dist[i] = 0; in.nextToken(); num[i] = (int) in.nval; } in.nextToken(); - int m = (int) in.nval; + m = (int) in.nval; for (int i = 1, x, y; i <= m; i++) { in.nextToken(); x = (int) in.nval; diff --git a/src/class154/Code03_MonkeyKing2.java b/src/class154/Code03_MonkeyKing2.java index 17766aa27..ed3f20a84 100644 --- a/src/class154/Code03_MonkeyKing2.java +++ b/src/class154/Code03_MonkeyKing2.java @@ -10,12 +10,21 @@ //using namespace std; // //const int MAXN = 100001; +//int n, m; //int num[MAXN]; //int ls[MAXN]; //int rs[MAXN]; //int dist[MAXN]; //int fa[MAXN]; // +//void prepare() { +// dist[0] = -1; +// for(int i = 1; i <= n; i++) { +// ls[i] = rs[i] = dist[i] = 0; +// fa[i] = i; +// } +//} +// //int find(int i) { // fa[i] = fa[i] == i ? i : find(fa[i]); // return fa[i]; @@ -64,8 +73,8 @@ //int main() { // ios::sync_with_stdio(false); // cin.tie(nullptr); -// int n, m; // while (cin >> n) { +// prepare(); // for (int i = 1; i <= n; i++) { // fa[i] = i; // ls[i] = rs[i] = dist[i] = 0; diff --git a/src/class154/Code04_Convict1.java b/src/class154/Code04_Convict1.java index 8fa8371cd..c8a6bd82f 100644 --- a/src/class154/Code04_Convict1.java +++ b/src/class154/Code04_Convict1.java @@ -33,6 +33,7 @@ public class Code04_Convict1 { public static long k; public static void prepare() { + dist[0] = -1; for (int i = 1; i <= n; i++) { left[i] = right[i] = dist[i] = 0; father[i] = i; diff --git a/src/class154/Code04_Convict2.java b/src/class154/Code04_Convict2.java index 079d62bd1..e9e0e6d53 100644 --- a/src/class154/Code04_Convict2.java +++ b/src/class154/Code04_Convict2.java @@ -50,6 +50,7 @@ //} // //void prepare() { +// dist[0] = -1; // for (int i = 1; i <= n; i++) { // ls[i] = rs[i] = dist[i] = 0; // fa[i] = i; diff --git a/src/class154/Code05_Dispatch1.java b/src/class154/Code05_Dispatch1.java index 32d4314e1..ef788f207 100644 --- a/src/class154/Code05_Dispatch1.java +++ b/src/class154/Code05_Dispatch1.java @@ -58,6 +58,7 @@ public class Code05_Dispatch1 { public static void prepare() { ans = 0; cnt = 1; + dist[0] = -1; for (int i = 1; i <= n; i++) { head[i] = left[i] = right[i] = dist[i] = size[i] = 0; sum[i] = 0; diff --git a/src/class154/Code05_Dispatch2.java b/src/class154/Code05_Dispatch2.java index fa7cd13f4..92f50e348 100644 --- a/src/class154/Code05_Dispatch2.java +++ b/src/class154/Code05_Dispatch2.java @@ -46,6 +46,7 @@ public class Code05_Dispatch2 { public static void prepare() { ans = 0; cnt = 1; + dist[0] = -1; for (int i = 1; i <= n; i++) { head[i] = left[i] = right[i] = dist[i] = size[i] = 0; sum[i] = 0; diff --git a/src/class154/Code05_Dispatch3.java b/src/class154/Code05_Dispatch3.java index 7fae7c264..353666609 100644 --- a/src/class154/Code05_Dispatch3.java +++ b/src/class154/Code05_Dispatch3.java @@ -28,6 +28,7 @@ //void prepare() { // ans = 0; // cnt = 1; +// dist[0] = -1; // for (int i = 1; i <= n; i++) { // head[i] = ls[i] = rs[i] = dist[i] = siz[i] = 0; // sum[i] = 0; diff --git a/src/class154/Code06_NumberSequence1.java b/src/class154/Code06_NumberSequence1.java index 53bc868dc..89a46074c 100644 --- a/src/class154/Code06_NumberSequence1.java +++ b/src/class154/Code06_NumberSequence1.java @@ -43,6 +43,7 @@ public class Code06_NumberSequence1 { public static long[] ans = new long[MAXN]; public static void prepare() { + dist[0] = -1; for (int i = 1; i <= n; i++) { left[i] = right[i] = dist[i] = 0; } diff --git a/src/class154/Code06_NumberSequence2.java b/src/class154/Code06_NumberSequence2.java index 792e6f37e..7c0dae7bb 100644 --- a/src/class154/Code06_NumberSequence2.java +++ b/src/class154/Code06_NumberSequence2.java @@ -23,6 +23,7 @@ //long long ans[MAXN]; // //void prepare() { +// dist[0] = -1; // for (int i = 1; i <= n; i++) { // ls[i] = rs[i] = dist[i] = 0; // } diff --git a/src/class155/Code01_CityCapture1.java b/src/class155/Code01_CityCapture1.java index 82a34031b..8e120f52d 100644 --- a/src/class155/Code01_CityCapture1.java +++ b/src/class155/Code01_CityCapture1.java @@ -52,14 +52,15 @@ public class Code01_CityCapture1 { public static long[] add = new long[MAXN]; public static void prepare() { - for (int i = 1; i <= n; i++) { - sacrifice[i] = top[i] = 0; - } + dist[0] = -1; for (int i = 1; i <= m; i++) { left[i] = right[i] = dist[i] = 0; mul[i] = 1; add[i] = 0; } + for (int i = 1; i <= n; i++) { + sacrifice[i] = top[i] = 0; + } } public static void down(int i) { diff --git a/src/class155/Code01_CityCapture2.java b/src/class155/Code01_CityCapture2.java index a08e83f00..d3978d4e9 100644 --- a/src/class155/Code01_CityCapture2.java +++ b/src/class155/Code01_CityCapture2.java @@ -29,17 +29,15 @@ //long long add[MAXN]; // //void prepare() { -// for (int i = 1; i <= n; i++) { -// sacrifice[i] = 0; -// top[i] = 0; -// } +// dist[0] = -1; // for (int i = 1; i <= m; i++) { -// ls[i] = 0; -// rs[i] = 0; -// dist[i] = 0; +// ls[i] = rs[i] = dist[i] = 0; // mul[i] = 1; // add[i] = 0; // } +// for (int i = 1; i <= n; i++) { +// sacrifice[i] = top[i] = 0; +// } //} // //void down(int i) { From 50b9edcf015d0b693b25afb780c54252cdb0e0aa Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 12 Dec 2024 22:12:41 +0800 Subject: [PATCH 0462/2029] modify code --- src/class154/Code03_MonkeyKing2.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/class154/Code03_MonkeyKing2.java b/src/class154/Code03_MonkeyKing2.java index ed3f20a84..eb3a8edbe 100644 --- a/src/class154/Code03_MonkeyKing2.java +++ b/src/class154/Code03_MonkeyKing2.java @@ -76,8 +76,6 @@ // while (cin >> n) { // prepare(); // for (int i = 1; i <= n; i++) { -// fa[i] = i; -// ls[i] = rs[i] = dist[i] = 0; // cin >> num[i]; // } // cin >> m; From 90f59a0a507d0f35830758fa36060a06babaa0b1 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 13 Dec 2024 15:49:06 +0800 Subject: [PATCH 0463/2029] modify code --- src/class154/Code04_Convict1.java | 2 +- src/class154/Code04_Convict2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class154/Code04_Convict1.java b/src/class154/Code04_Convict1.java index c8a6bd82f..06b0033dd 100644 --- a/src/class154/Code04_Convict1.java +++ b/src/class154/Code04_Convict1.java @@ -69,11 +69,11 @@ public static int merge(int i, int j) { // reduce过程中不用关心每个节点的dist是否更新正确 // 错误也只是略微影响平衡性,而且随着新节点的加入,平衡性会逐渐恢复 public static void reduce(int i, long v) { - num[i] = Math.max(num[i] - v, 0); int l = find(i); father[left[i]] = left[i]; father[right[i]] = right[i]; int r = merge(left[i], right[i]); + num[i] = Math.max(num[i] - v, 0); left[i] = right[i] = dist[i] = 0; father[i] = merge(l, r); } diff --git a/src/class154/Code04_Convict2.java b/src/class154/Code04_Convict2.java index e9e0e6d53..e14a7c889 100644 --- a/src/class154/Code04_Convict2.java +++ b/src/class154/Code04_Convict2.java @@ -40,11 +40,11 @@ //} // //void reduce(int i, long long v) { -// num[i] = max(num[i] - v, 0LL); // int l = find(i); // fa[ls[i]] = ls[i]; // fa[rs[i]] = rs[i]; // int r = merge(ls[i], rs[i]); +// num[i] = max(num[i] - v, 0LL); // ls[i] = rs[i] = dist[i] = 0; // fa[i] = merge(l, r); //} From 33986c9f869fb65c58d4c3dfdfae0ad480f73057 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 13 Dec 2024 15:57:51 +0800 Subject: [PATCH 0464/2029] modify code --- .../{Code02_RomanGame1.java => Code01_LeftistTree3.java} | 4 ++-- .../{Code02_RomanGame2.java => Code01_LeftistTree4.java} | 2 +- .../{Code03_MonkeyKing1.java => Code02_MonkeyKing1.java} | 2 +- .../{Code03_MonkeyKing2.java => Code02_MonkeyKing2.java} | 0 src/class154/{Code04_Convict1.java => Code03_Convict1.java} | 2 +- src/class154/{Code04_Convict2.java => Code03_Convict2.java} | 0 .../{Code05_Dispatch1.java => Code04_Dispatch1.java} | 6 +++--- .../{Code05_Dispatch2.java => Code04_Dispatch2.java} | 2 +- .../{Code05_Dispatch3.java => Code04_Dispatch3.java} | 0 ...e06_NumberSequence1.java => Code05_NumberSequence1.java} | 4 ++-- ...e06_NumberSequence2.java => Code05_NumberSequence2.java} | 0 11 files changed, 11 insertions(+), 11 deletions(-) rename src/class154/{Code02_RomanGame1.java => Code01_LeftistTree3.java} (98%) rename src/class154/{Code02_RomanGame2.java => Code01_LeftistTree4.java} (97%) rename src/class154/{Code03_MonkeyKing1.java => Code02_MonkeyKing1.java} (98%) rename src/class154/{Code03_MonkeyKing2.java => Code02_MonkeyKing2.java} (100%) rename src/class154/{Code04_Convict1.java => Code03_Convict1.java} (99%) rename src/class154/{Code04_Convict2.java => Code03_Convict2.java} (100%) rename src/class154/{Code05_Dispatch1.java => Code04_Dispatch1.java} (97%) rename src/class154/{Code05_Dispatch2.java => Code04_Dispatch2.java} (99%) rename src/class154/{Code05_Dispatch3.java => Code04_Dispatch3.java} (100%) rename src/class154/{Code06_NumberSequence1.java => Code05_NumberSequence1.java} (98%) rename src/class154/{Code06_NumberSequence2.java => Code05_NumberSequence2.java} (100%) diff --git a/src/class154/Code02_RomanGame1.java b/src/class154/Code01_LeftistTree3.java similarity index 98% rename from src/class154/Code02_RomanGame1.java rename to src/class154/Code01_LeftistTree3.java index 5feeb1723..1ce69d248 100644 --- a/src/class154/Code02_RomanGame1.java +++ b/src/class154/Code01_LeftistTree3.java @@ -1,6 +1,6 @@ package class154; -// 罗马游戏,左偏树模版题2,java版 +// 左偏树模版题2,java版 // 测试链接 : https://www.luogu.com.cn/problem/P2713 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -14,7 +14,7 @@ import java.io.Writer; import java.util.InputMismatchException; -public class Code02_RomanGame1 { +public class Code01_LeftistTree3 { public static int MAXN = 1000001; diff --git a/src/class154/Code02_RomanGame2.java b/src/class154/Code01_LeftistTree4.java similarity index 97% rename from src/class154/Code02_RomanGame2.java rename to src/class154/Code01_LeftistTree4.java index 8eca8aadb..1cbb18c46 100644 --- a/src/class154/Code02_RomanGame2.java +++ b/src/class154/Code01_LeftistTree4.java @@ -1,6 +1,6 @@ package class154; -// 罗马游戏,左偏树模版题2,C++版 +// 左偏树模版题2,C++版 // 测试链接 : https://www.luogu.com.cn/problem/P2713 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class154/Code03_MonkeyKing1.java b/src/class154/Code02_MonkeyKing1.java similarity index 98% rename from src/class154/Code03_MonkeyKing1.java rename to src/class154/Code02_MonkeyKing1.java index f7b7c04a9..118e66302 100644 --- a/src/class154/Code03_MonkeyKing1.java +++ b/src/class154/Code02_MonkeyKing1.java @@ -11,7 +11,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code03_MonkeyKing1 { +public class Code02_MonkeyKing1 { public static int MAXN = 100001; diff --git a/src/class154/Code03_MonkeyKing2.java b/src/class154/Code02_MonkeyKing2.java similarity index 100% rename from src/class154/Code03_MonkeyKing2.java rename to src/class154/Code02_MonkeyKing2.java diff --git a/src/class154/Code04_Convict1.java b/src/class154/Code03_Convict1.java similarity index 99% rename from src/class154/Code04_Convict1.java rename to src/class154/Code03_Convict1.java index 06b0033dd..14b6fd1c7 100644 --- a/src/class154/Code04_Convict1.java +++ b/src/class154/Code03_Convict1.java @@ -14,7 +14,7 @@ import java.io.Writer; import java.util.InputMismatchException; -public class Code04_Convict1 { +public class Code03_Convict1 { public static int MAXN = 2000001; diff --git a/src/class154/Code04_Convict2.java b/src/class154/Code03_Convict2.java similarity index 100% rename from src/class154/Code04_Convict2.java rename to src/class154/Code03_Convict2.java diff --git a/src/class154/Code05_Dispatch1.java b/src/class154/Code04_Dispatch1.java similarity index 97% rename from src/class154/Code05_Dispatch1.java rename to src/class154/Code04_Dispatch1.java index ef788f207..bc7853589 100644 --- a/src/class154/Code05_Dispatch1.java +++ b/src/class154/Code04_Dispatch1.java @@ -4,8 +4,8 @@ // 测试链接 : https://www.luogu.com.cn/problem/P1552 // 提交以下的code,提交时请把类名改成"Main",一些测试用例通过不了 // 这是因为java语言用递归方式实现dfs,递归会爆栈 -// 需要把dfs实现成迭代版,才能全部通过,就是Code05_Dispatch2文件 -// C++语言用递归方式实现,可以直接通过,就是Code05_Dispatch3文件 +// 需要把dfs实现成迭代版,才能全部通过,就是Code04_Dispatch2文件 +// C++语言用递归方式实现,可以直接通过,就是Code04_Dispatch3文件 import java.io.BufferedReader; import java.io.IOException; @@ -14,7 +14,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code05_Dispatch1 { +public class Code04_Dispatch1 { public static int MAXN = 100001; diff --git a/src/class154/Code05_Dispatch2.java b/src/class154/Code04_Dispatch2.java similarity index 99% rename from src/class154/Code05_Dispatch2.java rename to src/class154/Code04_Dispatch2.java index 92f50e348..06bf6f46f 100644 --- a/src/class154/Code05_Dispatch2.java +++ b/src/class154/Code04_Dispatch2.java @@ -11,7 +11,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code05_Dispatch2 { +public class Code04_Dispatch2 { public static int MAXN = 100001; diff --git a/src/class154/Code05_Dispatch3.java b/src/class154/Code04_Dispatch3.java similarity index 100% rename from src/class154/Code05_Dispatch3.java rename to src/class154/Code04_Dispatch3.java diff --git a/src/class154/Code06_NumberSequence1.java b/src/class154/Code05_NumberSequence1.java similarity index 98% rename from src/class154/Code06_NumberSequence1.java rename to src/class154/Code05_NumberSequence1.java index 89a46074c..4835846be 100644 --- a/src/class154/Code06_NumberSequence1.java +++ b/src/class154/Code05_NumberSequence1.java @@ -4,7 +4,7 @@ // 测试链接 : https://www.luogu.com.cn/problem/P4331 // 提交以下的code,提交时请把类名改成"Main",一些测试用例通过不了,空间超了 // 这是洛谷平台没有考虑其他语言导致的,同样的逻辑,C++实现就能完全通过 -// C++实现的版本,就是Code06_NumberSequence2文件 +// C++实现的版本,就是Code05_NumberSequence2文件 import java.io.BufferedWriter; import java.io.ByteArrayOutputStream; @@ -16,7 +16,7 @@ import java.io.Writer; import java.util.InputMismatchException; -public class Code06_NumberSequence1 { +public class Code05_NumberSequence1 { public static int MAXN = 1000001; diff --git a/src/class154/Code06_NumberSequence2.java b/src/class154/Code05_NumberSequence2.java similarity index 100% rename from src/class154/Code06_NumberSequence2.java rename to src/class154/Code05_NumberSequence2.java From 29ea9177eb5ac9996eb5321cf23afe38efdf7669 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 13 Dec 2024 18:04:38 +0800 Subject: [PATCH 0465/2029] modify code --- src/class154/Code01_LeftistTree1.java | 8 ++++++++ src/class154/Code01_LeftistTree2.java | 8 ++++++++ src/class154/Code01_LeftistTree3.java | 11 ++++++++++- src/class154/Code01_LeftistTree4.java | 11 ++++++++++- src/class154/Code02_MonkeyKing1.java | 11 ++++++++++- src/class154/Code02_MonkeyKing2.java | 11 ++++++++++- src/class154/Code03_Convict1.java | 21 +++++++++++++++++++++ src/class154/Code03_Convict2.java | 21 +++++++++++++++++++++ src/class154/Code04_Dispatch1.java | 8 ++++++++ src/class154/Code04_Dispatch2.java | 8 ++++++++ src/class154/Code04_Dispatch3.java | 8 ++++++++ src/class154/Code05_NumberSequence1.java | 5 +++++ src/class154/Code05_NumberSequence2.java | 5 +++++ 13 files changed, 132 insertions(+), 4 deletions(-) diff --git a/src/class154/Code01_LeftistTree1.java b/src/class154/Code01_LeftistTree1.java index 037e57a03..aa7e43d72 100644 --- a/src/class154/Code01_LeftistTree1.java +++ b/src/class154/Code01_LeftistTree1.java @@ -1,6 +1,14 @@ package class154; // 左偏树模版题1,java版 +// 依次给定n个非负数字,表示有n个小根堆,每个堆只有一个数 +// 实现如下两种操作,操作一共调用m次 +// 1 x y : 第x个数字所在的堆和第y个数字所在的堆合并 +// 如果两个数字已经在一个堆或者某个数字已经删除,不进行合并 +// 2 x : 打印第x个数字所在堆的最小值,并且在堆里删掉这个最小值 +// 如果第x个数字已经被删除,也就是找不到所在的堆,打印-1 +// 若有多个最小值,优先删除顺序靠前的 +// 1 <= n, m <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3377 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class154/Code01_LeftistTree2.java b/src/class154/Code01_LeftistTree2.java index 3b0ae7681..f05253d3f 100644 --- a/src/class154/Code01_LeftistTree2.java +++ b/src/class154/Code01_LeftistTree2.java @@ -1,6 +1,14 @@ package class154; // 左偏树模版题1,C++版 +// 依次给定n个非负数字,表示有n个小根堆,每个堆只有一个数 +// 实现如下两种操作,操作一共调用m次 +// 1 x y : 第x个数字所在的堆和第y个数字所在的堆合并 +// 如果两个数字已经在一个堆或者某个数字已经删除,不进行合并 +// 2 x : 打印第x个数字所在堆的最小值,并且在堆里删掉这个最小值 +// 如果第x个数字已经被删除,也就是找不到所在的堆,打印-1 +// 若有多个最小值,优先删除顺序靠前的 +// 1 <= n, m <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3377 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class154/Code01_LeftistTree3.java b/src/class154/Code01_LeftistTree3.java index 1ce69d248..485d20191 100644 --- a/src/class154/Code01_LeftistTree3.java +++ b/src/class154/Code01_LeftistTree3.java @@ -1,6 +1,15 @@ package class154; -// 左偏树模版题2,java版 +// 左偏树模版题2,数据量增强,java版 +// 依次给定n个非负数字,表示有n个小根堆,每个堆只有一个数 +// 实现如下两种操作,操作一共调用m次 +// M x y : 第x个数字所在的堆和第y个数字所在的堆合并 +// 如果两个数字已经在一个堆或者某个数字已经删除,不进行合并 +// K x : 打印第x个数字所在堆的最小值,并且在堆里删掉这个最小值 +// 如果第x个数字已经被删除,也就是找不到所在的堆,打印0 +// 若有多个最小值,优先删除顺序靠前的 +// 1 <= n <= 10^6 +// 1 <= m <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P2713 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class154/Code01_LeftistTree4.java b/src/class154/Code01_LeftistTree4.java index 1cbb18c46..bf8e07c9a 100644 --- a/src/class154/Code01_LeftistTree4.java +++ b/src/class154/Code01_LeftistTree4.java @@ -1,6 +1,15 @@ package class154; -// 左偏树模版题2,C++版 +// 左偏树模版题2,数据量增强,C++版 +// 依次给定n个非负数字,表示有n个小根堆,每个堆只有一个数 +// 实现如下两种操作,操作一共调用m次 +// M x y : 第x个数字所在的堆和第y个数字所在的堆合并 +// 如果两个数字已经在一个堆或者某个数字已经删除,不进行合并 +// K x : 打印第x个数字所在堆的最小值,并且在堆里删掉这个最小值 +// 如果第x个数字已经被删除,也就是找不到所在的堆,打印0 +// 若有多个最小值,优先删除顺序靠前的 +// 1 <= n <= 10^6 +// 1 <= m <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P2713 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class154/Code02_MonkeyKing1.java b/src/class154/Code02_MonkeyKing1.java index 118e66302..7b6108dd9 100644 --- a/src/class154/Code02_MonkeyKing1.java +++ b/src/class154/Code02_MonkeyKing1.java @@ -1,6 +1,15 @@ package class154; // 猴王,java版 +// 给定n只猴子的战斗力,一开始每个猴子都是独立的阵营 +// 一共有m次冲突,每次冲突给定两只猴子的编号x、y +// 如果x和y在同一阵营,这次冲突停止,打印-1 +// 如果x和y在不同阵营,x所在阵营的最强猴子会和y所在阵营的最强猴子进行打斗 +// 打斗的结果是,两个各自阵营的最强猴子,战斗力都减半,向下取整,其他猴子战力不变 +// 然后两个阵营合并,打印合并后的阵营最大战斗力 +// 题目可能有多组数据,需要监控输入流直到结束 +// 1 <= n, m <= 10^5 +// 0 <= 猴子战斗力 <= 32768 // 测试链接 : https://www.luogu.com.cn/problem/P1456 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -99,7 +108,7 @@ public static void main(String[] args) throws IOException { x = (int) in.nval; in.nextToken(); y = (int) in.nval; - System.out.println(fight(x, y)); + out.println(fight(x, y)); } } out.flush(); diff --git a/src/class154/Code02_MonkeyKing2.java b/src/class154/Code02_MonkeyKing2.java index eb3a8edbe..7380b7973 100644 --- a/src/class154/Code02_MonkeyKing2.java +++ b/src/class154/Code02_MonkeyKing2.java @@ -1,6 +1,15 @@ package class154; // 猴王,C++版 +// 给定n只猴子的战斗力,一开始每个猴子都是独立的阵营 +// 一共有m次冲突,每次冲突给定两只猴子的编号x、y +// 如果x和y在同一阵营,这次冲突停止,打印-1 +// 如果x和y在不同阵营,x所在阵营的最强猴子会和y所在阵营的最强猴子进行打斗 +// 打斗的结果是,两个各自阵营的最强猴子,战斗力都减半,向下取整,其他猴子战力不变 +// 然后两个阵营合并,打印合并后的阵营最大战斗力 +// 题目可能有多组数据,需要监控输入流直到结束 +// 1 <= n, m <= 10^5 +// 0 <= 猴子战斗力 <= 32768 // 测试链接 : https://www.luogu.com.cn/problem/P1456 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -82,7 +91,7 @@ // for (int i = 1; i <= m; i++) { // int x, y; // cin >> x >> y; -// cout << fight(x, y) << "\n"; +// cout << fight(x, y) << endl; // } // } // return 0; diff --git a/src/class154/Code03_Convict1.java b/src/class154/Code03_Convict1.java index 14b6fd1c7..da7fbf386 100644 --- a/src/class154/Code03_Convict1.java +++ b/src/class154/Code03_Convict1.java @@ -1,6 +1,27 @@ package class154; // 断罪者,java版 +// 给定t,w,k,表示一共有t个人,死亡方式都为w,地狱阈值都为k,w和k含义稍后解释 +// 每个人都给定n和m,表示这人一生有n件错事,有m次领悟 +// 这个人的n件错事,给定对应的n个罪恶值,然后给定m次领悟,领悟类型如下 +// 2 a : 第a件错事的罪恶值变成0 +// 3 a b : 第a件错事所在的集合中,最大罪恶值的错事,罪恶值减少b +// 如果减少后罪恶值变成负数,认为这件错事的罪恶值变为0 +// 如果集合中,两件错事都是最大的罪恶值,取编号较小的错事 +// 4 a b : 第a件错事所在的集合与第b件错事所在的集合合并 +// 一个错事集合的罪恶值 = 这个集合中的最大罪恶值,只取一个 +// 一个人的罪恶值 = 这个人所有错事集合的罪恶值累加起来 +// 然后根据死亡方式w,对每个人的罪恶值做最后调整,然后打印这个人的下场 +// 如果w==1,不调整 +// 如果w==2,人的罪恶值 -= 错事集合的罪恶值中的最大值 +// 如果w==3,人的罪恶值 += 错事集合的罪恶值中的最大值 +// 如果一个人的罪恶值 == 0,打印"Gensokyo 0" +// 如果一个人的罪恶值 > k,打印"Hell ",然后打印罪恶值 +// 如果一个人的罪恶值 <= k,打印"Heaven ",然后打印罪恶值 +// 一共有t个人,所以最终会有t次打印 +// 1 <= t <= 30 +// 1 <= n <= 2 * 10^6 +// 错事罪恶值可能很大,输入保证每个人的罪恶值用long类型不溢出 // 测试链接 : https://www.luogu.com.cn/problem/P4971 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class154/Code03_Convict2.java b/src/class154/Code03_Convict2.java index e14a7c889..24adf6a5a 100644 --- a/src/class154/Code03_Convict2.java +++ b/src/class154/Code03_Convict2.java @@ -1,6 +1,27 @@ package class154; // 断罪者,C++版 +// 给定t,w,k,表示一共有t个人,死亡方式都为w,地狱阈值都为k,w和k含义稍后解释 +// 每个人都给定n和m,表示这人一生有n件错事,有m次领悟 +// 这个人的n件错事,给定对应的n个罪恶值,然后给定m次领悟,领悟类型如下 +// 2 a : 第a件错事的罪恶值变成0 +// 3 a b : 第a件错事所在的集合中,最大罪恶值的错事,罪恶值减少b +// 如果减少后罪恶值变成负数,认为这件错事的罪恶值变为0 +// 如果集合中,两件错事都是最大的罪恶值,取编号较小的错事 +// 4 a b : 第a件错事所在的集合与第b件错事所在的集合合并 +// 一个错事集合的罪恶值 = 这个集合中的最大罪恶值,只取一个 +// 一个人的罪恶值 = 这个人所有错事集合的罪恶值累加起来 +// 然后根据死亡方式w,对每个人的罪恶值做最后调整,然后打印这个人的下场 +// 如果w==1,不调整 +// 如果w==2,人的罪恶值 -= 错事集合的罪恶值中的最大值 +// 如果w==3,人的罪恶值 += 错事集合的罪恶值中的最大值 +// 如果一个人的罪恶值 == 0,打印"Gensokyo 0" +// 如果一个人的罪恶值 > k,打印"Hell ",然后打印罪恶值 +// 如果一个人的罪恶值 <= k,打印"Heaven ",然后打印罪恶值 +// 一共有t个人,所以最终会有t次打印 +// 1 <= t <= 30 +// 1 <= n <= 2 * 10^6 +// 错事罪恶值可能很大,输入保证每个人的罪恶值用long类型不溢出 // 测试链接 : https://www.luogu.com.cn/problem/P4971 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class154/Code04_Dispatch1.java b/src/class154/Code04_Dispatch1.java index bc7853589..960eae742 100644 --- a/src/class154/Code04_Dispatch1.java +++ b/src/class154/Code04_Dispatch1.java @@ -1,6 +1,14 @@ package class154; // 派遣,dfs用递归实现,java版 +// 一共有n个忍者,每个忍者有工资、领导力、上级编号,三个属性 +// 如果某个忍者的上级编号为0,那么他是整棵忍者树的头 +// 你一共有m的预算,可以在忍者树上随意选一棵子树,然后在这棵子树上挑选忍者 +// 你选择某棵子树之后,不一定要选子树头的忍者,只要不超过m的预算,你就可以随意选择子树上的忍者 +// 最终收益 = 雇佣人数 * 子树头忍者的领导力,返回能取得的最大收益是多少 +// 输入保证,任何忍者的编号 > 该忍者上级的编号 +// 1 <= n <= 10^5 1 <= m <= 10^9 +// 1 <= 每个忍者工资 <= m 1 <= 每个忍者领导力 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P1552 // 提交以下的code,提交时请把类名改成"Main",一些测试用例通过不了 // 这是因为java语言用递归方式实现dfs,递归会爆栈 diff --git a/src/class154/Code04_Dispatch2.java b/src/class154/Code04_Dispatch2.java index 06bf6f46f..44cf4b6fe 100644 --- a/src/class154/Code04_Dispatch2.java +++ b/src/class154/Code04_Dispatch2.java @@ -1,6 +1,14 @@ package class154; // 派遣,dfs用迭代实现,java版 +// 一共有n个忍者,每个忍者有工资、领导力、上级编号,三个属性 +// 如果某个忍者的上级编号为0,那么他是整棵忍者树的头 +// 你一共有m的预算,可以在忍者树上随意选一棵子树,然后在这棵子树上挑选忍者 +// 你选择某棵子树之后,不一定要选子树头的忍者,只要不超过m的预算,你就可以随意选择子树上的忍者 +// 最终收益 = 雇佣人数 * 子树头忍者的领导力,返回能取得的最大收益是多少 +// 输入保证,任何忍者的编号 > 该忍者上级的编号 +// 1 <= n <= 10^5 1 <= m <= 10^9 +// 1 <= 每个忍者工资 <= m 1 <= 每个忍者领导力 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P1552 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class154/Code04_Dispatch3.java b/src/class154/Code04_Dispatch3.java index 353666609..dc89d3175 100644 --- a/src/class154/Code04_Dispatch3.java +++ b/src/class154/Code04_Dispatch3.java @@ -1,6 +1,14 @@ package class154; // 派遣,dfs用递归实现,C++版 +// 一共有n个忍者,每个忍者有工资、领导力、上级编号,三个属性 +// 如果某个忍者的上级编号为0,那么他是整棵忍者树的头 +// 你一共有m的预算,可以在忍者树上随意选一棵子树,然后在这棵子树上挑选忍者 +// 你选择某棵子树之后,不一定要选子树头的忍者,只要不超过m的预算,你就可以随意选择子树上的忍者 +// 最终收益 = 雇佣人数 * 子树头忍者的领导力,返回能取得的最大收益是多少 +// 输入保证,任何忍者的编号 > 该忍者上级的编号 +// 1 <= n <= 10^5 1 <= m <= 10^9 +// 1 <= 每个忍者工资 <= m 1 <= 每个忍者领导力 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P1552 // 逻辑和java的递归版完全一样,java必须改迭代版才能通过,C++的递归版就能通过 // 这是洛谷没有考虑其他语言导致的,提交如下代码,可以通过所有测试用例 diff --git a/src/class154/Code05_NumberSequence1.java b/src/class154/Code05_NumberSequence1.java index 4835846be..9e7a3f8ce 100644 --- a/src/class154/Code05_NumberSequence1.java +++ b/src/class154/Code05_NumberSequence1.java @@ -1,6 +1,11 @@ package class154; // 数字序列,java版 +// 给定一个长度为n的数组A,要求构造出一个长度为n的递增数组B +// 希望 |A[1] - B[1]| + |A[2] - B[2]| + ... + |A[n] - B[n]| 最小 +// 打印这个最小值,然后打印数组B,如果有多个方案,只打印其中的一个 +// 1 <= n <= 10^6 +// 0 <= A[i] <= 2^32 - 1 // 测试链接 : https://www.luogu.com.cn/problem/P4331 // 提交以下的code,提交时请把类名改成"Main",一些测试用例通过不了,空间超了 // 这是洛谷平台没有考虑其他语言导致的,同样的逻辑,C++实现就能完全通过 diff --git a/src/class154/Code05_NumberSequence2.java b/src/class154/Code05_NumberSequence2.java index 7c0dae7bb..28219c27c 100644 --- a/src/class154/Code05_NumberSequence2.java +++ b/src/class154/Code05_NumberSequence2.java @@ -1,6 +1,11 @@ package class154; // 数字序列,C++版 +// 给定一个长度为n的数组A,要求构造出一个长度为n的递增数组B +// 希望 |A[1] - B[1]| + |A[2] - B[2]| + ... + |A[n] - B[n]| 最小 +// 打印这个最小值,然后打印数组B,如果有多个方案,只打印其中的一个 +// 1 <= n <= 10^6 +// 0 <= A[i] <= 2^32 - 1 // 测试链接 : https://www.luogu.com.cn/problem/P4331 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From e0443cb38a71b349abc3dc87550e6afbbb333fa4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 14 Dec 2024 16:31:02 +0800 Subject: [PATCH 0466/2029] modify code --- src/class154/Code03_Convict1.java | 37 +++++++++++++++++++++++++------ src/class154/Code03_Convict2.java | 34 +++++++++++++++++++++++----- 2 files changed, 59 insertions(+), 12 deletions(-) diff --git a/src/class154/Code03_Convict1.java b/src/class154/Code03_Convict1.java index da7fbf386..60367fa07 100644 --- a/src/class154/Code03_Convict1.java +++ b/src/class154/Code03_Convict1.java @@ -1,6 +1,6 @@ package class154; -// 断罪者,java版 +// 断罪者,删除任意编号节点,java版 // 给定t,w,k,表示一共有t个人,死亡方式都为w,地狱阈值都为k,w和k含义稍后解释 // 每个人都给定n和m,表示这人一生有n件错事,有m次领悟 // 这个人的n件错事,给定对应的n个罪恶值,然后给定m次领悟,领悟类型如下 @@ -41,6 +41,8 @@ public class Code03_Convict1 { public static long[] num = new long[MAXN]; + public static int[] up = new int[MAXN]; + public static int[] left = new int[MAXN]; public static int[] right = new int[MAXN]; @@ -77,6 +79,7 @@ public static int merge(int i, int j) { j = tmp; } right[i] = merge(right[i], j); + up[right[i]] = i; if (dist[left[i]] < dist[right[i]]) { tmp = left[i]; left[i] = right[i]; @@ -87,16 +90,36 @@ public static int merge(int i, int j) { return i; } - // reduce过程中不用关心每个节点的dist是否更新正确 - // 错误也只是略微影响平衡性,而且随着新节点的加入,平衡性会逐渐恢复 - public static void reduce(int i, long v) { + public static int remove(int i) { int l = find(i); father[left[i]] = left[i]; father[right[i]] = right[i]; int r = merge(left[i], right[i]); - num[i] = Math.max(num[i] - v, 0); - left[i] = right[i] = dist[i] = 0; - father[i] = merge(l, r); + up[r] = 0; + num[i] = left[i] = right[i] = dist[i] = 0; + if (l == i) { + father[i] = r; + } else { + int h = up[i]; + if (left[h] == i) { + left[h] = 0; + } else { + right[h] = 0; + } + up[i] = 0; + for (int d = -1; dist[h] > d + 1; h = up[h], d++) { + dist[h] = d + 1; + } + father[i] = merge(l, r); + } + return father[i]; + } + + public static void reduce(int i, long v) { + long tmp = num[i]; + int l = remove(i); + num[i] = Math.max(tmp - v, 0); + father[l] = father[i] = merge(l, i); } public static long compute() { diff --git a/src/class154/Code03_Convict2.java b/src/class154/Code03_Convict2.java index 24adf6a5a..7ab69d630 100644 --- a/src/class154/Code03_Convict2.java +++ b/src/class154/Code03_Convict2.java @@ -1,6 +1,6 @@ package class154; -// 断罪者,C++版 +// 断罪者,删除任意编号节点,C++版 // 给定t,w,k,表示一共有t个人,死亡方式都为w,地狱阈值都为k,w和k含义稍后解释 // 每个人都给定n和m,表示这人一生有n件错事,有m次领悟 // 这个人的n件错事,给定对应的n个罪恶值,然后给定m次领悟,领悟类型如下 @@ -34,6 +34,7 @@ //int t, w, n, m; //long long k; //long long num[MAXN]; +//int up[MAXN]; //int ls[MAXN]; //int rs[MAXN]; //int dist[MAXN]; @@ -52,6 +53,7 @@ // tmp = i; i = j; j = tmp; // } // rs[i] = merge(rs[i], j); +// up[rs[i]] = i; // if (dist[ls[i]] < dist[rs[i]]) { // tmp = ls[i]; ls[i] = rs[i]; rs[i] = tmp; // } @@ -60,14 +62,36 @@ // return i; //} // -//void reduce(int i, long long v) { +//int remove(int i) { // int l = find(i); // fa[ls[i]] = ls[i]; // fa[rs[i]] = rs[i]; // int r = merge(ls[i], rs[i]); -// num[i] = max(num[i] - v, 0LL); -// ls[i] = rs[i] = dist[i] = 0; -// fa[i] = merge(l, r); +// up[r] = 0; +// num[i] = ls[i] = rs[i] = dist[i] = 0; +// if (l == i) { +// fa[i] = r; +// } else { +// int h = up[i]; +// if (ls[h] == i) { +// ls[h] = 0; +// } else { +// rs[h] = 0; +// } +// up[i] = 0; +// for (int d = -1; dist[h] > d + 1; h = up[h], d++) { +// dist[h] = d + 1; +// } +// fa[i] = merge(l, r); +// } +// return fa[i]; +//} +// +//void reduce(int i, long long v) { +// long tmp = num[i]; +// int l = remove(i); +// num[i] = max(tmp - v, 0LL); +// fa[l] = fa[i] = merge(l, i); //} // //void prepare() { From 3fb20c8bb5ff0116ac49fb34389631a490c2e198 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 14 Dec 2024 16:32:25 +0800 Subject: [PATCH 0467/2029] modify code --- src/class154/Code03_Convict1.java | 2 +- src/class154/Code03_Convict2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class154/Code03_Convict1.java b/src/class154/Code03_Convict1.java index 60367fa07..aedcfce8e 100644 --- a/src/class154/Code03_Convict1.java +++ b/src/class154/Code03_Convict1.java @@ -1,6 +1,6 @@ package class154; -// 断罪者,删除任意编号节点,java版 +// 断罪者,指定编号删除节点,java版 // 给定t,w,k,表示一共有t个人,死亡方式都为w,地狱阈值都为k,w和k含义稍后解释 // 每个人都给定n和m,表示这人一生有n件错事,有m次领悟 // 这个人的n件错事,给定对应的n个罪恶值,然后给定m次领悟,领悟类型如下 diff --git a/src/class154/Code03_Convict2.java b/src/class154/Code03_Convict2.java index 7ab69d630..7c5c6681b 100644 --- a/src/class154/Code03_Convict2.java +++ b/src/class154/Code03_Convict2.java @@ -1,6 +1,6 @@ package class154; -// 断罪者,删除任意编号节点,C++版 +// 断罪者,指定编号删除节点,C++版 // 给定t,w,k,表示一共有t个人,死亡方式都为w,地狱阈值都为k,w和k含义稍后解释 // 每个人都给定n和m,表示这人一生有n件错事,有m次领悟 // 这个人的n件错事,给定对应的n个罪恶值,然后给定m次领悟,领悟类型如下 From 7fc473c76194a5ebd350e38986aa2d09b234e205 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 14 Dec 2024 16:59:07 +0800 Subject: [PATCH 0468/2029] modify code --- src/class154/{Code03_Convict1.java => Code02_Convict1.java} | 4 ++-- src/class154/{Code03_Convict2.java => Code02_Convict2.java} | 2 +- .../{Code02_MonkeyKing1.java => Code03_MonkeyKing1.java} | 2 +- .../{Code02_MonkeyKing2.java => Code03_MonkeyKing2.java} | 0 4 files changed, 4 insertions(+), 4 deletions(-) rename src/class154/{Code03_Convict1.java => Code02_Convict1.java} (99%) rename src/class154/{Code03_Convict2.java => Code02_Convict2.java} (98%) rename src/class154/{Code02_MonkeyKing1.java => Code03_MonkeyKing1.java} (98%) rename src/class154/{Code02_MonkeyKing2.java => Code03_MonkeyKing2.java} (100%) diff --git a/src/class154/Code03_Convict1.java b/src/class154/Code02_Convict1.java similarity index 99% rename from src/class154/Code03_Convict1.java rename to src/class154/Code02_Convict1.java index aedcfce8e..898826e79 100644 --- a/src/class154/Code03_Convict1.java +++ b/src/class154/Code02_Convict1.java @@ -1,6 +1,6 @@ package class154; -// 断罪者,指定编号删除节点,java版 +// 断罪者,删除任意编号节点,java版 // 给定t,w,k,表示一共有t个人,死亡方式都为w,地狱阈值都为k,w和k含义稍后解释 // 每个人都给定n和m,表示这人一生有n件错事,有m次领悟 // 这个人的n件错事,给定对应的n个罪恶值,然后给定m次领悟,领悟类型如下 @@ -35,7 +35,7 @@ import java.io.Writer; import java.util.InputMismatchException; -public class Code03_Convict1 { +public class Code02_Convict1 { public static int MAXN = 2000001; diff --git a/src/class154/Code03_Convict2.java b/src/class154/Code02_Convict2.java similarity index 98% rename from src/class154/Code03_Convict2.java rename to src/class154/Code02_Convict2.java index 7c5c6681b..7ab69d630 100644 --- a/src/class154/Code03_Convict2.java +++ b/src/class154/Code02_Convict2.java @@ -1,6 +1,6 @@ package class154; -// 断罪者,指定编号删除节点,C++版 +// 断罪者,删除任意编号节点,C++版 // 给定t,w,k,表示一共有t个人,死亡方式都为w,地狱阈值都为k,w和k含义稍后解释 // 每个人都给定n和m,表示这人一生有n件错事,有m次领悟 // 这个人的n件错事,给定对应的n个罪恶值,然后给定m次领悟,领悟类型如下 diff --git a/src/class154/Code02_MonkeyKing1.java b/src/class154/Code03_MonkeyKing1.java similarity index 98% rename from src/class154/Code02_MonkeyKing1.java rename to src/class154/Code03_MonkeyKing1.java index 7b6108dd9..74f853061 100644 --- a/src/class154/Code02_MonkeyKing1.java +++ b/src/class154/Code03_MonkeyKing1.java @@ -20,7 +20,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code02_MonkeyKing1 { +public class Code03_MonkeyKing1 { public static int MAXN = 100001; diff --git a/src/class154/Code02_MonkeyKing2.java b/src/class154/Code03_MonkeyKing2.java similarity index 100% rename from src/class154/Code02_MonkeyKing2.java rename to src/class154/Code03_MonkeyKing2.java From 467089626e8aac3a320664949ecc369865a8eb74 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 14 Dec 2024 17:10:55 +0800 Subject: [PATCH 0469/2029] modify code --- src/class154/Code02_Convict1.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/class154/Code02_Convict1.java b/src/class154/Code02_Convict1.java index 898826e79..5ec22565a 100644 --- a/src/class154/Code02_Convict1.java +++ b/src/class154/Code02_Convict1.java @@ -73,6 +73,7 @@ public static int merge(int i, int j) { return i + j; } int tmp; + // 这里是维护大根堆,如果值一样,编号小的节点设为头 if (num[i] < num[j] || (num[i] == num[j] && i > j)) { tmp = i; i = j; From fc21f1c45d607cbb4a7b8fdce219895ed67eb9ed Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 14 Dec 2024 17:16:41 +0800 Subject: [PATCH 0470/2029] modify code --- src/class154/Code02_Convict1.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/class154/Code02_Convict1.java b/src/class154/Code02_Convict1.java index 5ec22565a..493d0cf7d 100644 --- a/src/class154/Code02_Convict1.java +++ b/src/class154/Code02_Convict1.java @@ -91,6 +91,7 @@ public static int merge(int i, int j) { return i; } + // 左偏树上删除编号为i的节点,返回删除操作后整棵树的头节点编号 public static int remove(int i) { int l = find(i); father[left[i]] = left[i]; From 38b6fcc7b8d9135854411f78b46298c667e8e158 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 14 Dec 2024 17:25:03 +0800 Subject: [PATCH 0471/2029] modify code --- src/class154/Code01_LeftistTree1.java | 2 +- src/class154/Code01_LeftistTree2.java | 2 +- src/class154/Code01_LeftistTree3.java | 2 +- src/class154/Code01_LeftistTree4.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class154/Code01_LeftistTree1.java b/src/class154/Code01_LeftistTree1.java index aa7e43d72..bfc63ee2f 100644 --- a/src/class154/Code01_LeftistTree1.java +++ b/src/class154/Code01_LeftistTree1.java @@ -7,7 +7,7 @@ // 如果两个数字已经在一个堆或者某个数字已经删除,不进行合并 // 2 x : 打印第x个数字所在堆的最小值,并且在堆里删掉这个最小值 // 如果第x个数字已经被删除,也就是找不到所在的堆,打印-1 -// 若有多个最小值,优先删除顺序靠前的 +// 若有多个最小值,优先删除编号小的 // 1 <= n, m <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3377 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class154/Code01_LeftistTree2.java b/src/class154/Code01_LeftistTree2.java index f05253d3f..9d01051de 100644 --- a/src/class154/Code01_LeftistTree2.java +++ b/src/class154/Code01_LeftistTree2.java @@ -7,7 +7,7 @@ // 如果两个数字已经在一个堆或者某个数字已经删除,不进行合并 // 2 x : 打印第x个数字所在堆的最小值,并且在堆里删掉这个最小值 // 如果第x个数字已经被删除,也就是找不到所在的堆,打印-1 -// 若有多个最小值,优先删除顺序靠前的 +// 若有多个最小值,优先删除编号小的 // 1 <= n, m <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3377 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 diff --git a/src/class154/Code01_LeftistTree3.java b/src/class154/Code01_LeftistTree3.java index 485d20191..3cec14680 100644 --- a/src/class154/Code01_LeftistTree3.java +++ b/src/class154/Code01_LeftistTree3.java @@ -7,7 +7,7 @@ // 如果两个数字已经在一个堆或者某个数字已经删除,不进行合并 // K x : 打印第x个数字所在堆的最小值,并且在堆里删掉这个最小值 // 如果第x个数字已经被删除,也就是找不到所在的堆,打印0 -// 若有多个最小值,优先删除顺序靠前的 +// 若有多个最小值,优先删除编号小的 // 1 <= n <= 10^6 // 1 <= m <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P2713 diff --git a/src/class154/Code01_LeftistTree4.java b/src/class154/Code01_LeftistTree4.java index bf8e07c9a..fb65c26f8 100644 --- a/src/class154/Code01_LeftistTree4.java +++ b/src/class154/Code01_LeftistTree4.java @@ -7,7 +7,7 @@ // 如果两个数字已经在一个堆或者某个数字已经删除,不进行合并 // K x : 打印第x个数字所在堆的最小值,并且在堆里删掉这个最小值 // 如果第x个数字已经被删除,也就是找不到所在的堆,打印0 -// 若有多个最小值,优先删除顺序靠前的 +// 若有多个最小值,优先删除编号小的 // 1 <= n <= 10^6 // 1 <= m <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P2713 From 361f69d3b343648a115943d2951fd20891a5cf0f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 14 Dec 2024 17:41:47 +0800 Subject: [PATCH 0472/2029] modify code --- src/class154/Code01_LeftistTree1.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/class154/Code01_LeftistTree1.java b/src/class154/Code01_LeftistTree1.java index bfc63ee2f..a9dc07dd4 100644 --- a/src/class154/Code01_LeftistTree1.java +++ b/src/class154/Code01_LeftistTree1.java @@ -74,10 +74,9 @@ public static int merge(int i, int j) { public static int pop(int i) { father[left[i]] = left[i]; father[right[i]] = right[i]; - // 下面这一句的功能 - // 因为有路径压缩,所以i下方的某个节点x,可能有father[x] = i - // 但是现在堆要去掉i了,所以x一直往上找到i是无效的 - // 为了i能再往上找到正确的头,所以有下面这句 + // 并查集有路径压缩,所以i下方的某个节点x,可能有father[x] = i + // 现在要删掉i了,所以x往上会找不到正确的头节点 + // 为了任何节点往上都能找到正确的头,所以要有下面这句 father[i] = merge(left[i], right[i]); num[i] = -1; left[i] = right[i] = dist[i] = 0; From 317679ab3d26a7a11c3eb61745ec8b19a5ee69e9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 14 Dec 2024 17:58:14 +0800 Subject: [PATCH 0473/2029] modify code --- src/class154/Code01_LeftistTree1.java | 1 + src/class154/Code02_Convict1.java | 2 +- src/class154/Code03_MonkeyKing1.java | 2 +- src/class154/Code04_Dispatch1.java | 2 +- src/class154/Code05_NumberSequence1.java | 1 + 5 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/class154/Code01_LeftistTree1.java b/src/class154/Code01_LeftistTree1.java index a9dc07dd4..14676e46b 100644 --- a/src/class154/Code01_LeftistTree1.java +++ b/src/class154/Code01_LeftistTree1.java @@ -55,6 +55,7 @@ public static int merge(int i, int j) { return i + j; } int tmp; + // 维护小根堆,如果值一样,编号小的节点做头 if (num[i] > num[j] || (num[i] == num[j] && i > j)) { tmp = i; i = j; diff --git a/src/class154/Code02_Convict1.java b/src/class154/Code02_Convict1.java index 493d0cf7d..f3e3f9f49 100644 --- a/src/class154/Code02_Convict1.java +++ b/src/class154/Code02_Convict1.java @@ -73,7 +73,7 @@ public static int merge(int i, int j) { return i + j; } int tmp; - // 这里是维护大根堆,如果值一样,编号小的节点设为头 + // 维护大根堆,如果值一样,编号小的节点做头 if (num[i] < num[j] || (num[i] == num[j] && i > j)) { tmp = i; i = j; diff --git a/src/class154/Code03_MonkeyKing1.java b/src/class154/Code03_MonkeyKing1.java index 74f853061..5a4e71df8 100644 --- a/src/class154/Code03_MonkeyKing1.java +++ b/src/class154/Code03_MonkeyKing1.java @@ -54,7 +54,7 @@ public static int merge(int i, int j) { return i + j; } int tmp; - // 本题是维护大根堆 + // 维护大根堆 if (num[i] < num[j]) { tmp = i; i = j; diff --git a/src/class154/Code04_Dispatch1.java b/src/class154/Code04_Dispatch1.java index 960eae742..8f49de9c2 100644 --- a/src/class154/Code04_Dispatch1.java +++ b/src/class154/Code04_Dispatch1.java @@ -90,7 +90,7 @@ public static int merge(int i, int j) { return i + j; } int tmp; - // 本题是维护大根堆 + // 维护大根堆 if (cost[i] < cost[j]) { tmp = i; i = j; diff --git a/src/class154/Code05_NumberSequence1.java b/src/class154/Code05_NumberSequence1.java index 9e7a3f8ce..a0a1b4d44 100644 --- a/src/class154/Code05_NumberSequence1.java +++ b/src/class154/Code05_NumberSequence1.java @@ -64,6 +64,7 @@ public static int merge(int i, int j) { return i + j; } int tmp; + // 维护大根堆 if (arr[i] < arr[j]) { tmp = i; i = j; From d2e4dc7d66c9df6de0ca42f24c4d3e46e107a683 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 14 Dec 2024 18:01:34 +0800 Subject: [PATCH 0474/2029] modify code --- src/class154/Code02_Convict1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class154/Code02_Convict1.java b/src/class154/Code02_Convict1.java index f3e3f9f49..a49e67845 100644 --- a/src/class154/Code02_Convict1.java +++ b/src/class154/Code02_Convict1.java @@ -91,7 +91,7 @@ public static int merge(int i, int j) { return i; } - // 左偏树上删除编号为i的节点,返回删除操作后整棵树的头节点编号 + // 左偏树上删除编号为i的节点,返回删除后整棵树的头节点编号 public static int remove(int i) { int l = find(i); father[left[i]] = left[i]; From 775227b69a5614b0e6569647c41f681306fa227a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 14 Dec 2024 18:20:47 +0800 Subject: [PATCH 0475/2029] modify code --- src/class154/Code03_MonkeyKing1.java | 15 +++++++++------ src/class154/Code03_MonkeyKing2.java | 15 +++++++++------ 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/class154/Code03_MonkeyKing1.java b/src/class154/Code03_MonkeyKing1.java index 5a4e71df8..2c0080eb9 100644 --- a/src/class154/Code03_MonkeyKing1.java +++ b/src/class154/Code03_MonkeyKing1.java @@ -75,19 +75,22 @@ public static int pop(int i) { father[left[i]] = left[i]; father[right[i]] = right[i]; father[i] = merge(left[i], right[i]); - num[i] /= 2; // 根据题目要求,这里是除以2 left[i] = right[i] = dist[i] = 0; return father[i]; } public static int fight(int x, int y) { - int l = find(x); - int r = find(y); - if (l == r) { + int a = find(x); + int b = find(y); + if (a == b) { return -1; } - father[l] = father[r] = merge(merge(pop(l), l), merge(pop(r), r)); - return num[father[l]]; + int l = pop(a); + int r = pop(b); + num[a] /= 2; + num[b] /= 2; + father[a] = father[b] = father[l] = father[r] = merge(merge(l, a), merge(r, b)); + return num[father[a]]; } public static void main(String[] args) throws IOException { diff --git a/src/class154/Code03_MonkeyKing2.java b/src/class154/Code03_MonkeyKing2.java index 7380b7973..0b10ccada 100644 --- a/src/class154/Code03_MonkeyKing2.java +++ b/src/class154/Code03_MonkeyKing2.java @@ -64,19 +64,22 @@ // fa[ls[i]] = ls[i]; // fa[rs[i]] = rs[i]; // fa[i] = merge(ls[i], rs[i]); -// num[i] /= 2; // ls[i] = rs[i] = dist[i] = 0; // return fa[i]; //} // //int fight(int x, int y) { -// int l = find(x); -// int r = find(y); -// if (l == r) { +// int a = find(x); +// int b = find(y); +// if (a == b) { // return -1; // } -// fa[l] = fa[r] = merge(merge(pop(l), l), merge(pop(r), r)); -// return num[fa[l]]; +// int l = pop(a); +// int r = pop(b); +// num[a] /= 2; +// num[b] /= 2; +// fa[a] = fa[b] = fa[l] = fa[r] = merge(merge(l, a), merge(r, b)); +// return num[fa[a]]; //} // //int main() { From 142fe4f1fad91bb52a3e810115c460d48524f50f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 14 Dec 2024 18:50:32 +0800 Subject: [PATCH 0476/2029] modify code --- src/class154/Code01_LeftistTree1.java | 2 +- src/class154/Code01_LeftistTree2.java | 2 +- src/class154/Code01_LeftistTree3.java | 2 +- src/class154/Code01_LeftistTree4.java | 2 +- src/class154/Code02_Convict1.java | 5 ++--- src/class154/Code02_Convict2.java | 5 ++--- 6 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/class154/Code01_LeftistTree1.java b/src/class154/Code01_LeftistTree1.java index 14676e46b..8d7cdd8be 100644 --- a/src/class154/Code01_LeftistTree1.java +++ b/src/class154/Code01_LeftistTree1.java @@ -79,7 +79,6 @@ public static int pop(int i) { // 现在要删掉i了,所以x往上会找不到正确的头节点 // 为了任何节点往上都能找到正确的头,所以要有下面这句 father[i] = merge(left[i], right[i]); - num[i] = -1; left[i] = right[i] = dist[i] = 0; return father[i]; } @@ -121,6 +120,7 @@ public static void main(String[] args) throws IOException { int ans = find(x); out.println(num[ans]); pop(ans); + num[ans] = -1; } } } diff --git a/src/class154/Code01_LeftistTree2.java b/src/class154/Code01_LeftistTree2.java index 9d01051de..01857ea29 100644 --- a/src/class154/Code01_LeftistTree2.java +++ b/src/class154/Code01_LeftistTree2.java @@ -62,7 +62,6 @@ // fa[ls[i]] = ls[i]; // fa[rs[i]] = rs[i]; // fa[i] = merge(ls[i], rs[i]); -// num[i] = -1; // ls[i] = rs[i] = dist[i] = 0; // return fa[i]; //} @@ -97,6 +96,7 @@ // int ans = find(x); // cout << num[ans] << "\n"; // pop(ans); +// num[ans] = -1; // } // } // } diff --git a/src/class154/Code01_LeftistTree3.java b/src/class154/Code01_LeftistTree3.java index 3cec14680..ff018d6ed 100644 --- a/src/class154/Code01_LeftistTree3.java +++ b/src/class154/Code01_LeftistTree3.java @@ -77,7 +77,6 @@ public static int pop(int i) { father[left[i]] = left[i]; father[right[i]] = right[i]; father[i] = merge(left[i], right[i]); - num[i] = -1; left[i] = right[i] = dist[i] = 0; return father[i]; } @@ -112,6 +111,7 @@ public static void main(String[] args) { int ans = find(x); out.println(num[ans]); pop(ans); + num[ans] = -1; } } } diff --git a/src/class154/Code01_LeftistTree4.java b/src/class154/Code01_LeftistTree4.java index fb65c26f8..6d7cbcb40 100644 --- a/src/class154/Code01_LeftistTree4.java +++ b/src/class154/Code01_LeftistTree4.java @@ -63,7 +63,6 @@ // fa[ls[i]] = ls[i]; // fa[rs[i]] = rs[i]; // fa[i] = merge(ls[i], rs[i]); -// num[i] = -1; // ls[i] = rs[i] = dist[i] = 0; // return fa[i]; //} @@ -96,6 +95,7 @@ // int ans = find(x); // cout << num[ans] << endl; // pop(ans); +// num[ans] = -1; // } // } // } diff --git a/src/class154/Code02_Convict1.java b/src/class154/Code02_Convict1.java index a49e67845..13f02ea46 100644 --- a/src/class154/Code02_Convict1.java +++ b/src/class154/Code02_Convict1.java @@ -98,7 +98,7 @@ public static int remove(int i) { father[right[i]] = right[i]; int r = merge(left[i], right[i]); up[r] = 0; - num[i] = left[i] = right[i] = dist[i] = 0; + left[i] = right[i] = dist[i] = 0; if (l == i) { father[i] = r; } else { @@ -118,9 +118,8 @@ public static int remove(int i) { } public static void reduce(int i, long v) { - long tmp = num[i]; int l = remove(i); - num[i] = Math.max(tmp - v, 0); + num[i] = Math.max(num[i] - v, 0); father[l] = father[i] = merge(l, i); } diff --git a/src/class154/Code02_Convict2.java b/src/class154/Code02_Convict2.java index 7ab69d630..a33eae6ea 100644 --- a/src/class154/Code02_Convict2.java +++ b/src/class154/Code02_Convict2.java @@ -68,7 +68,7 @@ // fa[rs[i]] = rs[i]; // int r = merge(ls[i], rs[i]); // up[r] = 0; -// num[i] = ls[i] = rs[i] = dist[i] = 0; +// ls[i] = rs[i] = dist[i] = 0; // if (l == i) { // fa[i] = r; // } else { @@ -88,9 +88,8 @@ //} // //void reduce(int i, long long v) { -// long tmp = num[i]; // int l = remove(i); -// num[i] = max(tmp - v, 0LL); +// num[i] = max(num[i] - v, 0LL); // fa[l] = fa[i] = merge(l, i); //} // From bca8909f99a2956720efca13bbda997a4f6f748b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 14 Dec 2024 20:49:54 +0800 Subject: [PATCH 0477/2029] modify code --- src/class154/Code01_LeftistTree1.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/class154/Code01_LeftistTree1.java b/src/class154/Code01_LeftistTree1.java index 8d7cdd8be..342c13902 100644 --- a/src/class154/Code01_LeftistTree1.java +++ b/src/class154/Code01_LeftistTree1.java @@ -34,7 +34,10 @@ public class Code01_LeftistTree1 { public static int[] dist = new int[MAXN]; - // 并查集需要 + // 并查集需要father数组,方便快速找到树的头 + // father[i]不代表i在树上的父亲节点 + // father是并查集找代表节点的路径信息 + // 需要保证,并查集最终的代表节点 = 树的头节点 public static int[] father = new int[MAXN]; public static void prepare() { From 5843fb8187207f4df24c6322d2d0021da5355955 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 14 Dec 2024 21:47:19 +0800 Subject: [PATCH 0478/2029] modify code --- src/class154/Code01_LeftistTree1.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/class154/Code01_LeftistTree1.java b/src/class154/Code01_LeftistTree1.java index 342c13902..bcd75f87d 100644 --- a/src/class154/Code01_LeftistTree1.java +++ b/src/class154/Code01_LeftistTree1.java @@ -37,7 +37,7 @@ public class Code01_LeftistTree1 { // 并查集需要father数组,方便快速找到树的头 // father[i]不代表i在树上的父亲节点 // father是并查集找代表节点的路径信息 - // 需要保证,并查集最终的代表节点 = 树的头节点 + // 需要保证,并查集最上方的代表节点 = 树的头节点 public static int[] father = new int[MAXN]; public static void prepare() { @@ -53,6 +53,7 @@ public static int find(int i) { return father[i]; } + // 编号为i的左偏树 与 编号为j的左偏树合并,返回新树的头节点编号 public static int merge(int i, int j) { if (i == 0 || j == 0) { return i + j; @@ -75,6 +76,7 @@ public static int merge(int i, int j) { return i; } + // 节点i一定是左偏树的头,在左偏树上删掉节点i,返回新树的头节点编号 public static int pop(int i) { father[left[i]] = left[i]; father[right[i]] = right[i]; From d6a17248f82f9ea629446c812505da4ffa331be4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 14 Dec 2024 22:06:02 +0800 Subject: [PATCH 0479/2029] modify code --- src/class154/Code02_Convict1.java | 28 +++++++++++++++------------- src/class154/Code02_Convict2.java | 24 ++++++++++++------------ 2 files changed, 27 insertions(+), 25 deletions(-) diff --git a/src/class154/Code02_Convict1.java b/src/class154/Code02_Convict1.java index 13f02ea46..63e367db1 100644 --- a/src/class154/Code02_Convict1.java +++ b/src/class154/Code02_Convict1.java @@ -91,28 +91,30 @@ public static int merge(int i, int j) { return i; } - // 左偏树上删除编号为i的节点,返回删除后整棵树的头节点编号 + // 不保证节点i是左偏树的头节点 + // 左偏树上删除编号为i的节点 + // 返回删除后整棵树的头节点编号 public static int remove(int i) { - int l = find(i); + int h = find(i); father[left[i]] = left[i]; father[right[i]] = right[i]; - int r = merge(left[i], right[i]); - up[r] = 0; + int s = merge(left[i], right[i]); + up[s] = 0; left[i] = right[i] = dist[i] = 0; - if (l == i) { - father[i] = r; + if (h == i) { + father[i] = s; } else { - int h = up[i]; - if (left[h] == i) { - left[h] = 0; + int f = up[i]; + if (left[f] == i) { + left[f] = 0; } else { - right[h] = 0; + right[f] = 0; } up[i] = 0; - for (int d = -1; dist[h] > d + 1; h = up[h], d++) { - dist[h] = d + 1; + for (int d = -1; dist[f] > d + 1; f = up[f], d++) { + dist[f] = d + 1; } - father[i] = merge(l, r); + father[i] = merge(h, s); } return father[i]; } diff --git a/src/class154/Code02_Convict2.java b/src/class154/Code02_Convict2.java index a33eae6ea..ec8db177a 100644 --- a/src/class154/Code02_Convict2.java +++ b/src/class154/Code02_Convict2.java @@ -63,26 +63,26 @@ //} // //int remove(int i) { -// int l = find(i); +// int h = find(i); // fa[ls[i]] = ls[i]; // fa[rs[i]] = rs[i]; -// int r = merge(ls[i], rs[i]); -// up[r] = 0; +// int s = merge(ls[i], rs[i]); +// up[s] = 0; // ls[i] = rs[i] = dist[i] = 0; -// if (l == i) { -// fa[i] = r; +// if (h == i) { +// fa[i] = s; // } else { -// int h = up[i]; -// if (ls[h] == i) { -// ls[h] = 0; +// int f = up[i]; +// if (ls[f] == i) { +// ls[f] = 0; // } else { -// rs[h] = 0; +// rs[f] = 0; // } // up[i] = 0; -// for (int d = -1; dist[h] > d + 1; h = up[h], d++) { -// dist[h] = d + 1; +// for (int d = -1; dist[f] > d + 1; f = up[f], d++) { +// dist[f] = d + 1; // } -// fa[i] = merge(l, r); +// fa[i] = merge(h, s); // } // return fa[i]; //} From 436cffc188163195ca48d0af883f38a806f9d1d0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 14 Dec 2024 22:13:18 +0800 Subject: [PATCH 0480/2029] modify code --- src/class154/Code02_Convict1.java | 16 ++++++++-------- src/class154/Code02_Convict2.java | 16 ++++++++-------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/class154/Code02_Convict1.java b/src/class154/Code02_Convict1.java index 63e367db1..d2d2fda17 100644 --- a/src/class154/Code02_Convict1.java +++ b/src/class154/Code02_Convict1.java @@ -39,8 +39,13 @@ public class Code02_Convict1 { public static int MAXN = 2000001; + public static int t, w, n, m; + + public static long k; + public static long[] num = new long[MAXN]; + // up[i]表示节点i在左偏树结构上的父亲节点 public static int[] up = new int[MAXN]; public static int[] left = new int[MAXN]; @@ -49,16 +54,13 @@ public class Code02_Convict1 { public static int[] dist = new int[MAXN]; + // father[i]表示并查集里节点i的路径信息 public static int[] father = new int[MAXN]; - public static int t, w, n, m; - - public static long k; - public static void prepare() { dist[0] = -1; for (int i = 1; i <= n; i++) { - left[i] = right[i] = dist[i] = 0; + up[i] = left[i] = right[i] = dist[i] = 0; father[i] = i; } } @@ -91,9 +93,7 @@ public static int merge(int i, int j) { return i; } - // 不保证节点i是左偏树的头节点 - // 左偏树上删除编号为i的节点 - // 返回删除后整棵树的头节点编号 + // 节点i是所在左偏树的任意节点,删除节点i,返回整棵树的头节点编号 public static int remove(int i) { int h = find(i); father[left[i]] = left[i]; diff --git a/src/class154/Code02_Convict2.java b/src/class154/Code02_Convict2.java index ec8db177a..1a41a6214 100644 --- a/src/class154/Code02_Convict2.java +++ b/src/class154/Code02_Convict2.java @@ -40,6 +40,14 @@ //int dist[MAXN]; //int fa[MAXN]; // +//void prepare() { +// dist[0] = -1; +// for (int i = 1; i <= n; i++) { +// up[i] = ls[i] = rs[i] = dist[i] = 0; +// fa[i] = i; +// } +//} +// //int find(int i) { // return fa[i] == i ? i : (fa[i] = find(fa[i])); //} @@ -93,14 +101,6 @@ // fa[l] = fa[i] = merge(l, i); //} // -//void prepare() { -// dist[0] = -1; -// for (int i = 1; i <= n; i++) { -// ls[i] = rs[i] = dist[i] = 0; -// fa[i] = i; -// } -//} -// //long long compute() { // long long ans = 0; // long long mx = 0; From f4fbecbc649259a58f6b8ccac8b33b854345399e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 14 Dec 2024 22:57:10 +0800 Subject: [PATCH 0481/2029] modify code --- src/class154/Code02_Convict1.java | 7 ++++++- src/class154/Code02_Convict2.java | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/class154/Code02_Convict1.java b/src/class154/Code02_Convict1.java index d2d2fda17..92d7937c9 100644 --- a/src/class154/Code02_Convict1.java +++ b/src/class154/Code02_Convict1.java @@ -111,8 +111,13 @@ public static int remove(int i) { right[f] = 0; } up[i] = 0; - for (int d = -1; dist[f] > d + 1; f = up[f], d++) { + for (int d = -1, tmp; dist[f] > d + 1; f = up[f], d++) { dist[f] = d + 1; + if (dist[left[f]] < dist[right[f]]) { + tmp = left[f]; + left[f] = right[f]; + right[f] = tmp; + } } father[i] = merge(h, s); } diff --git a/src/class154/Code02_Convict2.java b/src/class154/Code02_Convict2.java index 1a41a6214..a598acc36 100644 --- a/src/class154/Code02_Convict2.java +++ b/src/class154/Code02_Convict2.java @@ -87,8 +87,13 @@ // rs[f] = 0; // } // up[i] = 0; -// for (int d = -1; dist[f] > d + 1; f = up[f], d++) { +// for (int d = -1, tmp; dist[f] > d + 1; f = up[f], d++) { // dist[f] = d + 1; +// if (dist[ls[f]] < dist[rs[f]]) { +// tmp = ls[f]; +// ls[f] = rs[f]; +// rs[f] = tmp; +// } // } // fa[i] = merge(h, s); // } From 88bb3efcbb8440a141f4eae43e8856dc62573541 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 15 Dec 2024 00:22:05 +0800 Subject: [PATCH 0482/2029] modify code --- src/class154/Code02_Convict1.java | 22 ++++++++++------------ src/class154/Code02_Convict2.java | 22 ++++++++++------------ 2 files changed, 20 insertions(+), 24 deletions(-) diff --git a/src/class154/Code02_Convict1.java b/src/class154/Code02_Convict1.java index 92d7937c9..2328ae384 100644 --- a/src/class154/Code02_Convict1.java +++ b/src/class154/Code02_Convict1.java @@ -99,19 +99,17 @@ public static int remove(int i) { father[left[i]] = left[i]; father[right[i]] = right[i]; int s = merge(left[i], right[i]); - up[s] = 0; - left[i] = right[i] = dist[i] = 0; - if (h == i) { - father[i] = s; - } else { - int f = up[i]; + int f = up[i]; + father[i] = s; + up[s] = f; + if (h != i) { + father[s] = h; if (left[f] == i) { - left[f] = 0; + left[f] = s; } else { - right[f] = 0; + right[f] = s; } - up[i] = 0; - for (int d = -1, tmp; dist[f] > d + 1; f = up[f], d++) { + for (int d = dist[s], tmp; dist[f] > d + 1; f = up[f], d++) { dist[f] = d + 1; if (dist[left[f]] < dist[right[f]]) { tmp = left[f]; @@ -119,9 +117,9 @@ public static int remove(int i) { right[f] = tmp; } } - father[i] = merge(h, s); } - return father[i]; + up[i] = left[i] = right[i] = dist[i] = 0; + return father[s]; } public static void reduce(int i, long v) { diff --git a/src/class154/Code02_Convict2.java b/src/class154/Code02_Convict2.java index a598acc36..c582e2707 100644 --- a/src/class154/Code02_Convict2.java +++ b/src/class154/Code02_Convict2.java @@ -75,19 +75,17 @@ // fa[ls[i]] = ls[i]; // fa[rs[i]] = rs[i]; // int s = merge(ls[i], rs[i]); -// up[s] = 0; -// ls[i] = rs[i] = dist[i] = 0; -// if (h == i) { -// fa[i] = s; -// } else { -// int f = up[i]; +// int f = up[i]; +// fa[i] = s; +// up[s] = f; +// if (h != i) { +// fa[s] = h; // if (ls[f] == i) { -// ls[f] = 0; +// ls[f] = s; // } else { -// rs[f] = 0; +// rs[f] = s; // } -// up[i] = 0; -// for (int d = -1, tmp; dist[f] > d + 1; f = up[f], d++) { +// for (int d = dist[s], tmp; dist[f] > d + 1; f = up[f], d++) { // dist[f] = d + 1; // if (dist[ls[f]] < dist[rs[f]]) { // tmp = ls[f]; @@ -95,9 +93,9 @@ // rs[f] = tmp; // } // } -// fa[i] = merge(h, s); // } -// return fa[i]; +// up[i] = ls[i] = rs[i] = dist[i] = 0; +// return fa[s]; //} // //void reduce(int i, long long v) { From 307b9edd622574aa8fa6bb7c59235924afdd5fae Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 15 Dec 2024 00:23:29 +0800 Subject: [PATCH 0483/2029] modify code --- src/class154/Code02_Convict1.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/class154/Code02_Convict1.java b/src/class154/Code02_Convict1.java index 2328ae384..6e850d5f8 100644 --- a/src/class154/Code02_Convict1.java +++ b/src/class154/Code02_Convict1.java @@ -82,6 +82,7 @@ public static int merge(int i, int j) { j = tmp; } right[i] = merge(right[i], j); + // 设置up信息 up[right[i]] = i; if (dist[left[i]] < dist[right[i]]) { tmp = left[i]; From d44c5faa2f330ba7f8a59400e87e32fa472fb4ff Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 15 Dec 2024 11:18:37 +0800 Subject: [PATCH 0484/2029] modify code --- src/class154/Code02_Convict1.java | 4 ++-- src/class154/Code02_Convict2.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class154/Code02_Convict1.java b/src/class154/Code02_Convict1.java index 6e850d5f8..e8eda3952 100644 --- a/src/class154/Code02_Convict1.java +++ b/src/class154/Code02_Convict1.java @@ -124,9 +124,9 @@ public static int remove(int i) { } public static void reduce(int i, long v) { - int l = remove(i); + int h = remove(i); num[i] = Math.max(num[i] - v, 0); - father[l] = father[i] = merge(l, i); + father[h] = father[i] = merge(h, i); } public static long compute() { diff --git a/src/class154/Code02_Convict2.java b/src/class154/Code02_Convict2.java index c582e2707..790e6fa41 100644 --- a/src/class154/Code02_Convict2.java +++ b/src/class154/Code02_Convict2.java @@ -99,9 +99,9 @@ //} // //void reduce(int i, long long v) { -// int l = remove(i); +// int h = remove(i); // num[i] = max(num[i] - v, 0LL); -// fa[l] = fa[i] = merge(l, i); +// fa[h] = fa[i] = merge(h, i); //} // //long long compute() { From faea33f5cc14facaa3b6a083b791ec8d2eb495a7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 15 Dec 2024 11:28:35 +0800 Subject: [PATCH 0485/2029] modify code --- src/class154/Code02_Convict1.java | 4 +--- src/class154/Code02_Convict2.java | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/class154/Code02_Convict1.java b/src/class154/Code02_Convict1.java index e8eda3952..84310f66b 100644 --- a/src/class154/Code02_Convict1.java +++ b/src/class154/Code02_Convict1.java @@ -113,9 +113,7 @@ public static int remove(int i) { for (int d = dist[s], tmp; dist[f] > d + 1; f = up[f], d++) { dist[f] = d + 1; if (dist[left[f]] < dist[right[f]]) { - tmp = left[f]; - left[f] = right[f]; - right[f] = tmp; + tmp = left[f]; left[f] = right[f]; right[f] = tmp; } } } diff --git a/src/class154/Code02_Convict2.java b/src/class154/Code02_Convict2.java index 790e6fa41..0e21f1f31 100644 --- a/src/class154/Code02_Convict2.java +++ b/src/class154/Code02_Convict2.java @@ -88,9 +88,7 @@ // for (int d = dist[s], tmp; dist[f] > d + 1; f = up[f], d++) { // dist[f] = d + 1; // if (dist[ls[f]] < dist[rs[f]]) { -// tmp = ls[f]; -// ls[f] = rs[f]; -// rs[f] = tmp; +// tmp = ls[f]; ls[f] = rs[f]; rs[f] = tmp; // } // } // } From bf7b8edf9d878b2cbf1e797fa063d9f6f940eedc Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 15 Dec 2024 15:24:23 +0800 Subject: [PATCH 0486/2029] modify code --- src/class154/Code04_Dispatch1.java | 111 +++++------ src/class154/Code04_Dispatch2.java | 293 ++++++++++------------------- src/class154/Code04_Dispatch3.java | 131 ------------- 3 files changed, 146 insertions(+), 389 deletions(-) delete mode 100644 src/class154/Code04_Dispatch3.java diff --git a/src/class154/Code04_Dispatch1.java b/src/class154/Code04_Dispatch1.java index 8f49de9c2..73a5cabec 100644 --- a/src/class154/Code04_Dispatch1.java +++ b/src/class154/Code04_Dispatch1.java @@ -1,19 +1,15 @@ package class154; -// 派遣,dfs用递归实现,java版 -// 一共有n个忍者,每个忍者有工资、领导力、上级编号,三个属性 -// 如果某个忍者的上级编号为0,那么他是整棵忍者树的头 +// 派遣,java版 +// 一共有n个忍者,每个忍者有上级编号、工资、能力,三个属性 +// 输入保证,任何忍者的上级编号 < 这名忍者的编号,1号忍者是整棵忍者树的头 // 你一共有m的预算,可以在忍者树上随意选一棵子树,然后在这棵子树上挑选忍者 -// 你选择某棵子树之后,不一定要选子树头的忍者,只要不超过m的预算,你就可以随意选择子树上的忍者 -// 最终收益 = 雇佣人数 * 子树头忍者的领导力,返回能取得的最大收益是多少 -// 输入保证,任何忍者的编号 > 该忍者上级的编号 +// 你选择某棵子树之后,不一定要选子树头的忍者,只要不超过m的预算,可以随意选择子树上的忍者 +// 最终收益 = 雇佣人数 * 子树头忍者的能力,返回能取得的最大收益是多少 // 1 <= n <= 10^5 1 <= m <= 10^9 // 1 <= 每个忍者工资 <= m 1 <= 每个忍者领导力 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P1552 -// 提交以下的code,提交时请把类名改成"Main",一些测试用例通过不了 -// 这是因为java语言用递归方式实现dfs,递归会爆栈 -// 需要把dfs实现成迭代版,才能全部通过,就是Code04_Dispatch2文件 -// C++语言用递归方式实现,可以直接通过,就是Code04_Dispatch3文件 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.BufferedReader; import java.io.IOException; @@ -28,22 +24,14 @@ public class Code04_Dispatch1 { public static int n, m; - public static long ans; - - // 链式前向星需要 - 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; + // 上级 + public static int[] leader = new int[MAXN]; // 薪水 public static long[] cost = new long[MAXN]; - // 领导力 - public static long[] lead = new long[MAXN]; + // 能力 + public static long[] ability = new long[MAXN]; // 左孩子 public static int[] left = new int[MAXN]; @@ -64,22 +52,15 @@ public class Code04_Dispatch1 { public static long[] sum = new long[MAXN]; public static void prepare() { - ans = 0; - cnt = 1; dist[0] = -1; for (int i = 1; i <= n; i++) { - head[i] = left[i] = right[i] = dist[i] = size[i] = 0; - sum[i] = 0; + left[i] = right[i] = dist[i] = 0; + size[i] = 1; + sum[i] = cost[i]; father[i] = i; } } - public static void addEdge(int u, int v) { - next[cnt] = head[u]; - to[cnt] = v; - head[u] = cnt++; - } - public static int find(int i) { father[i] = father[i] == i ? i : find(father[i]); return father[i]; @@ -115,32 +96,31 @@ public static int pop(int i) { return father[i]; } - // dfs用递归实现 - public static void dfs(int u) { - for (int ei = head[u]; ei > 0; ei = next[ei]) { - dfs(to[ei]); - } - int usize = 1; - long usum = cost[u]; - for (int ei = head[u], v, l, r; ei > 0; ei = next[ei]) { - v = to[ei]; - l = find(u); - r = find(v); - usize += size[r]; - usum += sum[r]; - merge(l, r); - } - int i; - while (usum > m) { - i = find(u); - usize--; - usum -= cost[i]; - pop(i); + public static long compute() { + long ans = 0; + int p, psize, h, hsize; + long hsum, psum; + for (int i = n; i >= 1; i--) { + h = find(i); + hsize = size[h]; + hsum = sum[h]; + while (hsum > m) { + pop(h); + hsize--; + hsum -= cost[h]; + h = find(i); + } + ans = Math.max(ans, (long) hsize * ability[i]); + if (i > 1) { + p = find(leader[i]); + psize = size[p]; + psum = sum[p]; + father[p] = father[h] = merge(p, h); + size[father[p]] = psize + hsize; + sum[father[p]] = psum + hsum; + } } - i = find(u); - size[i] = usize; - sum[i] = usum; - ans = Math.max(ans, (long) usize * lead[u]); + return ans; } public static void main(String[] args) throws IOException { @@ -151,23 +131,16 @@ public static void main(String[] args) throws IOException { n = (int) in.nval; in.nextToken(); m = (int) in.nval; - prepare(); - int root = 0; - for (int i = 1, f; i <= n; i++) { + for (int i = 1; i <= n; i++) { in.nextToken(); - f = (int) in.nval; + leader[i] = (int) in.nval; in.nextToken(); cost[i] = (int) in.nval; in.nextToken(); - lead[i] = (int) in.nval; - if (f == 0) { - root = i; - } else { - addEdge(f, i); - } + ability[i] = (int) in.nval; } - dfs(root); - out.println(ans); + prepare(); + out.println(compute()); out.flush(); out.close(); br.close(); diff --git a/src/class154/Code04_Dispatch2.java b/src/class154/Code04_Dispatch2.java index 44cf4b6fe..c80580a56 100644 --- a/src/class154/Code04_Dispatch2.java +++ b/src/class154/Code04_Dispatch2.java @@ -1,195 +1,110 @@ package class154; -// 派遣,dfs用迭代实现,java版 -// 一共有n个忍者,每个忍者有工资、领导力、上级编号,三个属性 -// 如果某个忍者的上级编号为0,那么他是整棵忍者树的头 +// 派遣,C++版 +// 一共有n个忍者,每个忍者有上级编号、工资、能力,三个属性 +// 输入保证,任何忍者的上级编号 < 这名忍者的编号,1号忍者是整棵忍者树的头 // 你一共有m的预算,可以在忍者树上随意选一棵子树,然后在这棵子树上挑选忍者 -// 你选择某棵子树之后,不一定要选子树头的忍者,只要不超过m的预算,你就可以随意选择子树上的忍者 -// 最终收益 = 雇佣人数 * 子树头忍者的领导力,返回能取得的最大收益是多少 -// 输入保证,任何忍者的编号 > 该忍者上级的编号 +// 你选择某棵子树之后,不一定要选子树头的忍者,只要不超过m的预算,可以随意选择子树上的忍者 +// 最终收益 = 雇佣人数 * 子树头忍者的能力,返回能取得的最大收益是多少 // 1 <= n <= 10^5 1 <= m <= 10^9 // 1 <= 每个忍者工资 <= m 1 <= 每个忍者领导力 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P1552 -// 提交以下的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 Code04_Dispatch2 { - - public static int MAXN = 100001; - - public static int n, m; - - public static long ans; - - 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; - - public static long[] cost = new long[MAXN]; - - public static long[] lead = new long[MAXN]; - - public static int[] left = new int[MAXN]; - - public static int[] right = new int[MAXN]; - - public static int[] dist = new int[MAXN]; - - public static int[] father = new int[MAXN]; - - public static int[] size = new int[MAXN]; - - public static long[] sum = new long[MAXN]; - - public static void prepare() { - ans = 0; - cnt = 1; - dist[0] = -1; - for (int i = 1; i <= n; i++) { - head[i] = left[i] = right[i] = dist[i] = size[i] = 0; - sum[i] = 0; - father[i] = i; - } - } - - public static void addEdge(int u, int v) { - next[cnt] = head[u]; - to[cnt] = v; - head[u] = cnt++; - } - - public static int find(int i) { - father[i] = father[i] == i ? i : find(father[i]); - return father[i]; - } - - public static int merge(int i, int j) { - if (i == 0 || j == 0) { - return i + j; - } - int tmp; - if (cost[i] < cost[j]) { - tmp = i; - i = j; - j = tmp; - } - right[i] = merge(right[i], j); - if (dist[left[i]] < dist[right[i]]) { - tmp = left[i]; - left[i] = right[i]; - right[i] = tmp; - } - dist[i] = dist[right[i]] + 1; - father[left[i]] = father[right[i]] = i; - return i; - } - - public static int pop(int i) { - father[left[i]] = left[i]; - father[right[i]] = right[i]; - father[i] = merge(left[i], right[i]); - left[i] = right[i] = dist[i] = 0; - return father[i]; - } - - // dfs从递归版改成迭代版,不会的话,看讲解118 - // 重点讲了树上问题从递归版改成迭代版的方法 - public static int[][] ue = new int[MAXN][2]; - - public static int u, ei; - - public static int ssize; - - public static void push(int u, int ei) { - ue[ssize][0] = u; - ue[ssize][1] = ei; - ssize++; - } - - public static void pop() { - --ssize; - u = ue[ssize][0]; - ei = ue[ssize][1]; - } - - // dfs用迭代实现 - public static void dfs(int root) { - ssize = 0; - push(root, -1); - while (ssize > 0) { - pop(); - if (ei == -1) { - ei = head[u]; - } else { - ei = next[ei]; - } - if (ei > 0) { - push(u, ei); - push(to[ei], -1); - } else { - int usize = 1; - long usum = cost[u]; - for (int ei = head[u], v, l, r; ei > 0; ei = next[ei]) { - v = to[ei]; - l = find(u); - r = find(v); - usize += size[r]; - usum += sum[r]; - merge(l, r); - } - int i; - while (usum > m) { - i = find(u); - usize--; - usum -= cost[i]; - pop(i); - } - i = find(u); - size[i] = usize; - sum[i] = usum; - ans = Math.max(ans, (long) usize * lead[u]); - } - } - } - - 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; - prepare(); - int root = 0; - for (int i = 1, f; i <= n; i++) { - in.nextToken(); - f = (int) in.nval; - in.nextToken(); - cost[i] = (int) in.nval; - in.nextToken(); - lead[i] = (int) in.nval; - if (f == 0) { - root = i; - } else { - addEdge(f, i); - } - } - dfs(root); - out.println(ans); - out.flush(); - out.close(); - br.close(); - } - -} +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +//using namespace std; +// +//const int MAXN = 100001; +//int n, m; +//int leader[MAXN]; +//long long cost[MAXN]; +//long long ability[MAXN]; +//int ls[MAXN]; +//int rs[MAXN]; +//int dist[MAXN]; +//int fa[MAXN]; +//int siz[MAXN]; +//long long sum[MAXN]; +// +//int find(int i) { +// return fa[i] = (fa[i] == i ? i : find(fa[i])); +//} +// +//int merge(int i, int j) { +// if (i == 0 || j == 0) { +// return i + j; +// } +// int tmp; +// if (cost[i] < cost[j]) { +// tmp = i; +// i = j; +// j = tmp; +// } +// rs[i] = merge(rs[i], j); +// if (dist[ls[i]] < dist[rs[i]]) { +// tmp = ls[i]; +// ls[i] = rs[i]; +// rs[i] = tmp; +// } +// dist[i] = dist[rs[i]] + 1; +// fa[ls[i]] = fa[rs[i]] = i; +// return i; +//} +// +//int pop(int i) { +// fa[ls[i]] = ls[i]; +// fa[rs[i]] = rs[i]; +// fa[i] = merge(ls[i], rs[i]); +// ls[i] = rs[i] = dist[i] = 0; +// return fa[i]; +//} +// +//void prepare() { +// dist[0] = -1; +// for (int i = 1; i <= n; i++) { +// ls[i] = rs[i] = dist[i] = 0; +// siz[i] = 1; +// sum[i] = cost[i]; +// fa[i] = i; +// } +//} +// +//long long compute() { +// long long ans = 0; +// int p, psize, h, hsize; +// long long hsum, psum; +// for (int i = n; i >= 1; i--) { +// h = find(i); +// hsize = siz[h]; +// hsum = sum[h]; +// while (hsum > m) { +// pop(h); +// hsize--; +// hsum -= cost[h]; +// h = find(i); +// } +// ans = max(ans, (long long)hsize * ability[i]); +// if (i > 1) { +// p = find(leader[i]); +// psize = siz[p]; +// psum = sum[p]; +// fa[p] = fa[h] = merge(p, h); +// siz[fa[p]] = psize + hsize; +// sum[fa[p]] = psum + hsum; +// } +// } +// return ans; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1; i <= n; i++) { +// cin >> leader[i] >> cost[i] >> ability[i]; +// } +// prepare(); +// cout << compute() << endl; +// return 0; +//} \ No newline at end of file diff --git a/src/class154/Code04_Dispatch3.java b/src/class154/Code04_Dispatch3.java deleted file mode 100644 index dc89d3175..000000000 --- a/src/class154/Code04_Dispatch3.java +++ /dev/null @@ -1,131 +0,0 @@ -package class154; - -// 派遣,dfs用递归实现,C++版 -// 一共有n个忍者,每个忍者有工资、领导力、上级编号,三个属性 -// 如果某个忍者的上级编号为0,那么他是整棵忍者树的头 -// 你一共有m的预算,可以在忍者树上随意选一棵子树,然后在这棵子树上挑选忍者 -// 你选择某棵子树之后,不一定要选子树头的忍者,只要不超过m的预算,你就可以随意选择子树上的忍者 -// 最终收益 = 雇佣人数 * 子树头忍者的领导力,返回能取得的最大收益是多少 -// 输入保证,任何忍者的编号 > 该忍者上级的编号 -// 1 <= n <= 10^5 1 <= m <= 10^9 -// 1 <= 每个忍者工资 <= m 1 <= 每个忍者领导力 <= 10^9 -// 测试链接 : https://www.luogu.com.cn/problem/P1552 -// 逻辑和java的递归版完全一样,java必须改迭代版才能通过,C++的递归版就能通过 -// 这是洛谷没有考虑其他语言导致的,提交如下代码,可以通过所有测试用例 - -//#include -// -//using namespace std; -// -//const int MAXN = 100001; -//int n, m; -//long long ans; -//int head[MAXN]; -//int nxt[MAXN]; -//int to[MAXN]; -//int cnt; -//long long cost[MAXN]; -//long long lead[MAXN]; -//int ls[MAXN]; -//int rs[MAXN]; -//int dist[MAXN]; -//int fa[MAXN]; -//int siz[MAXN]; -//long long sum[MAXN]; -// -//void prepare() { -// ans = 0; -// cnt = 1; -// dist[0] = -1; -// for (int i = 1; i <= n; i++) { -// head[i] = ls[i] = rs[i] = dist[i] = siz[i] = 0; -// sum[i] = 0; -// fa[i] = i; -// } -//} -// -//void addEdge(int u, int v) { -// nxt[cnt] = head[u]; -// to[cnt] = v; -// head[u] = cnt++; -//} -// -//int find(int i) { -// fa[i] = fa[i] == i ? i : find(fa[i]); -// return fa[i]; -//} -// -//int merge(int i, int j) { -// if (i == 0 || j == 0) { -// return i + j; -// } -// if (cost[i] < cost[j]) { -// int tmp = i; -// i = j; -// j = tmp; -// } -// rs[i] = merge(rs[i], j); -// if (dist[ls[i]] < dist[rs[i]]) { -// int tmp = ls[i]; -// ls[i] = rs[i]; -// rs[i] = tmp; -// } -// dist[i] = dist[rs[i]] + 1; -// fa[ls[i]] = fa[rs[i]] = i; -// return i; -//} -// -//int pop(int i) { -// fa[ls[i]] = ls[i]; -// fa[rs[i]] = rs[i]; -// fa[i] = merge(ls[i], rs[i]); -// ls[i] = rs[i] = dist[i] = 0; -// return fa[i]; -//} -// -//void dfs(int u) { -// for (int ei = head[u]; ei > 0; ei = nxt[ei]) { -// dfs(to[ei]); -// } -// int usize = 1; -// long long usum = cost[u]; -// for (int ei = head[u], v, l, r; ei > 0; ei = nxt[ei]) { -// v = to[ei]; -// l = find(u); -// r = find(v); -// usize += siz[r]; -// usum += sum[r]; -// merge(l, r); -// } -// int i; -// while (usum > m) { -// i = find(u); -// usize--; -// usum -= cost[i]; -// pop(i); -// } -// i = find(u); -// siz[i] = usize; -// sum[i] = usum; -// ans = max(ans, (long long)usize * lead[u]); -//} -// -//int main() { -// ios::sync_with_stdio(false); -// cin.tie(nullptr); -// cin >> n >> m; -// prepare(); -// int root = 0; -// for (int i = 1; i <= n; i++) { -// int f; -// cin >> f >> cost[i] >> lead[i]; -// if (f == 0) { -// root = i; -// } else { -// addEdge(f, i); -// } -// } -// dfs(root); -// cout << ans << endl; -// return 0; -//} \ No newline at end of file From 12bf39aa3555be3dc7af14f0694bcf14cbeb508b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 15 Dec 2024 16:12:11 +0800 Subject: [PATCH 0487/2029] modify code --- src/class154/Code05_NumberSequence1.java | 7 +++---- src/class154/Code05_NumberSequence2.java | 10 +++++----- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/class154/Code05_NumberSequence1.java b/src/class154/Code05_NumberSequence1.java index a0a1b4d44..1c18573d2 100644 --- a/src/class154/Code05_NumberSequence1.java +++ b/src/class154/Code05_NumberSequence1.java @@ -51,6 +51,8 @@ public static void prepare() { dist[0] = -1; for (int i = 1; i <= n; i++) { left[i] = right[i] = dist[i] = 0; + father[i] = from[i] = to[i] = i; + size[i] = 1; } } @@ -90,10 +92,6 @@ public static int pop(int i) { } public static long compute() { - for (int i = 1; i <= n; i++) { - father[i] = from[i] = to[i] = i; - size[i] = 1; - } int stackSize = 0; for (int i = 1, pre, cur, s; i <= n; i++) { while (stackSize > 0) { @@ -104,6 +102,7 @@ public static long compute() { } s = size[pre] + size[cur]; cur = merge(pre, cur); + // 大根堆只保留到上中位数 while (s > (i - from[pre] + 1 + 1) / 2) { cur = pop(cur); s--; diff --git a/src/class154/Code05_NumberSequence2.java b/src/class154/Code05_NumberSequence2.java index 28219c27c..82d0f00f9 100644 --- a/src/class154/Code05_NumberSequence2.java +++ b/src/class154/Code05_NumberSequence2.java @@ -31,6 +31,8 @@ // dist[0] = -1; // for (int i = 1; i <= n; i++) { // ls[i] = rs[i] = dist[i] = 0; +// fa[i] = from[i] = to[i] = i; +// siz[i] = 1; // } //} // @@ -40,7 +42,9 @@ //} // //int merge(int i, int j) { -// if (i == 0 || j == 0) return i + j; +// if (i == 0 || j == 0) { +// return i + j; +// } // int tmp; // if (arr[i] < arr[j]) { // tmp = i; i = j; j = tmp; @@ -63,10 +67,6 @@ //} // //long long compute() { -// for (int i = 1; i <= n; i++) { -// fa[i] = from[i] = to[i] = i; -// siz[i] = 1; -// } // int stackSize = 0; // for (int i = 1, pre, cur, s; i <= n; i++) { // while (stackSize > 0) { From a347aec38eefdecfc9ccb8c2a89b384a4736b994 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 15 Dec 2024 17:48:39 +0800 Subject: [PATCH 0488/2029] modify code --- ...70\345\205\263\351\242\230\347\233\256.pptx" | Bin 0 -> 53867 bytes src/class154/Code05_NumberSequence1.java | 7 +++++++ 2 files changed, 7 insertions(+) create mode 100644 "ppt/\347\256\227\346\263\225\350\256\262\350\247\243154\343\200\220\346\214\272\351\232\276\343\200\221\345\267\246\345\201\217\346\240\221\347\232\204\345\216\237\347\220\206\343\200\201\344\273\243\347\240\201\343\200\201\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\243154\343\200\220\346\214\272\351\232\276\343\200\221\345\267\246\345\201\217\346\240\221\347\232\204\345\216\237\347\220\206\343\200\201\344\273\243\347\240\201\343\200\201\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\243154\343\200\220\346\214\272\351\232\276\343\200\221\345\267\246\345\201\217\346\240\221\347\232\204\345\216\237\347\220\206\343\200\201\344\273\243\347\240\201\343\200\201\347\233\270\345\205\263\351\242\230\347\233\256.pptx" new file mode 100644 index 0000000000000000000000000000000000000000..0e14d1b3c9b36720de62d75fffd332d918a5d6b7 GIT binary patch literal 53867 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

    ;oEn$`g=IgQX#j0 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 literal 0 HcmV?d00001 diff --git a/src/class154/Code05_NumberSequence1.java b/src/class154/Code05_NumberSequence1.java index 1c18573d2..d0ec590b0 100644 --- a/src/class154/Code05_NumberSequence1.java +++ b/src/class154/Code05_NumberSequence1.java @@ -29,22 +29,29 @@ public class Code05_NumberSequence1 { public static long[] arr = new long[MAXN]; + // 左偏树需要 public static int[] left = new int[MAXN]; public static int[] right = new int[MAXN]; public static int[] dist = new int[MAXN]; + // 并查集向上的路径 public static int[] father = new int[MAXN]; + // 集合表达区域的左下标 public static int[] from = new int[MAXN]; + // 集合表达区域的右下标 public static int[] to = new int[MAXN]; + // 集合里有几个数字 public static int[] size = new int[MAXN]; + // 单调栈 public static int[] stack = new int[MAXN]; + // 构造的数组 public static long[] ans = new long[MAXN]; public static void prepare() { From 7b802f4f63540d98b89f408efa4a779513e7a076 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 15 Dec 2024 19:57:42 +0800 Subject: [PATCH 0489/2029] modify code --- ...70\223\351\242\2306-Splay\346\240\221.pdf" | Bin 325745 -> 325003 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243153\343\200\220\346\211\251\345\261\225\343\200\221\346\234\211\345\272\217\350\241\250\344\270\223\351\242\2306-Splay\346\240\221.pdf" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243153\343\200\220\346\211\251\345\261\225\343\200\221\346\234\211\345\272\217\350\241\250\344\270\223\351\242\2306-Splay\346\240\221.pdf" index b7ba9cf170a12103ae84293da1e457052aa81e08..030f1a1ed9e3048441289db10770f9f05227368d 100644 GIT binary patch delta 89028 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%0Dgc8LU@Ez8 zcF8v19X>lbF$hLKiL4%y%$kC3lRUY&BvNl28&tzxuy&3m5VO z&-vwh&)G10^X!Ubj!e;td=8S=YBEXTVr`?7yP+ zSRd{qkCca}tVuaVmw#Mda4^gGjlAK%qW01}=ST?9h`L)DOr6{??8z=k@J;kh%yJUy zj?^BlJ<3_JTjJt2n{1?yY{Q{UN8wkd>HPWYrqGK8gFKyf77e0w{s8?B)c?bN3=U(( zL1@N@`V{Xf-gz-v7O`~Y3g0j)*QV0Sn!@IiZ6#5cB1>-yYk%@rpIe!mRdwuYY7+-~ z*q@PG9bb56ZO;1qm_m7;{7gFS87N4vK6=~Zf-p0F*NPb92>H(I2mhh$DK7ZvFdFq7 zp*MSA<=)kCp%Ix88R6+%3>NTI-kTG*aQN9C9x*W+wr+~r;^8+T1dTRcpt>^h;@`C` zw@OM1%Fj@fxPQ;c1NR3fu1pAt*yfkCni^zK>S+fdsi5>=m2r!_>U3V&*|PMX(y85YOd0L*KXx#w&`Kb(@QTYHz@{xHRJ2$ z7t^!zPUWR5jsojM`I0evJ$A>$#cbQ7?tqx~tpfsnVSl0TQ_%YP*N;nY3bQ9$&KhRV zfznnQ$u0@^-sl-w>?l;9smiU)uh&x#pA0B_Vjc-*<~`W-F#DEEODvQqErW zNZHz{+JC29pj_Ljx}@P9vy_dr71IaDtUtg!ubB9So!&3}moVWy-_AV&KX?R%WluT9>iDxm*bA_WyCg z2d_0k?%FeJa@II(oD*pk$w39&5?4!ls_m>idiSm^d(Sxt%B?{7JB75JPB{plseit9 zE9<~Ty3KBkjg2swmO`nBH=3Ygp*+T`PDt7`QS}PJan?wh{e+j$uLfqN()uu5Q!Z3! z;Lj=1fp%42z`yZ@y>h1lf1?~&c^4H?uq_7T1y-P0dm9DaJaX5D; z?%V#Ls~dWB!B|d=R7m3}iTPeZ6Gtm+THpBH9)72s>3Dnik(q=}R;V*I;3Q?PSEa+o zY}lEX9eyf2Ys1|t!Ta|)z>EYzLq#&`iuFAe%+_W=eJ&Z{X+{W0hcL1$(4_(o>~7~(e(8E zE4mqA0-I5qUY4%Lww=-%Ci`L5(~~c4jtOy7V`grf!=Wv66PDVg&&DDhXh2$Zdcs6F zE?HphG3(aiduuy5IDaYb;Qa$0x!?Az^pRb==HI-i*|u3NIkB3$h46&%z3XWNZ+_xg z&Sv23YP5Wa!@MUs&70|Z)l+zMyS2ONW$pYMw(Sm-^s?)8f9(If69(48YZxq<`7){o%AYbBf{v?X3Tt{yUe$847S_3y&5aElQ)w$A4RKGY@N-Xf$7q1HF-1 z487ODz&OgE;Snj5Uliva=N3=fpumZi`Div1$isL#9*?wwxj|dKvj#2cn66uSSp1Xs z5B%Qyo^P$ctf9fTVL`(@+RJ&AmYe6q(F7(ueVt4iX%B^Xwj0jEci&zvC?q3h_vPIe z;|e)Slx*jHy?+-3%v)LQAv~*Yzt(iqr%o7y*}UsB_Qt$!m!CbcM*#L;izBvPq~UhT zd3E=U-fdt#z-&3ph`2~=|D$uzumnln`g`6&%WKb0XXw$Vgi+6NutKI~we(16Cs6pZ2}ndGnd3A)9e40dA^54+(I?xua@YGM8=_T#04Ol8}phlS5Mac8Hr znmJi>qJQrARjOq1zHv);`g8co0a~a+yV8VUI8Gi}<|w?p{;=)dGg<-aZWbqbb%|S9 zX*+)5p;DZLmC_`Q%Uel2)TfJ%c#uh)w8t}U z%dRb9yS?Qr)A{wvi<4aObv+RVJdynmvs_eWp~C&e-)&`U>r*ZFmz14L^u z!x(W8k9Wm|a93K$iX74|w`OpJW^`m|j7v~cI9;YRSKVu`oUO8ASH^4$H$k(MYzG}0 zF;oteQgIRSzJ%%piyLTdotDQP34Y2GdTn5foPTf?1Q)on|v% z;(uu1Xs6j|+Gz&ANhc^7B#lly13Mu^eMI<9~?* z9A0M=arr8oVuRduFB%qQwcv0BHgox`lBd{Os+DGU*NNr<-QsLUilp6ow1LJP_eka% z{ZWX)JpLu>z+aLM3ypY*rzCqACGW!+bXM~GZr>e#QB*q%RL8rOiC zY;<7kw`~zhOR5>URi|px8|EKZgMYRUlvTGECs1){;rIy{He22AF#ay|>3sK;!_01Y z$!1e3Ju8=kZiVU^ql}Uc@T##=j|X+)$$$r94@P>0DLgoeC(%(l$%@0o*VG?D|9OAd zbvw%%ug~lp-HCb~8W!=X=*O$3N_-bJzXH6|CH7(@B|PIXRcwG%seu)@;eR4tngo5R z;q+y27u`~pfPEsS1TOLMLb490#TQTr>~;!zmp8W5Hx~Vo0i$h>2!GH5eyBI-uLa#e zVBKX`?jUKz-Zf}+Sv~KUVU&81`m64A{tWwPE0hfkwyDPQ;#=4+y`>;fIxG6~PGGy2 zU4cEE##mSt&Jntv+w|z`S;x2b0+w>DRLw zPp`crj1IxRo6tP&tgFzNdhJL9-BmIIZ8dgOA*S-uV2Bn6t1B+E@JD_aocm0R4I`C< z`NV+uz+FKcx~a}8l*>e8=?SwUX6t$r)KQ}<(50PkS00-x$I-Ie$$u-fhoNTf2>~x! z@_0y`{C&n1=1CwNNU}4g_ME4!*H_*M4 zTau$vG8YO-7jlx)jeqaROKQ{JroBmpy>gMZO%}M`$EnoEtfhfuB121v*OHsK^dH%S z?s6}`LCLV4p9WK3F$WjRy_XIGWBOhtwJNWH9vl1Jwh56V>L=#SklV<^_isszO^DyU zcPFg@Y){^jLTSMp$>kY&1(`W%rSfYBx}$zv_Iuv%Iq$N5=6|kZvgTIJlsRgke~UV} zTP!4?3y(IS2R5k3P%eyg)e~QUSWY z(?)u$IdAROo1ao>{~CmYxipmZz7TQ81ctR?A0~1at$%Zg{b8xfL^WL_s=Fd}8lq?f zqGZHE7uHk5qy3Mm7|YO{jQZ><)pJFaa_n-2@;Rg0sM^FUCo9LQCey&G_N-B28s!pp zvWejd8}@7roiKkcYP;2V(XQkB&z@I&{C(=PnYZUOHVU>sPWo}^k4JK7W=*}up$<%B z4%Zy2Z+{$Q&&Yib`0t~|to@8~4lR1CuBw#XHOleJx|K>swOMt5SK2AZtL#+cH4{dQ zA81uAW)8Z!gWDWD;06b9y#m&Q9oE%< z$}CPVINFl(p3d|XJnx|AQ;2WD_(%5hF-ASLJ%6vdOWU1ll(Uy9zVu*JdsN4Hr8f} zvVX=eoI^kA;v&3ZP$clHp|8Iz?-m-=qG2i0|3T$%y1zTj|6x?uy3Sx(Nux`tZSkCZ znYdMS=2bUUDn*5I`U-_o#i(|vj`2z_<#d(Tf1fncy#e+#HeA57c1pI3ZiKl22?|UA zHygT3FPg=vLA+$qCGKXMI_e%?dB%ywU4N3C$*#(*$*7%wOo;W1_TLsr_iWq2aSC;0 zV<`~mH-d(S%1c)+UoO*dtqC;6vUI~9l&%Ucq^NK}%|DH=Zf~amJwU?0pgjQA(47fw zOB(&lmQhH$yw<1AwN@4hFZpmB=7IXt#?ZjqaI5lu$pa3a(p>JwKDyD#V~=lmq_2D> z1wDV>DcO!fQfp1pdE?iVi#zc{`m-bIIt{HX^k7caWi*^3nR~<;*K5=`QF%g>==Pb^y4e{ZLBtjmN$eO}~Bemj4isJmj#$$prqfwI>$INPC#U6VX5ot>Y0g>LMcaYu%L4_3%k=~{EE*(UgfWWRm z>@CI^V~Qr4cgQ>B``_8*_nrTDa!xYYnB95%eV_Y0&qcpLR5`GLMs%7cH>MnX=7^oR`glY-Kqj)Xy4!3Qf{YzHjldH8SA zA=2TjeRQr0^S0vW`WLN$Lpuc82irpzJbOF25oM`Bx6LEjV3bEIN9F=>pJ^)qI?GGI ziCw37j@h0-s+F8?S#SY`mVt z9$0)9VYznMHW}7}j`Z-Z(CZ;Ul8C%ahZ}`i2RpZiF!@b6?HRph>A)=qb~oqFEf=?- z?`_5Ga)R508|Y`~`vdrU60Mc_?}^`?Drb+<>_4O2V6wll1)BEi|BW%M*_tHjyzTg~j}kQsmaXX6Z8P7Yd% zH6I@aarpjw2gQeOQRt>3$!+G=(hi0O%l2K58S z@&c&j)32wtDW@}bSX~~14`MC+p@%cKf9ga8h0KVsHSSw1_gXfY)EZXs^O21K-Z0QQ z1X@_=(xSoqRrIR%emj4K+6cqLN3_@5x;44fIn`);Fg5Pg&Xo?z0df($V=E#0YP$wh zXwapBYI6XT;Q6_EdAa#oHH^dDd|Jz+-l_I`j3;wKn(L$jvLTm3nA^v~F+@;O2#i5aZ)t~un z|6LS_-e4E9s=c(Qu%CjgbsWBX0UO2Y#OR%IxBd^q=K=9%9>aeiYHhjt^y>4=$X~>M zMBzB%YGq2*l^T!?`QxS5Yc=-+TROLBK5*tUARzO2k39%B87|GIHUO*bYwJdR=3&`n z<4wqN>>zyAY)^man|jr_SGtv%I53qyl^#`2I;W4h?)0gK`Ev0t48+nd$g2(jk3IKV zR&i#TUJ0|0T~50k(G+eoY(B;GR<+gEH-eg(@HVtJHMI>Y_9=ENvH zg;Yn-h3{|xS_QF>CH|ae(bXz{*?lXm670gL|XTiz61z>`jv1$8K)m}GSY}QfCbYUe^Kmb5^fCvJ_>(j6%b#w;;kVV!P;fK6?uU5;sKZa0Fh zyRW*ft{%t--h|IdTXVzH9+mFpuBE1qOod;CSCyNghsGKCz*-pofD!b~hi*th-NNU| z%))=PqSPWl3!pK7e>Lky<6q~BB)5<)MCwHZ+|Jg}EU*)}2iO+Y_G~yEr5&jgsYhW( z6_lmEvfkgi?;Wuou<5lkR?^TudvFH=%pn2im^OroytaL{fk9LlLA^b`oc?zy&YVm*tldIs|&{bL!EW zQQFi_;X@*LW59ObeeKrQZJSOzD41)VFlsYkhWoq5o9;H+R@;?1cJ?zKP4=x8U7b9i zdUXmq06(~yygGPw^y;KaGBd!vrF}|(B2k(z&ig*^J@q3IgTM5L^}mUl-3G8RcY=RA zCLTsZdSdn%!F`H*XcUHqa2OsU@kcx~elQhn&O(B`^fPHb>E07njQM-xHz!}{crfLb zWhP}OH-@f>#4<6%_lEueN*G8@_hS=fETiv{rpb5mDEk%6n8UamR6`&<))$?+WD0jD zV1^O5Dl3LpqiObY3HSMX^4-MCI}d-pqbBDztFc3*yxQRt`^`Xi&K>4=;lFo*?F_e= zh-eP453fEP&SZOLxn(+0+&9>F3hkIZiFZr^em|!P`UZ7Ykv#3A>wLtP+QJ=BWe-5e z?ims0v&vTFaLM^n4gj2=0SUY8=4#|DH6fTFAGS`n-fpKRxElV)?tv^w6gI0^QXpq;aZc;_ADN6e|=9iW*|C#`+8Jq|ij zhqx_jfJ?}dUJ>EGt87Ge@Y8&oza;w0OZ!$MdG?D*?u#Dsanp43cnbh8b>vytV>I3B zEo+Ty^aUf8ZUfG}PMrdDJ`X;vF|RsVp(7Zp@)&lz>Dn#5uWy>Qqd9+y2yYCl4Xu(3 zXL7tieeObWpJUeeKjGJdbYc zCZo;0Napts<{u0{=yZ-UYlqkM%C_DZ>3Gr%E5lU6WfDcL#T_NxiiM1~k*ARd7!gzx z=z%KDGdcHKD;k|RT77@4Orfx(sjR(1>O1lG&RH`c?Guqr5w#IjN5Yv*uXOixc(-NP zZyF|w0p2mqcbXB_g=sk;;RZ;&9Y75ss)!*k$_HrMnOj>ZIO2I;yxoaRrekGcNeJ7XD`2hIRvHV6bzl z@p-dmpZU1^3r8dygsi}YLx#whGP+>(sxV*3eG_*AD&*l@g3 zz`jEZX#5Wm(Fj9Tp%}?X)5+3lbW(!8m_2~MkN~v|UKkj(UH}G+<2|H*RAeBq0zDGk z_;~p((ObeN#g);}*qj>q2-VS*UZq}zUO~Zu!2zNEm1iows&X^(GIO&)Mq*9-mH3o+ zlw@Quh#`Lh-TXa#J*iN%fzHUz$WG7E%wjb69aPz1)MUYAq-22HpvTrLw9UDH-y}d=ieUeOjy109|_}F<_ z`oLP+on`fNbw1gx*R22#)Mh(cE<~|}K%g>fX zUXzbtG6T~C(&2=ihqWfr!r5JT@g&lfUMhgcpvry#(yMP+q~|IJV6WLqHTKH@c`WOP zy%2wSOR)E-vNrdDoQ-DF={W)Zfsg_g>;s}Dp)4!20s@Mv%WeF0w~h6QJ$o)PA|^1N z0^29Au*}lcQ>+9>XNvWK3m zkw6#iI*QczZw9XhJ=z+t)xh)j9t2kZvnOJ-_y*dmTFS7Y zc#MXa)*bso{`^O+7GRwHI*CF7*r8CEb|WBn>@lE;&ag9z07q@6H9db?`wTC+i@$#n zOx7x* zrA}N%GCKK8+|KicF+u0UqR&N&C{H3dIyG-Kn}7rpkbjC$#}Ql9e*w@t`6Sj|hZpu( z0eb<_w~%ErDyD97IfQYMch{;BVyAKs-Z}i9kIjFH>!5+e ziJ-t3BYi;}y(&QDpWvIAsma_WdZerK5$N9&F*u#I!$u3j=%pwSh$r|O7%BMf@H*zE zJLJ#QOqM+;e0d_9K{pd<{m@dKLakg)!C+x%zyFBmgn<2ot)q=xJ5JV{mRJe;>U>(9 zy3GI8VBCXTwHDhn#x;?uppSplK%Vf=`T9a@p0{=}HZB|XrxWQ&DF^K>%=gLl$@Up+ zW~|4w?jHXBlq*x=0zsoIUKWIxhvToJ+OOY`jQmQmUyjcmA=n$ByT%mv6jAI`l6#6Z z=-CbE(wsYf3O)>$&iIfJf7xrnJVslak@_X%Kt18lZIl84kQM@QwmE;9+?O;kyy91+ zzY%XFwQ&SbD%2-LzL6om(IDvmv*2aX-Lmj;#yr3+C7GMzXczwn7I)ABfOWnGd`$> zmkt^;?Juj}<|7$!ra^x%z^KaVEwUnkeN{;RiLBN`<`}&KqZ&|Kyav_9YyQnydq^?O zE#`Iz|NcVEZJ%9?ei6?l2+kUxdAXWVOy9d9Hp(PXw!h`s! z>MUq+?*rC*Q4E1mg{1Uu;S-8Ym2fdcYHLbIN*AC)=S-qa&q9A5q@UlEZq6FR$-8Ck z#0O-6LEiW=GFm(Nf%kFP{!VQJHu?Zijlnzh4R{MV`wNbu=f<#!1Q>1ukPS(~4K{8q^&0OO1 z@U0(#GE1>WH0L$NehUeEUvm#DXWPjWwKi}?_V5Zbj1PYWywpFT1c*nX+N6>zed%S@ zm-<8vZr8OtYdR}>ih20*fpoa+&;Tum$8qHy*uBr=j2QqOM4L#TFra-XB<2a{KZL!V zkFhoJorgf@_U1CMH}WRgEEx!THjn{5zO6p>YG;@d*K1CB4ir9!t!L26+2eS{49FH$ zfQSiPtX6;ZV#eRh+tMA-^)JzOMFItKmJp2p$}Zl*58^L?oT;LJxFy_1A-fU(HG}?Q zcZj(i>=G6{ow|UphF8$)t_|vS3N`zIcjWTK>8^uBz>Zy}Jr(Q~%;bSj)OEM%Ud02A zfB8h0XFsFC(r+K`#trzeDtj9HP9tCRn*{uc+);m(7*~NXbpi|)iOiae+O&q_nT#`D zt|q%tp;M0;>+BtBxkI&b`ZWAuf7tB(`MyH^vmj>rUo?CBf6*+6av|*-iSx+IEs5=y zx~X4KDv1YV@EFx@ltV9cYsg`)`innP99JaspZMjdd_ym*2U&UQsAi@Ed*IayH349i3vzceA*pvnvMv7S+$2ou|(Rb zbnA4NGKH!W^>#H5HGx&4dQtUIIa;9C$b{_&{3m6I$1yER0`}H!DuZZxhzheyh5EsV)}Swt}hV5Jq18`>xRCx@x*&iVgmYd z95FRWISF|JoIe{R;bh3Ln$U{SGUA4SBh$0UA3oUMo~i!4@%WHSBJ{nC9Xj>dlv;EhdT z^!5KY`gQ0SKl=BmlW%*iR4n$w{B( zu*nHzatH_NqQK3P-%$1~oc#nv4B?1}$Q4ZRP!)}2k7C&e1YRwJWaY5zL&Aas%G}op zvUzF^A*rC4$mx7lie!?2J9U2@?GWOfRLoO;l zt-gbScl7+3qWx7WjfQTP_I4I79lA_=ZBuhqM`~1BbVk&DV?_HPb-28A5$R$~UBvU_ z@W&!)lqSP-LSSDCA*13WBUa!@>H3iiR}0X0Q!vmyV%ey}yl5Z2-SB_3Vlwa9RY2fd zIK63B4|$2P7s^F)lDT{WU4@%q9nQt|MB1hF^c67ip|@_&E`>-picG;vA*pcf+hOcE zgJpiW&~vGIx&p~+)_}%bCcq%@qN~WE-xhsrk7Rt%>PU1Hd?Y1!gt*urKQyvJkr3%# zI+19=6FIW*S-88Y;1YjQD@r3u;~dX_K2n5sl_S|&N*DkB4_OmaubSuOTk zTFT5V8VX&8exdYP!?2gPgRL=rcAFST*wa(A<9#;p`H8d`?+)R@r`< zeS}{ku>uzJoK1C9Lc3|$Y8Y$Wc42yNw@g$?z^h|!UNo)i(5Kd-Q)vkPQy#sxw@!-r zQF%981RNM7M`r2F$594s zC+i+ZrlGTHplr;jltGW?J zR@qt9qf^FAKY@rP6<@?*>L?6i*jC}}mtgn;)UDtN*qkn+6ftfk8?!4BU*Rd{?hC=68Q6~uZL?kN z&<!=kKqODfKFp7E5B=v9Qd*|RWwxAfW_Y~2^&f_bX0Z~_reQ8^Vpw2 zCRq;>l#hV+qrL{N_(xl{dd-GMD+bzn1}!=mQ+a@?7@R6-O9 zdvI(P#LElIf33V%6*kUjd1?A-hEV7iw1xzK3t;TM1X|Tga1BH+;V$(O&4&->6I>g( zMc8Z?9{g4bI!^k&JwSdaXDZ-*%{Lz3z5Zx{8q-u>Cw<>T5;lgcZ7uI8>eeZj4u=p; z)7*dmK5j4Sf@YX+lHa}dD12K>MMG6>HT8-;Pn+*Nc6hBaZ}RuW)0b~1eldeyC=&PuqG|pKzaYUWEsfS@=>yzhZNMUxNnhTN(oN*bn;^ns z{^UPA@FbEQ#j?-P;!$pfd=J`CW5-_O>!yFzygbn3x^X%u`}V_*=m0K- z)fojvMHShPQjh>((^yPI2}AuNg94*G0YXwFTtc!cR%ei4PrD0TBtl-IL5*?-)E|F^ z^clR?4%0?>!H5IXhsYN6O$FL3%w%Tia9YiO7|Zlyx*Km4+%C67D^H>?b>LFUPm7JS z-vWmh#HNu=~7^$o6=BDp)I^u=uvyZrYLg)jv# z)88ciZji*F%Z0R2NSW$2<=o?fp-lfLzSCY~0=xkorT2)fQEPM6{g-7mRNXVL7d4NU7``L4wBs8@}CwR>&bay(aK`(HMWj-#ps! z3#CJ#4gY*aw~K00AorJ>)0Of_qkxIkJ?j_}5fK#->j6D$0MrXWE06-@+DW|%_gkv~ z5ai_Gj^w?~W{;lSs68|ExcyBPl2OfM&@X3b&A>9-VzX;Tg7I?y&NJ;EEdq3|nLg<< zxwG#;qk>?h#a?3gNa?kJYXW~?7;V;s)KQf+!yCOyAfV9gL`&`ry`cuVO8#v6dlfVh zUm=RxbGtM86jPZf!;n+HCKO&d7cahnri~=CB7$21MrbGvP2)5?O``8)P!c>R!7~Ri zC4F&w*lwSL(7PosGG8bB#`kV~K5Y_O24>y4@`9V0{?C2C^Bxy~frx(s{g15pZ&@M# z(=)R&Ffft30{DT+hk;3u4op%3eJbRdVcv->T|sw7bYN7#S%1L|^V*Tp$=qoH+J(>K zU=^S$T*Qs4>{|)G2wR->9c+!x!)^uA8$Cs=hu0Iy;IWg?qIs1$zd3M+%f67Ypnm@@ z$mSq<7~tu@*GYXokq&d?9#4c2vLHE>W>xb!)7JG2S#VeSVyV7Kcb%j37~nfAMNKbE|Q6db$wI;|a0 zV^XPKrU4`64RAG_9ca=QjGtSTnhw@&gHK&w*gv+qE5Il5k92>7s4OKnJHH^a|H@0= zPeV1vHZm+aGAtGh<*_%9;8w0i#!6tBs!{1Ox(cQ68#pqY4W+s8S%MA6PssGb)N3il zz|@QJit-5u+K@MZ2Al#k;VBz(kbst~qaU*&hvCRZYh?a=!i%_FbdbEevW*tJ|Mki0 z2Su;cG8y317r}o!m8axp<>zJgq&(%{Ni*6$5-3-pv3~GQXFx`per+{UQNo6#VVURP zDqw%$73emE>%GQJ78N$IO?ft+Za0E<-}M86{;i{3%5|C$#Jdce-O+j|-2^V86Eu>j zVu^%6l71RXW{?DSO9`MGNOFSkjg0VHbv!9oYyN$>w3dJMt!4$B8RtET_LFEST%WaY zkH{{$1*66ndeYjzpxngizY1dgG( zi{tD?@RGj>#RkUMi&`9*mVOL;pCAnn-P0#W?3tFqDsj<6Sm|smz%vaXfX_|O&(3VQ zBIaRE({t{TQRmKuUEt@0BjFaBRR$6)MX-6$sdj${Tb7Fin0IGEG}U5TWnbhZ7;f>e zc5SeQ9bzH~j0*ZRTJ)+;!lxeH)`Nx<(#TiD-ltEX$3yrrS&BcSu??UFHn@sJ&ODAL z`wGeKB%n0Fep;P~sy8CRtv)$aBoILFP>J6E?!rHRx+N9XznB~Vlu<}>Ka>iHQUEN7Ps`y-4Ol4%- zxxot(3Y{G%=3=;N+E>m|$y5WTaksePQQ3cM4d_M}kc06)0$|{io6(VcpEsY?Kj#t^ z866dN9vmL93jj5l(2de*tX=LlvNHNf!zEs(i|Ms@io8JQt8dV+uY`2T*E$H~!_ zwv&#d)FN3^FF&CT%87RK;IlUNP?x0#!csyUr%OObabL z0un+Lf+K;Dr#u2W3oNr-11XQg6DvY7^Z_Ejs-P*qo$7=fN=ji$(UoHDG$w!Wu$`v9 zS&K1KS5aPH)B-6IBH(m@Q-B-DygBDVz^9bCt)Mm{4uB`9se7wl&B+o|7zUp|eVy>DRT6(dsD|`EtH=Ldtsy-nH?lxF&a;VqeDRg&4}mfvT9dTx z$^p#y^ESR;7F^M~YLIRwNHtHl$+T0~I&OZ@1!9+(a&hbUaJpxvPo`g!R`D5at=QrP-Xk=^;nk#=9=|nX|wM2Ks zG{s)O(20s#dB0zXpzXkEqs^?=s^qj_xEZG4b<1wS+?TLhn3#@(%CApNV7yj&*G~C% zL*~`Y^ba@RHJH|zRG0!4!)efNz5uSe z#B3N)eJrhe?3)}b0NsDlBjP&ad;0kssL>^p1klUv#?N7qA9TfEYV8EY&CTaw3F?m1q$zMXn)9xZ>OHc`z)5fW(DF=4VH z#=-G{BJU#C&d_UNW#Lt0FClZ=gc!{-#(j<5c2l{S!kBBZ#lce%zs8`?DRfJWmk{mk zF7>DD&FiG+P72&f41;uo`RfEENXQh0G>uGyRQoi?bQdMzfm2(Y;L87F-Q(`5v23S2 zw|wt*z3U#$A~1jRzEgzOX;;JW$%GgN#s`UjnFDVDxLD2TMBl^q*E-dVlcJ4=xxVxr zN+P?WhhwII>LP~AeC+*;Kg7QU`KV}1;-2Iq6pjJ5UTcF&U2-)<*}6^ucOgNaXdOdF4;UY(KoXN%63j!qB#(D&Z3fwA3Ze#}VY zTuFZnv^}ab`c~`|D(PaP#^>Y1$bvR;>jG=nGHbz&daow?cGEuTtkeRsJAlAf5k>x) z^`dmD(flT(c6x^w{xqE8_QK*?;x__!f^T3mYLYV~o`5YQj7G~HG%w4Zs zSpk%1cH1c$X>fIS*g7;{%*`X>AuYWm8GV0T_*;X(X>`kJyvPr)jTLYv@U1)i@TWEh zZo4t9-xs3g2}qGbQW*(*j6Fxi&8_4e5WIg^ znTbq*z{^|z9|GqJUNgEK9guMG(v5dHJ4fRI!`QnQpNn1#lnBwLq&-*U@YiRUG*!eD zrzoXqXTosVr8{OgtDTa!-R}WRw1*WljpJQ8_IWP(p6y!gZtbFSQAyFYj@-uFuIxdr zCIz4bja}?J+&E188J` z-+8%AY)sqv+XdPN1Dz0kDh7U;h7$C}*Fy9)^o3clX_#pQ5QJMZuV-D)f!&Q?pFXR6 zMLr4Md}{kS^aY;<>L8nQoAa6qfk6zZiB-UYlwxyc0!RaNxL{n_+i|A-yBu z*FAxo;Lcm0{7!&{3}}K3xOs4&nMXoOKAmRO&?8U;g?EGl3m2f^Y!{xhOJN^81*tn_ zN4#Dce+=OD6SVv~+L-`#3;2KYVF8Gn*JBe+WP-s9Q;oe2XgZLJZEs`SKUGM4i3_0B zSs9Q+NCm(4ps2Tz>gxpmbwDBdYyy9FPx%;t;Mf&{lYw$RD^yR`Wz}ZablJSMWZi@5m?)->a`mHy{I`}=!6&hQs^5Yt|ax#J>U}4 zL`bha+4;Gd-B+H%ef@$~v_oV>R8;7BKI~40`+9oO>JbwBF!br0W&9Y`lFix8xlOsS z3@zVhbjEAVq&XA;c%}N+DVaFK-%Z8g6nnN116$Z_8}WqVPE&MZwEUR|~&` ze;{TZ!CHy4;GFODpmCEa)|r5q<^yjiG7do3xYSTY2A*Z$8HVET)ocLV?l?#&O3-gu zEMY$BCkw(ae3@QH#wi5qI+%Z-wp4bK^@8Q{SH-=S z&KsSBCHE5FQ19VpWWgDOPYK_wcCsO-A+I4Hn&lYi5M&P%-~8W+ucZQl#uY-e0tb<1 zK_;Qb5illgnQhsv(uwcI8`}Km6(M9^6D;o|=VWxx={wVDZScAi_A7K8Y~;rT9oj|r zORcop$jVIkD;t02xkspbm>VG2rfx6r zXQXS)hlkFd5vZ5drQrti8F*zrn&?7BW)m>Sj{@H6dK(fC3(*OXaTVclnBR_082rSU zep5)!EN?_x(~$z$j3Y?0FT@sP_NDCX6%u4lZsKxjFyntH0*I-IM9s50G}r@v1vY{I z)>=ETo9`_+c3a5m%&P3FY)})pg}8?D4KRKu-hlKKp#e*TkazSWEkiBBEzagCFwN;r z(gvI(eZs@N|F=mfGv5=e^51J|kYg)wi;>YLoGnDzJezO_$`j+f-$9SH7<)ZMS+{W3 zj53MNa20<*c7B8If^6$9+C{%ccemra{M?vr1`kFrtb{$oan{P*lSoGNXTqB#fewCV zh@NS2+fK0C97&%@VCC`bo6`xIfLSjERvs`Bd)d#1xX;GWjedLsCf!F@eolRo;X1%@ zouHS*>TEnxhaH+#0ogtNX9oQP7j_SJ5e=Qbhzx&h4XF36ge>kg?|jc}cM2xT$tgt7 z9)r4ZkQWycc_q2vqYHLAAv}i|PX5K{GpYLsn*;d>$g}R&gu~?saAu%5fg(25K&IGR z{P$+iGR*sDH9c6t(}SAG>MZE&9M~+}g55%0VY9ILLA>YR+47MPpyqJWHq0ex6IObv@cTMUn4N4ieby_|D;xwu3aTL52ypPV z_dYH0y6t_-OUG%q7p4MuA*5{C`^NFkhYn)LVaLWnM!QaO`^A;9TRv5i1&6(!au%7N)m`oN>d}cgZq4k!O8rZX})nbq#-nj!k)a| ztUf?IT<~%O{OMu*5!eQo)s)s1HBf)tlRNFO=K)j*z6Nm2A|Z)iV|m&m%srf6Usi7= z8ghr(TV30 zV-jui9Iv}gq|{ulNvPAh!koi|?RtfsH!PX!z10InBNc|V4h?~wzAqyX6Azj0_$E=l zgt_Qw6=%Hiq{t%CE*a`2Acue3*Z~qDiDR5tdPc06tpSLB9af9L?klfpJQm$exRWGU zhvPL+Ja-8nM{CjNBlvT)gzU-e$Z5^D9binnP6nKSh%@kZ7rV`1g3ZA?TA<ixjtE7fm+iHgbL`x~i>ekV5gpoZU0l7`byz`k7nJ;7^R(%n?N6>~o?poXvp4rxkw(Si-rari8@H62eTzW07nKrd%^?D6Ayu@<7 z?*29-X7FLhYq0jJ&@VG6GVJJN+$GKudr1lUC<`r4LIP0#+L92FzM|jawHtx4fo){o z;;kFu?u}h#Q1uv=L0g}V9zbiKjltjEje+8~G&Qn2h~KN!g9=S^rF+#PBBL{{JGB>V z;r;O%M=*a}0*`kErm&^pdLEQEkW3DcZvh9C{={4980P}gXQiro;#*6;^vOq~_aAiq zOy%POF)GLw)`-%^;Ox21^DscpGW_1$eG(2L~bq&t@nd z{!2Uwf@Ao%Wv|h)?b2gl-K-Kla~!WS{GN#Mh&mGy80zO6;2uXEJ{x-?*T-$oS~k^O5nCBN2NkF6qjOUw-Jv zOYZ%7WBrtovL2b-W_?Bavo3-ruhi_+f|McwQp4cLXN}v(LHGO!2i!)D#GEH*3e%gv zur!e+8KoH|nQ*D~3HJ{7iG+c=E!ISOLaet&_!kV*X^22l|~@oRN;Rs z<)r%a3+6k5okYhWG=ApsD%?UmXCN=8qtVu;rsUJn}cg5rFbe*CMkKY=P7X!~)Pmuwoy8b7yr=Z2`10v>e+ z>}2_UG2C@iTThpLy7#W|g=zCJv$y-WSo_5^TF}VbD=SiSN4Yi{ijet%pUN*nREndpAGd%M`9wjb zf&$nCmbD-*D_zq&w0SPVqb0+{lS59M{!crM^I-gt?rtj%-hcRpz0mE0@5B(Q^1qKytJ zsqQd>RKttD>B+&zH};RJO`Aaf9`DkcJoRD%Ev!QulHq-;az%%7_X!5G z0^j&Q^PLfZ+IxRKP`lg5F@&cCYJxN*A-8VZwq^t7*LU~c_W#~#KBn|w^YsBn;g#|| zjZv_<;d@~tUuXV8L-UZw{qyOsxZh4MxqwD_)XWTNw7_rYN` ziD@GgtLV}d8v{7CuoA7mjO3`>Vw^*yw5D_>_rQb=#0GzMcpIDx{H(9bZ_aHm-Bi7| z@fgK#pGTpw=LLR~7HW{xy2c?`2Qw$J>W|dc0eG z8v7aRBFjSa!rspMfx>Yh+c}WQxiCn1>M6_v@ON^`a>%sH%&*9;$_A~+al+Tw!NSyz z!pCOKX@h^DB8Nho0y9BxQE+Qui*KU<4J6XRwm!CQHa$K}RZH>p{8r;4hWi4mK+02cD?^q5txKJ$EV7?RF_XHTHzWS#GIw{E-oe#WrIu+pfMN<*5XQ0l=DN^)ak{!D#2 z3rCO=*o>;2Qngq0t<+~mDu?9qR3Uw@O)tJEt!QAA~<{ow7fzaQ!L zW8Drd3v6nLObsz4k00SLXxZ=nI8I=><uuzx7F>LSxnDR|-c{4L&61tq7^t|@t>pKlzn4PcjIFkKo*!NuM{&o=^Y~jg{OO7PJx0vby9V^l zWpo^>W~0qqhv=4dZc8C5P9ASBLR}svMsz&rE+v z<{3hz^FUe?DBUtxR|Bew3$!dMh0iRZYR_TTFwXQ4a{HPgPUe^K%l z(!i+c3auAfrgu#zPg^j2Ews;f$m4%Dk3Zd>-3qrgCWQ z?p{;o#huCfUC-;ri>EUlQRojiL{?qg6>A%*>h5F`=Pa_hWGu~XwKm38t$dK!)tdh- zqdx_GnSjgytWO}WBH?_tNX#uHd|`okwE!kkZdYWJ50y8hc*pEkFlpip$g_XR(aGnM zJxhF=d~c+TBuOsarL-ZzrssoKneBmFL`g^fVCH0rWw}d@Z@b&$P_#%yiHXcRr{k>S zEJXr)kxQcIWpG4AN@K7x93XcPZW(45>N4QZ6g1}D%((+npQAz`_j7N-YD4%83&G~w z(;4qk+YB53^k0qWND}gg!Q_82u?tX#+3uW^cd)f6QWTyLk^mmpaXIPnDZEC$B6T=* zC>iY*p(_;d`Bot_F$f*X(;`}e+x@x)!oULCT$?NaNp=%#s2k0$6hoN>INYn#Ym~AX zd%VPCi?%|SKGW1y&sP(J{zn$GS7>gQeaFsn@1T$k*GzLZ$c43mygYwAl+(xzp3OKL z5^AkR(<*;2xbx2fX>3i*hS0cqETk&XEN8^Jiej zk^xDy!pV% zDvmM^w()f_EH{6yv1o*Hg9fp|YmD8|iQZ`i@Pm^I`=!SI|&yfeQRom)%diRC!#1B!G8y;8hy z90+B?&=LAQid=^yNi_VPM(5VybMN_a`hGSHju=Rnxm|zsJP$k-056Uav7xb{F<~Bt zr>qoQAe4SsH`rA-ns_DgO45~1k3p+RePA?bb!uJLs!vG1l$-!i%E>Ws!b>VkEKdN* z!2VIZPpm1#`v_KNxi*-2#k+&25PbO_EpWrTaPGpn^U)sGCQgdp@a6X_2AXPnlT$CJ zCa1Lu#Q;@6s=r!)Kb^SV$9&tXHfVQS`n7id_iK6Gj#xv8VJ~ju+x-xIWNm{p+l-{9ZK9T%?Z@GAQSsXwO)_DX&s^ON!ua}%in zGWcR3{6!%#Yc%)|L8ATK2KqU&QX}=i4_)y*g;vXahpdi&^Rg@Ye@`wfba?aZBGf#$ z2yASCWzI!Uu+i!S7Y!PWF*aI@i{>3Y57GHb^_u_hA++@p$e2_dGp!il+b6KDaZ25;Z)mrz{(ByxrC=U3AgkjcU_ zI_e{woRS*rF{#PQ4NvI(TQ|=b2$!UU`;Gn;8E=7q*aI1Z;B^x={vAr1g6Vb^{Tnjg z%zv(mQ-IsnrdMYO0+kyL@p18SadCp1CgU%f(7a5<2*9h_mVkSo4^Vtv5*+#Z8Xx$) z=m0Es{ETyk#lFTBFVNU=rq$_&#W1KhF42x^*7~Mq1E-np8?B=aQ&94Q^#YeB9zX{w zB2@5yyt)D^jUfGT8tX%1S09))&>+?hQsLmZ^Mfk-0jqLrRKbrAN-$yyPTGBYn?dA$ z>;qbiR!qU==_+S2!&;;e<9IXr6bqn;@}llB1|RwjgSuNCEv3*C@X7#FG^y?FH&P$? zsoBMFT0SHdu_|5!l7XXGhW}C_7zZy!ax=((n!3XMM_90(ffSf4)URb%q!5!(g>VTz z2$}`iF3_+XM_=GYXq`IROQ8p1ZiO_b%&p{GFgQC8eqkdCyVObi$+4}K@=X8Z_LsH4 zQ{3e#wumgVuQqAW25&v{A&VQ9om3C{TnyNyu`&$F783Q$?W2cIbxc*wPOKM2$6HP&ePqgi#!G*xM@bl5{43e2eK3$`&1(U2L*5rV`i!XwNp*w;cw9tudgmcb%e+W13Xx45Jpj2SyA zs8#nZp|_~3axU9bLX99BSV8klsvFCGm2ItCrDy{0l*Ax zS5A?#y^`7QX>E@h(<;MqEpS`#7;*1+?Gd027|NLeQGM}7tiGoSumgiXpe)pqF{lom z%x#-tw#OQ_6nABs1zgGr_0hcL{SAGHs|oxy1WiAoPlnLGV&qV{ zxo!8boZ$&o(}Sm*G??ej)4ju^y#}{T?pU_pVpLmoyH4GdylzKS0r-A@HsR%D{#f3< z{2w4@auFifIirDBxEIM7B7ra3An_Ua*B= zgX)LZ*#J_$1%|b0xJF!dk3s_wT8*B^+Rjco3#r4$17p#0D>S#`X zl=?6kxr)$l6#f%X4L~G+I>CPE@SFktYyOM;y9Fs;S3Rz}jg~P!KX^QKxvv+%WV*nG z%+@^eBp3jf-)Q`)3kkHZF)G-?Y>ih~#t9e_)Ipay)tEQxH{JT*iW&Vk)-hIrUfm!B zY!!O-6rO*4Gr!cHw7#l=UQNEkN*!)dIqZ2Ajgf4i6Cz+X@xJO!eCP~I|d6IA;~eGo_bZoH>AQRCK~*F5JN zb;d8kDc;~RldD-6mm8NY5_F4da{ykdNqu(-u2IJ1v%NS!Nu^zMTr@D~L1WYVlA=n|VB4>v#LtyGK zANeRjmKpCold6uk6(v|ET3@ySIe=%X20B!pbmsDzWFJAAMW#)Ty}ZF5n@t`q`pl0d z&srV~riP}5riZql==A80?-DhPl%UUnOD7wD8ffgtQ|XGGJI|%XrpKlacJ~c;OHS4^ zc7|3ardAPkXB(qiFXUXzjmtwNoy^&Be9ioP^TpQqb^%IiIy*5R?l5W)i?mzTpDuF{ z^f&s{IyRZN^Y`50*-xRx3rSB5MczrZ4V7|C=i`P~6>zRzk^Fyby$4hkSKBsh6lP9; z5@QnMm^qqgV(-QtH5Q}^h)5HV-n&Q#0TB>UQ4tZ4-h1yIL97C7h3%x?F-@2g;6%`-33sZc^y*z&sNfK``d@YS{DWS=Th69@%w zKujAI{|eS2IN+chuHtewNgd#>o}#jUYjcIpn?&M1@rj~J$fB~%G~Ei zASAJz92iE$VlfFAhH-9TQ~sr#UbP(FTl3IfH$4eXrdJ9)IuEwFH%WCoia?1h(3jFB z>co$MBiuSJ&$-a5Y`^#%x~$u+8zuekMivtzHLR7N1A>Ba{kbunthyX&y4G7YkBWbh z$l^wX^YZbZB&_6$tjhIjRk7HAnv9xawUi8!k4BIzl)u3o6w6t6${W*$N}AA9w|KsPe<+Jd!n?W>S|j?F2m#~e-O-!kh~9gfwS)t8oC`gOERN@Oc{FhME5w&zhhO~nD*NQ?_EB#2m{v`?9xEz;! z>k^}?E4*!oO|xyCq?=3`1RCqWZeS$wm_J89d~tv(sx3u7v^}hUeO~;VM3#6>NN0hw z`HO>{y~Qe#X{^SYF5mIPeC-M({v~%GzG)*6u@Ng)l=jeqTy&a&-1vGJ6R_Eoc6>H5;sT@n>{4ODx}V^444Ns>df2_}PEL zczF< zh};^g1o(37!1>#;PjqAX6l}luaD%bV~<0pW2@xH+e15uwkFUS zlQhUA1WYrn=!bh37Af&Hx66Ladk!1DK_MFW4(Pr?UvwEDjmsGF!BvQWVETSQQ2c>&Q8pg$fl7VF3+Z9f29V-k@+>tUaJnt&|iap^T>X6x}Qoki6j!kXqpL~q_!Lz zNXwn-C&l7EH;m~lTwTG@--pTX>J0rIK9bkS@4M;m;xZxl3%_#Ye;EI5UaD@|P~$0k zl>a#MM-)N6XA>GOw8V8NC!kWXYd_q~MOB^l?%LbMze@g4=T6d@hoNe|(PHtMP4p{` zW?0F8uDbo^4XhR7vd-g12k3%V2$yFrZHB|@@;~R1Z*_>;xu&yi(Vg%ym3cu0NZ0Z9 zj;pGT+S0BX>u#OlZFi+)noJ4Q&6#`X3?=$GJUSsy)JJA^kvV&E^b{9QMSE>q|=;iC=vheMwY!Nb%fY*1CPj<27p3Ieh zqj6wWL8hF(ot>vf09H8;MVjfPNUBk;D2poKbk`|w->3m6-=`xt9`yc-V;6dc7z!s5 z_YF~R@QL4~Jj=OT?0A*m=Cs6tKQ`a)wVzJa2JKk^QKQ@o{b{kzcdujtB z^ri~cTK(p}p@#bfFC_i4^(^e9IpWE9s@iKC8ya7B>hm9wmic1+90w* z`no!=HQz=`3ppVdvtjRRE<>VV^xn$d#Y%ZnJiCLO@PIiPaw_a(RJd#w zzsh)p-BJ$;8QnFJ#%h!}56pp}PQ~ehgp7>Loa8Zp>qRc(!lV0w4u^(+21Vjykf1O;2@IQI zp%-}e^AK9yyOJ)TUoUFHX0eJezmp$2h$l2&@3P~`uQ-hjyS8uH?cU|t>j#dzlhQX0yRUTR94&bw zMwkaFNnlkM0UU?p!=`Fr{Jwnxr0b-=$PD~50{;TE;fc@X2C-f__ zkt(!-t~_~k)x({?-nlf?cX`wrjO8n6>M{}ZG%apPJ`6U zve&fLq7s3wpPX!qL&s}62ZrP~G_UNf)swchn)m8mRqvI9dp{em2P^3&*eCU-qJK`C zZkuYG)B|J_W0TSSmrZKSq#f-RZ3e9xZBnEXaybk7(SFJz?{M7>Zo!k=$cIhjGtE4n z=w@>zt2?*e(%4~t{+$Dzbg%-4Bewi)!=ujoy1!YFX)YCbP?PgkR_$o}ak%e6%?tSJ zglqm~q-+ps`b5LUl#nGtxR+&G)XcYBAvd?(Tf}&#Y!-N4Btf zMF$~@&ks`u%)rE~xyZ2mBVW1ii9m}DG)xt8N;9)ztf}!kFCQJ4@k3B>Mc^d4h$H!nN*06&8E$yO{Y}~ukRwxnob24 zUzaj?Y?sJ?los-FJ(-TjCa!87b<`(+~vqt>} zX%Iby; zvH_u;*vc9QgnyWCCKhs*)&n}N`W5@7EiE>k#+UbYO4kV4U=*__R|W6%)b-Feu~2pf z#NcLsMQ2-SU)gZlFK5JT)u;|DteJ4>7K6wsNj2c6-f@uh{ZUowWnyHz9{d z%BwhK=9JEH^Dq}{`U(AF19dhLwThiCli5#yyUDaZIHS*BM|_P7Asrslf{omO%sW?l zwlcZ~7!`NUS>0CG{6M!2-_lXrS8*N68)7730M!uMNOS4U@nz&Dy-vOm_+c6U8i(mI zSv@C9CVPcsx|fkXqf zW4A`*ax;+Y4_ttt<8T*L9;k zbvIK>ld2Nys_E1_OOY59)jy|>?Rf2fF7lf8k5V`0Oz!Et(}>_^?q+4S6Z5!3%UrkG zYmIvGmDh_N=Dg5K<4Ir$ZX;=T!uAX6alxSvL+^x);x-cD@tdcXxixLI^m?lQ6Q6sY zH>E@`9fo}k%C%dn)_`tf`;*mu%NtVJW3X`Ag4%prJrBG4yZd^W7aYjlpP7+=lOZB$ zh)M)!o^v4GBqcE`Av+#mwC|Wu%MhzTTgf`G8e-G&m7#h8)y?@k(YFdq8ua*-q?DAD z)K>o%&lWd5T~)L1oyxE@c>M*atx69$1!RR>%zb2>0r@lxvJ`FaGDSn(y91=+cIIsOHHCH}R49lTP-{#xe- z30cxbR}PTbopg5ZZ;%-FWXNWjHdJ_)Xo)4)B`6uuCB0;c4)czD0575|kweBP#M#s?$u?KRhf5_(i!`qc+4Ejqq@FUDZ6c`sQo%ck>2|JIaDD z@kHYo=W?Lmv(K^DOj_B0tyjILRINZh5T%F@bsbP!ou%=!-U^#j5{_)ptMn1SiW{A2cQ=wFDNWb1nKlpYtis*lT-hV_s93ZQ9%hz0C zF0e$h>DK`%iG_BRv*$|?W zOlNdTX<`EBU~l7W;bG#c=e5Tl-tM=H`-)qN>I>>C8^FHi;psFFEL|g89mjoe1+=f+ z>&#ceGqB5reqcm@Ay&G~6X7P=2!vBJ`LO?QBQndJY_J20j;<)7Giv5Hbyc+1G&Jgz z$ajhQ@n+Phzab}8KnFcV?Y!v<^A%uz)!)x2Od|B<5s(OD!ZvEaoGv_FR6MJl939(7 z(m-K9N8fR!Og5cWLzye9jI{R{?X-bk`|aAHOP2@QH2RHyZrN4z^C}fOZ3l)1UN(>q zvtdAURmPAttcdC2Gss6}qV?5uTRP8=t^wHOTNoH`IYhrSS=qLq?5k|&}HV7)!KT=f-kEp>c}4eM#7#NsM2p2tZRl+ zzQWtvWNi(9^w;jfz-Yxm`l;P2>($zuHtoQC{pHc{i>5!TUl)mrYg;A5Kzh_i(Ot*% z!?m1T_eT3fAA(V_2!yD}J(V>3b#!M#!qfP>=ZH--`AH(EVa) zjMn$n4b%yNrC(=iM|yh(?7T+FBR2m%UUV3EQO_fP9!DhP*yGVn#7-5;H*9QuOv9Om zJ?Hr2^g};7#s1s=Kt84UVrxR1JPq>=f{$;giY97kAJQOop>P=TP9GBOL8|=^gt}~H z9!MVFfRPOLE?+sL2L&l;34OuH_cc;ZCJ)oegQ}X)ZMlh~iM~^tUX4+qsmPFPux&Hy zmg2yF+t0nAX^gi2p2J#4aP8eG-Kkyau$mn~9kDpE_+m*CjEmhu+>W@4*Z#}scf?MO z+HGRb)ts$8Q?GH3kD_cK{lINLu05$au{FM3ympdBo^k5RJG8zx$lA%@?i#t;J0PLI zjs5Ez6`2Q17lApX?pw8^d|mNkX@8-|FD_4i?C(p*H~olf?ATXl2o_&g&A~>SONOB9 zPf6ueAcb~vEmS5X)LIQ-Qh$12JIo?y(PcOrVe(G9M^@AkjRvauBVCS&=Hu2*9^MAi z){tFR@J}O0M?^)1KTkisIZGTno5tsGvc-T*gtJN!TO!vTPr$j>G?lE*BvW$FA3E=U zao&9>l|Mu#yS;Y)ai2e*YLQ}=WNI018g3LJ0mQ^wSWIomCS_5rk`-3dXW**fj=w_C zLv3aPvXupv9NI-f2$;uH`rHL6`EN)nz|i>!M38E-L>r5(=Ky1r6jpLsm3sa53vZgK5UDcD*Rq* zg362n_%zpK=Zg*!V@8+;tuA$BMnkBDK2=*vS2UPFe_?7jSzJPti>TTay5uqau(^X@ zK|bF@RNVF8et*VvA4pb3;tVI(Hg}VDa zEjQcl=l>H!W=Y5iaMs$X9?pj>J;PdtT83Ffq~au|nE!X_+ZxFTYkk-{$Pxg5e*#+! z5k7>&)&n(AnT}9ae&$#&Ua<|a$1%?jNoqQiW~vEqM`$vcNqmQ?FY=ytf{iSM6~322 z&2BCjS99rXhC0rKKH6-5qzKUdh8%!WH`-s(Z=mZ!zT)sVU*T`RVkV~13?yP9U&~tI z>MSGDz(UP?Tk^aLoDIhy#}Io=bbm5=gieNf{Ip?uT^&5!Fu44P^V%8yy5v0O-g)4o zqG%*kqG;1i(nNCUF2*{*&vA}3>YTQ6coWNvmX||dJ8U9E=7T4H_q7XE)LIMqh=IqI ze<$F)D*Og4LoTokxxg}z;|gf+L>mCjw?N3#o%oQQIA-H>$0x=YaP%2jqeR!xXA=?E z2Zgtq*T*B6iH$I&hdNa%)TvTg^2^NsZPQ=CIwyzmo5S+oki*>jHaRRmnyeX5=YT-b zVKr11=+e37BD8XUeLrFEjlRNYV{#oz9qXJW`(#tE3m-6j2ku+Fb}U9@Ft>5RRSg_0 z4TNte)R^%P=o1*o{Y|34Fd3RjBmM?%34;YNr9Vi-0?-dh-yg7#UO=P%V5pN!i#xR| zRL9rUU4O6n8iy8L{_m!do}%m7mlLl=-+ON{{x1l%aWq_WLP9I-attx35`U9_#xs;B5RQo7MdEL;yXXz>22I-qppAfZGiO?7-|XIT=G@tHF~B4GGw%Af zMkc269eT+)kFztA(UyEUu?H4V;W{C@{`!(t6Q-k2h^F4?_;!Y#g90cdr!`TE0F<;+ zf!LsJgSN1}4yntL&6kyGHLzdV_Zi+$ek3KY2#$e&*O|1Aq^`ssl*&EnJTp2~b!ojG zU)^4MrJ!Fz3b2#cMp30m{Rrbjo@UW*(T=CB&%l4;WJ}q}jMz3&vI>f~)Kpo1T@Hod#2=ssTWl zE@oZKO2mH__JKwgpBtZdA)ic-CzF$3W`cWbkDNnj0Ii&zsY96Pzt6sjm4>0Rd=$y- zQHGd6U|2BTBQx%21miAFW_(RB25`$5?x%u(vAWE7SRCemjR$f%^$7t+d_)INOJ&WnUGy`3*c1(w_EcS}lhA*SRSU*;qk_3C`2E%9N`%^84&PzzTMu8Np<_ii&~=4Y;fn$FVmc{Io|{M|vQ~0m}U`juwJ7TnO2e;DwymvV)sl)Ft$es?aq`H!)?` z3UB8;R?gt*sYs~7>39iwjJ4wELyY4%+1xjeD7fkKUhiS0Q%h#UCx z8hFNu)d^s;sHO2fbgIJ=ldT;95Le|iW_G}AjBG>^{LHZIjC^mICOB|(50f{Vek%zm zg5{(1g({iGc+;gORJwyoDs=gOoU*L)j0%X3Ub{^u=?w`9EZrr;{&5ck>w9z(7Bpl( z4e1?4VF?pW*GDW1at?MiKfFCUFxu^mWlV-Dlz)m&70iAbeI>o1BCjfm%#9|;CEqfa zg}I8dUFzg7A3wvX{>J*!MHZBQQ>O~Z-DH$x zl&0Z=z8ic(HVArDg@v2JEfJo*coc@v$Ck6>%Y`ZqCv}@3M}(tUU8z?R zx+Ue{#!gqG)2S;mBVDCNr@?FBCYe!7R>ToiNfDE^v~m5=cKv_w6?1KaKKn8M z`;za5IQ()cH3Kvaqglu#k2nGX9i7QsIDH{**6#qs=%WZoJqL*=qQqH@f7nrf9D;q$ zc!|f2n{X`1Zk#K;f=^gcQBhS2#~>o;{3AQO0bz34|@;igYFWdCIcOC7Ub(^(HRUe zP(XVc+S3?nii#DTMmhYSV`YzssEw@1`p|`D6q2HfFw03RNGnV&mdL&uzD<+`Q>@YG zhTCE{U=;ntkXaLd${e|axZ=+HP(jdN2dFjR&4QXRb8O;Q72#_XJ0KI`{@(gSjLIM-oIqFt^lveQFK@r=CLh<4Ihc(?Zak;yJFu{ae%MK+Ft{)w)36Y#lSxw9PpJ5+ zj;|Y?SSJq;!iCkGEQ+|RAvJl5iSRz=9f9?&Quf&h876vvjJLkGsi*Dn$grrOlX%Ev zYdV>hdM7FF@P)t&{@sPV)2RKBEo#|Xupjh0a@1?i4`Fe z#{*KN1|vB5dK+;Lf$8p$iE@%|4cT;bU3gAiZfj1rgsf#~rl7*PnYRbF`?h;aO*{?! zv;#|wU>7%kSlCh6>eYI%)wQ&Zx6QT5vC1mTDK985F)rqvT^&4ZJayp|*KX zvN(=p;5QlcbCw*Ki8hBe$4<-_KIB?r8)F*)=wFV1xj+^JddV0p+_t7@C*OOo`Dq18 z@>ZjQJzH#BX;iO;!F4!Wz^VNH;&nkhoF&-Ao*+ScLgF02bvq_(6muV|7opLn( zTDC5Kz8XYhyz?5T`QG%y&?LA6e)$53cR^WjkU{-ICdRzA;lmi6)U~8;4e~;^5A|N}BvZt!QMXWo@OKVy2#n#P9czJ# z0hRcfhyyw>0_D^qr%JOr9r4OK544yxNG`vBzp_n03OGzd zOkHeUEJQ|8l@7)rjDI4o&@ zrjOaAy2OSHO$dU#=?vgR)z=}bQQKB720^&ZvGHwO^SQ>@dR*RWx9+MK zT=(8>eo}$LwJF96Tj*A9U1NwlKG0%XZ&rmn=0_0n{lGR}sE@A^?|7yAH~#b!@rL2y zbb`}ZN z^xTVJrDljk1O|@o|a>H7>&T_yTGB`q(&PL%k+wAhgp;4()%f~hHZ;)Noc(Iet1mrqo0T3 zX*Hf}kPnZA7#`>nvX=DX+}llm!yu?W{$fNn8waf3;Rz)cqD*C+z20lfmpadPNNcZd z7+KykuSH7jk8!(puQsF#HpM7@Nt$2x+#R*(fX+BM&TR{YTb0{IXQ}KfYIcK2$Mxx~ z8^m069uw`Xishm0y&t%;=vv>soV?}96NB$TT8lkld)g;u*v>937cof%6 zrz+CZd&Xb))6)zPe2QdgALIg$mV_3C=52%70IVhw!J7C>8&-oz)=uTj#6P;in2Im7 zXUJ=c3GPY07Ch^TKjO?N|aNc`yWyQmA$hqj83Sn^pSnUwKs9^!C+Gsq|fc+>pZnS1|^ zejD@rymSMkplmN_lCf&V8fI{EGWyV$^si=T@3et$#KbWPIDT_;g94T&htl@xNU%T zFc)&+Sze%;%=>I`*k+`B)t=8O&#ua-laCG}sB`oYnX-#cp^s!GV-3Pjme++6W?~r> zx-iEQfw)U#$&WM9PCy%>;E%)^dfWKTeEDx+tA^jqrwL?#K7-?VCD+O1nr0nHHy+C6 zgRA^&y-_sSF@%dxD2Ok-P=t#=xYT^@p3RUAFR3eR&V>c;hM8lGs8FA2gd09w?OW&3 zBq7>Ew3CT1z?b+MpDhkbCcB~Wno*choK_~E>ux9rE{Eu;IrUd0`HaqPI$4LV-!CF) zcMp?k4~JfVNzT%=Q5ZGULdEigL!^I%Z$PL!+@mc|n~Uzzr)p|X)y?iaU7ng!mRuBf zE1G-+6^=KEa|0&aHOLc&Zd6!`6LiiSMH0=74sox@x#dv1qpwL5ca0P7SUY}NJmVsj`c$tlm0n`q;-nGRx8`!dv??Wqo^uKBRP@9`6A+ zNsBY4@{I37z%oTQ$u(qIKV9~U81~Cnye7^4v>9${sLzrQWvj3sb{N%}6QQ6U z42kA{El_=}VG8VWZ8NNKCqYGiC7ww1K?mgmBRaRnWvOGdZMNE>tA>jzt}3X{X_5%b z&T>6W5nhyO-IvV=7x|SQ!izMn0(>QMyJIsUCGD^3w#QNzbWBl1C{^BLSA`VNLlQwsTkEy2m}{istFo^p_Z z_`;5jjyM%|Dh#q~TFCB1h8{Z_an!^8fS0O2>bZBax{AuG(=spS#urLRCEYfEMz#_E z0qPI$S>fx6MGP^OeGTU0ZkofK#_=b9Ry8X~v0f+l3CY+!k_p3g3Ca4hWcDA0ULjcr z4O`;E-C;5grFo=y^k(r#(?c>2XF*Q-DmIt6^a~kr;w2y2VX3-TtJi@qDJ!VT!3wzg zEO(p9@<>0J;*J-EW`tw~B8c99dX-i&nVqW1zUq#9O!TEa_PK>wB^hP%;$gn9g_8}- z(yrGE2d&3QysU0Sh$6;}EK0VX`&Br&N_LPX#R~TYrL8h0cKmbr4$D4c!U~S&9?kA_ z;j@Y|ORyC6GdZrA&S{Q#x}jKi{jlz;^&_Pq&gk>vfz4OhS<_S}Hi}n&4NdTm_lx(I z%D$l*qvYdpWBM@wWz2*dnaf>aavifA((JKphU5nn`eHr#p&zmbaad2{#P!4jcdVn0 z#6(ePUPX@F^jff8#&yXRtTNdr=kJ^!iOX@ya!z;dhPm9>o=2Ns8M^TKu6ZuGu2d32 zzd1@bg_G$Bo&G^5E!8N03ZL!NA+Y-4oYM`#atM59Qmq4ba{h8x*73P3?G{TS8 z%+B2ND*ER$KgLMamG&Jl@d}O%Iv#j3S&M%c`y%$I^9y&Z*5B+H5b1Z^=VS)x1d8YW zjD3ZO^CVb&kjD~*Y8~Ysj|vRjzZ#)S`}fvIJFlvu?x}ur(~U)csKkGMjMLb$dG}IX zVDsKxeLOb&(6~`vu}~ZjgG~9~>U2Pl45-V#*-P%Q+GYl>=0QgyLr#R8ya+-`%(JtP z&n~rC;<(t;E{0Fid3?4j`u^EJ&Pl~J@@S~v91l^a=uDCp{}M$p(WrAhdp+iH?91~R zKIuMb-tFbQ?WKKxecQ(Xyv_5@@y_<9J45KAa5^=LENUW)2FSw4`W3v5m$kRG&$_6! zC)S?mE$FH2!7^xaRrd8T>AgaGf%)vAzmF=b(!W8kpZJ>FWwgqMD!LW|Un;45-E_Ch z1|+ZHvz(Lh8|Rm1zwVP(TwZ@^dE@*laUep|-Vc%K&+BD>)2JrK1>~@FO|&gF9fBi* zBZE&Q8Sp=yxpQ{-%sP`zj+=d;lyutfG?bE_pZP6@Og;zsH`X6@q5sOA?dIV;SCH2> zm+0e0Z=ZW`F2fuCRNkG{yj`b$->xwu7aq6iljTikhEwhsof$>GY9Z4hxA9cBns@Yc z^m6jnkJ@>Ea`nl<^1j;M76Z6ePN!2xiI!~IPvqwz`tv=dAL!4FkUjx~$^KVPFHE27 zpe(oy# z&oDTpqD!Rs#15S~C~lw6833`2I48qbZZE8!8%nFLZfIUnGrvqq2TyUz=Bw?gf_n+F z25k9%tNPm=R;|3SS6Ir?V-Lu&EezzG=W=2T@~g^p?*Hq@VqAG!oU6rG=Z-I?uI!n% zGnad2L5f)Sq~S>;3H6;gIXtcm)6poaDBDQf=~|mnESeJWBCsSN?kR) z^Fz~@+7MhQkEx1*R{9FrnCQUfIp_NrWGkM3GBQVE!hPrP?Lqp9?*){c*z7-weyKqD zmaZMQ%gm!`i) z@Rgg_$>&eWF3lWXkA7$!VI66GT-tJ{<@Xjc<3Ff}d2hL;_7ofm-uD71^V73oSd4dn z7-6Z}xFZk=ADew^xH???$S7psyUur=zZ_?@%0k1zK0E>+8kwQNzqM23^fC0D?HPSA*QGTo_Qd(9*uKsyLznL8L7H95RNv4fq$ad6 ztm8xqxHxGfvyMMHOw+8R>Q6MDgj02Vg{boUHT;QCWjC*}DzFp7ta7_rW4ZKywlD`L zmX%g?iZh+zc>&1JX;3Pwc+nts&YJPv96)czi}$Syg9qKwsI=XDZ(Mg=_XWLGrW&?( z@1IoqZvI^oWZXZfhH{OPhmx;SQ2&j4WZEmTQ!|(MvGTR`b1;oCJ7yYn`DW+aPV$*L z9@Qu2oNU=d?0Qw<*62ntmHu>pA{MIAsDtT=HL(N*m>#5p#DjLc0?|NQ18s4xvTwLm z&UBIo{nS5xCq(G7{wjE02FN#EKkk5jm6$IyTodu%e!U!bIsS6I(Naq_2OIHfLytpg z=YHak*-uN+ull}vf%+lcw{H;c8PNn=(bwG1(%;4^!s?jS@s8VV?^?-!bPOlq16eue zVDQ4@7l)rsu|jTcSY5TaSPFdAcFtCZEOQ`>jmdm1X;m-fd+DM!y1q{Oa@?46qYC?$ zZ`cN*rlNv^qTG@S>l)j7$8Fkc%@(=>lR_p}y}I;h$l0&U&uB*6n}evhX6;h2hAe?GuZJ^h!XTxRSDLALTaNb1dk$>y@Z61 z(s1D3@nj-c;i!z~WIJSw##%@<(m9J5DnKCuHlWq?Agz}7<+69&VgM@-(pmBgpOH-z zi{4eezi=D*h5uiZ^nGWpwA}4z8zD|ou`^#Kz03KtLY$a*b9qPv zI|MpfhFc!96tDY#k2aWk=keq7Wig!WJK6k^%OuxeOu*^z6*FeP-N9J@g zgIjI>jU%0Q=mMO{Bn5v~J#P|Mob}`CxS5a4=No<}&LjDMAQVStXS~63v)%T#7?~08 zSDcjJ3jb;l5&Ukd-l~D!*Kd%IpOP(@MgjJLPJzyr5%`MixZVDH8=0X7gRlLl+mb~I zWOg$7ECZ4@(1Yy4hBUPQw)#&7&U~(Gj!Ty7>flvJS4EW7RQEUhBq2Q`)K{crRR@AJ}kFR54_;w~?2zwdFp06o7^sS}qm# z<@KcedJd#~RfY(%&0NEog2am%7qiayM8D9^;-mMSu!{1C@;wsjds3pw1f4mSkU5Jy zR-><2T@lSZD$k@;LMK*}OlRF!9@wa^RH(|2{M7z`wiH@#^xX&&DV3Iu`!4N(;*{>N z?p57RxH+sHq-#mP8tn(s00`9x%D+H(YM6=J20Em!Zl3lK3*`T^S~ey0?0OI(CNZvG}cgL(;$`#q_nBXYzkOw)4WJ_>Op! z!w1*|+6CHMhg%=BiNrqm zM>B>;J`Z^eT@H-+uV7I6m0TKEm99X01!@}#!uD%aova}9hUh#1GUi>A|FaJ22>+4B z_3f3aLT)l$E;p%(YI#a~QYW0$Tr&-X;VgBvwR1K1D&5O>6gE^=HWYZ^T@JR3 z@8VwMT2$1Y-J3it>845A#DEPo4Z^#BI2Sq<+80V_HKal;t?C_X94Z{8wg&p9O4h(K z-E8W)RNtNBndO<`iHq?rI8=DBu&6tAAZ8S)?DKnw9(&v()GENnx!9rDt{CEvC%OIZ znL33A6(&+gM+;{|cf3nSNmF@sb(wvQW3x+J4{ugzUFJ~L2~hC47kHPrJqUS!BQ$+< z>89}moGbm%eu4Fxu;8O%SSnQb zw)nQhwnWqAHtNo{*oDR5M4f+<^h@50Y7D`>-h2J`hIHH*AfMbNKVZE!rc>;~?IP?V zr44uLf3GJq)aAy9^_WFTWLDJkA{w8%s)*0G4tmle4wts-eKL)&f!tQJ|-LSf#Qe{a=}SqeoDS;BsymSx5TLY*S2wAQOXAb*oC2a@EN%1o9LB* zEbv*nZ1`tk*Un*ZQ)DN9WM6VJ%|W4=&8SOlNNR$cqAQ(jv{ZFNwi2I@%{&{Ta|?(s z*no4{03>NYki`r%5k2z(A%-quGLgLfdVs!QZpk{~E(<%11+YjVRtjVm+PHQAH$ce0 zmNwDp+qC#^KC8fPq35ONuOD*h`ZY530r>&(>0yT;r(pDm%`w}^mb=Y=Hp}BvaZ0+9FSwQ# z+dkVX_8ro^A2VO1{GpM^hi(np5uj?_W!vmfZDGYX?Qe!Jlk+00bw)~v_1i}q9#_06 zwkRblLKe|@*K=;xewX=Dn7oI*An-r~E{y4SYNu~vKs{YLF3b%%v! zYxQ?D8StH>&5vu|lp2*8l9a%Eyzp!#L=aX$kOi_>N=CIeMHux%j@?m{M|RNAlh z97=Y>vM&MIe>s;MlcyvXff1$(W}Js*vu~4olby7v#k$O_&?rYrKc=SK@-?r1X6aIe zd29aqneCa!{q@tl_3Tf2oJ}8|&4g@ae;ql>t|zYCtDlyyXLW=oj;=FiLmEP=gG%=M z@u>%s-4dN8-)oZ@jHAJRb5(~jJ^p@2_h8jsNgQ3!e}|d6qfeDdD@&w`<*mRSvEJdKfpa!NI!clF%zVsr$f2NXl2~d!pVIlr=HUc507&~sx9SF+O$k>s#LE4lVbT8nh@2Hge9^p)bvNbYy zrsJm>hwuB}^p=|ylU3;B-6R7Zzt7=2&(axN=@JdP%^277IPZSZoiYo$o)?ZXktz`u zp@AWXUBiu{?V>Hun4Hbt!$(!root>x9Nl;^e>*QbKl#ylGDjlwW=j81gdDkSC({Y` zLmLv%k4NZ9=K8?kSohuiNCBAJSy)>^V$1Ij_*-5WBNbpAQ#eko9TDjbcZbnNZsjO>75x8nZk`mLDk~AuwOQf?asfH-&BwspL`)X ze;yXp!|;c>*4f|RGip%7t8Dsy$I9Ijm<)bQj$Wfj|5o~z<}>66*$Ym93Xn`y)bLUr z;AE#Np(=HcRqlBV1E9sA$4V>OS$be?0fO3<8;9M*`-U zie-)tW}*crU5z%`zu3K@sT%jwf9^ngSxS`#p&n6_q&UhRIez4L$Z?5K-7+NdY(AV= zfru2k{qtGdP<(-<9Hl_!$%XupZZ*8h(mGW9Ja48sy6fs4=LM`E(&`7HS%5iuXSWe^Yn-U;#do zI4GcCI3EQ=w1<4F3}34f1uY~?4`IW3>HXj?ARc!yt=Jy zPu+o5X?IymX=RyR8*lGmf9j;`>|W#BaHMrOsXy&X7FHFiypMXi)AUoBB5*tU&)Apo z64}>6A*Xj6mf5Zl4|G0p9$DL|@kHU`A4w8}{sA^SCi`qojHHwG#l!KA0;F#2itGRj zJoPJXglL$s`jLB&X+=UyQ{f8H(4!h+ErV$2pdm~@ieUJ%Q@c}>f3wuwdcT`aK;b@q zIOl5RrS^K~D#Yu}O}t~7ZK-8hOtdGedb5~pQGLurnG6}>Mw{sre zZvHNTcK%jDrlI8qe0N4mMny(hdTCBcpGCAdS`r}NWeqJqb zZ6KX|7)(AD`i#{qa)HnBW(L|2e%zlIUZ?(?=QF_n;Jx_%ijo5U& ztG#Ws>6v;aZ@bkO2rv%kewoP*3`T z$-sV;P_qjde^w9|e4#AsGEsG-PsrB3Ff@FReURdKWicJcd-OZC%H*>p`H4w=NNB-bU|HPaQJec*=5lT~kYQND66b}DkD zE4=91!*pZVoxYI=y}wBWr_qTqrdgH_Aj%WERkm35e_slt;HzvU4?q%3hC@XvN5X*@o{NWc# zMkf}?e~+DCi)GJ(8$tmYVNb3+sdMVk38M&?(2&q00mnR}9e}!ajLuNz&(xJi7tU^q zE{RXeNK22ei0M3A67%jHC|469YNV3E4OQWR1+BdCf+VlF@sb3MVqorCMw7*FLGN$V z4ZGP<@t5+y5VxV9cdenx;gMKVSl}Ly%g{jH_m>8(K@Yl*PQsPPg;MjdJbYN9P?nRq$AeVMQJ~~GgfC))%laP zb*CC;Lw+*8Ts_oT{mwK{~_vsT}hdyir@U%i_`|cKEY}(TD^vT zybX1*wz8)3x+)3%XGHjct!=JoD}wxf+K?=miOalzvOHA40R#66^_0+Z1~$d@oHi{~ z2PByl)iXtR4hLvci8l2gqCzg}D$gc|e}?IyI`&FUM|D$$q(i2xK_0TEt~Q4peZ@)8 zJ05_T{)l*W@=H82NRK>J+Duc$Z$}`xLN{`U91ps>A3Rv$SZtlQ--566u5>GMG;`-tgk3_e4r~Nv+j8FI<6d3Lmf9(w8 zd$+Slww%f-K2JtME|;??M<(c}}a-w!;hC@HV5Xws?VZzI4_Cl(-?EkZIB z*}xB4jCeBT=i5ZFhRm)Kd74uQyS@dCujx-Wlj*i(qlEYj1A%^e;B;5>EEsRvozg$4 zEP?*6@Hwof4P9Ezsw@j^VIzB}f5N`bM4q63E_84@H`q$5ph&;bCN|rt+CHKNh__p4 zkoSN6NwoPf#FL`&mo8b~L)YIShJDyW(<+iH6RIVbdg=FYi4MyN%hUkUDDZ;ZB^nm> z(NH*5X6%T9B6!4M_QCf4P-n`7pOO~w*1g$H5;blPk$?djFrcJG6Ni*Ef2cP*-i|@N z%5C0ZDmf{k!$1vx>a<)#wdnwV|8YIatWf%SOumq99u_u}PlxE(-|Qc;FOnbUIrs4s z9x^@7U&}?;Vt>0U-*mZrF!$EJM4pt))DO-%kYSQ)B<;!!Y4B_H?2zxMOX2;B8bArX z3@GucL-Y%i#lRBxiE0@0f5{KCNcgyv4YNPu6ykm@kk4pMY6HcuRHlB5&|XSA!90IX zA$FYQsyM2?jisu77xs}KG8Bzji$Wh5E1zMoZ^Wj?r(L{Q5!(Z*)d}lkUNDC^77`_@ zaJWOoBra(#m?y=h;XR6w?76`OZS_)eR_}4(%SZAbW{8%~qyvuCfBw}6Dj+f@?ag=Z zcI>ojfWDX9#bL1DWZ9I}w5xmD_-s~ZI9?A>DvQ4b# z;UlhdEZ<{&P&r!643vrh6AiL)OxDcOFX4S?wsPmD`AV5ce|UcOYzL^Ga z09CKWL23hj(^6VrUIP^UhB4s?+t60gS=fa?!ptYbumeY4XeoQj^Q3naI3miLz%WM! zdFmP-*lH)OH@aVQxuv*U+U?S1)n$ZeUB7t`+@#N?@}lpQF>^NiOwMWWDwYvS6_~8t ztfH(6Nh@8)eJ zs(yY|fBDu+8lwXRS8CeZO6;`rk_NC^f`;oc#&-cso$<52mDa@*{spb9becZkMLlciA97&YKvQ49< zW0}{H@copnN)D|*43!Qzv1M4MnWdPbw5EZ9e~;im3A$CDWx3uNK2^^v@3s!~b{pO> zePUhR&u^+!t=DVoyHWQn=PyYg#BHoGz``s;ZH_n&2J-1$Nmnk2%nVQR37E|L6sR>E ze|)XUYWA8ekkjqA8S@1@C71#5PsLbU+@HEZiqs@6YiS5QM^e}zkHhYPFdD4U05;Fp z+1JV2=~2KV-$!0+oak&1s^*uE%AZ>y`L5<=JDK80rr40lW{o}kw{`O?78YNsuWZlg zl@Qk*2wr9*<0#6 zN%Dkpj(+!ye7BY%A;^RwU-kv^WnVBfWG4L%?eE04@67-GIj(;E-y)}TqpWE}@FS%% zzY(E{IXv<1JqtAjEL5Cn_h6aQh_nlb%v)&W;b_!!e2yk&&n0&17>)WO3-vWafBna8 zIY6jSps2FQcALe{Z7}LG7g?xG)5C$bhaFGh^LJ3(|-Q(qoLO=M4@bd$^HVv_IBQ>&%WQfzlu!B0yqLWh|BbvDv4%~EeKlfwa#>S z|FHhBJg4yg)%MFuo_)!f5)haiOcM*iM_`bdv8b+5RfKalwJh{X-XGii->?o z6KT>r2uSbJK`gN)F&<+yF{aPPS>*R!YhzB%^PKa&&-4EA{`ey+B&=C;&&)kD_kCa2 zr9%cde*G=kcDC51#IE>QMVHw8x?!1aVe_r>;jG(`BAd?UTsl?hb;Dhde+5XlNIjBl zCZTJU0LU<-6F$cbn?+fm!E4H|mzS1{MwDeoq2WA+%q<*4=6V8|n3SOxgJJF9)oxn&OO>b(VIt`7FD4?P!I?L4}BpXLHnkSCCF zHDC1Bep&mEEb?BIz-FK$e@~YXDe2{iKSCpCn5g{7!gIx4^1yF!w9JDs+08J!`-V6#)M zrCbB{KM3D5*9NSvpSKu_8+(iIr#=(Oz5s1uEaE7!^gV{CO~msIe>~4%_=iM~E6Fb^ zEG!j~`;5sk6FUlS z9GTMc(o55-MD@_6K#5ygOxl4&vE@Re&6;Y^Gddr2{(MxFe~5O1m4Z3B(rRy=nYg$w z{ma-NMTC)oC}k#-mY)WtCV_6(!_w2%6VN6xpiQgE$KT;5N^~Z!Cey#8(;1KfOoy)7 zS~C4x!F=S6ECI?Y8GO|pSrv&Jrg5ZsFKtGVFFj1IbB0F4dhG_4Mv}UE)5b#$$_*0m zF4W-?wv=B8e;*%w%FiEx!&^7{o4Pu^?}#mq9ka7>63MiwqkL>!W%itw&8=0f8_Rb| zIx4J&b-vp7y@bT_ZCrQ0AURP%<_vi93824L zyy5;AA94!*?S9Rjrh!hcyJBMtQ)>$cRHVKAkZ-{oe=*ubo%YM1menBJOfC=MNONy5 z%Y)Yjozz7q4aYj!sN5)YvO(U-r2@w!I*E4=Rrfb`wR_zYAGNfyvvC&5bl$!@d;|nU zx)k>@Va-YXBk&`lD^)Ogyy+Z+1?%@Wn~GmOY9~`t1gdv+`sXnDlPv0|i-0K?G@yx& z0(5;8e~B*A+EN~R9?HzQ_;c~`vxp9Is3%z6za5EF!bse# zZf|H2KGMO?$;rtD(KtlxFwC+)U;t%0=QC_;(>KVyB+q@zpJE)e?vF=8+dzzSR>d0N5%ti30F$zlAY|Y zrDPoR)b1W_7q3xXX|UWH1)mDMBD=4^8a#(i%&6$iwEr}KPyv;H{~}=~`T3sChLP*~ zTe`Zuhs8&aS=kCRNsHRZr|HI#GT}n2-(*;3jBz?rr(dUDFTt(960exc&y&C6)G6T= ze>MG$-5n=|ak7+8MlBp^34yksVhfwSp<(Ae#Xb6~QFml7FvGlC{Ns&>okMz0O@6fi zs&RSomI~z?w+9*@fvmZYKMp2BMUE6P4ttH&)O1waOnY62MW#p-(05qr4)cQ>1lqKp z+Z!MMKC1`<2b)=~T&J!%WJ2E>9O4BOe~BZ)Ji>0bazv9GJwWHlvK0BO#rtKlTj1LM zk?8ePJyJ-H-QwH#lR}n10}@a}lOf#}g9>3fnlZzDS*vw>U;%B|;fbdWqE2$L|Q%Vatjh+BHCe}^js zE1Kf<;GBbqfiMt@`2~NyUQH~2y)coit?lfE*K6SQvM|u$8>6^rh0^wJQ}Mu)j-S9y zr-tZc$a%01-KFC?mQ{T&>AG(5<-s3zjA6@0nm*%(iVORYaNui{Wp1OpSQ{U2`#E%S zWQx)x!ZQ4pk-Z%7kb^vQuc#77f4d2O0AnC$s1%F`M4jvbK9|2R^6`I~M3evJ+k;P? z5++esRYyZh8%$$o>*(lwTqHa2)-?9ydk*Y2j}kV2+Sm z#*2O$ukwPGz0dFAYNTbu1!U2o8pw;i=XvmCm{XK%y9Z%>Ujz{G8A12Se`tsrGvRI0 zo4rEiqMGzzq&6<5ie!k1q90$R6E3Y!SeUjgS2N2X&$Uo0I{s!37&$793y)-4f|0|$ z*uL^etz>lBDfDYVui2nnaI@x(`VDGuvtwg2k6+A6{m?Iepecy5#DkprNe_2JCzE@8~z;Njb>qNiRu)+l4Gt+wAdSRVRlRMm{yxd`p&9#B* z-o~3kzbvh+?QAh7hu-#Up6q8~;mu?Nfiy(0afXWEbr(JUg3OF3N}}&+86!WfJr}e% zVv|ymQ{&sCzei~I?4D4wK;Mwl{vkN=YTs5kEph`b$l*zC0c z#=ek|?V;y6%43=ESSIut;OuHnrN+g&g$E^_xXIf#TjSI3`To@*`NIEi9r~1&dI$T; z-RIaq$rrw@eBmE_+o3rlT0q_Gqa5{91--)trKJGjS(R#w3n9H)kR;;Aquwqb^>$jo zlvn0d6qF)Ue;3w=&8)qz;coR;+Iix`D>OFk+bhxq7-dyAT}3AE2cgS8hJ4CD;z<5N zn*S?9^1C>i|1-&7%#6+gKfT;r8IF0Y`Y~@cjn=|jE&OZSJB_`$yQZU|Rq$5!whj)$ zwx>pI<<4+{z-aOzv0Y6QRfr*rpuo<>8YLKrNnbpAe^mz_>sShw=qIsE^}PGb$vf+7 z+QbWo_TD#pipAYelfQ#T&WC&;Bik+TSTFmLEW=$KY4asNk|lUr0)WbEvSg`1z-$M# zgk?+VveyiM>08j5$tMqNT?b-Mxs#nL|LnQ^$A3H7n^o;~&COnS#Q11uXIBx1(n|i> zXJy}_f6kv>ML*UgUw2Z;3xfNq=z;PML^G3U37CD!6%qr*I1n}+=ElmX=qC&@1=^S| zw zc0V>)ux(<4t=F#?HrTN#KNlHM?9r#?Zm6}qf3do*-usr=)z$5Uy9eNEV_!`^m0w67 zP%%IEz{qdC{9J@}9`ugdvm-m`D{d5MxLYJ$=0y{4p>hFYVYi_8NL}jZ{)4Sq`TaOeec+HZjyUpyM3rmOw$eT_Xv~pN%(b>+`-(BnuRy<*^zkI6rca ze+hL6aSV14QFHpkAjyL$&9y=D9hh2TaxdmZqh#h$9|%ICKo)U6TOn3_)+x;K4DJ)( zykbaH6ghc?n914KY^-RICrw6tu@CV@Gi$nDnKGbXdrZXF$^HxExacV>+s?1Wm;Y?} zTK@-CN%_sS9jLs0r&6+)*l+<$?04$uf9dFLIEt#+GE|g*RQ$5Os|&)^h?Y%OydeML z$zTAr)oXzUe6xe3v>n|0>6%w0i;w0)QaVNdrNCiUPXT)+h{I=;{B$YIk3$LabY zY&b+EfryG4n{QO*ew{!*Qiv8)0Z(dRsAjVJNUaWP*t+WK8!hU@IuH6u$TfJAwehcWs;bM2vu?%zt|Fh7vUmhCX%FPid-xe(BBe;tUWAXn2p>Hf zC>unednK~XTU4Q-@-1tZf8$iOG21h>njefL% zB?l*xPky7HEMWPKe?Q|`@Ge-L#j0c@s#ILE+zL)qMmI&ZM7C=RCR*k}C6@F(RN1Ar zCwIpWlxy5L(&X0ZLROw4VKC7#=JJq1_>PDLFp;H{O5(IrgU<&=1w{c$`?_l>nfHre zrX^%TFIc^1E8%?fE<3_xVvpOyhORla$z!K$r%St2n~s;be{^rj_Tr6po6YuVt5+C{ z8=9}*EE-DFxvF_pqd8OTdf(*>r+a0;rjhre;b-e0#3x*=jj{F6??@RK8ctsDiS~=u z%+l{Pd6`&yx$#nq;$>8`?pLSt)+|JEb4O3z!}9N|HZ>e-b?I>+Q+2$AV+;M4nVRK&^}K^M)RB<8Y{)La;kZ${!d0K%v6 z`&iEqkB}3HzyGKO8r9Qbr_Y`WLp3E475-HGvL$kr#Mji!O@ z3Su$yq5wRQs*-LC$Y(?yK5c371EIQCaL?uMcD;Tu^l|Y3cpic&3d*Zq-Vfz>)PHb&lO?-7c&;aHErU6E{7koMU*wWaFnCmK+#6jp_5IQ(s@j2tZ#&!2`%|t}| ze>S3n2LlcSDhHwNwkNhLt|J~~k%QzoC`Bsb$}XXUmVrkDEYQJEzUy60gzlL@>0VJ5 zJ%n03-#VY`-lYou;wv`EmPtoM;2|dO&*P4MX0%mD37ULux9gu=e~keq0a2W;ZU364 zE#-S8?G;vox{nlJNSvu2=eNampOv~ve~a{v=+$#7ciczn)jLqyxzn%6N{T>kdT^@Tq zwi=p9L54vlfu^Em%3m@k*17F*(M-fmVJ%(GXa{Hnss^LmH)A{E+Ayxi`iUF+e==jz z0P7U&7;Fd5%Gu9**O2AV*{W^8S*yGg$dLNl+NRp}d&|Gx@+<$REmF)p-lnCBV;fj+>mv5@YwZFzB+% zkv5bO(nCr_n+>M6igYcNEN?LqBMCX-9@!H|AT;3&ja=g(`u-_XUt=qG%?K~4d!%#Z z6=dqKrAMSfr@THpr#ZVhk!+15C`PX&>-RDIHa|oeh7YysBg)X&WZHnpe_o?R_S>JV zK;D#c+dbSi!Yo2!Y93)ed#hCGobEY|NaKqRmz@)iUv~R75mKZU z-X;cmo0^TpFIp>VGG;>>E;zv_-=@T^(!V00C3GO7KcXw5O)3wWPaUa5({~QF=_B6O z*ks(G-Jpb~e;1mzMbmC?f15UwH?90{O$YynrZjHW9Cn*VN^pE|My%hrLl zqX)JlVgA96DlI6K-TS4M%>Hiu^F`0;5ZAF%h{kL}QrfmZ*-d zSv3j=*$ADpdZC9!ko6O$=KJ!l{F@bj{lDwVd(=)DR%{)!;{T#6e`Gn(KFQL=OP5oV zvg2-Ec&VQ)4nK6pJj5y3CFE4F6hD`Ou6i^Ed@Ch0MZn3Jt02i1N*Ajl!ov>ASTd^* zBv+we2&iPGbWkx_n_6_m}2o#CuUm!D52$O3EuF4PW=p1jl`m6|C z9Y|!`(`g#(>kY&Mugb{BF+!OH(C$s-DY8UE+AX@}n4=A*e@!|~s<6QQKPRIoj7b@G z4Y!IgijWu@M;OoEB|UJ?;GA}(*+r)Wmjt(~?%Bby!7;+}c#m4EqT;WOJ?d?8SbsB? z$McplERT5U<>1RcdDca4W&Y)X4WT{Z-4PuT&11%&0plB)+=B7nHhri`1x?=*jDMO* z8gz|7)8YTEf9V*fgyRXWSKV`hV?+LH(^#2@_2f;rmjB(fO_5uve|bP-Xm><+M7z*5 z+5Tn&e{IujZMt3YWzGvx1C)It2us#Q zkwsSsS17UVnk1~E53!1jOm4#=R2ae7CXHhb;l8kne3|6Gj2&S#W^J`GYop69mtk$8 z%W{wKKUn+UyG;Kac><4+$7<3Q^N~sx@nem9 z2ZuEGZTw7~PPVGR$!kjG>%j*v?ke}GwyL(aiq-oS`*-#?KB#z^gR0kmK(&oI)#_L0 zdtE@s9ZNJ#fZR(sY7ueaFftj|X+^bwU?9O+e>X^E4+R5xzcr9?ghViq$=}oQUko%h z9Vh>vry~r6=@@|Nh&k~u(@_|lTi7TNo5V^$3P=UsT0S`cFWaUs!O;n!z8$R8;_R_A zfC(;ECSt~8)e%K?v+LU8FWMWC!<>S95G@}flEoa0QS}^VdtC- ze;B(8N7hkex{bL|dA_E0R=03CA90a|ar$=O(5ayGZCEPls5E-M|Buz=0}1~-X@UC_ z<|DFR4f6RY?2S(ZbDxx(+dAT{xlM5@f4ll)9RE2V|7UY2_~gRefmFyToR(K&X z8Kfp;##mx|y0Ar?-Z|7RoHpv~f8ksjh114^|L9!)7q<8pSN@kj{g1Yw<45$k<%rJP zQm08mcw*mXP4K7+fyZ$zj|N*Fi|E;Yk`E1Ssa}}XUp!3SsJiix)AA;#L|mEO7+H{< zRFIH+@wSwRAY%8D_z`zHkGWcuQkGPynI!f;>}h@i+~prLsj*&F9u;n-e-dr4H2bSo zsTLBtR2|cmZomn24}0b1BrqxTcY#f3$8w|r{>AU=$PZ!-|1{0x|2WTgV4CR5r-=jR zxiC$F;>J#5lj+-O^8aI+V);C83hk9olNRI+l}EBs0bb`?b-eVrgr4Vf2EgpNo$l!e zvGtBU4C;^E!8Mt5aMG73f4LTp*gDjR^}Re)+FRY(C~4$N56ZMyb30=vgX4CYmYEir zqLm<=CfnE3?N1qUdM4Sip61ee5Rn$A~*hm|`{o3m!vu zvnIQCf+tI-`jGgK?g#f8{vo2d{iFk6aR`8YO``f})FYK`G=`Nqf76$^W1{R}CCU@1 z%S__rftN(~nrwFvBpt@L0_K>2W_K3?)VR;>Wu_UhLQF)9zhw>?e-#xOn2CyL*`1 z85e*FrVt&F8p}DNHl9z^o+Plh;F?6z=(#~+MjrA=L@uLQe-IdWL_PuA2y`XiK7E2S zDe=GUCK2v%X>S&D}Pq} zs^C{(ot_DcxO+qgnUF0Yd=nj5wsm`zo;WurC;wWZe~5P*B-X@g(HM}+4XiFsLNC5y z>LatV8fVF_g3=1igeD6TlBRQa+v=xD&v(@30YF=Q9NlOt9OsTHy^ zR>;a&{Z6dV)%7w(Zj=|gpv2nGw_k0y-i%9L{(K`UeJjgxa77o{_HSQ}>A< zN}J=ef6_D3E|*GMBf6~~?|ohJtni2YUq#LI3%MK8l8tbx?wRISjZ+LHbhe@_e27kE zvZ~V?uC}Rw0z$)0%UM^nfH~QBqSYM~L#sjFEEuqsD1(o3oc${M9rr&g-*rwa!sZOn zL4p1!LTtjlU_h71^xfjeZw+|)y0j~z)9U`7e;38i3SQ;?hUOo!e5Ni!9WF!k2pdou zP!y267m?=U@lNsfB5KOWRCpDRU%*ej)ka;ai&Hucc)Prf7-iv3@jWiafy- zfA?5EPyrF)Mc6+NsS;mypYlfCrAJD2#Mzg#6S6^RJUUoK?7)_;g(9z#+@kz~BCzZA zp)9Meui{?*R|l_&tydau*4QhuBQyT!nMYVfsLL;6Kyrs=U^k!IfriNrV`%pWv70BX zh*p^{R>TI@X0hg)t=qEqiF=0{zbMDie|P*4p=_>Qky)h_kI?zWC zyi!9GNF#Ff~4J zoxH+F!_n}Y zB>W&lhi1~yn7%Cl^Po$&sS=mE+gyZ8nWN}&y zANMoYE{oIVQP-_U4LQ9xe>0l@oFQKzjnIcuBbszuKRn;!9=aH^jPG{ScgbuOI(reD z*PcC)bx%ZWx~UEmn-^OUQ>d0G4zvuk3IrVBJ@wa&%T`BaJKY3C^|sLWsU}oBKvk@7 zU!_%~mt_dFf_t@1lW8X=$!IfYCAB(dbj$3)lElUZk@f5Og(MTxLmELD31 zm+9hTd(=Ypx}Nv}BxaIl$4W1ST=vUw$?+`mFAAs#t%=Bu$csQ21UURF111rM5e8Dp z=*p2{&Vx?1rtcUoZL<;Qv}Sdu4T{K~0WihJb`WBJ*p+fAyCRZj^CDejP6rz+&OyR|%m=eTGJ?Mva zIAtzuwGj*I6Ok80BUJ~Xa&n{H1pCz7I|ueI)BbT2m1q;me>ObrqT>&d@jK`&O)_hF z?<=CvNfjQD6>W6I7oZk^FiH`3f78ydLF_&8{|W#5c)COHq&RhRwqlWv zhoSQkJDWOVe{o*nwX(FD6wj;P8Gem+KY5d7;UZvXFArLV>xZjKh3m{s*6z_G}b7BuH^Cz)ntEd);be9sdd6oTQs_~36WV!{}AR>>4 z_+MlnDexa5K{Dbbdym_>fll5@*P|F4>L%b%dGzp^e^H$fY#zy9#oa3_y)$>jo3~Ju ziAU$L=3X9FbLa$=yiWRq8Pym$#f^sC9tqjUk`qXcK>v(K7?fv8Iouw#CqcxX1~CXN zOyX3WYxJ%kELD{B6xj4xbeguvFJ~PxBtoraAAq=|5v zvK_oCf7f4F46T?@-b@7_vzk5T>*+LSgYYe1F{7FzzWA1*kr3ov783&FuMkq?L+j2|0z z8C;iGnl&5TP%qmfSZm~{%!1<^hGY$jEOiM-UJ9qGT_*H{HA433=ci3%UL?^Gk@<@3 ze=pDtSEozXp@x}VgSx)o9)CkbLjn`%?3Z*BnXv{L7&_xTD$|978;f>H6{ROb{Q`phgHMFog$GJcNBTx)>=O^1yMaSY>Xo=WX=T`LyGLrz zDqj`9$bAM?+Xi6?KStfdpA&{g8pwS1f5c|TmB$uzZpqyvRgrpx`UM6B26>)w{QG6S z(wfUz8G!xeNvpz!oF3?WQ}QbRW!ATNSqUpE86{kOmOu#DKu!$N6J#=()=wX)5Fv|p zT9KTl1?&j{%@6Qcq`goe`zv$)%?F&~ytV7;L?x*A{o3=7CwG4DTlmcuGG1Mve~o%? z@bf2{zX+5`TKqju$F6>B`Q98ANoR#~*U@2pnE$IYoYiJi1q00v3vp9V&Asw(fHy|B zzC^c1-}H~%Ad^|Y9UkjlR#fjy-;dLcN0?t|5O}c8_=TU6dY|(YgtuDHmBpv0Cnd+^ zN-NKHow#!Z%I0ZLQ@+CKCW|m67Do(~;j|yNmX@W;op!umn#(oM{L}dX zrJ>g&vLkXLvf;EZ^lBPYE8e|qL!;QCbB z&3Xm}_>2iHMxxy8Hd7OskzO?mWsaxW_`LXnI22z5_W`vSosFMdC|jO!2z3lafyrD3 z#m@{!l(tf(#|%+w=cv*@h|)S?+x=D6ir~@BEiK#Xw@Z%Dahj`k?|{6}ojV=hRKF_J z%G1u)ZfX+S4OsOb9VjPEe>(Xnnk;~cI+Re%9OQ-9-o8K}hr5Yqbc6L9L z+K}9o(2O0zfr@qLw4IO$-X_j2$t(rMFaKn?oh92xCU7|1Y{zT1e+yH(4fPQ?da!m1 zlOQP2Ge9EA3K}>Fa`t6o|JXUr&YNX>SzQ1BTy}>9korMd zPu7$8AsSECkitP)NY?EYI@W?otti{T2AiL@@I}V-?&z+;`Vr1>aAX%hgGs8mjN~h{ zhlc)~1_Geb3!E&R%;Cf79Aw64;=V7ase2)1I1|60kKfN{e`zfgIsrEDLa7w~3kn!M z!1D)qMr&l>$fq3C{Ve>C1egU}1yoIx_jBRX5)dv~`X2Q=;wO?FhM%Hcir6cO7b^1= zafm!)9byv*qLcl+{h(|axU`lH$?PExBW(212%`lL@eK?a8T}O8u}@S7H0re_jg2~; zik({_4JcH$e<0*@cEgGN7J8-zTP>)_5wc5UO5u|mO&!g>*-xU7(jymh|{W4ZzkOrRZ)gL zmExP~l~&tS-Cc194)d`JxxhLZ+MC%}dStj|9?y~=@z0^uown>Eu1eHZTT!-c2&)4b z?g0oAe@@0ex0N^Hj!{EExn@#R4IwUXJA{#4T1DK|6U4MEjPu^+a=^w2VS&>6+~JHD z>X~BlUL8jh21x=k*4@GQit2 zzMNmG+at9Gk$8w4E5?;KTxf62U+?DcF7HIA-xDAy3bDCn=L=&0;T z|2h&TQwWy8BZ_eyU>8a4ZakR;!)0HegO+w%*4N*R17``WbDbBad2*6uElNaP? zfBJ$Y87Qcyre71&O$;@KnAuZex}KV{V2OO$B8?8otX zD-)d+m32NFT5p4H^tfpsQVPQEO1EQ7c(M8svNU9>0UGCeCJtHVUqo znfG#AD+-$m+pgS;L>cdVRbk!8ie`@Jf5_Gh@E)TNWkCb{4)%fU8wA9aFy104dK9DEI=z6h0AMqN=u_B<;h6I3)+e<`Vj zsYREFSW3KwTnSWG)fNu;i$tIBq)Q*pd z?ny~|&tk{hM_rT52^V+VE!)b=^cg*Z}?XCT)3))DKw*qd}`PXMHF1j3$FKV`* z%!~cy=?A{KPLT;2kJA@@xTk+pp8nbcC$_lc?3z|L&2&J8Pekt2()p7=I=fHbV0B?h zjmf?*3=SIVd5>yOp5)tH-_STX$maOc+Q~I>r7A;q)2>Tb!-qx=xb>fy7XzRBc(|n) zSU3zRp8Bg|8ZyAh$zER$i&;0NAaO|QcP6LqYoceGL>KxGa=f}B*z2?PuIpSUrL7-< z1J-Umt=eW^sVVkY8=iXNuiSeBvj!*qHzy)q&AE?X{qq@TW4(-rXX1C5)f6|!`|Zz- z+?=r2p>qEHxQ>bkb><@`6q=el7gXbF+o%rnuQC_^K6r+ok{;9W+^YSB$(T=fPkWqp zaQr75F5ZxuhM65nn3sL(u1V!L78;9fnX|+4&K*ksbienKywctQmPuXS9^GSbZZaSYe$~0^9o~Cul(Jc*c+!)%p{OZU4 zKYFdn%SpAH`TjZa;X~tCr9;nUV|Mw&q3s>R^W9bs!V5oH@aa2GO6zP*VjRp0Cz_rx znps+Nzoz0`ocaQ9EKYG8>mvcQ=k12WA(sq24>APj;HXS!9{{89g z+`PrwtUisJg8^Pg^&Xdh;@a^3d*hB}1S%#G`%d_*l7G2mzBHka<(OruU)>6bDZKG4 zr|P$CH|w)nCzm$M=Pk$kdLKP7WBIr(j_rAiQfA%FIXSCVlOI+XbaX>h+s(754f3Nb z9&JoE|HEuijCoAv59{BHKNi0tyUjQ;KFqfK>x>)AYxc*LOes0DUVjyuIEk<9lzb(@$eV2L0CW zLfdThlGzuJ3~;szu^RjAV~=-&8-HAJeq{7%yEOBpzKsqAUmh}^Sl$w`<>+Qh)1nb2 z+amY9X*w*v_CRsfv2`2ETLjz6KZFfM_I&!OKSMRk_B_##@(c2qX?@;PTiJ@1#aMss zdeg|q`rEp@;KSM~61>Dodu$bdy+QwlX`tbrs`(Z3n`4JKY z{L)Y9egzT)5gZm|9@sFJB|3@7U{DpFhnFUm?-5TSkJ0U1FQXd4n4p6U<8NDQWXiy=+f^Q^)UM^>O62_!OYV`PC7=$A-Hf_|bv zHyk6AX`s#`k!N`Y7#W5R$RdX8d24cMS!SqSK)T7LtH2TfXd8i~tJ1i0hRN9V>`c;_ zEaGGuJ7Qx5?dQ#^5!yw~s)33~ctA%2-E+ipq6n_WNtk{=%gKno8q1TkbUdCw32cNC zbT(~Pvr1Ip5uT@^VtI^U7!3N0CCv`5&x<_FLHg$9wYr;_N! zKw^>uTu@}`)rD9Qaquh$t16N?rI~~kd018v!?KD3>=IF+R~)&F*h@UAE1uHHB&^sA zlZY}5C^0agL?(!aPNH_Ej+rDx$5V(A12w@)q`N>s!gatViqIzU@T`o0P1cdt1d0V^ zMud*9SnGARlo8Ta-c^}SV(4|s${bi4tjvSu!pfM}4!@@|RXPc&YpD|UfczngKoGHV zFZ?XSry}x5x^s!`)rxstOcBjSzlUfB4%#@j7aJf^qCrHOSP?^MpMS&@BOn+MZYf0I zfqoK(Nn{w0)$O~Ucq5h(p_n3C8##{=o1iB1r)!DMMSzHK1Gw`n>|i2O z03^C6hr8k{Ace848?Ao-{M-Q~w3!GwYYix3h_OBqrbEJH}hCZ!vg zmAKa$U3vNA0Ky-=V2pv_MFctk6A_Jc5=2BJv_W-)6afS2jzpjo$R`m82}FeAf#__Q zn8+YdRiY1dkm%~)U4E&TnUw@k1)i4y?xd+f1M`@0It3^BI(S{Blb`7jCBjR*Ov`jk zD41>}VtWm{m(XDZerCbxaxmJntttz$-)yD^1%;{!Rj3*DRJDyu;DR7E()Hs%zjIX2 zR@)MxEovlYfd=_VjIT^ojO;^Xh{lKGI3Fx>c1Hi-MLkz-XJ-@=IzKq{+hE@XM&uGi O;~E-SS~_`7Hu@V=0uRCf delta 89785 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ý(EFJ9Vg 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 Date: Tue, 17 Dec 2024 11:10:27 +0800 Subject: [PATCH 0490/2029] modify code --- src/class154/Code02_Convict1.java | 6 ++++-- src/class154/Code02_Convict2.java | 5 +++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/class154/Code02_Convict1.java b/src/class154/Code02_Convict1.java index 84310f66b..c1bf3cfa9 100644 --- a/src/class154/Code02_Convict1.java +++ b/src/class154/Code02_Convict1.java @@ -117,8 +117,10 @@ public static int remove(int i) { } } } - up[i] = left[i] = right[i] = dist[i] = 0; - return father[s]; + int ans = father[s]; + // 节点s有可能是0号节点,为了安全,节点i信息清空,节点0的up、father清空 + up[i] = left[i] = right[i] = dist[i] = up[0] = father[0] = 0; + return ans; } public static void reduce(int i, long v) { diff --git a/src/class154/Code02_Convict2.java b/src/class154/Code02_Convict2.java index 0e21f1f31..087e87366 100644 --- a/src/class154/Code02_Convict2.java +++ b/src/class154/Code02_Convict2.java @@ -92,8 +92,9 @@ // } // } // } -// up[i] = ls[i] = rs[i] = dist[i] = 0; -// return fa[s]; +// int ans = fa[s]; +// up[i] = ls[i] = rs[i] = dist[i] = up[0] = fa[0] = 0; +// return ans; //} // //void reduce(int i, long long v) { From 3ceed36b621d8ecb79d85c2292f404817d20a9ff Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 17 Dec 2024 11:13:24 +0800 Subject: [PATCH 0491/2029] modify code --- src/class154/Code02_Convict1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class154/Code02_Convict1.java b/src/class154/Code02_Convict1.java index c1bf3cfa9..2cd3aa2af 100644 --- a/src/class154/Code02_Convict1.java +++ b/src/class154/Code02_Convict1.java @@ -118,7 +118,7 @@ public static int remove(int i) { } } int ans = father[s]; - // 节点s有可能是0号节点,为了安全,节点i信息清空,节点0的up、father清空 + // s可能是0号节点,所以为了安全,节点i信息清空,0号节点的up、father也清空 up[i] = left[i] = right[i] = dist[i] = up[0] = father[0] = 0; return ans; } From 2ff28eb996517d01cf94c2f2f88304e0abd74d08 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 17 Dec 2024 11:24:21 +0800 Subject: [PATCH 0492/2029] modify code --- src/class154/Code02_Convict1.java | 6 ++---- src/class154/Code02_Convict2.java | 5 ++--- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/class154/Code02_Convict1.java b/src/class154/Code02_Convict1.java index 2cd3aa2af..84310f66b 100644 --- a/src/class154/Code02_Convict1.java +++ b/src/class154/Code02_Convict1.java @@ -117,10 +117,8 @@ public static int remove(int i) { } } } - int ans = father[s]; - // s可能是0号节点,所以为了安全,节点i信息清空,0号节点的up、father也清空 - up[i] = left[i] = right[i] = dist[i] = up[0] = father[0] = 0; - return ans; + up[i] = left[i] = right[i] = dist[i] = 0; + return father[s]; } public static void reduce(int i, long v) { diff --git a/src/class154/Code02_Convict2.java b/src/class154/Code02_Convict2.java index 087e87366..0e21f1f31 100644 --- a/src/class154/Code02_Convict2.java +++ b/src/class154/Code02_Convict2.java @@ -92,9 +92,8 @@ // } // } // } -// int ans = fa[s]; -// up[i] = ls[i] = rs[i] = dist[i] = up[0] = fa[0] = 0; -// return ans; +// up[i] = ls[i] = rs[i] = dist[i] = 0; +// return fa[s]; //} // //void reduce(int i, long long v) { From 30f61798da0a28c05adb6470466667cbdcef56bb Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 17 Dec 2024 16:09:37 +0800 Subject: [PATCH 0493/2029] modify code --- src/class155/Code02_TrickyOperation1.java | 365 ++++++++++++++++++++++ src/class155/Code02_TrickyOperation2.java | 207 ++++++++++++ 2 files changed, 572 insertions(+) create mode 100644 src/class155/Code02_TrickyOperation1.java create mode 100644 src/class155/Code02_TrickyOperation2.java diff --git a/src/class155/Code02_TrickyOperation1.java b/src/class155/Code02_TrickyOperation1.java new file mode 100644 index 000000000..884a6f35e --- /dev/null +++ b/src/class155/Code02_TrickyOperation1.java @@ -0,0 +1,365 @@ +package class155; + +// 棘手的操作,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P3273 + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.TreeMap; + +public class Code02_TrickyOperation1 { + + public static int MAXN = 300001; + + public static int[] num = new int[MAXN]; + + public static int[] up = new int[MAXN]; + + public static int[] left = new int[MAXN]; + + public static int[] right = new int[MAXN]; + + public static int[] dist = new int[MAXN]; + + public static int[] father = new int[MAXN]; + + public static int[] size = new int[MAXN]; + + public static int[] add = new int[MAXN]; + + public static TreeMap heads = new TreeMap<>(); + + public static int addAll = 0; + + public static int[] stack = new int[MAXN]; + + public static int n, m; + + public static void minusHead(int h) { + if (h != 0) { + int hnum = num[h] + add[h]; + if (heads.get(hnum) == 1) { + heads.remove(hnum); + } else { + heads.put(hnum, heads.get(hnum) - 1); + } + } + } + + public static void addHead(int h) { + if (h != 0) { + int hnum = num[h] + add[h]; + heads.put(hnum, heads.getOrDefault(hnum, 0) + 1); + } + } + + public static void prepare() { + dist[0] = -1; + heads.clear(); + for (int i = 1; i <= n; i++) { + up[i] = left[i] = right[i] = dist[i] = 0; + father[i] = i; + size[i] = 1; + add[i] = 0; + addHead(i); + } + addAll = 0; + } + + public static int find(int i) { + father[i] = father[i] == i ? i : find(father[i]); + return father[i]; + } + + public static int merge(int i, int j) { + if (i == 0 || j == 0) { + return i + j; + } + int tmp; + if (num[i] < num[j]) { + tmp = i; + i = j; + j = tmp; + } + right[i] = merge(right[i], j); + up[right[i]] = i; + if (dist[left[i]] < dist[right[i]]) { + tmp = left[i]; + left[i] = right[i]; + right[i] = tmp; + } + dist[i] = dist[right[i]] + 1; + father[left[i]] = father[right[i]] = i; + return i; + } + + public static int remove(int i) { + int h = find(i); + father[left[i]] = left[i]; + father[right[i]] = right[i]; + int s = merge(left[i], right[i]); + int f = up[i]; + father[i] = s; + up[s] = f; + if (h != i) { + father[s] = h; + if (left[f] == i) { + left[f] = s; + } else { + right[f] = s; + } + for (int d = dist[s], tmp; dist[f] > d + 1; f = up[f], d++) { + dist[f] = d + 1; + if (dist[left[f]] < dist[right[f]]) { + tmp = left[f]; + left[f] = right[f]; + right[f] = tmp; + } + } + } + up[i] = left[i] = right[i] = dist[i] = 0; + return father[s]; + } + + public static void down(int i, int v) { + if (i != 0) { + add[i] = 0; + int size = 0; + stack[++size] = i; + while (size > 0) { + i = stack[size--]; + num[i] += v; + if (right[i] != 0) { + stack[++size] = right[i]; + } + if (left[i] != 0) { + stack[++size] = left[i]; + } + } + } + } + + public static void u(int i, int j) { + int l = find(i); + int r = find(j); + if (l == r) { + return; + } + int lsize = size[l]; + minusHead(l); + int rsize = size[r]; + minusHead(r); + int addTag; + if (lsize <= rsize) { + down(l, add[l] - add[r]); + addTag = add[r]; + } else { + down(r, add[r] - add[l]); + addTag = add[l]; + } + int h = merge(l, r); + size[h] = lsize + rsize; + add[h] = addTag; + addHead(h); + } + + public static void a1(int i, int v) { + int h = find(i); + minusHead(h); + int l = remove(i); + if (l != 0) { + size[l] = size[h] - 1; + add[l] = add[h]; + addHead(l); + } + num[i] = num[i] + add[h] + v; + father[i] = i; + size[i] = 1; + add[i] = 0; + addHead(i); + u(l, i); + } + + public static void a2(int i, int v) { + int h = find(i); + minusHead(h); + add[h] += v; + addHead(h); + } + + public static void a3(int v) { + addAll += v; + } + + public static int f1(int i) { + return num[i] + add[find(i)] + addAll; + } + + public static int f2(int i) { + int h = find(i); + return num[h] + add[h] + addAll; + } + + public static int f3() { + return heads.lastKey() + addAll; + } + + public static void main(String[] args) { + ReaderWriter io = new ReaderWriter(); + n = io.nextInt(); + for (int i = 1; i <= n; i++) { + num[i] = io.nextInt(); + } + prepare(); + m = io.nextInt(); + String op; + for (int i = 1, x, y; i <= m; i++) { + op = io.next(); + if (op.equals("F3")) { + io.println(f3()); + } else { + x = io.nextInt(); + if (op.equals("U")) { + y = io.nextInt(); + u(x, y); + } else if (op.equals("A1")) { + y = io.nextInt(); + a1(x, y); + } else if (op.equals("A2")) { + y = io.nextInt(); + a2(x, y); + } else if (op.equals("A3")) { + a3(x); + } else if (op.equals("F1")) { + io.println(f1(x)); + } else { + io.println(f2(x)); + } + } + } + io.flush(); + io.close(); + } + + // ReaderWriter处理读写 + public static class ReaderWriter extends PrintWriter { + byte[] buf = new byte[1 << 15]; + int bId = 0, bSize = 0; + boolean eof = false; + + public ReaderWriter() { + super(System.out); + } + + private byte getByte() { + if (bId >= bSize) { + try { + bSize = System.in.read(buf); + } catch (IOException e) { + e.printStackTrace(); + } + if (bSize == -1) + eof = true; + bId = 0; + } + return buf[bId++]; + } + + byte c; + + public boolean hasNext() { + if (eof) + return false; + while ((c = getByte()) <= 32 && !eof) + ; + if (eof) + return false; + bId--; + return true; + } + + public String next() { + if (!hasNext()) + return null; + byte c = getByte(); + while (c <= 32) + c = getByte(); + StringBuilder sb = new StringBuilder(); + while (c > 32) { + sb.append((char) c); + c = getByte(); + } + return sb.toString(); + } + + public int nextInt() { + if (!hasNext()) + return Integer.MIN_VALUE; + int sign = 1; + byte c = getByte(); + while (c <= 32) + c = getByte(); + if (c == '-') { + sign = -1; + c = getByte(); + } + int val = 0; + while (c >= '0' && c <= '9') { + val = val * 10 + (c - '0'); + c = getByte(); + } + bId--; + return val * sign; + } + + public long nextLong() { + if (!hasNext()) + return Long.MIN_VALUE; + int sign = 1; + byte c = getByte(); + while (c <= 32) + c = getByte(); + if (c == '-') { + sign = -1; + c = getByte(); + } + long val = 0; + while (c >= '0' && c <= '9') { + val = val * 10 + (c - '0'); + c = getByte(); + } + bId--; + return val * sign; + } + + public double nextDouble() { + if (!hasNext()) + return Double.NaN; + int sign = 1; + byte c = getByte(); + while (c <= 32) + c = getByte(); + if (c == '-') { + sign = -1; + c = getByte(); + } + double val = 0; + while (c >= '0' && c <= '9') { + val = val * 10 + (c - '0'); + c = getByte(); + } + if (c == '.') { + double mul = 1; + c = getByte(); + while (c >= '0' && c <= '9') { + mul *= 0.1; + val += (c - '0') * mul; + c = getByte(); + } + } + bId--; + return val * sign; + } + } + +} diff --git a/src/class155/Code02_TrickyOperation2.java b/src/class155/Code02_TrickyOperation2.java new file mode 100644 index 000000000..0700f36b5 --- /dev/null +++ b/src/class155/Code02_TrickyOperation2.java @@ -0,0 +1,207 @@ +package class155; + +// 棘手的操作,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P3273 + +//#include +// +//using namespace std; +// +//const int MAXN = 300001; +//int num[MAXN]; +//int up[MAXN]; +//int ls[MAXN]; +//int rs[MAXN]; +//int dist[MAXN]; +//int fa[MAXN]; +//int siz[MAXN]; +//int add[MAXN]; +//int sta[MAXN]; +//multiset heads; +//int addAll = 0; +//int n, m; +// +//void minusHead(int h) { +// if (h != 0) { +// heads.erase(heads.find(num[h] + add[h])); +// } +//} +// +//void addHead(int h) { +// if (h != 0) { +// heads.insert(num[h] + add[h]); +// } +//} +// +//void prepare() { +// dist[0] = -1; +// heads.clear(); +// for (int i = 1; i <= n; i++) { +// up[i] = ls[i] = rs[i] = dist[i] = 0; +// fa[i] = i; +// siz[i] = 1; +// add[i] = 0; +// addHead(i); +// } +// addAll = 0; +//} +// +//int find(int i) { +// fa[i] = fa[i] == i ? i : find(fa[i]); +// return fa[i]; +//} +// +//int merge(int i, int j) { +// if (i == 0 || j == 0) return i + j; +// int tmp; +// if (num[i] < num[j]) { +// tmp = i; i = j; j = tmp; +// } +// rs[i] = merge(rs[i], j); +// up[rs[i]] = i; +// if (dist[ls[i]] < dist[rs[i]]) { +// tmp = ls[i]; ls[i] = rs[i]; rs[i] = tmp; +// } +// dist[i] = dist[rs[i]] + 1; +// fa[ls[i]] = i; +// fa[rs[i]] = i; +// return i; +//} +// +//int remove(int i) { +// int h = find(i); +// fa[ls[i]] = ls[i]; +// fa[rs[i]] = rs[i]; +// int s = merge(ls[i], rs[i]); +// int f = up[i]; +// fa[i] = s; +// up[s] = f; +// if (h != i) { +// fa[s] = h; +// if (ls[f] == i) { +// ls[f] = s; +// } else { +// rs[f] = s; +// } +// for (int d = dist[s], tmp; dist[f] > d + 1; f = up[f], d++) { +// dist[f] = d + 1; +// if (dist[ls[f]] < dist[rs[f]]) { +// tmp = ls[f]; ls[f] = rs[f]; rs[f] = tmp; +// } +// } +// } +// up[i] = ls[i] = rs[i] = dist[i] = 0; +// return fa[s]; +//} +// +//void down(int i, int v) { +// if (i != 0) { +// add[i] = 0; +// int size = 0; +// sta[++size] = i; +// while (size > 0) { +// i = sta[size--]; +// num[i] += v; +// if (rs[i] != 0) sta[++size] = rs[i]; +// if (ls[i] != 0) sta[++size] = ls[i]; +// } +// } +//} +// +//void u(int i, int j) { +// int l = find(i); +// int r = find(j); +// if (l == r) return; +// int lsize = siz[l]; +// minusHead(l); +// int rsize = siz[r]; +// minusHead(r); +// int addTag; +// if (lsize <= rsize) { +// down(l, add[l] - add[r]); +// addTag = add[r]; +// } else { +// down(r, add[r] - add[l]); +// addTag = add[l]; +// } +// int h = merge(l, r); +// siz[h] = lsize + rsize; +// add[h] = addTag; +// addHead(h); +//} +// +//void a1(int i, int v) { +// int h = find(i); +// minusHead(h); +// int l = remove(i); +// if (l != 0) { +// siz[l] = siz[h] - 1; +// add[l] = add[h]; +// addHead(l); +// } +// num[i] = num[i] + add[h] + v; +// fa[i] = i; +// siz[i] = 1; +// add[i] = 0; +// addHead(i); +// u(l, i); +//} +// +//void a2(int i, int v) { +// int h = find(i); +// minusHead(h); +// add[h] += v; +// addHead(h); +//} +// +//void a3(int v) { +// addAll += v; +//} +// +//int f1(int i) { +// return num[i] + add[find(i)] + addAll; +//} +// +//int f2(int i) { +// int h = find(i); +// return num[h] + add[h] + addAll; +//} +// +//int f3() { +// return (*heads.rbegin()) + addAll; +//} +// +//int main(){ +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n; +// for (int i = 1; i <= n; i++) cin >> num[i]; +// prepare(); +// cin >> m; +// for (int i = 1; i <= m; i++) { +// string op; +// cin >> op; +// if (op == "F3") { +// cout << f3() << "\n"; +// } else { +// int x; cin >> x; +// if (op == "U") { +// int y; cin >> y; +// u(x, y); +// } else if (op == "A1") { +// int y; cin >> y; +// a1(x, y); +// } else if (op == "A2") { +// int y; cin >> y; +// a2(x, y); +// } else if (op == "A3") { +// a3(x); +// } else if (op == "F1") { +// cout << f1(x) << "\n"; +// } else { +// cout << f2(x) << "\n"; +// } +// } +// } +// return 0; +//} \ No newline at end of file From aaa8633f61d9a3bf3553c0691b7d4d9fe571c306 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 17 Dec 2024 16:10:39 +0800 Subject: [PATCH 0494/2029] modify code --- src/class155/Code02_TrickyOperation1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class155/Code02_TrickyOperation1.java b/src/class155/Code02_TrickyOperation1.java index 884a6f35e..668eb81c3 100644 --- a/src/class155/Code02_TrickyOperation1.java +++ b/src/class155/Code02_TrickyOperation1.java @@ -241,7 +241,7 @@ public static void main(String[] args) { io.close(); } - // ReaderWriter处理读写 + // 读写工具类 public static class ReaderWriter extends PrintWriter { byte[] buf = new byte[1 << 15]; int bId = 0, bSize = 0; From 62f3739418687be399fea762d84fda0d7428d264 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 17 Dec 2024 21:14:10 +0800 Subject: [PATCH 0495/2029] modify code --- src/class155/Code02_TrickyOperation1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class155/Code02_TrickyOperation1.java b/src/class155/Code02_TrickyOperation1.java index 668eb81c3..a4fd43a04 100644 --- a/src/class155/Code02_TrickyOperation1.java +++ b/src/class155/Code02_TrickyOperation1.java @@ -243,7 +243,7 @@ public static void main(String[] args) { // 读写工具类 public static class ReaderWriter extends PrintWriter { - byte[] buf = new byte[1 << 15]; + byte[] buf = new byte[1 << 10]; int bId = 0, bSize = 0; boolean eof = false; From d418999607286fb4e7819a4ba497426e48fe7a95 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 18 Dec 2024 23:34:11 +0800 Subject: [PATCH 0496/2029] modify code --- src/class155/Code03_KShortestPath1.java | 324 ++++++++++++++++++++++++ src/class155/Code03_KShortestPath2.java | 237 +++++++++++++++++ 2 files changed, 561 insertions(+) create mode 100644 src/class155/Code03_KShortestPath1.java create mode 100644 src/class155/Code03_KShortestPath2.java diff --git a/src/class155/Code03_KShortestPath1.java b/src/class155/Code03_KShortestPath1.java new file mode 100644 index 000000000..54a9c312e --- /dev/null +++ b/src/class155/Code03_KShortestPath1.java @@ -0,0 +1,324 @@ +package class155; + +// 可持久化左偏树 + k短路,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P2483 + +import java.io.BufferedWriter; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; + +public class Code03_KShortestPath1 { + + public static int MAXN = 50001; + public static int MAXM = 200001; + public static int MAXT = MAXN * 20; + public static int MAXH = 4200001; + + public static int n, m; + public static double money; + + public static int[] headg = new int[MAXN]; + public static int[] tog = new int[MAXM]; + public static int[] nextg = new int[MAXM]; + public static double[] weightg = new double[MAXM]; + public static int cntg = 0; + + public static int[] headr = new int[MAXN]; + public static int[] tor = new int[MAXM]; + public static int[] nextr = new int[MAXM]; + public static double[] weightr = new double[MAXM]; + public static int cntr = 0; + + public static int[] rt = new int[MAXN]; + public static double[] num = new double[MAXT]; + public static int[] left = new int[MAXT]; + public static int[] right = new int[MAXT]; + public static int[] dist = new int[MAXT]; + public static int[] father = new int[MAXT]; + public static int cnth = 0; + + public static int[] idx = new int[MAXH]; + public static double[] cost = new double[MAXH]; + public static int cntd; + public static int[] heap = new int[MAXH]; + public static int cntp; + + public static boolean[] vis = new boolean[MAXN]; + public static int[] path = new int[MAXN]; + public static double[] dis = new double[MAXN]; + + public static void addEdgeG(int u, int v, double w) { + nextg[++cntg] = headg[u]; + tog[cntg] = v; + weightg[cntg] = w; + headg[u] = cntg; + } + + public static void addEdgeR(int u, int v, double w) { + nextr[++cntr] = headr[u]; + tor[cntr] = v; + weightr[cntr] = w; + headr[u] = cntr; + } + + public static int init(int f, double v) { + num[++cnth] = v; + left[cnth] = right[cnth] = dist[cnth] = 0; + father[cnth] = f; + return cnth; + } + + public static int clone(int i) { + num[++cnth] = num[i]; + left[cnth] = left[i]; + right[cnth] = right[i]; + dist[cnth] = dist[i]; + father[cnth] = father[i]; + return cnth; + } + + public static int merge(int i, int j) { + if (i == 0 || j == 0) { + return i + j; + } + int tmp; + if (num[i] > num[j]) { + tmp = i; + i = j; + j = tmp; + } + int k = clone(i); + right[k] = merge(right[k], j); + if (dist[left[k]] < dist[right[k]]) { + tmp = left[k]; + left[k] = right[k]; + right[k] = tmp; + } + dist[k] = dist[right[k]] + 1; + return k; + } + + public static void heapAdd(int i, double v) { + idx[++cntd] = i; + cost[cntd] = v; + heap[++cntp] = cntd; + int cur = cntp, up = cur / 2, tmp; + while (cur > 1 && cost[heap[up]] > cost[heap[cur]]) { + tmp = heap[up]; + heap[up] = heap[cur]; + heap[cur] = tmp; + cur = up; + up = cur / 2; + } + } + + public static int heapPop() { + int ans = heap[1]; + heap[1] = heap[cntp--]; + int cur = 1, l = cur * 2, r = l + 1, best, tmp; + while (l <= cntp) { + best = (r <= cntp && cost[heap[r]] < cost[heap[l]]) ? r : l; + best = (cost[heap[best]] < cost[heap[cur]]) ? best : cur; + if (best == cur) { + break; + } + tmp = heap[best]; + heap[best] = heap[cur]; + heap[cur] = tmp; + cur = best; + l = cur * 2; + r = l + 1; + } + return ans; + } + + public static boolean isEmpty() { + return cntp == 0; + } + + public static void dijkstra() { + dis[n] = 0; + for (int i = 1; i < n; i++) { + dis[i] = Double.POSITIVE_INFINITY; + } + cntd = cntp = 0; + heapAdd(n, 0); + while (!isEmpty()) { + int h = heapPop(); + int u = idx[h]; + double w = cost[h]; + if (!vis[u]) { + vis[u] = true; + for (int e = headr[u], v; e > 0; e = nextr[e]) { + v = tor[e]; + if (dis[v] > w + weightr[e]) { + dis[v] = w + weightr[e]; + path[v] = e; + heapAdd(v, dis[v]); + } + } + } + } + } + + public static void mergeRoad() { + cntd = cntp = 0; + for (int i = 1; i <= n; i++) { + heapAdd(i, dis[i]); + } + dist[0] = -1; + while (!isEmpty()) { + int h = heapPop(); + int u = idx[h]; + for (int e = headg[u]; e > 0; e = nextg[e]) { + if (e != path[u]) { + rt[u] = merge(rt[u], init(tog[e], weightg[e] + dis[tog[e]] - dis[u])); + } + } + if (path[u] != 0) { + rt[u] = merge(rt[u], rt[tog[path[u]]]); + } + } + } + + public static int expand() { + int ans = 0; + money -= dis[1]; + if (money >= 0) { + ans++; + cntd = cntp = 0; + if (rt[1] != 0) { + heapAdd(rt[1], num[rt[1]]); + } + while (!isEmpty()) { + int h = heapPop(); + int u = idx[h]; + double w = cost[h]; + money -= w + dis[1]; + if (money < 0) { + break; + } + ans++; + if (left[u] != 0) { + heapAdd(left[u], w - num[u] + num[left[u]]); + } + if (right[u] != 0) { + heapAdd(right[u], w - num[u] + num[right[u]]); + } + if (father[u] != 0 && rt[father[u]] != 0) { + heapAdd(rt[father[u]], w + num[rt[father[u]]]); + } + } + } + return ans; + } + + public static void main(String[] args) throws IOException { + FastReader in = new FastReader(); + BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + money = in.nextDouble(); + int u, v; + double w; + for (int i = 1; i <= m; i++) { + u = in.nextInt(); + v = in.nextInt(); + w = in.nextDouble(); + if (u != n) { + addEdgeG(u, v, w); + addEdgeR(v, u, w); + } + } + dijkstra(); + mergeRoad(); + out.write(expand() + "\n"); + 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 boolean hasNext() throws IOException { + while (hasNextByte()) { + byte b = buffer[ptr]; + if (!isWhitespace(b)) + return true; + ptr++; + } + return false; + } + + 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 double nextDouble() throws IOException { + double num = 0, div = 1; + byte b = readByte(); + while (isWhitespace(b)) + b = readByte(); + boolean minus = false; + if (b == '-') { + minus = true; + b = readByte(); + } + while (!isWhitespace(b) && b != '.' && b != -1) { + num = num * 10 + (b - '0'); + b = readByte(); + } + if (b == '.') { + b = readByte(); + while (!isWhitespace(b) && b != -1) { + num += (b - '0') / (div *= 10); + b = readByte(); + } + } + return minus ? -num : num; + } + + private boolean isWhitespace(byte b) { + return b == ' ' || b == '\n' || b == '\r' || b == '\t'; + } + } + +} \ No newline at end of file diff --git a/src/class155/Code03_KShortestPath2.java b/src/class155/Code03_KShortestPath2.java new file mode 100644 index 000000000..06cee5e58 --- /dev/null +++ b/src/class155/Code03_KShortestPath2.java @@ -0,0 +1,237 @@ +package class155; + +// 可持久化左偏树 + k短路,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P2483 + +//#include +// +//using namespace std; +// +//const int MAXN = 50001; +//const int MAXM = 200001; +//const int MAXT = MAXN * 20; +//const int MAXH = 4200001; +// +//int n, m; +//double money; +// +//int headg[MAXN]; +//int tog[MAXM]; +//int nextg[MAXM]; +//double weightg[MAXM]; +//int cntg = 0; +// +//int headr[MAXN]; +//int tor[MAXM]; +//int nextr[MAXM]; +//double weightr[MAXM]; +//int cntr = 0; +// +//int rt[MAXN]; +//double num[MAXT]; +//int ls[MAXT]; +//int rs[MAXT]; +//int dist[MAXT]; +//int fa[MAXT]; +//int cnth = 0; +// +//int idx[MAXH]; +//double cost[MAXH]; +//int cntd = 0; +//int heap[MAXH]; +//int cntp = 0; +// +//bool vis[MAXN]; +//int path[MAXN]; +//double dis[MAXN]; +// +//void addEdgeG(int u, int v, double w){ +// cntg++; +// nextg[cntg] = headg[u]; +// tog[cntg] = v; +// weightg[cntg] = w; +// headg[u] = cntg; +//} +// +//void addEdgeR(int u, int v, double w){ +// cntr++; +// nextr[cntr] = headr[u]; +// tor[cntr] = v; +// weightr[cntr] = w; +// headr[u] = cntr; +//} +// +//int init(int f, double v){ +// cnth++; +// num[cnth] = v; +// ls[cnth] = rs[cnth] = dist[cnth] = 0; +// fa[cnth] = f; +// return cnth; +//} +// +//int clone(int i){ +// cnth++; +// num[cnth] = num[i]; +// ls[cnth] = ls[i]; +// rs[cnth] = rs[i]; +// dist[cnth] = dist[i]; +// fa[cnth] = fa[i]; +// return cnth; +//} +// +//int merge(int i, int j){ +// if(i == 0 || j == 0){ +// return i + j; +// } +// if(num[i] > num[j]){ +// swap(i, j); +// } +// int k = clone(i); +// rs[k] = merge(rs[k], j); +// if(dist[ls[k]] < dist[rs[k]]){ +// swap(ls[k], rs[k]); +// } +// dist[k] = dist[rs[k]] + 1; +// return k; +//} +// +//void heapAdd(int i, double v){ +// cntd++; +// idx[cntd] = i; +// cost[cntd] = v; +// cntp++; +// heap[cntp] = cntd; +// int cur = cntp; +// while(cur > 1){ +// int up = cur / 2; +// if(cost[heap[up]] > cost[heap[cur]]){ +// swap(heap[up], heap[cur]); +// cur = up; +// } +// else{ +// break; +// } +// } +//} +// +//int heapPop(){ +// int ans = heap[1]; +// heap[1] = heap[cntp]; +// cntp--; +// int cur = 1; +// while(cur * 2 <= cntp){ +// int l = cur * 2; +// int r = l + 1; +// int best = l; +// if(r <= cntp && cost[heap[r]] < cost[heap[l]]){ +// best = r; +// } +// if(cost[heap[best]] < cost[heap[cur]]){ +// swap(heap[best], heap[cur]); +// cur = best; +// } +// else{ +// break; +// } +// } +// return ans; +//} +// +//bool isEmpty(){ +// return cntp == 0; +//} +// +//void dijkstra(){ +// fill(dis, dis + MAXN, 1e18); +// dis[n] = 0; +// cntd = cntp = 0; +// heapAdd(n, 0.0); +// while(!isEmpty()){ +// int h = heapPop(); +// int u = idx[h]; +// double w = cost[h]; +// if(!vis[u]){ +// vis[u] = true; +// for(int e = headr[u]; e != 0; e = nextr[e]){ +// int v = tor[e]; +// if(dis[v] > w + weightr[e]){ +// dis[v] = w + weightr[e]; +// path[v] = e; +// heapAdd(v, dis[v]); +// } +// } +// } +// } +//} +// +//void mergeRoad(){ +// cntd = cntp = 0; +// for(int i = 1; i <= n; i++){ +// heapAdd(i, dis[i]); +// } +// dist[0] = -1; +// while(!isEmpty()){ +// int h = heapPop(); +// int u = idx[h]; +// for(int e = headg[u]; e != 0; e = nextg[e]){ +// if(e != path[u]){ +// rt[u] = merge(rt[u], init(tog[e], weightg[e] + dis[tog[e]] - dis[u])); +// } +// } +// if(path[u] != 0){ +// rt[u] = merge(rt[u], rt[tog[path[u]]]); +// } +// } +//} +// +//int expand(){ +// int ans = 0; +// money -= dis[1]; +// if(money >= 0){ +// ans++; +// cntd = cntp = 0; +// if(rt[1] != 0){ +// heapAdd(rt[1], num[rt[1]]); +// } +// while(!isEmpty()){ +// int h = heapPop(); +// int u = idx[h]; +// double w = cost[h]; +// money -= w + dis[1]; +// if(money < 0){ +// break; +// } +// ans++; +// if(ls[u] != 0){ +// heapAdd(ls[u], w - num[u] + num[ls[u]]); +// } +// if(rs[u] != 0){ +// heapAdd(rs[u], w - num[u] + num[rs[u]]); +// } +// if(fa[u] != 0 && rt[fa[u]] != 0){ +// heapAdd(rt[fa[u]], w + num[rt[fa[u]]]); +// } +// } +// } +// return ans; +//} +// +//int main(){ +// ios::sync_with_stdio(false); +// cin.tie(NULL); +// cin >> n >> m >> money; +// int u, v; +// double w; +// for(int i = 1; i <= m; i++){ +// cin >> u >> v >> w; +// if(u != n){ +// addEdgeG(u, v, w); +// addEdgeR(v, u, w); +// } +// } +// dijkstra(); +// mergeRoad(); +// int ans = expand(); +// cout << ans << endl; +// return 0; +//} \ No newline at end of file From 2638a2cd65b1025e132979d7483c6a6f54ae9c5e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 18 Dec 2024 23:52:10 +0800 Subject: [PATCH 0497/2029] modify code --- src/class155/Code03_KShortestPath1.java | 42 ++++++++++---------- src/class155/Code03_KShortestPath2.java | 51 ++++++++++++------------- 2 files changed, 45 insertions(+), 48 deletions(-) diff --git a/src/class155/Code03_KShortestPath1.java b/src/class155/Code03_KShortestPath1.java index 54a9c312e..0be70d59d 100644 --- a/src/class155/Code03_KShortestPath1.java +++ b/src/class155/Code03_KShortestPath1.java @@ -36,13 +36,13 @@ public class Code03_KShortestPath1 { public static int[] right = new int[MAXT]; public static int[] dist = new int[MAXT]; public static int[] father = new int[MAXT]; - public static int cnth = 0; + public static int cntt = 0; public static int[] idx = new int[MAXH]; public static double[] cost = new double[MAXH]; public static int cntd; public static int[] heap = new int[MAXH]; - public static int cntp; + public static int cnth; public static boolean[] vis = new boolean[MAXN]; public static int[] path = new int[MAXN]; @@ -63,19 +63,19 @@ public static void addEdgeR(int u, int v, double w) { } public static int init(int f, double v) { - num[++cnth] = v; - left[cnth] = right[cnth] = dist[cnth] = 0; - father[cnth] = f; - return cnth; + num[++cntt] = v; + left[cntt] = right[cntt] = dist[cntt] = 0; + father[cntt] = f; + return cntt; } public static int clone(int i) { - num[++cnth] = num[i]; - left[cnth] = left[i]; - right[cnth] = right[i]; - dist[cnth] = dist[i]; - father[cnth] = father[i]; - return cnth; + num[++cntt] = num[i]; + left[cntt] = left[i]; + right[cntt] = right[i]; + dist[cntt] = dist[i]; + father[cntt] = father[i]; + return cntt; } public static int merge(int i, int j) { @@ -102,8 +102,8 @@ public static int merge(int i, int j) { public static void heapAdd(int i, double v) { idx[++cntd] = i; cost[cntd] = v; - heap[++cntp] = cntd; - int cur = cntp, up = cur / 2, tmp; + heap[++cnth] = cntd; + int cur = cnth, up = cur / 2, tmp; while (cur > 1 && cost[heap[up]] > cost[heap[cur]]) { tmp = heap[up]; heap[up] = heap[cur]; @@ -115,10 +115,10 @@ public static void heapAdd(int i, double v) { public static int heapPop() { int ans = heap[1]; - heap[1] = heap[cntp--]; + heap[1] = heap[cnth--]; int cur = 1, l = cur * 2, r = l + 1, best, tmp; - while (l <= cntp) { - best = (r <= cntp && cost[heap[r]] < cost[heap[l]]) ? r : l; + while (l <= cnth) { + best = (r <= cnth && cost[heap[r]] < cost[heap[l]]) ? r : l; best = (cost[heap[best]] < cost[heap[cur]]) ? best : cur; if (best == cur) { break; @@ -134,7 +134,7 @@ public static int heapPop() { } public static boolean isEmpty() { - return cntp == 0; + return cnth == 0; } public static void dijkstra() { @@ -142,7 +142,7 @@ public static void dijkstra() { for (int i = 1; i < n; i++) { dis[i] = Double.POSITIVE_INFINITY; } - cntd = cntp = 0; + cntd = cnth = 0; heapAdd(n, 0); while (!isEmpty()) { int h = heapPop(); @@ -163,7 +163,7 @@ public static void dijkstra() { } public static void mergeRoad() { - cntd = cntp = 0; + cntd = cnth = 0; for (int i = 1; i <= n; i++) { heapAdd(i, dis[i]); } @@ -187,7 +187,7 @@ public static int expand() { money -= dis[1]; if (money >= 0) { ans++; - cntd = cntp = 0; + cntd = cnth = 0; if (rt[1] != 0) { heapAdd(rt[1], num[rt[1]]); } diff --git a/src/class155/Code03_KShortestPath2.java b/src/class155/Code03_KShortestPath2.java index 06cee5e58..ad1cc1a7b 100644 --- a/src/class155/Code03_KShortestPath2.java +++ b/src/class155/Code03_KShortestPath2.java @@ -33,13 +33,13 @@ //int rs[MAXT]; //int dist[MAXT]; //int fa[MAXT]; -//int cnth = 0; +//int cntt = 0; // //int idx[MAXH]; //double cost[MAXH]; //int cntd = 0; //int heap[MAXH]; -//int cntp = 0; +//int cnth = 0; // //bool vis[MAXN]; //int path[MAXN]; @@ -62,21 +62,21 @@ //} // //int init(int f, double v){ -// cnth++; -// num[cnth] = v; -// ls[cnth] = rs[cnth] = dist[cnth] = 0; -// fa[cnth] = f; -// return cnth; +// cntt++; +// num[cntt] = v; +// ls[cntt] = rs[cntt] = dist[cntt] = 0; +// fa[cntt] = f; +// return cntt; //} // //int clone(int i){ -// cnth++; -// num[cnth] = num[i]; -// ls[cnth] = ls[i]; -// rs[cnth] = rs[i]; -// dist[cnth] = dist[i]; -// fa[cnth] = fa[i]; -// return cnth; +// cntt++; +// num[cntt] = num[i]; +// ls[cntt] = ls[i]; +// rs[cntt] = rs[i]; +// dist[cntt] = dist[i]; +// fa[cntt] = fa[i]; +// return cntt; //} // //int merge(int i, int j){ @@ -96,12 +96,10 @@ //} // //void heapAdd(int i, double v){ -// cntd++; -// idx[cntd] = i; +// idx[++cntd] = i; // cost[cntd] = v; -// cntp++; -// heap[cntp] = cntd; -// int cur = cntp; +// heap[++cnth] = cntd; +// int cur = cnth; // while(cur > 1){ // int up = cur / 2; // if(cost[heap[up]] > cost[heap[cur]]){ @@ -116,14 +114,13 @@ // //int heapPop(){ // int ans = heap[1]; -// heap[1] = heap[cntp]; -// cntp--; +// heap[1] = heap[cnth--]; // int cur = 1; -// while(cur * 2 <= cntp){ +// while(cur * 2 <= cnth){ // int l = cur * 2; // int r = l + 1; // int best = l; -// if(r <= cntp && cost[heap[r]] < cost[heap[l]]){ +// if(r <= cnth && cost[heap[r]] < cost[heap[l]]){ // best = r; // } // if(cost[heap[best]] < cost[heap[cur]]){ @@ -138,13 +135,13 @@ //} // //bool isEmpty(){ -// return cntp == 0; +// return cnth == 0; //} // //void dijkstra(){ // fill(dis, dis + MAXN, 1e18); // dis[n] = 0; -// cntd = cntp = 0; +// cntd = cnth = 0; // heapAdd(n, 0.0); // while(!isEmpty()){ // int h = heapPop(); @@ -165,7 +162,7 @@ //} // //void mergeRoad(){ -// cntd = cntp = 0; +// cntd = cnth = 0; // for(int i = 1; i <= n; i++){ // heapAdd(i, dis[i]); // } @@ -189,7 +186,7 @@ // money -= dis[1]; // if(money >= 0){ // ans++; -// cntd = cntp = 0; +// cntd = cnth = 0; // if(rt[1] != 0){ // heapAdd(rt[1], num[rt[1]]); // } From 51b2e919c335af3a0ae1700829f0871d16c55222 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 18 Dec 2024 23:53:38 +0800 Subject: [PATCH 0498/2029] modify code --- src/class155/Code02_TrickyOperation1.java | 1 + src/class155/Code02_TrickyOperation2.java | 2 ++ src/class155/Code03_KShortestPath1.java | 1 + src/class155/Code03_KShortestPath2.java | 2 ++ 4 files changed, 6 insertions(+) diff --git a/src/class155/Code02_TrickyOperation1.java b/src/class155/Code02_TrickyOperation1.java index a4fd43a04..243581336 100644 --- a/src/class155/Code02_TrickyOperation1.java +++ b/src/class155/Code02_TrickyOperation1.java @@ -2,6 +2,7 @@ // 棘手的操作,java版 // 测试链接 : https://www.luogu.com.cn/problem/P3273 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.IOException; import java.io.PrintWriter; diff --git a/src/class155/Code02_TrickyOperation2.java b/src/class155/Code02_TrickyOperation2.java index 0700f36b5..249fdc465 100644 --- a/src/class155/Code02_TrickyOperation2.java +++ b/src/class155/Code02_TrickyOperation2.java @@ -2,6 +2,8 @@ // 棘手的操作,C++版 // 测试链接 : https://www.luogu.com.cn/problem/P3273 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 //#include // diff --git a/src/class155/Code03_KShortestPath1.java b/src/class155/Code03_KShortestPath1.java index 0be70d59d..74c9a0905 100644 --- a/src/class155/Code03_KShortestPath1.java +++ b/src/class155/Code03_KShortestPath1.java @@ -2,6 +2,7 @@ // 可持久化左偏树 + k短路,java版 // 测试链接 : https://www.luogu.com.cn/problem/P2483 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.BufferedWriter; import java.io.IOException; diff --git a/src/class155/Code03_KShortestPath2.java b/src/class155/Code03_KShortestPath2.java index ad1cc1a7b..34b4d5cf8 100644 --- a/src/class155/Code03_KShortestPath2.java +++ b/src/class155/Code03_KShortestPath2.java @@ -2,6 +2,8 @@ // 可持久化左偏树 + k短路,C++版 // 测试链接 : https://www.luogu.com.cn/problem/P2483 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 //#include // From c8cc56b202211061d7ba757c9de58844a43e33dd Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 19 Dec 2024 14:38:56 +0800 Subject: [PATCH 0499/2029] modify code --- ...{Code03_KShortestPath1.java => Code04_KShortestPath1.java} | 4 ++-- ...{Code03_KShortestPath2.java => Code04_KShortestPath2.java} | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename src/class155/{Code03_KShortestPath1.java => Code04_KShortestPath1.java} (98%) rename src/class155/{Code03_KShortestPath2.java => Code04_KShortestPath2.java} (99%) diff --git a/src/class155/Code03_KShortestPath1.java b/src/class155/Code04_KShortestPath1.java similarity index 98% rename from src/class155/Code03_KShortestPath1.java rename to src/class155/Code04_KShortestPath1.java index 74c9a0905..22e9735d6 100644 --- a/src/class155/Code03_KShortestPath1.java +++ b/src/class155/Code04_KShortestPath1.java @@ -1,6 +1,6 @@ package class155; -// 可持久化左偏树 + k短路,java版 +// k短路问题最优解,java版 // 测试链接 : https://www.luogu.com.cn/problem/P2483 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -9,7 +9,7 @@ import java.io.InputStream; import java.io.OutputStreamWriter; -public class Code03_KShortestPath1 { +public class Code04_KShortestPath1 { public static int MAXN = 50001; public static int MAXM = 200001; diff --git a/src/class155/Code03_KShortestPath2.java b/src/class155/Code04_KShortestPath2.java similarity index 99% rename from src/class155/Code03_KShortestPath2.java rename to src/class155/Code04_KShortestPath2.java index 34b4d5cf8..3a5ce0b91 100644 --- a/src/class155/Code03_KShortestPath2.java +++ b/src/class155/Code04_KShortestPath2.java @@ -1,6 +1,6 @@ package class155; -// 可持久化左偏树 + k短路,C++版 +// k短路问题的最优解,C++版 // 测试链接 : https://www.luogu.com.cn/problem/P2483 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From fbd2f22ed026eaab11747cb9de86d09d567d8104 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 19 Dec 2024 14:52:06 +0800 Subject: [PATCH 0500/2029] modify code --- src/class155/Code04_KShortestPath1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class155/Code04_KShortestPath1.java b/src/class155/Code04_KShortestPath1.java index 22e9735d6..a5a6b01dc 100644 --- a/src/class155/Code04_KShortestPath1.java +++ b/src/class155/Code04_KShortestPath1.java @@ -1,6 +1,6 @@ package class155; -// k短路问题最优解,java版 +// k短路问题的最优解,java版 // 测试链接 : https://www.luogu.com.cn/problem/P2483 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 From 55f5fb898dd3a687cc6df751377080336cee62c5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 19 Dec 2024 18:46:38 +0800 Subject: [PATCH 0501/2029] modify code --- src/class155/Code04_KShortestPath1.java | 21 +++++++++++---------- src/class155/Code04_KShortestPath2.java | 18 +++++++++--------- 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/src/class155/Code04_KShortestPath1.java b/src/class155/Code04_KShortestPath1.java index a5a6b01dc..83cdd5ef2 100644 --- a/src/class155/Code04_KShortestPath1.java +++ b/src/class155/Code04_KShortestPath1.java @@ -33,10 +33,10 @@ public class Code04_KShortestPath1 { public static int[] rt = new int[MAXN]; public static double[] num = new double[MAXT]; + public static int[] up = new int[MAXT]; public static int[] left = new int[MAXT]; public static int[] right = new int[MAXT]; public static int[] dist = new int[MAXT]; - public static int[] father = new int[MAXT]; public static int cntt = 0; public static int[] idx = new int[MAXH]; @@ -65,17 +65,17 @@ public static void addEdgeR(int u, int v, double w) { public static int init(int f, double v) { num[++cntt] = v; + up[cntt] = f; left[cntt] = right[cntt] = dist[cntt] = 0; - father[cntt] = f; return cntt; } public static int clone(int i) { num[++cntt] = num[i]; + up[cntt] = up[i]; left[cntt] = left[i]; right[cntt] = right[i]; dist[cntt] = dist[i]; - father[cntt] = father[i]; return cntt; } @@ -134,7 +134,7 @@ public static int heapPop() { return ans; } - public static boolean isEmpty() { + public static boolean heapEmpty() { return cnth == 0; } @@ -145,7 +145,7 @@ public static void dijkstra() { } cntd = cnth = 0; heapAdd(n, 0); - while (!isEmpty()) { + while (!heapEmpty()) { int h = heapPop(); int u = idx[h]; double w = cost[h]; @@ -169,7 +169,7 @@ public static void mergeRoad() { heapAdd(i, dis[i]); } dist[0] = -1; - while (!isEmpty()) { + while (!heapEmpty()) { int h = heapPop(); int u = idx[h]; for (int e = headg[u]; e > 0; e = nextg[e]) { @@ -192,7 +192,7 @@ public static int expand() { if (rt[1] != 0) { heapAdd(rt[1], num[rt[1]]); } - while (!isEmpty()) { + while (!heapEmpty()) { int h = heapPop(); int u = idx[h]; double w = cost[h]; @@ -207,8 +207,8 @@ public static int expand() { if (right[u] != 0) { heapAdd(right[u], w - num[u] + num[right[u]]); } - if (father[u] != 0 && rt[father[u]] != 0) { - heapAdd(rt[father[u]], w + num[rt[father[u]]]); + if (up[u] != 0 && rt[up[u]] != 0) { + heapAdd(rt[up[u]], w + num[rt[up[u]]]); } } } @@ -234,7 +234,8 @@ public static void main(String[] args) throws IOException { } dijkstra(); mergeRoad(); - out.write(expand() + "\n"); + int ans = expand(); + out.write(ans + "\n"); out.flush(); out.close(); } diff --git a/src/class155/Code04_KShortestPath2.java b/src/class155/Code04_KShortestPath2.java index 3a5ce0b91..bbdd5978a 100644 --- a/src/class155/Code04_KShortestPath2.java +++ b/src/class155/Code04_KShortestPath2.java @@ -31,10 +31,10 @@ // //int rt[MAXN]; //double num[MAXT]; +//int up[MAXT]; //int ls[MAXT]; //int rs[MAXT]; //int dist[MAXT]; -//int fa[MAXT]; //int cntt = 0; // //int idx[MAXH]; @@ -66,18 +66,18 @@ //int init(int f, double v){ // cntt++; // num[cntt] = v; +// up[cntt] = f; // ls[cntt] = rs[cntt] = dist[cntt] = 0; -// fa[cntt] = f; // return cntt; //} // //int clone(int i){ // cntt++; // num[cntt] = num[i]; +// up[cntt] = up[i]; // ls[cntt] = ls[i]; // rs[cntt] = rs[i]; // dist[cntt] = dist[i]; -// fa[cntt] = fa[i]; // return cntt; //} // @@ -136,7 +136,7 @@ // return ans; //} // -//bool isEmpty(){ +//bool heapEmpty(){ // return cnth == 0; //} // @@ -145,7 +145,7 @@ // dis[n] = 0; // cntd = cnth = 0; // heapAdd(n, 0.0); -// while(!isEmpty()){ +// while(!heapEmpty()){ // int h = heapPop(); // int u = idx[h]; // double w = cost[h]; @@ -169,7 +169,7 @@ // heapAdd(i, dis[i]); // } // dist[0] = -1; -// while(!isEmpty()){ +// while(!heapEmpty()){ // int h = heapPop(); // int u = idx[h]; // for(int e = headg[u]; e != 0; e = nextg[e]){ @@ -192,7 +192,7 @@ // if(rt[1] != 0){ // heapAdd(rt[1], num[rt[1]]); // } -// while(!isEmpty()){ +// while(!heapEmpty()){ // int h = heapPop(); // int u = idx[h]; // double w = cost[h]; @@ -207,8 +207,8 @@ // if(rs[u] != 0){ // heapAdd(rs[u], w - num[u] + num[rs[u]]); // } -// if(fa[u] != 0 && rt[fa[u]] != 0){ -// heapAdd(rt[fa[u]], w + num[rt[fa[u]]]); +// if(up[u] != 0 && rt[up[u]] != 0){ +// heapAdd(rt[up[u]], w + num[rt[up[u]]]); // } // } // } From e2687f41d1ac633d613cb97ce84a2d98820fda15 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 19 Dec 2024 22:35:39 +0800 Subject: [PATCH 0502/2029] modify code --- .../Code03_PersistentLeftistTree1.java | 186 ++++++++++++++++++ src/class155/Code04_KShortestPath1.java | 16 +- src/class155/Code04_KShortestPath2.java | 12 +- 3 files changed, 200 insertions(+), 14 deletions(-) create mode 100644 src/class155/Code03_PersistentLeftistTree1.java diff --git a/src/class155/Code03_PersistentLeftistTree1.java b/src/class155/Code03_PersistentLeftistTree1.java new file mode 100644 index 000000000..ac0ee9d06 --- /dev/null +++ b/src/class155/Code03_PersistentLeftistTree1.java @@ -0,0 +1,186 @@ +package class155; + +// 可持久化左偏树练习题,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P2409 +// 提交以下的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_PersistentLeftistTree1 { + + public static int MAXN = 101; + public static int MAXM = 10001; + public static int MAXT = 1000001; + public static int INF = 10000001; + + public static int n, k; + + public static int[] start = new int[MAXN]; + public static int[] end = new int[MAXN]; + public static int[] arr = new int[MAXM]; + + public static int[] idx = new int[MAXT]; + public static int[] jdx = new int[MAXT]; + public static int[] num = new int[MAXT]; + public static int[] left = new int[MAXT]; + public static int[] right = new int[MAXT]; + public static int[] dist = new int[MAXT]; + public static int cnt = 0; + + public static int[] base = new int[MAXT]; + + public static int[] heap = new int[MAXM]; + public static int heapSize = 0; + + public static int[] ans = new int[MAXM]; + + public static int init(int i, int j) { + idx[++cnt] = i; + jdx[cnt] = j; + num[cnt] = j + 1 < end[i] ? (arr[j + 1] - arr[j]) : INF; + left[cnt] = right[cnt] = dist[cnt] = 0; + return cnt; + } + + public static int clone(int i) { + idx[++cnt] = idx[i]; + jdx[cnt] = jdx[i]; + num[cnt] = num[i]; + left[cnt] = left[i]; + right[cnt] = right[i]; + dist[cnt] = dist[i]; + return cnt; + } + + public static int merge(int i, int j) { + if (i == 0 || j == 0) { + return i + j; + } + int tmp; + if (num[i] > num[j]) { + tmp = i; + i = j; + j = tmp; + } + int h = clone(i); + right[h] = merge(right[h], j); + if (dist[left[h]] < dist[right[h]]) { + tmp = left[h]; + left[h] = right[h]; + right[h] = tmp; + } + dist[h] = dist[right[h]] + 1; + return h; + } + + public static int pop(int i) { + if (left[i] == 0 && right[i] == 0) { + return 0; + } + if (left[i] == 0 || right[i] == 0) { + return clone(left[i] + right[i]); + } + return merge(left[i], right[i]); + } + + public static boolean compare(int i, int j) { + return base[heap[i]] + num[heap[i]] < base[heap[j]] + num[heap[j]]; + } + + public static void heapAdd(int i) { + heap[++heapSize] = i; + int cur = heapSize, up = cur / 2, tmp; + while (cur > 1 && compare(cur, up)) { + tmp = heap[up]; + heap[up] = heap[cur]; + heap[cur] = tmp; + cur = up; + up = cur / 2; + } + } + + public static int heapPop() { + int ans = heap[1]; + heap[1] = heap[heapSize--]; + int cur = 1, l = cur * 2, r = l + 1, best, tmp; + while (l <= heapSize) { + best = (r <= heapSize && compare(r, l)) ? r : l; + best = compare(best, cur) ? best : cur; + if (best == cur) { + break; + } + tmp = heap[best]; + heap[best] = heap[cur]; + heap[cur] = tmp; + cur = best; + l = cur * 2; + r = l + 1; + } + return ans; + } + + public static void compute() { + int first = 0; + for (int i = 1; i <= n; i++) { + Arrays.sort(arr, start[i], end[i]); + first += arr[start[i]]; + } + dist[0] = -1; + int head = 0; + for (int i = 1; i <= n; i++) { + head = merge(head, init(i, start[i])); + } + base[head] = first; + ans[1] = first; + heapAdd(head); + for (int ansi = 2, h1, h2; ansi <= k; ansi++) { + head = heapPop(); + ans[ansi] = base[head] + num[head]; + h1 = pop(head); + if (h1 != 0) { + base[h1] = base[head]; + heapAdd(h1); + } + if (jdx[head] + 1 < end[idx[head]]) { + h2 = merge(h1, init(idx[head], jdx[head] + 1)); + base[h2] = ans[ansi]; + heapAdd(h2); + } + } + } + + 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(); + k = (int) in.nval; + for (int i = 1, m, ai = 0; i <= n; i++) { + in.nextToken(); + m = (int) in.nval; + start[i] = ai + 1; + for (int j = 1; j <= m; j++) { + in.nextToken(); + arr[++ai] = (int) in.nval; + } + end[i] = start[i] + m; + } + compute(); + for (int i = 1; i <= k; i++) { + out.print(ans[i] + " "); + } + out.println(); + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class155/Code04_KShortestPath1.java b/src/class155/Code04_KShortestPath1.java index 83cdd5ef2..4bb8e5632 100644 --- a/src/class155/Code04_KShortestPath1.java +++ b/src/class155/Code04_KShortestPath1.java @@ -89,15 +89,15 @@ public static int merge(int i, int j) { i = j; j = tmp; } - int k = clone(i); - right[k] = merge(right[k], j); - if (dist[left[k]] < dist[right[k]]) { - tmp = left[k]; - left[k] = right[k]; - right[k] = tmp; + int h = clone(i); + right[h] = merge(right[h], j); + if (dist[left[h]] < dist[right[h]]) { + tmp = left[h]; + left[h] = right[h]; + right[h] = tmp; } - dist[k] = dist[right[k]] + 1; - return k; + dist[h] = dist[right[h]] + 1; + return h; } public static void heapAdd(int i, double v) { diff --git a/src/class155/Code04_KShortestPath2.java b/src/class155/Code04_KShortestPath2.java index bbdd5978a..e4b7a9711 100644 --- a/src/class155/Code04_KShortestPath2.java +++ b/src/class155/Code04_KShortestPath2.java @@ -88,13 +88,13 @@ // if(num[i] > num[j]){ // swap(i, j); // } -// int k = clone(i); -// rs[k] = merge(rs[k], j); -// if(dist[ls[k]] < dist[rs[k]]){ -// swap(ls[k], rs[k]); +// int h = clone(i); +// rs[h] = merge(rs[h], j); +// if(dist[ls[h]] < dist[rs[h]]){ +// swap(ls[h], rs[h]); // } -// dist[k] = dist[rs[k]] + 1; -// return k; +// dist[h] = dist[rs[h]] + 1; +// return h; //} // //void heapAdd(int i, double v){ From 66f8f1f16a675b76fa883b2389826a326cd58c76 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 19 Dec 2024 23:03:27 +0800 Subject: [PATCH 0503/2029] modify code --- .../Code03_PersistentLeftistTree1.java | 10 +- .../Code03_PersistentLeftistTree2.java | 153 ++++++++++++++++++ src/class155/Code04_KShortestPath1.java | 6 +- src/class155/Code04_KShortestPath2.java | 3 +- 4 files changed, 163 insertions(+), 9 deletions(-) create mode 100644 src/class155/Code03_PersistentLeftistTree2.java diff --git a/src/class155/Code03_PersistentLeftistTree1.java b/src/class155/Code03_PersistentLeftistTree1.java index ac0ee9d06..b6a01adf1 100644 --- a/src/class155/Code03_PersistentLeftistTree1.java +++ b/src/class155/Code03_PersistentLeftistTree1.java @@ -22,7 +22,7 @@ public class Code03_PersistentLeftistTree1 { public static int n, k; public static int[] start = new int[MAXN]; - public static int[] end = new int[MAXN]; + public static int[] boundary = new int[MAXN]; public static int[] arr = new int[MAXM]; public static int[] idx = new int[MAXT]; @@ -43,7 +43,7 @@ public class Code03_PersistentLeftistTree1 { public static int init(int i, int j) { idx[++cnt] = i; jdx[cnt] = j; - num[cnt] = j + 1 < end[i] ? (arr[j + 1] - arr[j]) : INF; + num[cnt] = j + 1 < boundary[i] ? (arr[j + 1] - arr[j]) : INF; left[cnt] = right[cnt] = dist[cnt] = 0; return cnt; } @@ -128,7 +128,7 @@ public static int heapPop() { public static void compute() { int first = 0; for (int i = 1; i <= n; i++) { - Arrays.sort(arr, start[i], end[i]); + Arrays.sort(arr, start[i], boundary[i]); first += arr[start[i]]; } dist[0] = -1; @@ -147,7 +147,7 @@ public static void compute() { base[h1] = base[head]; heapAdd(h1); } - if (jdx[head] + 1 < end[idx[head]]) { + if (jdx[head] + 1 < boundary[idx[head]]) { h2 = merge(h1, init(idx[head], jdx[head] + 1)); base[h2] = ans[ansi]; heapAdd(h2); @@ -171,7 +171,7 @@ public static void main(String[] args) throws IOException { in.nextToken(); arr[++ai] = (int) in.nval; } - end[i] = start[i] + m; + boundary[i] = start[i] + m; } compute(); for (int i = 1; i <= k; i++) { diff --git a/src/class155/Code03_PersistentLeftistTree2.java b/src/class155/Code03_PersistentLeftistTree2.java new file mode 100644 index 000000000..a357d465b --- /dev/null +++ b/src/class155/Code03_PersistentLeftistTree2.java @@ -0,0 +1,153 @@ +package class155; + +// 可持久化左偏树练习题,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P2409 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +//#include +// +//using namespace std; +// +//const int MAXN = 101; +//const int MAXM = 10001; +//const int MAXT = 1000001; +//const int INF = 10000001; +// +//int n, k; +// +//int start[MAXN]; +//int boundary[MAXN]; +//int arr[MAXM]; +// +//int idx[MAXT]; +//int jdx[MAXT]; +//int num[MAXT]; +//int ls[MAXT]; +//int rs[MAXT]; +//int dist[MAXT]; +//int cnt = 0; +// +//int base[MAXT]; +// +//int heap[MAXM]; +//int heapSize = 0; +// +//int ans[MAXM]; +// +//int init(int i, int j) { +// idx[++cnt] = i; +// jdx[cnt] = j; +// num[cnt] = (j + 1 < boundary[i]) ? (arr[j + 1] - arr[j]) : INF; +// ls[cnt] = rs[cnt] = dist[cnt] = 0; +// return cnt; +//} +// +//int clone(int i) { +// idx[++cnt] = idx[i]; +// jdx[cnt] = jdx[i]; +// num[cnt] = num[i]; +// ls[cnt] = ls[i]; +// rs[cnt] = rs[i]; +// dist[cnt] = dist[i]; +// return cnt; +//} +// +//int merge(int i, int j) { +// if (i == 0 || j == 0) return i + j; +// if (num[i] > num[j]) swap(i, j); +// int h = clone(i); +// rs[h] = merge(rs[h], j); +// if (dist[ls[h]] < dist[rs[h]]) swap(ls[h], rs[h]); +// dist[h] = dist[rs[h]] + 1; +// return h; +//} +// +//int pop(int i) { +// if (ls[i] == 0 && rs[i] == 0) return 0; +// if (ls[i] == 0 || rs[i] == 0) return clone(ls[i] + rs[i]); +// return merge(ls[i], rs[i]); +//} +// +//bool compare(int i, int j) { +// return base[heap[i]] + num[heap[i]] < base[heap[j]] + num[heap[j]]; +//} +// +//void heapAdd(int i) { +// heap[++heapSize] = i; +// int cur = heapSize, up = cur / 2; +// while (cur > 1 && compare(cur, up)) { +// swap(heap[cur], heap[up]); +// cur = up; +// up = cur / 2; +// } +//} +// +//int heapPop() { +// int top = heap[1]; +// heap[1] = heap[heapSize--]; +// int cur = 1, l = 2, r = 3, best; +// while (l <= heapSize) { +// best = (r <= heapSize && compare(r, l)) ? r : l; +// best = compare(best, cur) ? best : cur; +// if (best == cur) break; +// swap(heap[cur], heap[best]); +// cur = best; +// l = cur * 2; +// r = l + 1; +// } +// return top; +//} +// +//void compute() { +// int first = 0; +// 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) { +// head = merge(head, init(i, start[i])); +// } +// base[head] = first; +// ans[1] = first; +// heapAdd(head); +// for (int ansi = 2, h1, h2; ansi <= k; ++ansi) { +// head = heapPop(); +// ans[ansi] = base[head] + num[head]; +// h1 = pop(head); +// if (h1 != 0) { +// base[h1] = base[head]; +// heapAdd(h1); +// } +// if (jdx[head] + 1 < boundary[idx[head]]) { +// h2 = merge(h1, init(idx[head], jdx[head] + 1)); +// base[h2] = ans[ansi]; +// heapAdd(h2); +// } +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> k; +// int ai = 0; +// for (int i = 1; i <= n; ++i) { +// int m; +// cin >> m; +// start[i] = ai + 1; +// for (int j = 1; j <= m; ++j) { +// cin >> arr[++ai]; +// } +// boundary[i] = start[i] + m; +// } +// compute(); +// for (int i = 1; i <= k; ++i) { +// cout << ans[i] << " "; +// } +// cout << endl; +// return 0; +//} \ No newline at end of file diff --git a/src/class155/Code04_KShortestPath1.java b/src/class155/Code04_KShortestPath1.java index 4bb8e5632..ec0f881ea 100644 --- a/src/class155/Code04_KShortestPath1.java +++ b/src/class155/Code04_KShortestPath1.java @@ -8,6 +8,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; +import java.util.Arrays; public class Code04_KShortestPath1 { @@ -15,6 +16,7 @@ public class Code04_KShortestPath1 { public static int MAXM = 200001; public static int MAXT = MAXN * 20; public static int MAXH = 4200001; + public static double INF = 1e18; public static int n, m; public static double money; @@ -140,9 +142,7 @@ public static boolean heapEmpty() { public static void dijkstra() { dis[n] = 0; - for (int i = 1; i < n; i++) { - dis[i] = Double.POSITIVE_INFINITY; - } + Arrays.fill(dis, 1, n, INF); cntd = cnth = 0; heapAdd(n, 0); while (!heapEmpty()) { diff --git a/src/class155/Code04_KShortestPath2.java b/src/class155/Code04_KShortestPath2.java index e4b7a9711..4c7db3287 100644 --- a/src/class155/Code04_KShortestPath2.java +++ b/src/class155/Code04_KShortestPath2.java @@ -13,6 +13,7 @@ //const int MAXM = 200001; //const int MAXT = MAXN * 20; //const int MAXH = 4200001; +//const double INF = 1e18; // //int n, m; //double money; @@ -141,7 +142,7 @@ //} // //void dijkstra(){ -// fill(dis, dis + MAXN, 1e18); +// fill(dis, dis + MAXN, INF); // dis[n] = 0; // cntd = cnth = 0; // heapAdd(n, 0.0); From f99df9f46fd0db9b88522318f8e7ae6046456a1f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 20 Dec 2024 12:14:21 +0800 Subject: [PATCH 0504/2029] modify code --- src/class155/Code03_PersistentLeftistTree1.java | 5 +++-- src/class155/Code03_PersistentLeftistTree2.java | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/class155/Code03_PersistentLeftistTree1.java b/src/class155/Code03_PersistentLeftistTree1.java index b6a01adf1..ec2ced2e4 100644 --- a/src/class155/Code03_PersistentLeftistTree1.java +++ b/src/class155/Code03_PersistentLeftistTree1.java @@ -16,6 +16,7 @@ public class Code03_PersistentLeftistTree1 { public static int MAXN = 101; public static int MAXM = 10001; + public static int MAXK = 10001; public static int MAXT = 1000001; public static int INF = 10000001; @@ -35,10 +36,10 @@ public class Code03_PersistentLeftistTree1 { public static int[] base = new int[MAXT]; - public static int[] heap = new int[MAXM]; + public static int[] heap = new int[MAXK]; public static int heapSize = 0; - public static int[] ans = new int[MAXM]; + public static int[] ans = new int[MAXK]; public static int init(int i, int j) { idx[++cnt] = i; diff --git a/src/class155/Code03_PersistentLeftistTree2.java b/src/class155/Code03_PersistentLeftistTree2.java index a357d465b..9dccaabb6 100644 --- a/src/class155/Code03_PersistentLeftistTree2.java +++ b/src/class155/Code03_PersistentLeftistTree2.java @@ -12,6 +12,7 @@ // //const int MAXN = 101; //const int MAXM = 10001; +//const int MAXK = 10001; //const int MAXT = 1000001; //const int INF = 10000001; // @@ -31,10 +32,10 @@ // //int base[MAXT]; // -//int heap[MAXM]; +//int heap[MAXK]; //int heapSize = 0; // -//int ans[MAXM]; +//int ans[MAXK]; // //int init(int i, int j) { // idx[++cnt] = i; From 8f86504f32271afa5967c1fc110dd7b8fea95023 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 20 Dec 2024 13:07:57 +0800 Subject: [PATCH 0505/2029] modify code --- src/class155/Code04_KShortestPath1.java | 65 +++++++++----------- src/class155/Code04_KShortestPath2.java | 82 +++++++++++-------------- 2 files changed, 64 insertions(+), 83 deletions(-) diff --git a/src/class155/Code04_KShortestPath1.java b/src/class155/Code04_KShortestPath1.java index ec0f881ea..aad5f76b9 100644 --- a/src/class155/Code04_KShortestPath1.java +++ b/src/class155/Code04_KShortestPath1.java @@ -33,16 +33,17 @@ public class Code04_KShortestPath1 { public static double[] weightr = new double[MAXM]; public static int cntr = 0; - public static int[] rt = new int[MAXN]; - public static double[] num = new double[MAXT]; - public static int[] up = new int[MAXT]; + public static int[] start = new int[MAXT]; + public static double[] cost = new double[MAXT]; public static int[] left = new int[MAXT]; public static int[] right = new int[MAXT]; public static int[] dist = new int[MAXT]; public static int cntt = 0; + + public static int[] rt = new int[MAXN]; public static int[] idx = new int[MAXH]; - public static double[] cost = new double[MAXH]; + public static double[] val = new double[MAXH]; public static int cntd; public static int[] heap = new int[MAXH]; public static int cnth; @@ -65,16 +66,16 @@ public static void addEdgeR(int u, int v, double w) { headr[u] = cntr; } - public static int init(int f, double v) { - num[++cntt] = v; - up[cntt] = f; + public static int init(int s, double c) { + start[++cntt] = s; + cost[cntt] = c; left[cntt] = right[cntt] = dist[cntt] = 0; return cntt; } public static int clone(int i) { - num[++cntt] = num[i]; - up[cntt] = up[i]; + start[++cntt] = start[i]; + cost[cntt] = cost[i]; left[cntt] = left[i]; right[cntt] = right[i]; dist[cntt] = dist[i]; @@ -86,17 +87,13 @@ public static int merge(int i, int j) { return i + j; } int tmp; - if (num[i] > num[j]) { - tmp = i; - i = j; - j = tmp; + if (cost[i] > cost[j]) { + tmp = i; i = j; j = tmp; } int h = clone(i); right[h] = merge(right[h], j); if (dist[left[h]] < dist[right[h]]) { - tmp = left[h]; - left[h] = right[h]; - right[h] = tmp; + tmp = left[h]; left[h] = right[h]; right[h] = tmp; } dist[h] = dist[right[h]] + 1; return h; @@ -104,15 +101,13 @@ public static int merge(int i, int j) { public static void heapAdd(int i, double v) { idx[++cntd] = i; - cost[cntd] = v; + val[cntd] = v; heap[++cnth] = cntd; - int cur = cnth, up = cur / 2, tmp; - while (cur > 1 && cost[heap[up]] > cost[heap[cur]]) { - tmp = heap[up]; - heap[up] = heap[cur]; - heap[cur] = tmp; - cur = up; - up = cur / 2; + int cur = cnth, father = cur / 2, tmp; + while (cur > 1 && val[heap[father]] > val[heap[cur]]) { + tmp = heap[father]; heap[father] = heap[cur]; heap[cur] = tmp; + cur = father; + father = cur / 2; } } @@ -121,14 +116,12 @@ public static int heapPop() { heap[1] = heap[cnth--]; int cur = 1, l = cur * 2, r = l + 1, best, tmp; while (l <= cnth) { - best = (r <= cnth && cost[heap[r]] < cost[heap[l]]) ? r : l; - best = (cost[heap[best]] < cost[heap[cur]]) ? best : cur; + best = r <= cnth && val[heap[r]] < val[heap[l]] ? r : l; + best = val[heap[best]] < val[heap[cur]] ? best : cur; if (best == cur) { break; } - tmp = heap[best]; - heap[best] = heap[cur]; - heap[cur] = tmp; + tmp = heap[best]; heap[best] = heap[cur]; heap[cur] = tmp; cur = best; l = cur * 2; r = l + 1; @@ -148,7 +141,7 @@ public static void dijkstra() { while (!heapEmpty()) { int h = heapPop(); int u = idx[h]; - double w = cost[h]; + double w = val[h]; if (!vis[u]) { vis[u] = true; for (int e = headr[u], v; e > 0; e = nextr[e]) { @@ -190,25 +183,25 @@ public static int expand() { ans++; cntd = cnth = 0; if (rt[1] != 0) { - heapAdd(rt[1], num[rt[1]]); + heapAdd(rt[1], cost[rt[1]]); } while (!heapEmpty()) { int h = heapPop(); int u = idx[h]; - double w = cost[h]; + double w = val[h]; money -= w + dis[1]; if (money < 0) { break; } ans++; if (left[u] != 0) { - heapAdd(left[u], w - num[u] + num[left[u]]); + heapAdd(left[u], w - cost[u] + cost[left[u]]); } if (right[u] != 0) { - heapAdd(right[u], w - num[u] + num[right[u]]); + heapAdd(right[u], w - cost[u] + cost[right[u]]); } - if (up[u] != 0 && rt[up[u]] != 0) { - heapAdd(rt[up[u]], w + num[rt[up[u]]]); + if (start[u] != 0 && rt[start[u]] != 0) { + heapAdd(rt[start[u]], w + cost[rt[start[u]]]); } } } diff --git a/src/class155/Code04_KShortestPath2.java b/src/class155/Code04_KShortestPath2.java index 4c7db3287..989ee1f9f 100644 --- a/src/class155/Code04_KShortestPath2.java +++ b/src/class155/Code04_KShortestPath2.java @@ -30,16 +30,17 @@ //double weightr[MAXM]; //int cntr = 0; // -//int rt[MAXN]; -//double num[MAXT]; -//int up[MAXT]; +//int start[MAXT]; +//double cost[MAXT]; //int ls[MAXT]; //int rs[MAXT]; //int dist[MAXT]; //int cntt = 0; // +//int rt[MAXN]; +// //int idx[MAXH]; -//double cost[MAXH]; +//double val[MAXH]; //int cntd = 0; //int heap[MAXH]; //int cnth = 0; @@ -49,33 +50,29 @@ //double dis[MAXN]; // //void addEdgeG(int u, int v, double w){ -// cntg++; -// nextg[cntg] = headg[u]; +// nextg[++cntg] = headg[u]; // tog[cntg] = v; // weightg[cntg] = w; // headg[u] = cntg; //} // //void addEdgeR(int u, int v, double w){ -// cntr++; -// nextr[cntr] = headr[u]; +// nextr[++cntr] = headr[u]; // tor[cntr] = v; // weightr[cntr] = w; // headr[u] = cntr; //} // -//int init(int f, double v){ -// cntt++; -// num[cntt] = v; -// up[cntt] = f; +//int init(int s, double v){ +// start[++cntt] = s; +// cost[cntt] = v; // ls[cntt] = rs[cntt] = dist[cntt] = 0; // return cntt; //} // //int clone(int i){ -// cntt++; -// num[cntt] = num[i]; -// up[cntt] = up[i]; +// start[++cntt] = start[i]; +// cost[cntt] = cost[i]; // ls[cntt] = ls[i]; // rs[cntt] = rs[i]; // dist[cntt] = dist[i]; @@ -86,7 +83,7 @@ // if(i == 0 || j == 0){ // return i + j; // } -// if(num[i] > num[j]){ +// if(cost[i] > cost[j]){ // swap(i, j); // } // int h = clone(i); @@ -100,39 +97,30 @@ // //void heapAdd(int i, double v){ // idx[++cntd] = i; -// cost[cntd] = v; +// val[cntd] = v; // heap[++cnth] = cntd; -// int cur = cnth; -// while(cur > 1){ -// int up = cur / 2; -// if(cost[heap[up]] > cost[heap[cur]]){ -// swap(heap[up], heap[cur]); -// cur = up; -// } -// else{ -// break; -// } +// int cur = cnth, father = cur / 2; +// while(cur > 1 && val[heap[father]] > val[heap[cur]]){ +// swap(heap[father], heap[cur]); +// cur = father; +// father = cur / 2; // } //} // //int heapPop(){ // int ans = heap[1]; // heap[1] = heap[cnth--]; -// int cur = 1; -// while(cur * 2 <= cnth){ -// int l = cur * 2; -// int r = l + 1; -// int best = l; -// if(r <= cnth && cost[heap[r]] < cost[heap[l]]){ -// best = r; -// } -// if(cost[heap[best]] < cost[heap[cur]]){ -// swap(heap[best], heap[cur]); -// cur = best; -// } -// else{ +// int cur = 1, l = cur * 2, r = l + 1, best; +// while(l <= cnth){ +// best = r <= cnth && val[heap[r]] < val[heap[l]] ? r : l; +// best = val[heap[best]] < val[heap[cur]] ? best : cur; +// if(best == cur) { // break; // } +// swap(heap[best], heap[cur]); +// cur = best; +// l = cur * 2; +// r = l + 1; // } // return ans; //} @@ -149,7 +137,7 @@ // while(!heapEmpty()){ // int h = heapPop(); // int u = idx[h]; -// double w = cost[h]; +// double w = val[h]; // if(!vis[u]){ // vis[u] = true; // for(int e = headr[u]; e != 0; e = nextr[e]){ @@ -191,25 +179,25 @@ // ans++; // cntd = cnth = 0; // if(rt[1] != 0){ -// heapAdd(rt[1], num[rt[1]]); +// heapAdd(rt[1], cost[rt[1]]); // } // while(!heapEmpty()){ // int h = heapPop(); // int u = idx[h]; -// double w = cost[h]; +// double w = val[h]; // money -= w + dis[1]; // if(money < 0){ // break; // } // ans++; // if(ls[u] != 0){ -// heapAdd(ls[u], w - num[u] + num[ls[u]]); +// heapAdd(ls[u], w - cost[u] + cost[ls[u]]); // } // if(rs[u] != 0){ -// heapAdd(rs[u], w - num[u] + num[rs[u]]); +// heapAdd(rs[u], w - cost[u] + cost[rs[u]]); // } -// if(up[u] != 0 && rt[up[u]] != 0){ -// heapAdd(rt[up[u]], w + num[rt[up[u]]]); +// if(start[u] != 0 && rt[start[u]] != 0){ +// heapAdd(rt[start[u]], w + cost[rt[start[u]]]); // } // } // } From 6a652ed82005d08d127ded52e603afaf83041845 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 20 Dec 2024 13:15:37 +0800 Subject: [PATCH 0506/2029] modify code --- ...de03_PersistentLeftistTree1.java => Code03_Blocks1.java} | 4 ++-- ...de03_PersistentLeftistTree2.java => Code03_Blocks2.java} | 2 +- src/class155/Code04_KShortestPath1.java | 2 +- src/class155/Code04_KShortestPath2.java | 2 +- src/class155/ShowDetail.java | 6 ++++++ 5 files changed, 11 insertions(+), 5 deletions(-) rename src/class155/{Code03_PersistentLeftistTree1.java => Code03_Blocks1.java} (97%) rename src/class155/{Code03_PersistentLeftistTree2.java => Code03_Blocks2.java} (98%) create mode 100644 src/class155/ShowDetail.java diff --git a/src/class155/Code03_PersistentLeftistTree1.java b/src/class155/Code03_Blocks1.java similarity index 97% rename from src/class155/Code03_PersistentLeftistTree1.java rename to src/class155/Code03_Blocks1.java index ec2ced2e4..7f21ba4f2 100644 --- a/src/class155/Code03_PersistentLeftistTree1.java +++ b/src/class155/Code03_Blocks1.java @@ -1,6 +1,6 @@ package class155; -// 可持久化左偏树练习题,java版 +// Y的积木,可持久化左偏树实现最优解,java版 // 测试链接 : https://www.luogu.com.cn/problem/P2409 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -12,7 +12,7 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class Code03_PersistentLeftistTree1 { +public class Code03_Blocks1 { public static int MAXN = 101; public static int MAXM = 10001; diff --git a/src/class155/Code03_PersistentLeftistTree2.java b/src/class155/Code03_Blocks2.java similarity index 98% rename from src/class155/Code03_PersistentLeftistTree2.java rename to src/class155/Code03_Blocks2.java index 9dccaabb6..d42199c84 100644 --- a/src/class155/Code03_PersistentLeftistTree2.java +++ b/src/class155/Code03_Blocks2.java @@ -1,6 +1,6 @@ package class155; -// 可持久化左偏树练习题,C++版 +// Y的积木,可持久化左偏树实现最优解,C++版 // 测试链接 : https://www.luogu.com.cn/problem/P2409 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class155/Code04_KShortestPath1.java b/src/class155/Code04_KShortestPath1.java index aad5f76b9..70277aea4 100644 --- a/src/class155/Code04_KShortestPath1.java +++ b/src/class155/Code04_KShortestPath1.java @@ -1,6 +1,6 @@ package class155; -// k短路问题的最优解,java版 +// k短路问题,可持久化左偏树实现最优解,java版 // 测试链接 : https://www.luogu.com.cn/problem/P2483 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class155/Code04_KShortestPath2.java b/src/class155/Code04_KShortestPath2.java index 989ee1f9f..1b5558c75 100644 --- a/src/class155/Code04_KShortestPath2.java +++ b/src/class155/Code04_KShortestPath2.java @@ -1,6 +1,6 @@ package class155; -// k短路问题的最优解,C++版 +// k短路问题,可持久化左偏树实现最优解,C++版 // 测试链接 : https://www.luogu.com.cn/problem/P2483 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class155/ShowDetail.java b/src/class155/ShowDetail.java new file mode 100644 index 000000000..22ae9c539 --- /dev/null +++ b/src/class155/ShowDetail.java @@ -0,0 +1,6 @@ +package class155; + +// 可持久化左偏树的实现和验证 +public class ShowDetail { + +} From 3b6578dbd546e727d8881cbe3f47b02a11abe6b4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 20 Dec 2024 14:54:47 +0800 Subject: [PATCH 0507/2029] modify code --- src/class155/ShowDetail.java | 231 ++++++++++++++++++++++++++++++++++- 1 file changed, 230 insertions(+), 1 deletion(-) diff --git a/src/class155/ShowDetail.java b/src/class155/ShowDetail.java index 22ae9c539..994aa14e4 100644 --- a/src/class155/ShowDetail.java +++ b/src/class155/ShowDetail.java @@ -1,6 +1,235 @@ package class155; -// 可持久化左偏树的实现和验证 +// 可持久化左偏树的实现 + 对数器验证实现的正确性 + +import java.util.ArrayList; +import java.util.PriorityQueue; + public class ShowDetail { + public static int MAXN = 10000; + + public static int MAXV = 100000; + + public static int MAXT = 10000001; + + public static int[] num = new int[MAXT]; + + public static int[] left = new int[MAXT]; + + public static int[] right = new int[MAXT]; + + public static int[] dist = new int[MAXT]; + + public static int cnt = 0; + + public static int[] rt = new int[MAXN]; + + public static int[] size = new int[MAXN]; + + public static int init(int v) { + num[++cnt] = v; + left[cnt] = right[cnt] = dist[cnt] = 0; + return cnt; + } + + public static int clone(int i) { + num[++cnt] = num[i]; + left[cnt] = left[i]; + right[cnt] = right[i]; + dist[cnt] = dist[i]; + return cnt; + } + + public static int merge(int i, int j) { + if (i == 0 || j == 0) { + return i + j; + } + int tmp; + if (num[i] > num[j]) { + tmp = i; + i = j; + j = tmp; + } + int h = clone(i); + right[h] = merge(right[h], j); + if (dist[left[h]] < dist[right[h]]) { + tmp = left[h]; + left[h] = right[h]; + right[h] = tmp; + } + dist[h] = dist[right[h]] + 1; + return h; + } + + public static int pop(int i) { + if (left[i] == 0 && right[i] == 0) { + return 0; + } + if (left[i] == 0 || right[i] == 0) { + return clone(left[i] + right[i]); + } + return merge(left[i], right[i]); + } + + // 可持久化左偏树,x版本加入数字y,生成最新的i版本 + public static void treeAdd(int x, int y, int i) { + size[i] = size[x] + 1; + rt[i] = merge(rt[x], init(y)); + } + + // 可持久化左偏树,x版本与y版本合并,生成最新的i版本 + public static void treeMerge(int x, int y, int i) { + size[i] = size[x] + size[y]; + if (rt[x] == 0 && rt[y] == 0) { + rt[i] = 0; + } else if (rt[x] == 0 || rt[y] == 0) { + rt[i] = clone(rt[x] + rt[y]); + } else { + rt[i] = merge(rt[x], rt[y]); + } + } + + // 可持久化左偏树,x版本弹出顶部,生成最新的i版本 + public static void treePop(int x, int i) { + if (size[x] == 0) { + size[i] = 0; + rt[i] = 0; + } else { + size[i] = size[x] - 1; + rt[i] = pop(rt[x]); + } + } + + // 验证结构 + public static ArrayList> verify = new ArrayList<>(); + + // 验证结构,x版本加入数字y,生成最新版本 + public static void verifyAdd(int x, int y) { + PriorityQueue pre = verify.get(x); + ArrayList tmp = new ArrayList<>(); + while (!pre.isEmpty()) { + tmp.add(pre.poll()); + } + PriorityQueue cur = new PriorityQueue<>(); + for (int number : tmp) { + pre.add(number); + cur.add(number); + } + cur.add(y); + verify.add(cur); + } + + // 验证结构,x版本与y版本合并,生成最新版本 + public static void verifyMerge(int x, int y) { + PriorityQueue h1 = verify.get(x); + PriorityQueue h2 = verify.get(y); + ArrayList tmp = new ArrayList<>(); + PriorityQueue cur = new PriorityQueue<>(); + while (!h1.isEmpty()) { + int number = h1.poll(); + tmp.add(number); + cur.add(number); + } + for (int number : tmp) { + h1.add(number); + } + tmp.clear(); + while (!h2.isEmpty()) { + int number = h2.poll(); + tmp.add(number); + cur.add(number); + } + for (int number : tmp) { + h2.add(number); + } + verify.add(cur); + } + + // 验证结构,x版本弹出顶部,生成最新版本 + public static void verifyPop(int x) { + PriorityQueue pre = verify.get(x); + PriorityQueue cur = new PriorityQueue<>(); + if (pre.size() == 0) { + verify.add(cur); + } else { + int top = pre.poll(); + ArrayList tmp = new ArrayList<>(); + while (!pre.isEmpty()) { + tmp.add(pre.poll()); + } + for (int number : tmp) { + pre.add(number); + cur.add(number); + } + pre.add(top); + verify.add(cur); + } + } + + // 可持久化左偏树i版本的堆 + // 是否等于 + // 验证结构i版本的堆 + public static boolean check(int i) { + int h1 = rt[i]; + int s1 = size[i]; + PriorityQueue h2 = verify.get(i); + if (s1 != h2.size()) { + return false; + } + boolean ans = true; + ArrayList tmp = new ArrayList<>(); + while (!h2.isEmpty()) { + int o1 = num[h1]; + h1 = pop(h1); + int o2 = h2.poll(); + tmp.add(o2); + if (o1 != o2) { + ans = false; + break; + } + } + for (int v : tmp) { + h2.add(v); + } + return ans; + } + + public static void main(String[] args) { + System.out.println("测试开始"); + dist[0] = -1; + rt[0] = size[0] = 0; // 可持久化左偏树生成0版本的堆 + verify.add(new PriorityQueue<>()); // 验证结构生成0版本的堆 + for (int i = 1, op, x, y; i < MAXN; i++) { + // op == 1,x版本的堆里加入数字y,形成i号版本的堆 + // op == 2,x版本的堆和y版本的堆合并,形成i号版本的堆 + // op == 3,x版本的堆弹出堆顶,形成i号版本的堆 + op = i == 1 ? 1 : ((int) (Math.random() * 3) + 1); + x = (int) (Math.random() * i); + if (op == 1) { + y = (int) (Math.random() * MAXV); + treeAdd(x, y, i); + verifyAdd(x, y); + } else if (op == 2) { + y = x; + // 保证x != y + do { + y = (int) (Math.random() * i); + } while (y == x); + treeMerge(x, y, i); + verifyMerge(x, y); + } else { + treePop(x, i); + verifyPop(x); + } + } + // 验证在两个结构中是否每个版本的堆都一样 + for (int i = 1; i < MAXN; i++) { + if (!check(i)) { + System.out.println("出错了!"); + } + } + System.out.println("测试结束"); + } + } From e782fa40e579f6a92431ff5bcbbe442414b84512 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 20 Dec 2024 15:00:20 +0800 Subject: [PATCH 0508/2029] modify code --- src/class155/ShowDetail.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class155/ShowDetail.java b/src/class155/ShowDetail.java index 994aa14e4..ac81b898d 100644 --- a/src/class155/ShowDetail.java +++ b/src/class155/ShowDetail.java @@ -11,7 +11,7 @@ public class ShowDetail { public static int MAXV = 100000; - public static int MAXT = 10000001; + public static int MAXT = 1000001; public static int[] num = new int[MAXT]; From 47a585f39bc98e2858ac4b76520dd50a041fdd89 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 20 Dec 2024 21:15:40 +0800 Subject: [PATCH 0509/2029] modify code --- ...ava => Code03_PersistentLeftistTree1.java} | 14 +- .../Code03_PersistentLeftistTree2.java | 218 ++++++++++++++++++ ...ode03_Blocks1.java => Code04_Blocks1.java} | 2 +- ...ode03_Blocks2.java => Code04_Blocks2.java} | 0 ...tPath1.java => Code05_KShortestPath1.java} | 2 +- ...tPath2.java => Code05_KShortestPath2.java} | 0 6 files changed, 229 insertions(+), 7 deletions(-) rename src/class155/{ShowDetail.java => Code03_PersistentLeftistTree1.java} (94%) create mode 100644 src/class155/Code03_PersistentLeftistTree2.java rename src/class155/{Code03_Blocks1.java => Code04_Blocks1.java} (99%) rename src/class155/{Code03_Blocks2.java => Code04_Blocks2.java} (100%) rename src/class155/{Code04_KShortestPath1.java => Code05_KShortestPath1.java} (99%) rename src/class155/{Code04_KShortestPath2.java => Code05_KShortestPath2.java} (100%) diff --git a/src/class155/ShowDetail.java b/src/class155/Code03_PersistentLeftistTree1.java similarity index 94% rename from src/class155/ShowDetail.java rename to src/class155/Code03_PersistentLeftistTree1.java index ac81b898d..647630ac9 100644 --- a/src/class155/ShowDetail.java +++ b/src/class155/Code03_PersistentLeftistTree1.java @@ -1,17 +1,17 @@ package class155; -// 可持久化左偏树的实现 + 对数器验证实现的正确性 +// 可持久化左偏树的实现,利用对数器验证正确性,java版 import java.util.ArrayList; import java.util.PriorityQueue; -public class ShowDetail { +public class Code03_PersistentLeftistTree1 { public static int MAXN = 10000; public static int MAXV = 100000; - public static int MAXT = 1000001; + public static int MAXT = 2000001; public static int[] num = new int[MAXT]; @@ -212,18 +212,22 @@ public static void main(String[] args) { verifyAdd(x, y); } else if (op == 2) { y = x; - // 保证x != y do { y = (int) (Math.random() * i); } while (y == x); + // 保证x != y treeMerge(x, y, i); verifyMerge(x, y); } else { treePop(x, i); verifyPop(x); } + // 检查最新版本的堆是否一样 + if (!check(i)) { + System.out.println("出错了!"); + } } - // 验证在两个结构中是否每个版本的堆都一样 + // 最后验证是否所有版本的堆都一样 for (int i = 1; i < MAXN; i++) { if (!check(i)) { System.out.println("出错了!"); diff --git a/src/class155/Code03_PersistentLeftistTree2.java b/src/class155/Code03_PersistentLeftistTree2.java new file mode 100644 index 000000000..4d9728681 --- /dev/null +++ b/src/class155/Code03_PersistentLeftistTree2.java @@ -0,0 +1,218 @@ +package class155; + +// 可持久化左偏树的实现,利用对数器验证正确性,C++版 + +//#include +//#include +//#include +//#include +//#include +//#include +// +//using namespace std; +// +//const int MAXN = 10000; +//const int MAXV = 100000; +//const int MAXT = 2000001; +// +//int num[MAXT]; +//int ls[MAXT]; +//int rs[MAXT]; +//int dist[MAXT]; +//int cnt = 0; +//int rt[MAXN]; +//int siz[MAXN]; +// +//int init(int v) { +// num[++cnt] = v; +// ls[cnt] = rs[cnt] = dist[cnt] = 0; +// return cnt; +//} +// +//int clone(int i) { +// num[++cnt] = num[i]; +// ls[cnt] = ls[i]; +// rs[cnt] = rs[i]; +// dist[cnt] = dist[i]; +// return cnt; +//} +// +//int merge(int i, int j) { +// if (i == 0 || j == 0) { +// return i + j; +// } +// if (num[i] > num[j]) { +// swap(i, j); +// } +// int h = clone(i); +// rs[h] = merge(rs[h], j); +// if (dist[ls[h]] < dist[rs[h]]) { +// swap(ls[h], rs[h]); +// } +// dist[h] = dist[rs[h]] + 1; +// return h; +//} +// +//int pop(int i) { +// if (ls[i] == 0 && rs[i] == 0) { +// return 0; +// } +// if (ls[i] == 0 || rs[i] == 0) { +// return clone(ls[i] + rs[i]); +// } +// return merge(ls[i], rs[i]); +//} +// +//void treeAdd(int x, int y, int i) { +// siz[i] = siz[x] + 1; +// rt[i] = merge(rt[x], init(y)); +//} +// +//void treeMerge(int x, int y, int i) { +// siz[i] = siz[x] + siz[y]; +// if (rt[x] == 0 && rt[y] == 0) { +// rt[i] = 0; +// } else if (rt[x] == 0 || rt[y] == 0) { +// rt[i] = clone(rt[x] + rt[y]); +// } else { +// rt[i] = merge(rt[x], rt[y]); +// } +//} +// +//void treePop(int x, int i) { +// if (siz[x] == 0) { +// siz[i] = 0; +// rt[i] = 0; +// } else { +// siz[i] = siz[x] - 1; +// rt[i] = pop(rt[x]); +// } +//} +// +//vector, greater>> verify; +// +//void verifyAdd(int x, int y) { +// priority_queue, greater> pre = verify[x]; +// vector tmp; +// while (!pre.empty()) { +// tmp.push_back(pre.top()); +// pre.pop(); +// } +// priority_queue, greater> cur; +// for (int number : tmp) { +// cur.push(number); +// } +// cur.push(y); +// verify.push_back(cur); +//} +// +//void verifyMerge(int x, int y) { +// priority_queue, greater> h1 = verify[x]; +// priority_queue, greater> h2 = verify[y]; +// vector tmp; +// priority_queue, greater> cur; +// while (!h1.empty()) { +// int number = h1.top(); +// h1.pop(); +// tmp.push_back(number); +// cur.push(number); +// } +// for (int number : tmp) { +// h1.push(number); +// } +// tmp.clear(); +// while (!h2.empty()) { +// int number = h2.top(); +// h2.pop(); +// tmp.push_back(number); +// cur.push(number); +// } +// for (int number : tmp) { +// h2.push(number); +// } +// verify.push_back(cur); +//} +// +//void verifyPop(int x) { +// priority_queue, greater> pre = verify[x]; +// priority_queue, greater> cur; +// if (pre.empty()) { +// verify.push_back(cur); +// } else { +// int top = pre.top(); +// pre.pop(); +// vector tmp; +// while (!pre.empty()) { +// tmp.push_back(pre.top()); +// pre.pop(); +// } +// for (int number : tmp) { +// pre.push(number); +// cur.push(number); +// } +// pre.push(top); +// verify.push_back(cur); +// } +//} +// +//bool check(int i) { +// int h1 = rt[i]; +// int s1 = siz[i]; +// priority_queue, greater> h2 = verify[i]; +// if (s1 != h2.size()) { +// return false; +// } +// bool ans = true; +// vector tmp; +// while (!h2.empty()) { +// int o1 = num[h1]; +// h1 = pop(h1); +// int o2 = h2.top(); +// h2.pop(); +// tmp.push_back(o2); +// if (o1 != o2) { +// ans = false; +// break; +// } +// } +// for (int v : tmp) { +// h2.push(v); +// } +// return ans; +//} +// +//int main() { +// cout << "test begin" << endl; +// dist[0] = -1; +// rt[0] = siz[0] = 0; +// verify.emplace_back(priority_queue, greater>()); +// srand(time(nullptr)); +// for (int i = 1, op, x, y; i < MAXN; i++) { +// op = i == 1 ? 1 : (rand() % 3 + 1); +// x = rand() % i; +// if (op == 1) { +// y = rand() % MAXV; +// treeAdd(x, y, i); +// verifyAdd(x, y); +// } else if (op == 2) { +// do { +// y = rand() % i; +// } while (y == x); +// treeMerge(x, y, i); +// verifyMerge(x, y); +// } else { +// treePop(x, i); +// verifyPop(x); +// } +// if (!check(i)) { +// cout << "err!" << endl; +// } +// } +// for (int i = 1; i < MAXN; i++) { +// if (!check(i)) { +// cout << "err!" << endl; +// } +// } +// cout << "test fin" << endl; +// return 0; +//} \ No newline at end of file diff --git a/src/class155/Code03_Blocks1.java b/src/class155/Code04_Blocks1.java similarity index 99% rename from src/class155/Code03_Blocks1.java rename to src/class155/Code04_Blocks1.java index 7f21ba4f2..915846c3b 100644 --- a/src/class155/Code03_Blocks1.java +++ b/src/class155/Code04_Blocks1.java @@ -12,7 +12,7 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class Code03_Blocks1 { +public class Code04_Blocks1 { public static int MAXN = 101; public static int MAXM = 10001; diff --git a/src/class155/Code03_Blocks2.java b/src/class155/Code04_Blocks2.java similarity index 100% rename from src/class155/Code03_Blocks2.java rename to src/class155/Code04_Blocks2.java diff --git a/src/class155/Code04_KShortestPath1.java b/src/class155/Code05_KShortestPath1.java similarity index 99% rename from src/class155/Code04_KShortestPath1.java rename to src/class155/Code05_KShortestPath1.java index 70277aea4..92a45b277 100644 --- a/src/class155/Code04_KShortestPath1.java +++ b/src/class155/Code05_KShortestPath1.java @@ -10,7 +10,7 @@ import java.io.OutputStreamWriter; import java.util.Arrays; -public class Code04_KShortestPath1 { +public class Code05_KShortestPath1 { public static int MAXN = 50001; public static int MAXM = 200001; diff --git a/src/class155/Code04_KShortestPath2.java b/src/class155/Code05_KShortestPath2.java similarity index 100% rename from src/class155/Code04_KShortestPath2.java rename to src/class155/Code05_KShortestPath2.java From 17fed16e5c9c0139fc0920268c0fb5366f96f4bb Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 20 Dec 2024 21:22:11 +0800 Subject: [PATCH 0510/2029] modify code --- src/class155/Code03_PersistentLeftistTree2.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class155/Code03_PersistentLeftistTree2.java b/src/class155/Code03_PersistentLeftistTree2.java index 4d9728681..45ed0871a 100644 --- a/src/class155/Code03_PersistentLeftistTree2.java +++ b/src/class155/Code03_PersistentLeftistTree2.java @@ -213,6 +213,6 @@ // cout << "err!" << endl; // } // } -// cout << "test fin" << endl; +// cout << "test end" << endl; // return 0; //} \ No newline at end of file From f35ea8fd6ff2b3497a52b3ff841fd55c28a9db4b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 20 Dec 2024 22:11:12 +0800 Subject: [PATCH 0511/2029] modify code --- .../Code03_PersistentLeftistTree1.java | 21 ++++++------------- .../Code03_PersistentLeftistTree2.java | 15 +++++++------ src/class155/Code04_Blocks1.java | 3 +-- src/class155/Code04_Blocks2.java | 3 +-- 4 files changed, 15 insertions(+), 27 deletions(-) diff --git a/src/class155/Code03_PersistentLeftistTree1.java b/src/class155/Code03_PersistentLeftistTree1.java index 647630ac9..3c8d16db0 100644 --- a/src/class155/Code03_PersistentLeftistTree1.java +++ b/src/class155/Code03_PersistentLeftistTree1.java @@ -8,25 +8,18 @@ public class Code03_PersistentLeftistTree1 { public static int MAXN = 10000; - public static int MAXV = 100000; - public static int MAXT = 2000001; public static int[] num = new int[MAXT]; - public static int[] left = new int[MAXT]; - public static int[] right = new int[MAXT]; - public static int[] dist = new int[MAXT]; - + public static int[] size = new int[MAXT]; public static int cnt = 0; public static int[] rt = new int[MAXN]; - public static int[] size = new int[MAXN]; - public static int init(int v) { num[++cnt] = v; left[cnt] = right[cnt] = dist[cnt] = 0; @@ -74,13 +67,12 @@ public static int pop(int i) { // 可持久化左偏树,x版本加入数字y,生成最新的i版本 public static void treeAdd(int x, int y, int i) { - size[i] = size[x] + 1; rt[i] = merge(rt[x], init(y)); + size[rt[i]] = size[rt[x]] + 1; } // 可持久化左偏树,x版本与y版本合并,生成最新的i版本 public static void treeMerge(int x, int y, int i) { - size[i] = size[x] + size[y]; if (rt[x] == 0 && rt[y] == 0) { rt[i] = 0; } else if (rt[x] == 0 || rt[y] == 0) { @@ -88,16 +80,16 @@ public static void treeMerge(int x, int y, int i) { } else { rt[i] = merge(rt[x], rt[y]); } + size[rt[i]] = size[rt[x]] + size[rt[y]]; } // 可持久化左偏树,x版本弹出顶部,生成最新的i版本 public static void treePop(int x, int i) { - if (size[x] == 0) { - size[i] = 0; + if (size[rt[x]] == 0) { rt[i] = 0; } else { - size[i] = size[x] - 1; rt[i] = pop(rt[x]); + size[rt[i]] = size[rt[x]] - 1; } } @@ -172,9 +164,8 @@ public static void verifyPop(int x) { // 验证结构i版本的堆 public static boolean check(int i) { int h1 = rt[i]; - int s1 = size[i]; PriorityQueue h2 = verify.get(i); - if (s1 != h2.size()) { + if (size[h1] != h2.size()) { return false; } boolean ans = true; diff --git a/src/class155/Code03_PersistentLeftistTree2.java b/src/class155/Code03_PersistentLeftistTree2.java index 45ed0871a..fbe2caaa1 100644 --- a/src/class155/Code03_PersistentLeftistTree2.java +++ b/src/class155/Code03_PersistentLeftistTree2.java @@ -19,9 +19,10 @@ //int ls[MAXT]; //int rs[MAXT]; //int dist[MAXT]; +//int siz[MAXT]; //int cnt = 0; +// //int rt[MAXN]; -//int siz[MAXN]; // //int init(int v) { // num[++cnt] = v; @@ -64,12 +65,11 @@ //} // //void treeAdd(int x, int y, int i) { -// siz[i] = siz[x] + 1; // rt[i] = merge(rt[x], init(y)); +// siz[rt[i]] = siz[rt[x]] + 1; //} // //void treeMerge(int x, int y, int i) { -// siz[i] = siz[x] + siz[y]; // if (rt[x] == 0 && rt[y] == 0) { // rt[i] = 0; // } else if (rt[x] == 0 || rt[y] == 0) { @@ -77,15 +77,15 @@ // } else { // rt[i] = merge(rt[x], rt[y]); // } +// siz[rt[i]] = siz[rt[x]] + siz[rt[y]]; //} // //void treePop(int x, int i) { -// if (siz[x] == 0) { -// siz[i] = 0; +// if (siz[rt[x]] == 0) { // rt[i] = 0; // } else { -// siz[i] = siz[x] - 1; // rt[i] = pop(rt[x]); +// siz[rt[i]] = siz[rt[x]] - 1; // } //} // @@ -157,9 +157,8 @@ // //bool check(int i) { // int h1 = rt[i]; -// int s1 = siz[i]; // priority_queue, greater> h2 = verify[i]; -// if (s1 != h2.size()) { +// if (siz[h1] != h2.size()) { // return false; // } // bool ans = true; diff --git a/src/class155/Code04_Blocks1.java b/src/class155/Code04_Blocks1.java index 915846c3b..25293b6da 100644 --- a/src/class155/Code04_Blocks1.java +++ b/src/class155/Code04_Blocks1.java @@ -32,9 +32,8 @@ public class Code04_Blocks1 { public static int[] left = new int[MAXT]; public static int[] right = new int[MAXT]; public static int[] dist = new int[MAXT]; - public static int cnt = 0; - public static int[] base = new int[MAXT]; + public static int cnt = 0; public static int[] heap = new int[MAXK]; public static int heapSize = 0; diff --git a/src/class155/Code04_Blocks2.java b/src/class155/Code04_Blocks2.java index d42199c84..598daf971 100644 --- a/src/class155/Code04_Blocks2.java +++ b/src/class155/Code04_Blocks2.java @@ -28,9 +28,8 @@ //int ls[MAXT]; //int rs[MAXT]; //int dist[MAXT]; -//int cnt = 0; -// //int base[MAXT]; +//int cnt = 0; // //int heap[MAXK]; //int heapSize = 0; From 34b2eb47d2cc5ad1c62383bb37018b3fa1d0162e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 21 Dec 2024 11:00:01 +0800 Subject: [PATCH 0512/2029] modify code --- src/class155/Code01_CityCapture1.java | 1 - src/class155/Code01_CityCapture2.java | 1 - 2 files changed, 2 deletions(-) diff --git a/src/class155/Code01_CityCapture1.java b/src/class155/Code01_CityCapture1.java index 8e120f52d..ee2a289c6 100644 --- a/src/class155/Code01_CityCapture1.java +++ b/src/class155/Code01_CityCapture1.java @@ -93,7 +93,6 @@ public static int merge(int i, int j) { j = tmp; } down(i); - down(j); right[i] = merge(right[i], j); if (dist[left[i]] < dist[right[i]]) { tmp = left[i]; diff --git a/src/class155/Code01_CityCapture2.java b/src/class155/Code01_CityCapture2.java index d3978d4e9..a17585805 100644 --- a/src/class155/Code01_CityCapture2.java +++ b/src/class155/Code01_CityCapture2.java @@ -70,7 +70,6 @@ // j = tmp; // } // down(i); -// down(j); // rs[i] = merge(rs[i], j); // if (dist[ls[i]] < dist[rs[i]]) { // tmp = ls[i]; From 011ef257325556f16ade9429b25fbaa6f066266b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 22 Dec 2024 12:30:21 +0800 Subject: [PATCH 0513/2029] modify code --- src/class155/Code05_KShortestPath1.java | 38 ++++++++++++------------- src/class155/Code05_KShortestPath2.java | 36 +++++++++++------------ 2 files changed, 37 insertions(+), 37 deletions(-) diff --git a/src/class155/Code05_KShortestPath1.java b/src/class155/Code05_KShortestPath1.java index 92a45b277..b9bf1e0dd 100644 --- a/src/class155/Code05_KShortestPath1.java +++ b/src/class155/Code05_KShortestPath1.java @@ -33,13 +33,13 @@ public class Code05_KShortestPath1 { public static double[] weightr = new double[MAXM]; public static int cntr = 0; - public static int[] start = new int[MAXT]; + public static int[] to = new int[MAXT]; public static double[] cost = new double[MAXT]; public static int[] left = new int[MAXT]; public static int[] right = new int[MAXT]; public static int[] dist = new int[MAXT]; public static int cntt = 0; - + public static int[] rt = new int[MAXN]; public static int[] idx = new int[MAXH]; @@ -66,15 +66,15 @@ public static void addEdgeR(int u, int v, double w) { headr[u] = cntr; } - public static int init(int s, double c) { - start[++cntt] = s; + public static int init(int t, double c) { + to[++cntt] = t; cost[cntt] = c; left[cntt] = right[cntt] = dist[cntt] = 0; return cntt; } public static int clone(int i) { - start[++cntt] = start[i]; + to[++cntt] = to[i]; cost[cntt] = cost[i]; left[cntt] = left[i]; right[cntt] = right[i]; @@ -139,9 +139,9 @@ public static void dijkstra() { cntd = cnth = 0; heapAdd(n, 0); while (!heapEmpty()) { - int h = heapPop(); - int u = idx[h]; - double w = val[h]; + int top = heapPop(); + int u = idx[top]; + double w = val[top]; if (!vis[u]) { vis[u] = true; for (int e = headr[u], v; e > 0; e = nextr[e]) { @@ -163,8 +163,8 @@ public static void mergeRoad() { } dist[0] = -1; while (!heapEmpty()) { - int h = heapPop(); - int u = idx[h]; + int top = heapPop(); + int u = idx[top]; for (int e = headg[u]; e > 0; e = nextg[e]) { if (e != path[u]) { rt[u] = merge(rt[u], init(tog[e], weightg[e] + dis[tog[e]] - dis[u])); @@ -186,22 +186,22 @@ public static int expand() { heapAdd(rt[1], cost[rt[1]]); } while (!heapEmpty()) { - int h = heapPop(); - int u = idx[h]; - double w = val[h]; + int top = heapPop(); + int i = idx[top]; + double w = val[top]; money -= w + dis[1]; if (money < 0) { break; } ans++; - if (left[u] != 0) { - heapAdd(left[u], w - cost[u] + cost[left[u]]); + if (left[i] != 0) { + heapAdd(left[i], w - cost[i] + cost[left[i]]); } - if (right[u] != 0) { - heapAdd(right[u], w - cost[u] + cost[right[u]]); + if (right[i] != 0) { + heapAdd(right[i], w - cost[i] + cost[right[i]]); } - if (start[u] != 0 && rt[start[u]] != 0) { - heapAdd(rt[start[u]], w + cost[rt[start[u]]]); + if (to[i] != 0 && rt[to[i]] != 0) { + heapAdd(rt[to[i]], w + cost[rt[to[i]]]); } } } diff --git a/src/class155/Code05_KShortestPath2.java b/src/class155/Code05_KShortestPath2.java index 1b5558c75..19c93804e 100644 --- a/src/class155/Code05_KShortestPath2.java +++ b/src/class155/Code05_KShortestPath2.java @@ -30,7 +30,7 @@ //double weightr[MAXM]; //int cntr = 0; // -//int start[MAXT]; +//int to[MAXT]; //double cost[MAXT]; //int ls[MAXT]; //int rs[MAXT]; @@ -63,15 +63,15 @@ // headr[u] = cntr; //} // -//int init(int s, double v){ -// start[++cntt] = s; +//int init(int t, double v){ +// to[++cntt] = t; // cost[cntt] = v; // ls[cntt] = rs[cntt] = dist[cntt] = 0; // return cntt; //} // //int clone(int i){ -// start[++cntt] = start[i]; +// to[++cntt] = to[i]; // cost[cntt] = cost[i]; // ls[cntt] = ls[i]; // rs[cntt] = rs[i]; @@ -135,9 +135,9 @@ // cntd = cnth = 0; // heapAdd(n, 0.0); // while(!heapEmpty()){ -// int h = heapPop(); -// int u = idx[h]; -// double w = val[h]; +// int top = heapPop(); +// int u = idx[top]; +// double w = val[top]; // if(!vis[u]){ // vis[u] = true; // for(int e = headr[u]; e != 0; e = nextr[e]){ @@ -159,8 +159,8 @@ // } // dist[0] = -1; // while(!heapEmpty()){ -// int h = heapPop(); -// int u = idx[h]; +// int top = heapPop(); +// int u = idx[top]; // for(int e = headg[u]; e != 0; e = nextg[e]){ // if(e != path[u]){ // rt[u] = merge(rt[u], init(tog[e], weightg[e] + dis[tog[e]] - dis[u])); @@ -182,22 +182,22 @@ // heapAdd(rt[1], cost[rt[1]]); // } // while(!heapEmpty()){ -// int h = heapPop(); -// int u = idx[h]; -// double w = val[h]; +// int top = heapPop(); +// int i = idx[top]; +// double w = val[top]; // money -= w + dis[1]; // if(money < 0){ // break; // } // ans++; -// if(ls[u] != 0){ -// heapAdd(ls[u], w - cost[u] + cost[ls[u]]); +// if(ls[i] != 0){ +// heapAdd(ls[i], w - cost[i] + cost[ls[i]]); // } -// if(rs[u] != 0){ -// heapAdd(rs[u], w - cost[u] + cost[rs[u]]); +// if(rs[i] != 0){ +// heapAdd(rs[i], w - cost[i] + cost[rs[i]]); // } -// if(start[u] != 0 && rt[start[u]] != 0){ -// heapAdd(rt[start[u]], w + cost[rt[start[u]]]); +// if(to[i] != 0 && rt[to[i]] != 0){ +// heapAdd(rt[to[i]], w + cost[rt[to[i]]]); // } // } // } From 9901f0d7eaa022cb4c149fc7cead87f846272908 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 22 Dec 2024 12:46:03 +0800 Subject: [PATCH 0514/2029] modify code --- src/class154/Code01_LeftistTree2.java | 8 ++------ src/class154/Code01_LeftistTree4.java | 8 ++------ src/class154/Code02_Convict2.java | 9 ++++----- src/class154/Code03_MonkeyKing2.java | 9 ++------- src/class154/Code04_Dispatch2.java | 9 ++------- src/class154/Code05_NumberSequence2.java | 5 ++--- src/class155/Code01_CityCapture2.java | 9 ++------- src/class155/Code02_TrickyOperation2.java | 9 ++++----- src/class155/Code04_Blocks2.java | 8 ++++++-- 9 files changed, 26 insertions(+), 48 deletions(-) diff --git a/src/class154/Code01_LeftistTree2.java b/src/class154/Code01_LeftistTree2.java index 01857ea29..1d8fe0b0a 100644 --- a/src/class154/Code01_LeftistTree2.java +++ b/src/class154/Code01_LeftistTree2.java @@ -43,15 +43,11 @@ // return i + j; // } // if (num[i] > num[j] || (num[i] == num[j] && i > j)) { -// int tmp = i; -// i = j; -// j = tmp; +// swap(i, j); // } // rs[i] = merge(rs[i], j); // if (dist[ls[i]] < dist[rs[i]]) { -// int tmp = ls[i]; -// ls[i] = rs[i]; -// rs[i] = tmp; +// swap(ls[i], rs[i]); // } // dist[i] = dist[rs[i]] + 1; // fa[ls[i]] = fa[rs[i]] = i; diff --git a/src/class154/Code01_LeftistTree4.java b/src/class154/Code01_LeftistTree4.java index 6d7cbcb40..cb86536cb 100644 --- a/src/class154/Code01_LeftistTree4.java +++ b/src/class154/Code01_LeftistTree4.java @@ -44,15 +44,11 @@ // return i + j; // } // if (num[i] > num[j] || (num[i] == num[j] && i > j)) { -// int tmp = i; -// i = j; -// j = tmp; +// swap(i, j); // } // rs[i] = merge(rs[i], j); // if (dist[ls[i]] < dist[rs[i]]) { -// int tmp = ls[i]; -// ls[i] = rs[i]; -// rs[i] = tmp; +// swap(ls[i], rs[i]); // } // dist[i] = dist[rs[i]] + 1; // fa[ls[i]] = fa[rs[i]] = i; diff --git a/src/class154/Code02_Convict2.java b/src/class154/Code02_Convict2.java index 0e21f1f31..e2c949bda 100644 --- a/src/class154/Code02_Convict2.java +++ b/src/class154/Code02_Convict2.java @@ -56,14 +56,13 @@ // if (i == 0 || j == 0) { // return i + j; // } -// int tmp; // if (num[i] < num[j] || (num[i] == num[j] && i > j)) { -// tmp = i; i = j; j = tmp; +// swap(i, j); // } // rs[i] = merge(rs[i], j); // up[rs[i]] = i; // if (dist[ls[i]] < dist[rs[i]]) { -// tmp = ls[i]; ls[i] = rs[i]; rs[i] = tmp; +// swap(ls[i], rs[i]); // } // dist[i] = dist[rs[i]] + 1; // fa[ls[i]] = fa[rs[i]] = i; @@ -85,10 +84,10 @@ // } else { // rs[f] = s; // } -// for (int d = dist[s], tmp; dist[f] > d + 1; f = up[f], d++) { +// for (int d = dist[s]; dist[f] > d + 1; f = up[f], d++) { // dist[f] = d + 1; // if (dist[ls[f]] < dist[rs[f]]) { -// tmp = ls[f]; ls[f] = rs[f]; rs[f] = tmp; +// swap(ls[f], rs[f]); // } // } // } diff --git a/src/class154/Code03_MonkeyKing2.java b/src/class154/Code03_MonkeyKing2.java index 0b10ccada..9e71edb8a 100644 --- a/src/class154/Code03_MonkeyKing2.java +++ b/src/class154/Code03_MonkeyKing2.java @@ -43,17 +43,12 @@ // if (i == 0 || j == 0) { // return i + j; // } -// int tmp; // if (num[i] < num[j]) { -// tmp = i; -// i = j; -// j = tmp; +// swap(i, j); // } // rs[i] = merge(rs[i], j); // if (dist[ls[i]] < dist[rs[i]]) { -// tmp = ls[i]; -// ls[i] = rs[i]; -// rs[i] = tmp; +// swap(ls[i], rs[i]); // } // dist[i] = dist[rs[i]] + 1; // fa[ls[i]] = fa[rs[i]] = i; diff --git a/src/class154/Code04_Dispatch2.java b/src/class154/Code04_Dispatch2.java index c80580a56..0ab81a5b7 100644 --- a/src/class154/Code04_Dispatch2.java +++ b/src/class154/Code04_Dispatch2.java @@ -35,17 +35,12 @@ // if (i == 0 || j == 0) { // return i + j; // } -// int tmp; // if (cost[i] < cost[j]) { -// tmp = i; -// i = j; -// j = tmp; +// swap(i, j); // } // rs[i] = merge(rs[i], j); // if (dist[ls[i]] < dist[rs[i]]) { -// tmp = ls[i]; -// ls[i] = rs[i]; -// rs[i] = tmp; +// swap(ls[i], rs[i]); // } // dist[i] = dist[rs[i]] + 1; // fa[ls[i]] = fa[rs[i]] = i; diff --git a/src/class154/Code05_NumberSequence2.java b/src/class154/Code05_NumberSequence2.java index 82d0f00f9..1a99b3895 100644 --- a/src/class154/Code05_NumberSequence2.java +++ b/src/class154/Code05_NumberSequence2.java @@ -45,13 +45,12 @@ // if (i == 0 || j == 0) { // return i + j; // } -// int tmp; // if (arr[i] < arr[j]) { -// tmp = i; i = j; j = tmp; +// swap(i, j); // } // rs[i] = merge(rs[i], j); // if (dist[ls[i]] < dist[rs[i]]) { -// tmp = ls[i]; ls[i] = rs[i]; rs[i] = tmp; +// swap(ls[i], rs[i]); // } // dist[i] = dist[rs[i]] + 1; // fa[ls[i]] = fa[rs[i]] = i; diff --git a/src/class155/Code01_CityCapture2.java b/src/class155/Code01_CityCapture2.java index a17585805..50e191dfe 100644 --- a/src/class155/Code01_CityCapture2.java +++ b/src/class155/Code01_CityCapture2.java @@ -63,18 +63,13 @@ // if (i == 0 || j == 0) { // return i + j; // } -// int tmp; // if (attack[i] > attack[j]) { -// tmp = i; -// i = j; -// j = tmp; +// swap(i, j); // } // down(i); // rs[i] = merge(rs[i], j); // if (dist[ls[i]] < dist[rs[i]]) { -// tmp = ls[i]; -// ls[i] = rs[i]; -// rs[i] = tmp; +// swap(ls[i], rs[i]); // } // dist[i] = dist[rs[i]] + 1; // return i; diff --git a/src/class155/Code02_TrickyOperation2.java b/src/class155/Code02_TrickyOperation2.java index 249fdc465..290a6532b 100644 --- a/src/class155/Code02_TrickyOperation2.java +++ b/src/class155/Code02_TrickyOperation2.java @@ -55,14 +55,13 @@ // //int merge(int i, int j) { // if (i == 0 || j == 0) return i + j; -// int tmp; // if (num[i] < num[j]) { -// tmp = i; i = j; j = tmp; +// swap(i, j); // } // rs[i] = merge(rs[i], j); // up[rs[i]] = i; // if (dist[ls[i]] < dist[rs[i]]) { -// tmp = ls[i]; ls[i] = rs[i]; rs[i] = tmp; +// swap(ls[i], rs[i]); // } // dist[i] = dist[rs[i]] + 1; // fa[ls[i]] = i; @@ -85,10 +84,10 @@ // } else { // rs[f] = s; // } -// for (int d = dist[s], tmp; dist[f] > d + 1; f = up[f], d++) { +// for (int d = dist[s]; dist[f] > d + 1; f = up[f], d++) { // dist[f] = d + 1; // if (dist[ls[f]] < dist[rs[f]]) { -// tmp = ls[f]; ls[f] = rs[f]; rs[f] = tmp; +// swap(ls[f], rs[f]); // } // } // } diff --git a/src/class155/Code04_Blocks2.java b/src/class155/Code04_Blocks2.java index 598daf971..16edc7599 100644 --- a/src/class155/Code04_Blocks2.java +++ b/src/class155/Code04_Blocks2.java @@ -56,10 +56,14 @@ // //int merge(int i, int j) { // if (i == 0 || j == 0) return i + j; -// if (num[i] > num[j]) swap(i, j); +// if (num[i] > num[j]) { +// swap(i, j); +// } // int h = clone(i); // rs[h] = merge(rs[h], j); -// if (dist[ls[h]] < dist[rs[h]]) swap(ls[h], rs[h]); +// if (dist[ls[h]] < dist[rs[h]]) { +// swap(ls[h], rs[h]); +// } // dist[h] = dist[rs[h]] + 1; // return h; //} From 40d85a93e5ef957e62f9a32979b51686892651e2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 22 Dec 2024 13:01:08 +0800 Subject: [PATCH 0515/2029] modify code --- src/class155/Code05_KShortestPath1.java | 18 +++++++++++++----- src/class155/Code05_KShortestPath2.java | 2 +- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/class155/Code05_KShortestPath1.java b/src/class155/Code05_KShortestPath1.java index b9bf1e0dd..f31cc7958 100644 --- a/src/class155/Code05_KShortestPath1.java +++ b/src/class155/Code05_KShortestPath1.java @@ -14,7 +14,7 @@ public class Code05_KShortestPath1 { public static int MAXN = 50001; public static int MAXM = 200001; - public static int MAXT = MAXN * 20; + public static int MAXT = 1000001; public static int MAXH = 4200001; public static double INF = 1e18; @@ -88,12 +88,16 @@ public static int merge(int i, int j) { } int tmp; if (cost[i] > cost[j]) { - tmp = i; i = j; j = tmp; + tmp = i; + i = j; + j = tmp; } int h = clone(i); right[h] = merge(right[h], j); if (dist[left[h]] < dist[right[h]]) { - tmp = left[h]; left[h] = right[h]; right[h] = tmp; + tmp = left[h]; + left[h] = right[h]; + right[h] = tmp; } dist[h] = dist[right[h]] + 1; return h; @@ -105,7 +109,9 @@ public static void heapAdd(int i, double v) { heap[++cnth] = cntd; int cur = cnth, father = cur / 2, tmp; while (cur > 1 && val[heap[father]] > val[heap[cur]]) { - tmp = heap[father]; heap[father] = heap[cur]; heap[cur] = tmp; + tmp = heap[father]; + heap[father] = heap[cur]; + heap[cur] = tmp; cur = father; father = cur / 2; } @@ -121,7 +127,9 @@ public static int heapPop() { if (best == cur) { break; } - tmp = heap[best]; heap[best] = heap[cur]; heap[cur] = tmp; + tmp = heap[best]; + heap[best] = heap[cur]; + heap[cur] = tmp; cur = best; l = cur * 2; r = l + 1; diff --git a/src/class155/Code05_KShortestPath2.java b/src/class155/Code05_KShortestPath2.java index 19c93804e..dc329cbbd 100644 --- a/src/class155/Code05_KShortestPath2.java +++ b/src/class155/Code05_KShortestPath2.java @@ -11,7 +11,7 @@ // //const int MAXN = 50001; //const int MAXM = 200001; -//const int MAXT = MAXN * 20; +//const int MAXT = 1000001; //const int MAXH = 4200001; //const double INF = 1e18; // From 7ef3f77bd8e4f6f558738120ca8443dbbf84ae4f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 22 Dec 2024 23:44:16 +0800 Subject: [PATCH 0516/2029] modify code --- src/class155/Code01_CityCapture1.java | 347 +++++++++----------------- 1 file changed, 119 insertions(+), 228 deletions(-) diff --git a/src/class155/Code01_CityCapture1.java b/src/class155/Code01_CityCapture1.java index ee2a289c6..23809fa98 100644 --- a/src/class155/Code01_CityCapture1.java +++ b/src/class155/Code01_CityCapture1.java @@ -5,15 +5,8 @@ // 测试链接 : https://www.luogu.com.cn/problem/P3261 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 -import java.io.BufferedWriter; -import java.io.ByteArrayOutputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.Writer; -import java.util.InputMismatchException; +import java.io.PrintWriter; public class Code01_CityCapture1 { @@ -151,254 +144,152 @@ public static void compute() { } public static void main(String[] args) { - FastReader in = new FastReader(System.in); - FastWriter out = new FastWriter(System.out); - n = in.readInt(); - m = in.readInt(); + ReaderWriter io = new ReaderWriter(); + n = io.nextInt(); + m = io.nextInt(); prepare(); for (int i = 1; i <= n; i++) { - defend[i] = in.readLong(); + defend[i] = io.nextLong(); } for (int i = 2; i <= n; i++) { - belong[i] = in.readInt(); - op[i] = in.readInt(); - gain[i] = in.readLong(); + belong[i] = io.nextInt(); + op[i] = io.nextInt(); + gain[i] = io.nextLong(); } for (int i = 1; i <= m; i++) { - attack[i] = in.readLong(); - born[i] = in.readInt(); + attack[i] = io.nextLong(); + born[i] = io.nextInt(); } compute(); for (int i = 1; i <= n; i++) { - out.println(sacrifice[i]); + io.println(sacrifice[i]); } for (int i = 1; i <= m; i++) { - out.println(deep[born[i]] - deep[die[i]]); + io.println(deep[born[i]] - deep[die[i]]); } - out.flush(); - out.close(); + io.flush(); + io.close(); } - // 快读 - public static class FastReader { - InputStream is; - private byte[] inbuf = new byte[1024]; - public int lenbuf = 0; - public int ptrbuf = 0; + // 读写工具类 + public static class ReaderWriter extends PrintWriter { + byte[] buf = new byte[1 << 16]; + int bId = 0, bSize = 0; + boolean eof = false; - public FastReader(final InputStream is) { - this.is = is; + public ReaderWriter() { + super(System.out); } - public int readByte() { - if (lenbuf == -1) { - throw new InputMismatchException(); - } - if (ptrbuf >= lenbuf) { - ptrbuf = 0; + private byte getByte() { + if (bId >= bSize) { try { - lenbuf = is.read(inbuf); + bSize = System.in.read(buf); } catch (IOException e) { - throw new InputMismatchException(); - } - if (lenbuf <= 0) { - return -1; + e.printStackTrace(); } + if (bSize == -1) + eof = true; + bId = 0; } - return inbuf[ptrbuf++]; + return buf[bId++]; } - public int readInt() { - return (int) readLong(); - } + byte c; - public long readLong() { - long num = 0; - int b; - boolean minus = false; - while ((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-')) + public boolean hasNext() { + if (eof) + return false; + while ((c = getByte()) <= 32 && !eof) ; - if (b == '-') { - minus = true; - b = readByte(); - } - - while (true) { - if (b >= '0' && b <= '9') { - num = num * 10 + (b - '0'); - } else { - return minus ? -num : num; - } - b = readByte(); - } - } - } - - // 快写 - public static class FastWriter { - private static final int BUF_SIZE = 1 << 13; - private final byte[] buf = new byte[BUF_SIZE]; - private OutputStream out; - private Writer writer; - private int ptr = 0; - - public FastWriter(Writer writer) { - this.writer = new BufferedWriter(writer); - out = new ByteArrayOutputStream(); - } - - public FastWriter(OutputStream os) { - this.out = os; - } - - public FastWriter(String path) { - try { - this.out = new FileOutputStream(path); - } catch (FileNotFoundException e) { - throw new RuntimeException("FastWriter"); - } - } - - public FastWriter write(byte b) { - buf[ptr++] = b; - if (ptr == BUF_SIZE) { - innerflush(); - } - return this; - } - - public FastWriter write(String s) { - s.chars().forEach(c -> { - buf[ptr++] = (byte) c; - if (ptr == BUF_SIZE) { - innerflush(); - } - }); - return this; - } - - private static int countDigits(long l) { - if (l >= 1000000000000000000L) { - return 19; - } - if (l >= 100000000000000000L) { - return 18; - } - if (l >= 10000000000000000L) { - return 17; - } - if (l >= 1000000000000000L) { - return 16; - } - if (l >= 100000000000000L) { - return 15; - } - if (l >= 10000000000000L) { - return 14; - } - if (l >= 1000000000000L) { - return 13; - } - if (l >= 100000000000L) { - return 12; - } - if (l >= 10000000000L) { - return 11; - } - if (l >= 1000000000L) { - return 10; - } - if (l >= 100000000L) { - return 9; - } - if (l >= 10000000L) { - return 8; - } - if (l >= 1000000L) { - return 7; - } - if (l >= 100000L) { - return 6; - } - if (l >= 10000L) { - return 5; - } - if (l >= 1000L) { - return 4; - } - if (l >= 100L) { - return 3; - } - if (l >= 10L) { - return 2; - } - return 1; - } - - public FastWriter write(long x) { - if (x == Long.MIN_VALUE) { - return write("" + x); - } - if (ptr + 21 >= BUF_SIZE) { - innerflush(); - } - if (x < 0) { - write((byte) '-'); - x = -x; - } - int d = countDigits(x); - for (int i = ptr + d - 1; i >= ptr; i--) { - buf[i] = (byte) ('0' + x % 10); - x /= 10; - } - ptr += d; - return this; - } - - public FastWriter writeln(long x) { - return write(x).writeln(); - } - - public FastWriter writeln() { - return write((byte) '\n'); - } - - private void innerflush() { - try { - out.write(buf, 0, ptr); - ptr = 0; - } catch (IOException e) { - throw new RuntimeException("innerflush"); - } - } - - public void flush() { - innerflush(); - try { - if (writer != null) { - writer.write(((ByteArrayOutputStream) out).toString()); - out = new ByteArrayOutputStream(); - writer.flush(); - } else { - out.flush(); + if (eof) + return false; + bId--; + return true; + } + + public String next() { + if (!hasNext()) + return null; + byte c = getByte(); + while (c <= 32) + c = getByte(); + StringBuilder sb = new StringBuilder(); + while (c > 32) { + sb.append((char) c); + c = getByte(); + } + return sb.toString(); + } + + public int nextInt() { + if (!hasNext()) + return Integer.MIN_VALUE; + int sign = 1; + byte c = getByte(); + while (c <= 32) + c = getByte(); + if (c == '-') { + sign = -1; + c = getByte(); + } + int val = 0; + while (c >= '0' && c <= '9') { + val = val * 10 + (c - '0'); + c = getByte(); + } + bId--; + return val * sign; + } + + public long nextLong() { + if (!hasNext()) + return Long.MIN_VALUE; + int sign = 1; + byte c = getByte(); + while (c <= 32) + c = getByte(); + if (c == '-') { + sign = -1; + c = getByte(); + } + long val = 0; + while (c >= '0' && c <= '9') { + val = val * 10 + (c - '0'); + c = getByte(); + } + bId--; + return val * sign; + } + + public double nextDouble() { + if (!hasNext()) + return Double.NaN; + int sign = 1; + byte c = getByte(); + while (c <= 32) + c = getByte(); + if (c == '-') { + sign = -1; + c = getByte(); + } + double val = 0; + while (c >= '0' && c <= '9') { + val = val * 10 + (c - '0'); + c = getByte(); + } + if (c == '.') { + double mul = 1; + c = getByte(); + while (c >= '0' && c <= '9') { + mul *= 0.1; + val += (c - '0') * mul; + c = getByte(); } - } catch (IOException e) { - throw new RuntimeException("flush"); - } - } - - public FastWriter println(long x) { - return writeln(x); - } - - public void close() { - flush(); - try { - out.close(); - } catch (Exception e) { } + bId--; + return val * sign; } - } } From fe94a4dafbde4862f4c2b4bbb6a72884fe878657 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 22 Dec 2024 23:49:57 +0800 Subject: [PATCH 0517/2029] modify code --- src/class155/Code02_TrickyOperation1.java | 14 +++++++------- src/class155/Code02_TrickyOperation2.java | 10 +++++----- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/class155/Code02_TrickyOperation1.java b/src/class155/Code02_TrickyOperation1.java index 243581336..0b382e8b4 100644 --- a/src/class155/Code02_TrickyOperation1.java +++ b/src/class155/Code02_TrickyOperation1.java @@ -28,7 +28,7 @@ public class Code02_TrickyOperation1 { public static int[] add = new int[MAXN]; - public static TreeMap heads = new TreeMap<>(); + public static TreeMap heap = new TreeMap<>(); public static int addAll = 0; @@ -39,10 +39,10 @@ public class Code02_TrickyOperation1 { public static void minusHead(int h) { if (h != 0) { int hnum = num[h] + add[h]; - if (heads.get(hnum) == 1) { - heads.remove(hnum); + if (heap.get(hnum) == 1) { + heap.remove(hnum); } else { - heads.put(hnum, heads.get(hnum) - 1); + heap.put(hnum, heap.get(hnum) - 1); } } } @@ -50,13 +50,13 @@ public static void minusHead(int h) { public static void addHead(int h) { if (h != 0) { int hnum = num[h] + add[h]; - heads.put(hnum, heads.getOrDefault(hnum, 0) + 1); + heap.put(hnum, heap.getOrDefault(hnum, 0) + 1); } } public static void prepare() { dist[0] = -1; - heads.clear(); + heap.clear(); for (int i = 1; i <= n; i++) { up[i] = left[i] = right[i] = dist[i] = 0; father[i] = i; @@ -202,7 +202,7 @@ public static int f2(int i) { } public static int f3() { - return heads.lastKey() + addAll; + return heap.lastKey() + addAll; } public static void main(String[] args) { diff --git a/src/class155/Code02_TrickyOperation2.java b/src/class155/Code02_TrickyOperation2.java index 290a6532b..61ab69857 100644 --- a/src/class155/Code02_TrickyOperation2.java +++ b/src/class155/Code02_TrickyOperation2.java @@ -19,25 +19,25 @@ //int siz[MAXN]; //int add[MAXN]; //int sta[MAXN]; -//multiset heads; +//multiset heap; //int addAll = 0; //int n, m; // //void minusHead(int h) { // if (h != 0) { -// heads.erase(heads.find(num[h] + add[h])); +// heap.erase(heap.find(num[h] + add[h])); // } //} // //void addHead(int h) { // if (h != 0) { -// heads.insert(num[h] + add[h]); +// heap.insert(num[h] + add[h]); // } //} // //void prepare() { // dist[0] = -1; -// heads.clear(); +// heap.clear(); // for (int i = 1; i <= n; i++) { // up[i] = ls[i] = rs[i] = dist[i] = 0; // fa[i] = i; @@ -169,7 +169,7 @@ //} // //int f3() { -// return (*heads.rbegin()) + addAll; +// return (*heap.rbegin()) + addAll; //} // //int main(){ From 147224db6a138e2b8cf85b48d4ac5aadf11646f3 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 23 Dec 2024 15:19:17 +0800 Subject: [PATCH 0518/2029] modify code --- src/class155/Code01_CityCapture1.java | 30 +++++++++++++++-------- src/class155/Code01_CityCapture2.java | 26 ++++++++++++++------ src/class155/Code02_TrickyOperation1.java | 9 +++++++ src/class155/Code02_TrickyOperation2.java | 9 +++++++ src/class155/Code04_Blocks1.java | 7 ++++++ src/class155/Code04_Blocks2.java | 7 ++++++ src/class155/Code05_KShortestPath1.java | 8 ++++++ src/class155/Code05_KShortestPath2.java | 8 ++++++ 8 files changed, 86 insertions(+), 18 deletions(-) diff --git a/src/class155/Code01_CityCapture1.java b/src/class155/Code01_CityCapture1.java index 23809fa98..be279ec01 100644 --- a/src/class155/Code01_CityCapture1.java +++ b/src/class155/Code01_CityCapture1.java @@ -1,7 +1,17 @@ package class155; // 城池攻占,java版 -// 输入保证,如果城市a管辖城市b,必有a < b +// 一共有n个城市,1号城市是城市树的头,每个城市有di、bi、oi、gi +// 分别表示,城市防御值、上级城市编号、奖励类型、奖励值 +// 如果奖励类型为0,那么任何骑士攻克这个城市后,攻击力会增加gi +// 如果奖励类型为1,那么任何骑士攻克这个城市后,攻击力会乘以gi +// 输入保证,任何城市的上级编号 < 这座城市的编号 +// 一共有m个骑士,每个骑士都有攻击力ai、第一次攻击的城市fi +// 如果骑士攻击力 >= 城市防御值,当前城市会被攻占,骑士获得奖励,继续攻击上级城市 +// 如果骑士攻击力 < 城市防御值,那么骑士会在该城市牺牲,没有后续动作了 +// 所有骑士都是独立的,不会影响其他骑士攻击这座城池的结果 +// 打印每个城市牺牲的骑士数量,打印每个骑士攻占的城市数量 +// 1 <= n、m <= 3 * 10^5,攻击值的增加也不会超过long类型范围 // 测试链接 : https://www.luogu.com.cn/problem/P3261 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -22,16 +32,16 @@ public class Code01_CityCapture1 { public static long[] gain = new long[MAXN]; + public static long[] attack = new long[MAXN]; + + public static int[] first = new int[MAXN]; + public static int[] deep = new int[MAXN]; public static int[] top = new int[MAXN]; public static int[] sacrifice = new int[MAXN]; - public static long[] attack = new long[MAXN]; - - public static int[] born = new int[MAXN]; - public static int[] die = new int[MAXN]; public static int[] left = new int[MAXN]; @@ -120,10 +130,10 @@ public static void compute() { deep[i] = deep[belong[i]] + 1; } for (int i = 1; i <= m; i++) { - if (top[born[i]] == 0) { - top[born[i]] = i; + if (top[first[i]] == 0) { + top[first[i]] = i; } else { - top[born[i]] = merge(top[born[i]], i); + top[first[i]] = merge(top[first[i]], i); } } for (int i = n; i >= 1; i--) { @@ -158,14 +168,14 @@ public static void main(String[] args) { } for (int i = 1; i <= m; i++) { attack[i] = io.nextLong(); - born[i] = io.nextInt(); + first[i] = io.nextInt(); } compute(); for (int i = 1; i <= n; i++) { io.println(sacrifice[i]); } for (int i = 1; i <= m; i++) { - io.println(deep[born[i]] - deep[die[i]]); + io.println(deep[first[i]] - deep[die[i]]); } io.flush(); io.close(); diff --git a/src/class155/Code01_CityCapture2.java b/src/class155/Code01_CityCapture2.java index 50e191dfe..2e2227737 100644 --- a/src/class155/Code01_CityCapture2.java +++ b/src/class155/Code01_CityCapture2.java @@ -1,7 +1,17 @@ package class155; // 城池攻占,C++版 -// 输入保证,如果城市a管辖城市b,必有a < b +// 一共有n个城市,1号城市是城市树的头,每个城市有di、bi、oi、gi +// 分别表示,城市防御值、上级城市编号、奖励类型、奖励值 +// 如果奖励类型为0,那么任何骑士攻克这个城市后,攻击力会增加gi +// 如果奖励类型为1,那么任何骑士攻克这个城市后,攻击力会乘以gi +// 输入保证,任何城市的上级编号 < 这座城市的编号 +// 一共有m个骑士,每个骑士都有攻击力ai、第一次攻击的城市fi +// 如果骑士攻击力 >= 城市防御值,当前城市会被攻占,骑士获得奖励,继续攻击上级城市 +// 如果骑士攻击力 < 城市防御值,那么骑士会在该城市牺牲,没有后续动作了 +// 所有骑士都是独立的,不会影响其他骑士攻击这座城池的结果 +// 打印每个城市牺牲的骑士数量,打印每个骑士攻占的城市数量 +// 1 <= n、m <= 3 * 10^5,攻击值的增加也不会超过long类型范围 // 测试链接 : https://www.luogu.com.cn/problem/P3261 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -16,11 +26,11 @@ //int belong[MAXN]; //int op[MAXN]; //long long gain[MAXN]; +//long long attack[MAXN]; +//int first[MAXN]; //int deep[MAXN]; //int top[MAXN]; //int sacrifice[MAXN]; -//long long attack[MAXN]; -//int born[MAXN]; //int die[MAXN]; //int ls[MAXN]; //int rs[MAXN]; @@ -99,10 +109,10 @@ // deep[i] = deep[belong[i]] + 1; // } // for (int i = 1; i <= m; i++) { -// if (top[born[i]] == 0) { -// top[born[i]] = i; +// if (top[first[i]] == 0) { +// top[first[i]] = i; // } else { -// top[born[i]] = merge(top[born[i]], i); +// top[first[i]] = merge(top[first[i]], i); // } // } // for (int i = n; i >= 1; i--) { @@ -134,14 +144,14 @@ // cin >> belong[i] >> op[i] >> gain[i]; // } // for (int i = 1; i <= m; i++) { -// cin >> attack[i] >> born[i]; +// cin >> attack[i] >> first[i]; // } // compute(); // for (int i = 1; i <= n; i++) { // cout << sacrifice[i] << "\n"; // } // for (int i = 1; i <= m; i++) { -// cout << deep[born[i]] - deep[die[i]] << endl; +// cout << deep[first[i]] - deep[die[i]] << endl; // } // return 0; //} \ No newline at end of file diff --git a/src/class155/Code02_TrickyOperation1.java b/src/class155/Code02_TrickyOperation1.java index 0b382e8b4..e86ca3b83 100644 --- a/src/class155/Code02_TrickyOperation1.java +++ b/src/class155/Code02_TrickyOperation1.java @@ -1,6 +1,15 @@ package class155; // 棘手的操作,java版 +// 编号1~n个节点,每个节点独立且有自己的权值,实现如下6种操作,操作一共调用m次 +// U x y : x所在的集合和y所在的集合合并 +// A1 x v : x节点的权值增加v +// A2 x v : x所在的集合所有节点的权值增加v +// A3 v : 所有节点的权值增加v +// F1 x : 打印x节点的权值 +// F2 x : 打印x所在的集合中,权值最大的节点的权值 +// F3 : 打印所有节点中,权值最大的节点的权值 +// 1 <= n、m <= 3 * 10^5,权值不会超过int类型的范围 // 测试链接 : https://www.luogu.com.cn/problem/P3273 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class155/Code02_TrickyOperation2.java b/src/class155/Code02_TrickyOperation2.java index 61ab69857..53c162222 100644 --- a/src/class155/Code02_TrickyOperation2.java +++ b/src/class155/Code02_TrickyOperation2.java @@ -1,6 +1,15 @@ package class155; // 棘手的操作,C++版 +// 编号1~n个节点,每个节点独立且有自己的权值,实现如下6种操作,操作一共调用m次 +// U x y : x所在的集合和y所在的集合合并 +// A1 x v : x节点的权值增加v +// A2 x v : x所在的集合所有节点的权值增加v +// A3 v : 所有节点的权值增加v +// F1 x : 打印x节点的权值 +// F2 x : 打印x所在的集合中,权值最大的节点的权值 +// F3 : 打印所有节点中,权值最大的节点的权值 +// 1 <= n、m <= 3 * 10^5,权值不会超过int类型的范围 // 测试链接 : https://www.luogu.com.cn/problem/P3273 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class155/Code04_Blocks1.java b/src/class155/Code04_Blocks1.java index 25293b6da..485acbb12 100644 --- a/src/class155/Code04_Blocks1.java +++ b/src/class155/Code04_Blocks1.java @@ -1,6 +1,13 @@ package class155; // Y的积木,可持久化左偏树实现最优解,java版 +// 一共有n个正数数组,给定每个数组的大小mi,以及每个数组的数字 +// 每个数组必须选且只能选一个数字,就可以形成n个数字的挑选方案 +// 所有这些方案中,有数字累加和第1小的方案、第2小的方案、第3小的方案... +// 打印,累加和前k小的方案,各自的累加和,要求实现O(k * log k)的解 +// 1 <= n、mi <= 100 +// 1 <= k <= 10^4 +// 1 <= 数字 <= 100 // 测试链接 : https://www.luogu.com.cn/problem/P2409 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class155/Code04_Blocks2.java b/src/class155/Code04_Blocks2.java index 16edc7599..048fb2d65 100644 --- a/src/class155/Code04_Blocks2.java +++ b/src/class155/Code04_Blocks2.java @@ -1,6 +1,13 @@ package class155; // Y的积木,可持久化左偏树实现最优解,C++版 +// 一共有n个正数数组,给定每个数组的大小mi,以及每个数组的数字 +// 每个数组必须选且只能选一个数字,就可以形成n个数字的挑选方案 +// 所有这些方案中,有数字累加和第1小的方案、第2小的方案、第3小的方案... +// 打印,累加和前k小的方案,各自的累加和,要求实现O(k * log k)的解 +// 1 <= n、mi <= 100 +// 1 <= k <= 10^4 +// 1 <= 数字 <= 100 // 测试链接 : https://www.luogu.com.cn/problem/P2409 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class155/Code05_KShortestPath1.java b/src/class155/Code05_KShortestPath1.java index f31cc7958..7b2d895a3 100644 --- a/src/class155/Code05_KShortestPath1.java +++ b/src/class155/Code05_KShortestPath1.java @@ -1,6 +1,14 @@ package class155; // k短路问题,可持久化左偏树实现最优解,java版 +// 一共有n个点,编号1~n,一共有m条边,每条边有边权,组成一个有向带权图 +// 从1号点走到n号点,就认为是一次旅行 +// 一次旅行中,边不能重复选,但是点可以重复经过,如果到达了n号点,那么这次旅行直接停止 +// 从1号点走到n号点,会有很多通路方案,通路方案的路费为所有选择边集的边权和 +// 虽然每次旅行都是从1号点到n号点,但是你希望每次旅行的通路方案都是不同的 +// 任何两次旅行,只要选择边集稍有不同,就认为是不同的旅行 +// 你的钱数为money,用来支付路费,打印你一共能进行几次旅行 +// 可持久化左偏树的解法可以做到最优解,请用此方法实现 // 测试链接 : https://www.luogu.com.cn/problem/P2483 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class155/Code05_KShortestPath2.java b/src/class155/Code05_KShortestPath2.java index dc329cbbd..b15e0ff92 100644 --- a/src/class155/Code05_KShortestPath2.java +++ b/src/class155/Code05_KShortestPath2.java @@ -1,6 +1,14 @@ package class155; // k短路问题,可持久化左偏树实现最优解,C++版 +// 一共有n个点,编号1~n,m条边,每条边都有边权,组成一个有向带权图 +// 从1号点走到n号点,就认为是一次旅行 +// 一次旅行中,边不能重复选,但是点可以重复经过,如果到达了n号点,那么这次旅行直接停止 +// 从1号点走到n号点,会有很多通路方案,通路方案的路费为所有选择边集的边权和 +// 虽然每次旅行都是从1号点到n号点,但是你希望每次旅行的通路方案都是不同的 +// 任何两次旅行,只要选择边集稍有不同,就认为是不同的旅行 +// 你的钱数为money,用来支付路费,打印你一共能进行几次旅行 +// 可持久化左偏树的解法可以做到最优解,请用此方法实现 // 测试链接 : https://www.luogu.com.cn/problem/P2483 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From 15fc26d32d8f9f5bf68ace0657567529eb5973a8 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 23 Dec 2024 15:37:56 +0800 Subject: [PATCH 0519/2029] modify code --- src/class155/Code01_CityCapture1.java | 9 ++++----- src/class155/Code01_CityCapture2.java | 9 ++++----- src/class155/Code05_KShortestPath1.java | 2 +- src/class155/Code05_KShortestPath2.java | 2 +- 4 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/class155/Code01_CityCapture1.java b/src/class155/Code01_CityCapture1.java index be279ec01..dd1c5f0bf 100644 --- a/src/class155/Code01_CityCapture1.java +++ b/src/class155/Code01_CityCapture1.java @@ -1,12 +1,11 @@ package class155; // 城池攻占,java版 -// 一共有n个城市,1号城市是城市树的头,每个城市有di、bi、oi、gi -// 分别表示,城市防御值、上级城市编号、奖励类型、奖励值 -// 如果奖励类型为0,那么任何骑士攻克这个城市后,攻击力会增加gi -// 如果奖励类型为1,那么任何骑士攻克这个城市后,攻击力会乘以gi +// 一共有n个城市,1号城市是城市树的头,每个城市有城市防御值、上级城市编号、奖励类型、奖励值 +// 如果奖励类型为0,任何骑士攻克这个城市后,攻击力会加上该城市的奖励值 +// 如果奖励类型为1,任何骑士攻克这个城市后,攻击力会乘以该城市的奖励值 // 输入保证,任何城市的上级编号 < 这座城市的编号 -// 一共有m个骑士,每个骑士都有攻击力ai、第一次攻击的城市fi +// 一共有m个骑士,每个骑士都有攻击力、第一次攻击的城市 // 如果骑士攻击力 >= 城市防御值,当前城市会被攻占,骑士获得奖励,继续攻击上级城市 // 如果骑士攻击力 < 城市防御值,那么骑士会在该城市牺牲,没有后续动作了 // 所有骑士都是独立的,不会影响其他骑士攻击这座城池的结果 diff --git a/src/class155/Code01_CityCapture2.java b/src/class155/Code01_CityCapture2.java index 2e2227737..1cdbe6a32 100644 --- a/src/class155/Code01_CityCapture2.java +++ b/src/class155/Code01_CityCapture2.java @@ -1,12 +1,11 @@ package class155; // 城池攻占,C++版 -// 一共有n个城市,1号城市是城市树的头,每个城市有di、bi、oi、gi -// 分别表示,城市防御值、上级城市编号、奖励类型、奖励值 -// 如果奖励类型为0,那么任何骑士攻克这个城市后,攻击力会增加gi -// 如果奖励类型为1,那么任何骑士攻克这个城市后,攻击力会乘以gi +// 一共有n个城市,1号城市是城市树的头,每个城市有城市防御值、上级城市编号、奖励类型、奖励值 +// 如果奖励类型为0,任何骑士攻克这个城市后,攻击力会加上该城市的奖励值 +// 如果奖励类型为1,任何骑士攻克这个城市后,攻击力会乘以该城市的奖励值 // 输入保证,任何城市的上级编号 < 这座城市的编号 -// 一共有m个骑士,每个骑士都有攻击力ai、第一次攻击的城市fi +// 一共有m个骑士,每个骑士都有攻击力、第一次攻击的城市 // 如果骑士攻击力 >= 城市防御值,当前城市会被攻占,骑士获得奖励,继续攻击上级城市 // 如果骑士攻击力 < 城市防御值,那么骑士会在该城市牺牲,没有后续动作了 // 所有骑士都是独立的,不会影响其他骑士攻击这座城池的结果 diff --git a/src/class155/Code05_KShortestPath1.java b/src/class155/Code05_KShortestPath1.java index 7b2d895a3..18458b2c7 100644 --- a/src/class155/Code05_KShortestPath1.java +++ b/src/class155/Code05_KShortestPath1.java @@ -8,7 +8,7 @@ // 虽然每次旅行都是从1号点到n号点,但是你希望每次旅行的通路方案都是不同的 // 任何两次旅行,只要选择边集稍有不同,就认为是不同的旅行 // 你的钱数为money,用来支付路费,打印你一共能进行几次旅行 -// 可持久化左偏树的解法可以做到最优解,请用此方法实现 +// 可持久化左偏树的解法能做到最优解,请用此方法实现 // 测试链接 : https://www.luogu.com.cn/problem/P2483 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class155/Code05_KShortestPath2.java b/src/class155/Code05_KShortestPath2.java index b15e0ff92..bf7a6afbf 100644 --- a/src/class155/Code05_KShortestPath2.java +++ b/src/class155/Code05_KShortestPath2.java @@ -8,7 +8,7 @@ // 虽然每次旅行都是从1号点到n号点,但是你希望每次旅行的通路方案都是不同的 // 任何两次旅行,只要选择边集稍有不同,就认为是不同的旅行 // 你的钱数为money,用来支付路费,打印你一共能进行几次旅行 -// 可持久化左偏树的解法可以做到最优解,请用此方法实现 +// 可持久化左偏树的解法能做到最优解,请用此方法实现 // 测试链接 : https://www.luogu.com.cn/problem/P2483 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From 21e866d7ba6b90298928cf0b411f0fa993aad3b8 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 23 Dec 2024 16:04:27 +0800 Subject: [PATCH 0520/2029] modify code --- src/class155/Code01_CityCapture1.java | 13 +++++++++++++ src/class155/Code02_TrickyOperation1.java | 11 +++++++++-- src/class155/Code02_TrickyOperation2.java | 2 +- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/class155/Code01_CityCapture1.java b/src/class155/Code01_CityCapture1.java index dd1c5f0bf..ae6cee7a6 100644 --- a/src/class155/Code01_CityCapture1.java +++ b/src/class155/Code01_CityCapture1.java @@ -23,34 +23,47 @@ public class Code01_CityCapture1 { public static int n, m; + // 城市防御值 public static long[] defend = new long[MAXN]; + // 上级城市编号 public static int[] belong = new int[MAXN]; + // 奖励类型 public static int[] op = new int[MAXN]; + // 奖励值 public static long[] gain = new long[MAXN]; + // 骑士攻击力 public static long[] attack = new long[MAXN]; + // 骑士第一次攻击的城市 public static int[] first = new int[MAXN]; + // 城市在城市树中的深度 public static int[] deep = new int[MAXN]; + // 城市拥有的骑士列表,用小根堆左偏树组织,最弱的骑士是头 public static int[] top = new int[MAXN]; + // 每个城市牺牲人数统计 public static int[] sacrifice = new int[MAXN]; + // 每个骑士死在了什么城市 public static int[] die = new int[MAXN]; + // 左偏树需要 public static int[] left = new int[MAXN]; public static int[] right = new int[MAXN]; public static int[] dist = new int[MAXN]; + // 懒更新信息,攻击力应该乘多少 public static long[] mul = new long[MAXN]; + // 懒更新信息,攻击力应该加多少 public static long[] add = new long[MAXN]; public static void prepare() { diff --git a/src/class155/Code02_TrickyOperation1.java b/src/class155/Code02_TrickyOperation1.java index e86ca3b83..c932531bc 100644 --- a/src/class155/Code02_TrickyOperation1.java +++ b/src/class155/Code02_TrickyOperation1.java @@ -21,6 +21,9 @@ public class Code02_TrickyOperation1 { public static int MAXN = 300001; + public static int n, m; + + // 左偏树需要 public static int[] num = new int[MAXN]; public static int[] up = new int[MAXN]; @@ -31,20 +34,24 @@ public class Code02_TrickyOperation1 { public static int[] dist = new int[MAXN]; + // 并查集的路径信息 public static int[] father = new int[MAXN]; + // 集合的大小信息 public static int[] size = new int[MAXN]; + // 集合内所有数字应该加多少值 public static int[] add = new int[MAXN]; + // 所有集合头节点的值,进入这个堆 public static TreeMap heap = new TreeMap<>(); + // 所有数字应该加多少 public static int addAll = 0; + // 准备好一个栈,用迭代方式实现先序遍历,不用递归方式 public static int[] stack = new int[MAXN]; - public static int n, m; - public static void minusHead(int h) { if (h != 0) { int hnum = num[h] + add[h]; diff --git a/src/class155/Code02_TrickyOperation2.java b/src/class155/Code02_TrickyOperation2.java index 53c162222..7b84cd101 100644 --- a/src/class155/Code02_TrickyOperation2.java +++ b/src/class155/Code02_TrickyOperation2.java @@ -19,6 +19,7 @@ //using namespace std; // //const int MAXN = 300001; +//int n, m; //int num[MAXN]; //int up[MAXN]; //int ls[MAXN]; @@ -30,7 +31,6 @@ //int sta[MAXN]; //multiset heap; //int addAll = 0; -//int n, m; // //void minusHead(int h) { // if (h != 0) { From 933496d23f0e2e09da6f5c375c66d49929c043c2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 23 Dec 2024 16:15:46 +0800 Subject: [PATCH 0521/2029] modify code --- src/class155/Code01_CityCapture1.java | 4 ++-- src/class155/Code01_CityCapture2.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class155/Code01_CityCapture1.java b/src/class155/Code01_CityCapture1.java index ae6cee7a6..c3385adb5 100644 --- a/src/class155/Code01_CityCapture1.java +++ b/src/class155/Code01_CityCapture1.java @@ -1,10 +1,10 @@ package class155; // 城池攻占,java版 -// 一共有n个城市,1号城市是城市树的头,每个城市有城市防御值、上级城市编号、奖励类型、奖励值 +// 一共有n个城市,1号城市是城市树的头,每个城市都有防御值、上级城市编号、奖励类型、奖励值 // 如果奖励类型为0,任何骑士攻克这个城市后,攻击力会加上该城市的奖励值 // 如果奖励类型为1,任何骑士攻克这个城市后,攻击力会乘以该城市的奖励值 -// 输入保证,任何城市的上级编号 < 这座城市的编号 +// 任何城市的上级编号 < 这座城市的编号,1号城市没有上级城市编号、奖励类型、奖励值 // 一共有m个骑士,每个骑士都有攻击力、第一次攻击的城市 // 如果骑士攻击力 >= 城市防御值,当前城市会被攻占,骑士获得奖励,继续攻击上级城市 // 如果骑士攻击力 < 城市防御值,那么骑士会在该城市牺牲,没有后续动作了 diff --git a/src/class155/Code01_CityCapture2.java b/src/class155/Code01_CityCapture2.java index 1cdbe6a32..aaa73ad90 100644 --- a/src/class155/Code01_CityCapture2.java +++ b/src/class155/Code01_CityCapture2.java @@ -1,10 +1,10 @@ package class155; // 城池攻占,C++版 -// 一共有n个城市,1号城市是城市树的头,每个城市有城市防御值、上级城市编号、奖励类型、奖励值 +// 一共有n个城市,1号城市是城市树的头,每个城市都有防御值、上级城市编号、奖励类型、奖励值 // 如果奖励类型为0,任何骑士攻克这个城市后,攻击力会加上该城市的奖励值 // 如果奖励类型为1,任何骑士攻克这个城市后,攻击力会乘以该城市的奖励值 -// 输入保证,任何城市的上级编号 < 这座城市的编号 +// 任何城市的上级编号 < 这座城市的编号,1号城市没有上级城市编号、奖励类型、奖励值 // 一共有m个骑士,每个骑士都有攻击力、第一次攻击的城市 // 如果骑士攻击力 >= 城市防御值,当前城市会被攻占,骑士获得奖励,继续攻击上级城市 // 如果骑士攻击力 < 城市防御值,那么骑士会在该城市牺牲,没有后续动作了 From 7f5a6ee4a28aac3e8d208a89bc8c46fc468c9dbf Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 23 Dec 2024 16:23:48 +0800 Subject: [PATCH 0522/2029] modify code --- src/class155/Code02_TrickyOperation1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class155/Code02_TrickyOperation1.java b/src/class155/Code02_TrickyOperation1.java index c932531bc..93d18662f 100644 --- a/src/class155/Code02_TrickyOperation1.java +++ b/src/class155/Code02_TrickyOperation1.java @@ -43,7 +43,7 @@ public class Code02_TrickyOperation1 { // 集合内所有数字应该加多少值 public static int[] add = new int[MAXN]; - // 所有集合头节点的值,进入这个堆 + // 所有集合头节点的值,进入这个堆,头堆 public static TreeMap heap = new TreeMap<>(); // 所有数字应该加多少 From 97ab0565b11c018aa1572c82bdafccbdf8d6c12a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 23 Dec 2024 16:51:33 +0800 Subject: [PATCH 0523/2029] modify code --- src/class155/Code01_CityCapture1.java | 22 +++++++++++----------- src/class155/Code01_CityCapture2.java | 22 +++++++++++----------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/class155/Code01_CityCapture1.java b/src/class155/Code01_CityCapture1.java index c3385adb5..ada3d8c8b 100644 --- a/src/class155/Code01_CityCapture1.java +++ b/src/class155/Code01_CityCapture1.java @@ -78,6 +78,17 @@ public static void prepare() { } } + public static void upgrade(int i, int t, long v) { + if (t == 0) { + add[i] += v; + attack[i] += v; + } else { + mul[i] *= v; + add[i] *= v; + attack[i] *= v; + } + } + public static void down(int i) { if (mul[i] != 1 || add[i] != 0) { int l = left[i]; @@ -125,17 +136,6 @@ public static int pop(int i) { return ans; } - public static void upgrade(int i, int t, long v) { - if (t == 0) { - add[i] += v; - attack[i] += v; - } else { - mul[i] *= v; - add[i] *= v; - attack[i] *= v; - } - } - public static void compute() { deep[1] = 1; for (int i = 2; i <= n; i++) { diff --git a/src/class155/Code01_CityCapture2.java b/src/class155/Code01_CityCapture2.java index aaa73ad90..757fe5161 100644 --- a/src/class155/Code01_CityCapture2.java +++ b/src/class155/Code01_CityCapture2.java @@ -49,6 +49,17 @@ // } //} // +//void upgrade(int i, int t, long long v) { +// if (t == 0) { +// add[i] += v; +// attack[i] += v; +// } else { +// mul[i] *= v; +// add[i] = add[i] * v; +// attack[i] = attack[i] * v; +// } +//} +// //void down(int i) { // if (mul[i] != 1 || add[i] != 0) { // int l = ls[i]; @@ -91,17 +102,6 @@ // return ans; //} // -//void upgrade(int i, int t, long long v) { -// if (t == 0) { -// add[i] += v; -// attack[i] += v; -// } else { -// mul[i] *= v; -// add[i] = add[i] * v; -// attack[i] = attack[i] * v; -// } -//} -// //void compute() { // deep[1] = 1; // for (int i = 2; i <= n; i++) { From 033eb56a54df403f4338ae59d7e53f60bad4f19b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 23 Dec 2024 17:16:09 +0800 Subject: [PATCH 0524/2029] modify code --- src/class155/Code05_KShortestPath1.java | 1 - src/class155/Code05_KShortestPath2.java | 1 - 2 files changed, 2 deletions(-) diff --git a/src/class155/Code05_KShortestPath1.java b/src/class155/Code05_KShortestPath1.java index 18458b2c7..f429d807d 100644 --- a/src/class155/Code05_KShortestPath1.java +++ b/src/class155/Code05_KShortestPath1.java @@ -8,7 +8,6 @@ // 虽然每次旅行都是从1号点到n号点,但是你希望每次旅行的通路方案都是不同的 // 任何两次旅行,只要选择边集稍有不同,就认为是不同的旅行 // 你的钱数为money,用来支付路费,打印你一共能进行几次旅行 -// 可持久化左偏树的解法能做到最优解,请用此方法实现 // 测试链接 : https://www.luogu.com.cn/problem/P2483 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class155/Code05_KShortestPath2.java b/src/class155/Code05_KShortestPath2.java index bf7a6afbf..e3aaa3690 100644 --- a/src/class155/Code05_KShortestPath2.java +++ b/src/class155/Code05_KShortestPath2.java @@ -8,7 +8,6 @@ // 虽然每次旅行都是从1号点到n号点,但是你希望每次旅行的通路方案都是不同的 // 任何两次旅行,只要选择边集稍有不同,就认为是不同的旅行 // 你的钱数为money,用来支付路费,打印你一共能进行几次旅行 -// 可持久化左偏树的解法能做到最优解,请用此方法实现 // 测试链接 : https://www.luogu.com.cn/problem/P2483 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From 60d6c32b63a0eb9aff51da58fe8986070b324594 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 24 Dec 2024 11:44:53 +0800 Subject: [PATCH 0525/2029] modify code --- src/class155/Code05_KShortestPath1.java | 10 +++++----- src/class155/Code05_KShortestPath2.java | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/class155/Code05_KShortestPath1.java b/src/class155/Code05_KShortestPath1.java index f429d807d..5b3e1dc2c 100644 --- a/src/class155/Code05_KShortestPath1.java +++ b/src/class155/Code05_KShortestPath1.java @@ -203,20 +203,20 @@ public static int expand() { while (!heapEmpty()) { int top = heapPop(); int i = idx[top]; - double w = val[top]; - money -= w + dis[1]; + double v = val[top]; + money -= v + dis[1]; if (money < 0) { break; } ans++; if (left[i] != 0) { - heapAdd(left[i], w - cost[i] + cost[left[i]]); + heapAdd(left[i], v - cost[i] + cost[left[i]]); } if (right[i] != 0) { - heapAdd(right[i], w - cost[i] + cost[right[i]]); + heapAdd(right[i], v - cost[i] + cost[right[i]]); } if (to[i] != 0 && rt[to[i]] != 0) { - heapAdd(rt[to[i]], w + cost[rt[to[i]]]); + heapAdd(rt[to[i]], v + cost[rt[to[i]]]); } } } diff --git a/src/class155/Code05_KShortestPath2.java b/src/class155/Code05_KShortestPath2.java index e3aaa3690..a0ed8956b 100644 --- a/src/class155/Code05_KShortestPath2.java +++ b/src/class155/Code05_KShortestPath2.java @@ -191,20 +191,20 @@ // while(!heapEmpty()){ // int top = heapPop(); // int i = idx[top]; -// double w = val[top]; -// money -= w + dis[1]; +// double v = val[top]; +// money -= v + dis[1]; // if(money < 0){ // break; // } // ans++; // if(ls[i] != 0){ -// heapAdd(ls[i], w - cost[i] + cost[ls[i]]); +// heapAdd(ls[i], v - cost[i] + cost[ls[i]]); // } // if(rs[i] != 0){ -// heapAdd(rs[i], w - cost[i] + cost[rs[i]]); +// heapAdd(rs[i], v - cost[i] + cost[rs[i]]); // } // if(to[i] != 0 && rt[to[i]] != 0){ -// heapAdd(rt[to[i]], w + cost[rt[to[i]]]); +// heapAdd(rt[to[i]], v + cost[rt[to[i]]]); // } // } // } From a930f1ca8ddd9e561d335bf0adb3c9ffc14bc08b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 24 Dec 2024 12:04:57 +0800 Subject: [PATCH 0526/2029] modify code --- src/class155/Code05_KShortestPath1.java | 3 +-- src/class155/Code05_KShortestPath2.java | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/class155/Code05_KShortestPath1.java b/src/class155/Code05_KShortestPath1.java index 5b3e1dc2c..4a898e413 100644 --- a/src/class155/Code05_KShortestPath1.java +++ b/src/class155/Code05_KShortestPath1.java @@ -51,9 +51,8 @@ public class Code05_KShortestPath1 { public static int[] idx = new int[MAXH]; public static double[] val = new double[MAXH]; - public static int cntd; public static int[] heap = new int[MAXH]; - public static int cnth; + public static int cntd, cnth; public static boolean[] vis = new boolean[MAXN]; public static int[] path = new int[MAXN]; diff --git a/src/class155/Code05_KShortestPath2.java b/src/class155/Code05_KShortestPath2.java index a0ed8956b..511c9df68 100644 --- a/src/class155/Code05_KShortestPath2.java +++ b/src/class155/Code05_KShortestPath2.java @@ -48,9 +48,8 @@ // //int idx[MAXH]; //double val[MAXH]; -//int cntd = 0; //int heap[MAXH]; -//int cnth = 0; +//int cntd, cnth; // //bool vis[MAXN]; //int path[MAXN]; From 2d8ed22b7aec3f601a7b11f33f723fd04093d722 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 24 Dec 2024 12:09:55 +0800 Subject: [PATCH 0527/2029] modify code --- src/class155/Code03_PersistentLeftistTree1.java | 3 +-- src/class155/Code03_PersistentLeftistTree2.java | 5 ++--- src/class155/Code05_KShortestPath1.java | 3 +-- src/class155/Code05_KShortestPath2.java | 3 +-- 4 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/class155/Code03_PersistentLeftistTree1.java b/src/class155/Code03_PersistentLeftistTree1.java index 3c8d16db0..34566df9d 100644 --- a/src/class155/Code03_PersistentLeftistTree1.java +++ b/src/class155/Code03_PersistentLeftistTree1.java @@ -11,6 +11,7 @@ public class Code03_PersistentLeftistTree1 { public static int MAXV = 100000; public static int MAXT = 2000001; + public static int[] rt = new int[MAXN]; public static int[] num = new int[MAXT]; public static int[] left = new int[MAXT]; public static int[] right = new int[MAXT]; @@ -18,8 +19,6 @@ public class Code03_PersistentLeftistTree1 { public static int[] size = new int[MAXT]; public static int cnt = 0; - public static int[] rt = new int[MAXN]; - public static int init(int v) { num[++cnt] = v; left[cnt] = right[cnt] = dist[cnt] = 0; diff --git a/src/class155/Code03_PersistentLeftistTree2.java b/src/class155/Code03_PersistentLeftistTree2.java index fbe2caaa1..e649a298c 100644 --- a/src/class155/Code03_PersistentLeftistTree2.java +++ b/src/class155/Code03_PersistentLeftistTree2.java @@ -15,6 +15,7 @@ //const int MAXV = 100000; //const int MAXT = 2000001; // +//int rt[MAXN]; //int num[MAXT]; //int ls[MAXT]; //int rs[MAXT]; @@ -22,8 +23,6 @@ //int siz[MAXT]; //int cnt = 0; // -//int rt[MAXN]; -// //int init(int v) { // num[++cnt] = v; // ls[cnt] = rs[cnt] = dist[cnt] = 0; @@ -212,6 +211,6 @@ // cout << "err!" << endl; // } // } -// cout << "test end" << endl; +// cout << "test finish" << endl; // return 0; //} \ No newline at end of file diff --git a/src/class155/Code05_KShortestPath1.java b/src/class155/Code05_KShortestPath1.java index 4a898e413..a05bf0682 100644 --- a/src/class155/Code05_KShortestPath1.java +++ b/src/class155/Code05_KShortestPath1.java @@ -40,6 +40,7 @@ public class Code05_KShortestPath1 { public static double[] weightr = new double[MAXM]; public static int cntr = 0; + public static int[] rt = new int[MAXN]; public static int[] to = new int[MAXT]; public static double[] cost = new double[MAXT]; public static int[] left = new int[MAXT]; @@ -47,8 +48,6 @@ public class Code05_KShortestPath1 { public static int[] dist = new int[MAXT]; public static int cntt = 0; - public static int[] rt = new int[MAXN]; - public static int[] idx = new int[MAXH]; public static double[] val = new double[MAXH]; public static int[] heap = new int[MAXH]; diff --git a/src/class155/Code05_KShortestPath2.java b/src/class155/Code05_KShortestPath2.java index 511c9df68..5cd59d614 100644 --- a/src/class155/Code05_KShortestPath2.java +++ b/src/class155/Code05_KShortestPath2.java @@ -37,6 +37,7 @@ //double weightr[MAXM]; //int cntr = 0; // +//int rt[MAXN]; //int to[MAXT]; //double cost[MAXT]; //int ls[MAXT]; @@ -44,8 +45,6 @@ //int dist[MAXT]; //int cntt = 0; // -//int rt[MAXN]; -// //int idx[MAXH]; //double val[MAXH]; //int heap[MAXH]; From a8c83271724cb3a446c01fc84430575776ddca8f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 24 Dec 2024 12:25:40 +0800 Subject: [PATCH 0528/2029] modify code --- src/class155/Code05_KShortestPath1.java | 15 ++++++++------- src/class155/Code05_KShortestPath2.java | 21 +++++++++++---------- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/src/class155/Code05_KShortestPath1.java b/src/class155/Code05_KShortestPath1.java index a05bf0682..35a288ffc 100644 --- a/src/class155/Code05_KShortestPath1.java +++ b/src/class155/Code05_KShortestPath1.java @@ -178,9 +178,10 @@ public static void mergeRoad() { while (!heapEmpty()) { int top = heapPop(); int u = idx[top]; - for (int e = headg[u]; e > 0; e = nextg[e]) { + for (int e = headg[u], v; e > 0; e = nextg[e]) { + v = tog[e]; if (e != path[u]) { - rt[u] = merge(rt[u], init(tog[e], weightg[e] + dis[tog[e]] - dis[u])); + rt[u] = merge(rt[u], init(v, weightg[e] + dis[v] - dis[u])); } } if (path[u] != 0) { @@ -201,20 +202,20 @@ public static int expand() { while (!heapEmpty()) { int top = heapPop(); int i = idx[top]; - double v = val[top]; - money -= v + dis[1]; + double w = val[top]; + money -= w + dis[1]; if (money < 0) { break; } ans++; if (left[i] != 0) { - heapAdd(left[i], v - cost[i] + cost[left[i]]); + heapAdd(left[i], w - cost[i] + cost[left[i]]); } if (right[i] != 0) { - heapAdd(right[i], v - cost[i] + cost[right[i]]); + heapAdd(right[i], w - cost[i] + cost[right[i]]); } if (to[i] != 0 && rt[to[i]] != 0) { - heapAdd(rt[to[i]], v + cost[rt[to[i]]]); + heapAdd(rt[to[i]], w + cost[rt[to[i]]]); } } } diff --git a/src/class155/Code05_KShortestPath2.java b/src/class155/Code05_KShortestPath2.java index 5cd59d614..b204d9b4d 100644 --- a/src/class155/Code05_KShortestPath2.java +++ b/src/class155/Code05_KShortestPath2.java @@ -1,7 +1,7 @@ package class155; // k短路问题,可持久化左偏树实现最优解,C++版 -// 一共有n个点,编号1~n,m条边,每条边都有边权,组成一个有向带权图 +// 一共有n个点,编号1~n,一共有m条边,每条边有边权,组成一个有向带权图 // 从1号点走到n号点,就认为是一次旅行 // 一次旅行中,边不能重复选,但是点可以重复经过,如果到达了n号点,那么这次旅行直接停止 // 从1号点走到n号点,会有很多通路方案,通路方案的路费为所有选择边集的边权和 @@ -145,8 +145,8 @@ // double w = val[top]; // if(!vis[u]){ // vis[u] = true; -// for(int e = headr[u]; e != 0; e = nextr[e]){ -// int v = tor[e]; +// for(int e = headr[u], v; e != 0; e = nextr[e]){ +// v = tor[e]; // if(dis[v] > w + weightr[e]){ // dis[v] = w + weightr[e]; // path[v] = e; @@ -166,9 +166,10 @@ // while(!heapEmpty()){ // int top = heapPop(); // int u = idx[top]; -// for(int e = headg[u]; e != 0; e = nextg[e]){ +// for(int e = headg[u], v; e != 0; e = nextg[e]){ +// v = tog[e]; // if(e != path[u]){ -// rt[u] = merge(rt[u], init(tog[e], weightg[e] + dis[tog[e]] - dis[u])); +// rt[u] = merge(rt[u], init(v, weightg[e] + dis[v] - dis[u])); // } // } // if(path[u] != 0){ @@ -189,20 +190,20 @@ // while(!heapEmpty()){ // int top = heapPop(); // int i = idx[top]; -// double v = val[top]; -// money -= v + dis[1]; +// double w = val[top]; +// money -= w + dis[1]; // if(money < 0){ // break; // } // ans++; // if(ls[i] != 0){ -// heapAdd(ls[i], v - cost[i] + cost[ls[i]]); +// heapAdd(ls[i], w - cost[i] + cost[ls[i]]); // } // if(rs[i] != 0){ -// heapAdd(rs[i], v - cost[i] + cost[rs[i]]); +// heapAdd(rs[i], w - cost[i] + cost[rs[i]]); // } // if(to[i] != 0 && rt[to[i]] != 0){ -// heapAdd(rt[to[i]], v + cost[rt[to[i]]]); +// heapAdd(rt[to[i]], w + cost[rt[to[i]]]); // } // } // } From 692f2f7ded3d2e53a6342135900c1b78cfce3a8e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 24 Dec 2024 13:32:46 +0800 Subject: [PATCH 0529/2029] modify code --- src/class155/Code05_KShortestPath1.java | 24 ++++++++++++------------ src/class155/Code05_KShortestPath2.java | 24 ++++++++++++------------ 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/class155/Code05_KShortestPath1.java b/src/class155/Code05_KShortestPath1.java index 35a288ffc..76815a507 100644 --- a/src/class155/Code05_KShortestPath1.java +++ b/src/class155/Code05_KShortestPath1.java @@ -48,7 +48,7 @@ public class Code05_KShortestPath1 { public static int[] dist = new int[MAXT]; public static int cntt = 0; - public static int[] idx = new int[MAXH]; + public static int[] key = new int[MAXH]; public static double[] val = new double[MAXH]; public static int[] heap = new int[MAXH]; public static int cntd, cnth; @@ -108,8 +108,8 @@ public static int merge(int i, int j) { return h; } - public static void heapAdd(int i, double v) { - idx[++cntd] = i; + public static void heapAdd(int k, double v) { + key[++cntd] = k; val[cntd] = v; heap[++cnth] = cntd; int cur = cnth, father = cur / 2, tmp; @@ -153,7 +153,7 @@ public static void dijkstra() { heapAdd(n, 0); while (!heapEmpty()) { int top = heapPop(); - int u = idx[top]; + int u = key[top]; double w = val[top]; if (!vis[u]) { vis[u] = true; @@ -177,7 +177,7 @@ public static void mergeRoad() { dist[0] = -1; while (!heapEmpty()) { int top = heapPop(); - int u = idx[top]; + int u = key[top]; for (int e = headg[u], v; e > 0; e = nextg[e]) { v = tog[e]; if (e != path[u]) { @@ -201,21 +201,21 @@ public static int expand() { } while (!heapEmpty()) { int top = heapPop(); - int i = idx[top]; + int h = key[top]; double w = val[top]; money -= w + dis[1]; if (money < 0) { break; } ans++; - if (left[i] != 0) { - heapAdd(left[i], w - cost[i] + cost[left[i]]); + if (left[h] != 0) { + heapAdd(left[h], w - cost[h] + cost[left[h]]); } - if (right[i] != 0) { - heapAdd(right[i], w - cost[i] + cost[right[i]]); + if (right[h] != 0) { + heapAdd(right[h], w - cost[h] + cost[right[h]]); } - if (to[i] != 0 && rt[to[i]] != 0) { - heapAdd(rt[to[i]], w + cost[rt[to[i]]]); + if (to[h] != 0 && rt[to[h]] != 0) { + heapAdd(rt[to[h]], w + cost[rt[to[h]]]); } } } diff --git a/src/class155/Code05_KShortestPath2.java b/src/class155/Code05_KShortestPath2.java index b204d9b4d..d4f2f786e 100644 --- a/src/class155/Code05_KShortestPath2.java +++ b/src/class155/Code05_KShortestPath2.java @@ -45,7 +45,7 @@ //int dist[MAXT]; //int cntt = 0; // -//int idx[MAXH]; +//int key[MAXH]; //double val[MAXH]; //int heap[MAXH]; //int cntd, cnth; @@ -100,8 +100,8 @@ // return h; //} // -//void heapAdd(int i, double v){ -// idx[++cntd] = i; +//void heapAdd(int k, double v){ +// key[++cntd] = k; // val[cntd] = v; // heap[++cnth] = cntd; // int cur = cnth, father = cur / 2; @@ -141,7 +141,7 @@ // heapAdd(n, 0.0); // while(!heapEmpty()){ // int top = heapPop(); -// int u = idx[top]; +// int u = key[top]; // double w = val[top]; // if(!vis[u]){ // vis[u] = true; @@ -165,7 +165,7 @@ // dist[0] = -1; // while(!heapEmpty()){ // int top = heapPop(); -// int u = idx[top]; +// int u = key[top]; // for(int e = headg[u], v; e != 0; e = nextg[e]){ // v = tog[e]; // if(e != path[u]){ @@ -189,21 +189,21 @@ // } // while(!heapEmpty()){ // int top = heapPop(); -// int i = idx[top]; +// int h = key[top]; // double w = val[top]; // money -= w + dis[1]; // if(money < 0){ // break; // } // ans++; -// if(ls[i] != 0){ -// heapAdd(ls[i], w - cost[i] + cost[ls[i]]); +// if(ls[h] != 0){ +// heapAdd(ls[h], w - cost[h] + cost[ls[h]]); // } -// if(rs[i] != 0){ -// heapAdd(rs[i], w - cost[i] + cost[rs[i]]); +// if(rs[h] != 0){ +// heapAdd(rs[h], w - cost[h] + cost[rs[h]]); // } -// if(to[i] != 0 && rt[to[i]] != 0){ -// heapAdd(rt[to[i]], w + cost[rt[to[i]]]); +// if(to[h] != 0 && rt[to[h]] != 0){ +// heapAdd(rt[to[h]], w + cost[rt[to[h]]]); // } // } // } From 00040b12f175965e717d27772d1d0aadc10777f7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 24 Dec 2024 13:42:41 +0800 Subject: [PATCH 0530/2029] modify code --- src/class155/Code01_CityCapture1.java | 4 ++-- src/class155/Code01_CityCapture2.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class155/Code01_CityCapture1.java b/src/class155/Code01_CityCapture1.java index ada3d8c8b..e0c0703e1 100644 --- a/src/class155/Code01_CityCapture1.java +++ b/src/class155/Code01_CityCapture1.java @@ -2,8 +2,8 @@ // 城池攻占,java版 // 一共有n个城市,1号城市是城市树的头,每个城市都有防御值、上级城市编号、奖励类型、奖励值 -// 如果奖励类型为0,任何骑士攻克这个城市后,攻击力会加上该城市的奖励值 -// 如果奖励类型为1,任何骑士攻克这个城市后,攻击力会乘以该城市的奖励值 +// 如果奖励类型为0,任何骑士攻克这个城市后,攻击力会加上奖励值 +// 如果奖励类型为1,任何骑士攻克这个城市后,攻击力会乘以奖励值 // 任何城市的上级编号 < 这座城市的编号,1号城市没有上级城市编号、奖励类型、奖励值 // 一共有m个骑士,每个骑士都有攻击力、第一次攻击的城市 // 如果骑士攻击力 >= 城市防御值,当前城市会被攻占,骑士获得奖励,继续攻击上级城市 diff --git a/src/class155/Code01_CityCapture2.java b/src/class155/Code01_CityCapture2.java index 757fe5161..0a3b5d7e9 100644 --- a/src/class155/Code01_CityCapture2.java +++ b/src/class155/Code01_CityCapture2.java @@ -2,8 +2,8 @@ // 城池攻占,C++版 // 一共有n个城市,1号城市是城市树的头,每个城市都有防御值、上级城市编号、奖励类型、奖励值 -// 如果奖励类型为0,任何骑士攻克这个城市后,攻击力会加上该城市的奖励值 -// 如果奖励类型为1,任何骑士攻克这个城市后,攻击力会乘以该城市的奖励值 +// 如果奖励类型为0,任何骑士攻克这个城市后,攻击力会加上奖励值 +// 如果奖励类型为1,任何骑士攻克这个城市后,攻击力会乘以奖励值 // 任何城市的上级编号 < 这座城市的编号,1号城市没有上级城市编号、奖励类型、奖励值 // 一共有m个骑士,每个骑士都有攻击力、第一次攻击的城市 // 如果骑士攻击力 >= 城市防御值,当前城市会被攻占,骑士获得奖励,继续攻击上级城市 From c9c32f2c993955115619cca6f84886e5e161c329 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 24 Dec 2024 13:48:55 +0800 Subject: [PATCH 0531/2029] modify code --- src/class155/Code01_CityCapture1.java | 6 +++--- src/class155/Code01_CityCapture2.java | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/class155/Code01_CityCapture1.java b/src/class155/Code01_CityCapture1.java index e0c0703e1..b97e96616 100644 --- a/src/class155/Code01_CityCapture1.java +++ b/src/class155/Code01_CityCapture1.java @@ -30,7 +30,7 @@ public class Code01_CityCapture1 { public static int[] belong = new int[MAXN]; // 奖励类型 - public static int[] op = new int[MAXN]; + public static int[] type = new int[MAXN]; // 奖励值 public static long[] gain = new long[MAXN]; @@ -155,7 +155,7 @@ public static void compute() { top[i] = pop(top[i]); } if (top[i] != 0) { - upgrade(top[i], op[i], gain[i]); + upgrade(top[i], type[i], gain[i]); if (top[belong[i]] == 0) { top[belong[i]] = top[i]; } else { @@ -175,7 +175,7 @@ public static void main(String[] args) { } for (int i = 2; i <= n; i++) { belong[i] = io.nextInt(); - op[i] = io.nextInt(); + type[i] = io.nextInt(); gain[i] = io.nextLong(); } for (int i = 1; i <= m; i++) { diff --git a/src/class155/Code01_CityCapture2.java b/src/class155/Code01_CityCapture2.java index 0a3b5d7e9..13e792aae 100644 --- a/src/class155/Code01_CityCapture2.java +++ b/src/class155/Code01_CityCapture2.java @@ -23,7 +23,7 @@ //int n, m; //long long defend[MAXN]; //int belong[MAXN]; -//int op[MAXN]; +//int type[MAXN]; //long long gain[MAXN]; //long long attack[MAXN]; //int first[MAXN]; @@ -121,7 +121,7 @@ // top[i] = pop(top[i]); // } // if (top[i] != 0) { -// upgrade(top[i], op[i], gain[i]); +// upgrade(top[i], type[i], gain[i]); // if (top[belong[i]] == 0) { // top[belong[i]] = top[i]; // } else { @@ -140,7 +140,7 @@ // cin >> defend[i]; // } // for (int i = 2; i <= n; i++) { -// cin >> belong[i] >> op[i] >> gain[i]; +// cin >> belong[i] >> type[i] >> gain[i]; // } // for (int i = 1; i <= m; i++) { // cin >> attack[i] >> first[i]; From 22794892301ca8ce832f9e338e000185e3ee0914 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 24 Dec 2024 13:55:23 +0800 Subject: [PATCH 0532/2029] modify code --- src/class155/Code01_CityCapture1.java | 4 ++-- src/class155/Code01_CityCapture2.java | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/class155/Code01_CityCapture1.java b/src/class155/Code01_CityCapture1.java index b97e96616..4a0a71c5e 100644 --- a/src/class155/Code01_CityCapture1.java +++ b/src/class155/Code01_CityCapture1.java @@ -95,12 +95,12 @@ public static void down(int i) { int r = right[i]; if (l != 0) { attack[l] = attack[l] * mul[i] + add[i]; - mul[l] *= mul[i]; + mul[l] = mul[l] * mul[i]; add[l] = add[l] * mul[i] + add[i]; } if (r != 0) { attack[r] = attack[r] * mul[i] + add[i]; - mul[r] *= mul[i]; + mul[r] = mul[r] * mul[i]; add[r] = add[r] * mul[i] + add[i]; } mul[i] = 1; diff --git a/src/class155/Code01_CityCapture2.java b/src/class155/Code01_CityCapture2.java index 13e792aae..2005bbe8d 100644 --- a/src/class155/Code01_CityCapture2.java +++ b/src/class155/Code01_CityCapture2.java @@ -55,8 +55,8 @@ // attack[i] += v; // } else { // mul[i] *= v; -// add[i] = add[i] * v; -// attack[i] = attack[i] * v; +// add[i] *= v; +// attack[i] *= v; // } //} // @@ -66,12 +66,12 @@ // int r = rs[i]; // if (l != 0) { // attack[l] = attack[l] * mul[i] + add[i]; -// mul[l] *= mul[i]; +// mul[l] = mul[l] * mul[i]; // add[l] = add[l] * mul[i] + add[i]; // } // if (r != 0) { // attack[r] = attack[r] * mul[i] + add[i]; -// mul[r] *= mul[i]; +// mul[r] = mul[r] * mul[i]; // add[r] = add[r] * mul[i] + add[i]; // } // mul[i] = 1; From bbb087b9cca1541e1e2ecc7e99be20c831535536 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 24 Dec 2024 15:46:11 +0800 Subject: [PATCH 0533/2029] modify code --- src/class155/Code01_CityCapture1.java | 4 ++-- src/class155/Code01_CityCapture2.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class155/Code01_CityCapture1.java b/src/class155/Code01_CityCapture1.java index 4a0a71c5e..8099d866a 100644 --- a/src/class155/Code01_CityCapture1.java +++ b/src/class155/Code01_CityCapture1.java @@ -80,12 +80,12 @@ public static void prepare() { public static void upgrade(int i, int t, long v) { if (t == 0) { - add[i] += v; attack[i] += v; + add[i] += v; } else { + attack[i] *= v; mul[i] *= v; add[i] *= v; - attack[i] *= v; } } diff --git a/src/class155/Code01_CityCapture2.java b/src/class155/Code01_CityCapture2.java index 2005bbe8d..65953abbb 100644 --- a/src/class155/Code01_CityCapture2.java +++ b/src/class155/Code01_CityCapture2.java @@ -51,12 +51,12 @@ // //void upgrade(int i, int t, long long v) { // if (t == 0) { -// add[i] += v; // attack[i] += v; +// add[i] += v; // } else { +// attack[i] *= v; // mul[i] *= v; // add[i] *= v; -// attack[i] *= v; // } //} // From 4fd65b30f86bf579b4d8a9db821818effb1daca8 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 24 Dec 2024 16:14:06 +0800 Subject: [PATCH 0534/2029] modify code --- src/class155/Code02_TrickyOperation1.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/class155/Code02_TrickyOperation1.java b/src/class155/Code02_TrickyOperation1.java index 93d18662f..898c54f34 100644 --- a/src/class155/Code02_TrickyOperation1.java +++ b/src/class155/Code02_TrickyOperation1.java @@ -43,7 +43,7 @@ public class Code02_TrickyOperation1 { // 集合内所有数字应该加多少值 public static int[] add = new int[MAXN]; - // 所有集合头节点的值,进入这个堆,头堆 + // 所有集合头节点的值,进入这个堆,也就是头堆 public static TreeMap heap = new TreeMap<>(); // 所有数字应该加多少 @@ -52,6 +52,7 @@ public class Code02_TrickyOperation1 { // 准备好一个栈,用迭代方式实现先序遍历,不用递归方式 public static int[] stack = new int[MAXN]; + // 编号为h的节点不再是左偏树的头,在头堆里删掉一份当前节点的值 public static void minusHead(int h) { if (h != 0) { int hnum = num[h] + add[h]; @@ -63,6 +64,7 @@ public static void minusHead(int h) { } } + // 编号为h的节点当前是左偏树的头,在头堆里增加一份当前节点的值 public static void addHead(int h) { if (h != 0) { int hnum = num[h] + add[h]; @@ -83,11 +85,13 @@ public static void prepare() { addAll = 0; } + // 返回i节点所在左偏树的树头 public static int find(int i) { father[i] = father[i] == i ? i : find(father[i]); return father[i]; } + // 合并两棵左偏树 public static int merge(int i, int j) { if (i == 0 || j == 0) { return i + j; @@ -110,6 +114,7 @@ public static int merge(int i, int j) { return i; } + // 节点i是所在左偏树的任意节点,删除节点i,返回整棵树的头节点编号 public static int remove(int i) { int h = find(i); father[left[i]] = left[i]; @@ -138,6 +143,9 @@ public static int remove(int i) { return father[s]; } + // 以i为头的左偏树,遭遇了更大的左偏树 + // i的懒更新信息取消,以i为头的整棵树所有节点的值增加v + // 不用递归实现先序遍历,容易爆栈,所以用迭代实现先序遍历 public static void down(int i, int v) { if (i != 0) { add[i] = 0; From 0b9119196b2476a2381a3d9e4c04fdd2ca3f7eed Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 24 Dec 2024 16:22:00 +0800 Subject: [PATCH 0535/2029] modify code --- src/class155/Code02_TrickyOperation1.java | 2 +- src/class155/Code02_TrickyOperation2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class155/Code02_TrickyOperation1.java b/src/class155/Code02_TrickyOperation1.java index 898c54f34..74c8f57c2 100644 --- a/src/class155/Code02_TrickyOperation1.java +++ b/src/class155/Code02_TrickyOperation1.java @@ -1,7 +1,7 @@ package class155; // 棘手的操作,java版 -// 编号1~n个节点,每个节点独立且有自己的权值,实现如下6种操作,操作一共调用m次 +// 编号1~n个节点,每个节点独立且有自己的权值,实现如下7种操作,操作一共调用m次 // U x y : x所在的集合和y所在的集合合并 // A1 x v : x节点的权值增加v // A2 x v : x所在的集合所有节点的权值增加v diff --git a/src/class155/Code02_TrickyOperation2.java b/src/class155/Code02_TrickyOperation2.java index 7b84cd101..38f0bd8c5 100644 --- a/src/class155/Code02_TrickyOperation2.java +++ b/src/class155/Code02_TrickyOperation2.java @@ -1,7 +1,7 @@ package class155; // 棘手的操作,C++版 -// 编号1~n个节点,每个节点独立且有自己的权值,实现如下6种操作,操作一共调用m次 +// 编号1~n个节点,每个节点独立且有自己的权值,实现如下7种操作,操作一共调用m次 // U x y : x所在的集合和y所在的集合合并 // A1 x v : x节点的权值增加v // A2 x v : x所在的集合所有节点的权值增加v From 579e4f038627ddc7cc713ceee97528883fbe87ad Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 24 Dec 2024 17:02:11 +0800 Subject: [PATCH 0536/2029] modify code --- src/class155/Code02_TrickyOperation1.java | 20 ++++++++++---------- src/class155/Code02_TrickyOperation2.java | 10 +++++----- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/class155/Code02_TrickyOperation1.java b/src/class155/Code02_TrickyOperation1.java index 74c8f57c2..4f6c34ed1 100644 --- a/src/class155/Code02_TrickyOperation1.java +++ b/src/class155/Code02_TrickyOperation1.java @@ -43,8 +43,8 @@ public class Code02_TrickyOperation1 { // 集合内所有数字应该加多少值 public static int[] add = new int[MAXN]; - // 所有集合头节点的值,进入这个堆,也就是头堆 - public static TreeMap heap = new TreeMap<>(); + // 所有集合头节点的值,进入这个有序表,头节点有序表 + public static TreeMap heads = new TreeMap<>(); // 所有数字应该加多少 public static int addAll = 0; @@ -52,29 +52,29 @@ public class Code02_TrickyOperation1 { // 准备好一个栈,用迭代方式实现先序遍历,不用递归方式 public static int[] stack = new int[MAXN]; - // 编号为h的节点不再是左偏树的头,在头堆里删掉一份当前节点的值 + // 编号为h的节点不再是左偏树的头,在头节点有序表里删掉一份当前节点的值 public static void minusHead(int h) { if (h != 0) { int hnum = num[h] + add[h]; - if (heap.get(hnum) == 1) { - heap.remove(hnum); + if (heads.get(hnum) == 1) { + heads.remove(hnum); } else { - heap.put(hnum, heap.get(hnum) - 1); + heads.put(hnum, heads.get(hnum) - 1); } } } - // 编号为h的节点当前是左偏树的头,在头堆里增加一份当前节点的值 + // 编号为h的节点当前是左偏树的头,在头节点有序表里增加一份当前节点的值 public static void addHead(int h) { if (h != 0) { int hnum = num[h] + add[h]; - heap.put(hnum, heap.getOrDefault(hnum, 0) + 1); + heads.put(hnum, heads.getOrDefault(hnum, 0) + 1); } } public static void prepare() { dist[0] = -1; - heap.clear(); + heads.clear(); for (int i = 1; i <= n; i++) { up[i] = left[i] = right[i] = dist[i] = 0; father[i] = i; @@ -226,7 +226,7 @@ public static int f2(int i) { } public static int f3() { - return heap.lastKey() + addAll; + return heads.lastKey() + addAll; } public static void main(String[] args) { diff --git a/src/class155/Code02_TrickyOperation2.java b/src/class155/Code02_TrickyOperation2.java index 38f0bd8c5..53c8b8bde 100644 --- a/src/class155/Code02_TrickyOperation2.java +++ b/src/class155/Code02_TrickyOperation2.java @@ -29,24 +29,24 @@ //int siz[MAXN]; //int add[MAXN]; //int sta[MAXN]; -//multiset heap; +//multiset heads; //int addAll = 0; // //void minusHead(int h) { // if (h != 0) { -// heap.erase(heap.find(num[h] + add[h])); +// heads.erase(heads.find(num[h] + add[h])); // } //} // //void addHead(int h) { // if (h != 0) { -// heap.insert(num[h] + add[h]); +// heads.insert(num[h] + add[h]); // } //} // //void prepare() { // dist[0] = -1; -// heap.clear(); +// heads.clear(); // for (int i = 1; i <= n; i++) { // up[i] = ls[i] = rs[i] = dist[i] = 0; // fa[i] = i; @@ -178,7 +178,7 @@ //} // //int f3() { -// return (*heap.rbegin()) + addAll; +// return (*heads.rbegin()) + addAll; //} // //int main(){ From 69cca1c7f15692f20832704e523ae9ff18fcf9a7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 24 Dec 2024 17:07:13 +0800 Subject: [PATCH 0537/2029] modify code --- src/class155/Code02_TrickyOperation1.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class155/Code02_TrickyOperation1.java b/src/class155/Code02_TrickyOperation1.java index 4f6c34ed1..9f242f8e9 100644 --- a/src/class155/Code02_TrickyOperation1.java +++ b/src/class155/Code02_TrickyOperation1.java @@ -52,7 +52,7 @@ public class Code02_TrickyOperation1 { // 准备好一个栈,用迭代方式实现先序遍历,不用递归方式 public static int[] stack = new int[MAXN]; - // 编号为h的节点不再是左偏树的头,在头节点有序表里删掉一份当前节点的值 + // 编号为h的节点不再是左偏树的头,在头节点有序表里删掉一份h节点的值 public static void minusHead(int h) { if (h != 0) { int hnum = num[h] + add[h]; @@ -64,7 +64,7 @@ public static void minusHead(int h) { } } - // 编号为h的节点当前是左偏树的头,在头节点有序表里增加一份当前节点的值 + // 编号为h的节点当前是左偏树的头,在头节点有序表里增加一份h节点的值 public static void addHead(int h) { if (h != 0) { int hnum = num[h] + add[h]; From ddc48cca49c70f60c5073b7526aa951f096aa0f3 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 24 Dec 2024 18:17:00 +0800 Subject: [PATCH 0538/2029] modify code --- src/class155/Code02_TrickyOperation1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class155/Code02_TrickyOperation1.java b/src/class155/Code02_TrickyOperation1.java index 9f242f8e9..6bb330261 100644 --- a/src/class155/Code02_TrickyOperation1.java +++ b/src/class155/Code02_TrickyOperation1.java @@ -144,7 +144,7 @@ public static int remove(int i) { } // 以i为头的左偏树,遭遇了更大的左偏树 - // i的懒更新信息取消,以i为头的整棵树所有节点的值增加v + // i的标签信息取消,以i为头的整棵树所有节点的值增加v // 不用递归实现先序遍历,容易爆栈,所以用迭代实现先序遍历 public static void down(int i, int v) { if (i != 0) { From 1759196d31e94d2e5816b21fb619060cfc168a09 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 24 Dec 2024 21:24:06 +0800 Subject: [PATCH 0539/2029] modify code --- src/class155/Code04_Blocks1.java | 24 +++++++++++++++++------- src/class155/Code04_Blocks2.java | 14 +++++++------- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/class155/Code04_Blocks1.java b/src/class155/Code04_Blocks1.java index 485acbb12..bf20e3fa4 100644 --- a/src/class155/Code04_Blocks1.java +++ b/src/class155/Code04_Blocks1.java @@ -29,28 +29,38 @@ public class Code04_Blocks1 { public static int n, k; + // 所有数组所有的数字都放在arr中 + public static int[] arr = new int[MAXM]; + // start[i] : 第i个数组的第一个数字在arr中的什么位置 public static int[] start = new int[MAXN]; + // boundary[i] : 第i个数组的越界位置在arr中的什么位置 public static int[] boundary = new int[MAXN]; - public static int[] arr = new int[MAXM]; + // 左偏树需要,假设某棵左偏树的头节点为h + // idx[h] : 当前堆顶来自哪个数组 public static int[] idx = new int[MAXT]; + // jdx[h] : 当前堆顶来自idx[h]数组的什么位置 public static int[] jdx = new int[MAXT]; - public static int[] num = new int[MAXT]; + // cost[h] : 当前堆顶让代价基础值增加多少代价 + public static int[] cost = new int[MAXT]; public static int[] left = new int[MAXT]; public static int[] right = new int[MAXT]; public static int[] dist = new int[MAXT]; + // base[h] : 整个左偏树代价基础值是什么 public static int[] base = new int[MAXT]; public static int cnt = 0; + // heap里放着所有版本的最优方案 public static int[] heap = new int[MAXK]; public static int heapSize = 0; + // 收集答案 public static int[] ans = new int[MAXK]; public static int init(int i, int j) { idx[++cnt] = i; jdx[cnt] = j; - num[cnt] = j + 1 < boundary[i] ? (arr[j + 1] - arr[j]) : INF; + cost[cnt] = j + 1 < boundary[i] ? (arr[j + 1] - arr[j]) : INF; left[cnt] = right[cnt] = dist[cnt] = 0; return cnt; } @@ -58,7 +68,7 @@ public static int init(int i, int j) { public static int clone(int i) { idx[++cnt] = idx[i]; jdx[cnt] = jdx[i]; - num[cnt] = num[i]; + cost[cnt] = cost[i]; left[cnt] = left[i]; right[cnt] = right[i]; dist[cnt] = dist[i]; @@ -70,7 +80,7 @@ public static int merge(int i, int j) { return i + j; } int tmp; - if (num[i] > num[j]) { + if (cost[i] > cost[j]) { tmp = i; i = j; j = tmp; @@ -97,7 +107,7 @@ public static int pop(int i) { } public static boolean compare(int i, int j) { - return base[heap[i]] + num[heap[i]] < base[heap[j]] + num[heap[j]]; + return base[heap[i]] + cost[heap[i]] < base[heap[j]] + cost[heap[j]]; } public static void heapAdd(int i) { @@ -148,7 +158,7 @@ public static void compute() { heapAdd(head); for (int ansi = 2, h1, h2; ansi <= k; ansi++) { head = heapPop(); - ans[ansi] = base[head] + num[head]; + ans[ansi] = base[head] + cost[head]; h1 = pop(head); if (h1 != 0) { base[h1] = base[head]; diff --git a/src/class155/Code04_Blocks2.java b/src/class155/Code04_Blocks2.java index 048fb2d65..240f78be2 100644 --- a/src/class155/Code04_Blocks2.java +++ b/src/class155/Code04_Blocks2.java @@ -25,13 +25,13 @@ // //int n, k; // +//int arr[MAXM]; //int start[MAXN]; //int boundary[MAXN]; -//int arr[MAXM]; // //int idx[MAXT]; //int jdx[MAXT]; -//int num[MAXT]; +//int cost[MAXT]; //int ls[MAXT]; //int rs[MAXT]; //int dist[MAXT]; @@ -46,7 +46,7 @@ //int init(int i, int j) { // idx[++cnt] = i; // jdx[cnt] = j; -// num[cnt] = (j + 1 < boundary[i]) ? (arr[j + 1] - arr[j]) : INF; +// cost[cnt] = (j + 1 < boundary[i]) ? (arr[j + 1] - arr[j]) : INF; // ls[cnt] = rs[cnt] = dist[cnt] = 0; // return cnt; //} @@ -54,7 +54,7 @@ //int clone(int i) { // idx[++cnt] = idx[i]; // jdx[cnt] = jdx[i]; -// num[cnt] = num[i]; +// cost[cnt] = cost[i]; // ls[cnt] = ls[i]; // rs[cnt] = rs[i]; // dist[cnt] = dist[i]; @@ -63,7 +63,7 @@ // //int merge(int i, int j) { // if (i == 0 || j == 0) return i + j; -// if (num[i] > num[j]) { +// if (cost[i] > cost[j]) { // swap(i, j); // } // int h = clone(i); @@ -82,7 +82,7 @@ //} // //bool compare(int i, int j) { -// return base[heap[i]] + num[heap[i]] < base[heap[j]] + num[heap[j]]; +// return base[heap[i]] + cost[heap[i]] < base[heap[j]] + cost[heap[j]]; //} // //void heapAdd(int i) { @@ -127,7 +127,7 @@ // heapAdd(head); // for (int ansi = 2, h1, h2; ansi <= k; ++ansi) { // head = heapPop(); -// ans[ansi] = base[head] + num[head]; +// ans[ansi] = base[head] + cost[head]; // h1 = pop(head); // if (h1 != 0) { // base[h1] = base[head]; From 762b66f95f868390bada803e2a341ee45240112d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 24 Dec 2024 21:24:59 +0800 Subject: [PATCH 0540/2029] modify code --- src/class155/Code04_Blocks1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class155/Code04_Blocks1.java b/src/class155/Code04_Blocks1.java index bf20e3fa4..4250fffff 100644 --- a/src/class155/Code04_Blocks1.java +++ b/src/class155/Code04_Blocks1.java @@ -29,7 +29,7 @@ public class Code04_Blocks1 { public static int n, k; - // 所有数组所有的数字都放在arr中 + // 所有数组的所有数字放在arr中 public static int[] arr = new int[MAXM]; // start[i] : 第i个数组的第一个数字在arr中的什么位置 public static int[] start = new int[MAXN]; From 7904ad7a066d7c636c88b2a3a7c5110feb8f4262 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 24 Dec 2024 21:34:34 +0800 Subject: [PATCH 0541/2029] modify code --- src/class155/Code04_Blocks1.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/class155/Code04_Blocks1.java b/src/class155/Code04_Blocks1.java index 4250fffff..b95052666 100644 --- a/src/class155/Code04_Blocks1.java +++ b/src/class155/Code04_Blocks1.java @@ -36,12 +36,13 @@ public class Code04_Blocks1 { // boundary[i] : 第i个数组的越界位置在arr中的什么位置 public static int[] boundary = new int[MAXN]; - // 左偏树需要,假设某棵左偏树的头节点为h - // idx[h] : 当前堆顶来自哪个数组 + // 左偏树需要 + // 假设编号为h的节点是某棵左偏树的头 + // idx[h] : 当前节点来自哪个数组 public static int[] idx = new int[MAXT]; - // jdx[h] : 当前堆顶来自idx[h]数组的什么位置 + // jdx[h] : 当前节点来自idx[h]数组的什么位置 public static int[] jdx = new int[MAXT]; - // cost[h] : 当前堆顶让代价基础值增加多少代价 + // cost[h] : 当前节点让代价基础值增加多少代价 public static int[] cost = new int[MAXT]; public static int[] left = new int[MAXT]; public static int[] right = new int[MAXT]; @@ -50,7 +51,8 @@ public class Code04_Blocks1 { public static int[] base = new int[MAXT]; public static int cnt = 0; - // heap里放着所有版本的最优方案 + // heap是经典的小根堆,放着所有版本左偏树的头 + // 哪个左偏树的头节点,所代表方案的累加和最小,谁就放在heap的顶部 public static int[] heap = new int[MAXK]; public static int heapSize = 0; From 7135fc15f107a53216eebe81fcc13f943e2439d9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 24 Dec 2024 21:58:44 +0800 Subject: [PATCH 0542/2029] modify code --- src/class155/Code04_Blocks1.java | 22 +++++++++++----------- src/class155/Code04_Blocks2.java | 12 ++++++------ 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/class155/Code04_Blocks1.java b/src/class155/Code04_Blocks1.java index b95052666..94480a7cb 100644 --- a/src/class155/Code04_Blocks1.java +++ b/src/class155/Code04_Blocks1.java @@ -36,19 +36,19 @@ public class Code04_Blocks1 { // boundary[i] : 第i个数组的越界位置在arr中的什么位置 public static int[] boundary = new int[MAXN]; - // 左偏树需要 + // 左偏树代表选择数字的一种状况,左偏树的头代表这种状况下最优的行动 // 假设编号为h的节点是某棵左偏树的头 - // idx[h] : 当前节点来自哪个数组 + // idx[h] : 最优行动来自哪个数组 public static int[] idx = new int[MAXT]; - // jdx[h] : 当前节点来自idx[h]数组的什么位置 + // jdx[h] : 最优行动来自idx[h]数组的什么位置 public static int[] jdx = new int[MAXT]; - // cost[h] : 当前节点让代价基础值增加多少代价 + // cost[h] : 在前一个方案的基础上,最优行动会让累加和增加多少 public static int[] cost = new int[MAXT]; public static int[] left = new int[MAXT]; public static int[] right = new int[MAXT]; public static int[] dist = new int[MAXT]; - // base[h] : 整个左偏树代价基础值是什么 - public static int[] base = new int[MAXT]; + // pre[h] : 导致当前状况的前一个方案,累加和是多少 + public static int[] pre = new int[MAXT]; public static int cnt = 0; // heap是经典的小根堆,放着所有版本左偏树的头 @@ -109,7 +109,7 @@ public static int pop(int i) { } public static boolean compare(int i, int j) { - return base[heap[i]] + cost[heap[i]] < base[heap[j]] + cost[heap[j]]; + return pre[heap[i]] + cost[heap[i]] < pre[heap[j]] + cost[heap[j]]; } public static void heapAdd(int i) { @@ -155,20 +155,20 @@ public static void compute() { for (int i = 1; i <= n; i++) { head = merge(head, init(i, start[i])); } - base[head] = first; + pre[head] = first; ans[1] = first; heapAdd(head); for (int ansi = 2, h1, h2; ansi <= k; ansi++) { head = heapPop(); - ans[ansi] = base[head] + cost[head]; + ans[ansi] = pre[head] + cost[head]; h1 = pop(head); if (h1 != 0) { - base[h1] = base[head]; + pre[h1] = pre[head]; heapAdd(h1); } if (jdx[head] + 1 < boundary[idx[head]]) { h2 = merge(h1, init(idx[head], jdx[head] + 1)); - base[h2] = ans[ansi]; + pre[h2] = ans[ansi]; heapAdd(h2); } } diff --git a/src/class155/Code04_Blocks2.java b/src/class155/Code04_Blocks2.java index 240f78be2..1745b4c9d 100644 --- a/src/class155/Code04_Blocks2.java +++ b/src/class155/Code04_Blocks2.java @@ -35,7 +35,7 @@ //int ls[MAXT]; //int rs[MAXT]; //int dist[MAXT]; -//int base[MAXT]; +//int pre[MAXT]; //int cnt = 0; // //int heap[MAXK]; @@ -82,7 +82,7 @@ //} // //bool compare(int i, int j) { -// return base[heap[i]] + cost[heap[i]] < base[heap[j]] + cost[heap[j]]; +// return pre[heap[i]] + cost[heap[i]] < pre[heap[j]] + cost[heap[j]]; //} // //void heapAdd(int i) { @@ -122,20 +122,20 @@ // for (int i = 1; i <= n; ++i) { // head = merge(head, init(i, start[i])); // } -// base[head] = first; +// pre[head] = first; // ans[1] = first; // heapAdd(head); // for (int ansi = 2, h1, h2; ansi <= k; ++ansi) { // head = heapPop(); -// ans[ansi] = base[head] + cost[head]; +// ans[ansi] = pre[head] + cost[head]; // h1 = pop(head); // if (h1 != 0) { -// base[h1] = base[head]; +// pre[h1] = pre[head]; // heapAdd(h1); // } // if (jdx[head] + 1 < boundary[idx[head]]) { // h2 = merge(h1, init(idx[head], jdx[head] + 1)); -// base[h2] = ans[ansi]; +// pre[h2] = ans[ansi]; // heapAdd(h2); // } // } From c36b0048df1400c437e31d94e035e9eb9b8dfa6c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 24 Dec 2024 23:51:33 +0800 Subject: [PATCH 0543/2029] modify code --- src/class155/Code04_Blocks1.java | 18 +++++++++--------- src/class155/Code04_Blocks2.java | 8 ++++---- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/class155/Code04_Blocks1.java b/src/class155/Code04_Blocks1.java index 94480a7cb..623a29e32 100644 --- a/src/class155/Code04_Blocks1.java +++ b/src/class155/Code04_Blocks1.java @@ -36,18 +36,18 @@ public class Code04_Blocks1 { // boundary[i] : 第i个数组的越界位置在arr中的什么位置 public static int[] boundary = new int[MAXN]; - // 左偏树代表选择数字的一种状况,左偏树的头代表这种状况下最优的行动 - // 假设编号为h的节点是某棵左偏树的头 + // 左偏树代表基于之前的某个方案,做出行动的可能性 + // 左偏树的头就代表这个最优行动,假设编号为h的节点是头 // idx[h] : 最优行动来自哪个数组 public static int[] idx = new int[MAXT]; - // jdx[h] : 最优行动来自idx[h]数组的什么位置 + // jdx[h] : 最优行动要替换掉idx[h]数组中什么位置的数 public static int[] jdx = new int[MAXT]; - // cost[h] : 在前一个方案的基础上,最优行动会让累加和增加多少 + // cost[h] : 基于之前的某个方案,最优行动会让累加和增加多少 public static int[] cost = new int[MAXT]; public static int[] left = new int[MAXT]; public static int[] right = new int[MAXT]; public static int[] dist = new int[MAXT]; - // pre[h] : 导致当前状况的前一个方案,累加和是多少 + // pre[h] : 基于之前的某个方案,这个方案的累加和,标签信息 public static int[] pre = new int[MAXT]; public static int cnt = 0; @@ -109,13 +109,13 @@ public static int pop(int i) { } public static boolean compare(int i, int j) { - return pre[heap[i]] + cost[heap[i]] < pre[heap[j]] + cost[heap[j]]; + return pre[i] + cost[i] < pre[j] + cost[j]; } public static void heapAdd(int i) { heap[++heapSize] = i; int cur = heapSize, up = cur / 2, tmp; - while (cur > 1 && compare(cur, up)) { + while (cur > 1 && compare(heap[cur], heap[up])) { tmp = heap[up]; heap[up] = heap[cur]; heap[cur] = tmp; @@ -129,8 +129,8 @@ public static int heapPop() { heap[1] = heap[heapSize--]; int cur = 1, l = cur * 2, r = l + 1, best, tmp; while (l <= heapSize) { - best = (r <= heapSize && compare(r, l)) ? r : l; - best = compare(best, cur) ? best : cur; + best = (r <= heapSize && compare(heap[r], heap[l])) ? r : l; + best = compare(heap[best], heap[cur]) ? best : cur; if (best == cur) { break; } diff --git a/src/class155/Code04_Blocks2.java b/src/class155/Code04_Blocks2.java index 1745b4c9d..c4011e9ba 100644 --- a/src/class155/Code04_Blocks2.java +++ b/src/class155/Code04_Blocks2.java @@ -82,13 +82,13 @@ //} // //bool compare(int i, int j) { -// return pre[heap[i]] + cost[heap[i]] < pre[heap[j]] + cost[heap[j]]; +// return pre[i] + cost[i] < pre[j] + cost[j]; //} // //void heapAdd(int i) { // heap[++heapSize] = i; // int cur = heapSize, up = cur / 2; -// while (cur > 1 && compare(cur, up)) { +// while (cur > 1 && compare(heap[cur], heap[up])) { // swap(heap[cur], heap[up]); // cur = up; // up = cur / 2; @@ -100,8 +100,8 @@ // heap[1] = heap[heapSize--]; // int cur = 1, l = 2, r = 3, best; // while (l <= heapSize) { -// best = (r <= heapSize && compare(r, l)) ? r : l; -// best = compare(best, cur) ? best : cur; +// best = (r <= heapSize && compare(heap[r], heap[l])) ? r : l; +// best = compare(heap[best], heap[cur]) ? best : cur; // if (best == cur) break; // swap(heap[cur], heap[best]); // cur = best; From 1a9159c162b25d2a6596c7b18452a085cf0a7602 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 25 Dec 2024 12:30:31 +0800 Subject: [PATCH 0544/2029] modify code --- src/class155/Code05_KShortestPath1.java | 8 ++++---- src/class155/Code05_KShortestPath2.java | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/class155/Code05_KShortestPath1.java b/src/class155/Code05_KShortestPath1.java index 76815a507..6476a107a 100644 --- a/src/class155/Code05_KShortestPath1.java +++ b/src/class155/Code05_KShortestPath1.java @@ -1,12 +1,12 @@ package class155; // k短路问题,可持久化左偏树实现最优解,java版 -// 一共有n个点,编号1~n,一共有m条边,每条边有边权,组成一个有向带权图 +// 有n个点编号1~n,有m条边,每条边都是正数边权,组成有向带权图 // 从1号点走到n号点,就认为是一次旅行 -// 一次旅行中,边不能重复选,但是点可以重复经过,如果到达了n号点,那么这次旅行直接停止 -// 从1号点走到n号点,会有很多通路方案,通路方案的路费为所有选择边集的边权和 +// 一次旅行中,边不能重复选,点可以重复经过,如果到达了n号点,那么旅行直接停止 +// 从1号点走到n号点,会有很多通路方案,通路方案的路费为选择边的边权累加和 // 虽然每次旅行都是从1号点到n号点,但是你希望每次旅行的通路方案都是不同的 -// 任何两次旅行,只要选择边集稍有不同,就认为是不同的旅行 +// 任何两次旅行,只要选择的边稍有不同,就认为是不同的通路方案 // 你的钱数为money,用来支付路费,打印你一共能进行几次旅行 // 测试链接 : https://www.luogu.com.cn/problem/P2483 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class155/Code05_KShortestPath2.java b/src/class155/Code05_KShortestPath2.java index d4f2f786e..14293594f 100644 --- a/src/class155/Code05_KShortestPath2.java +++ b/src/class155/Code05_KShortestPath2.java @@ -1,12 +1,12 @@ package class155; // k短路问题,可持久化左偏树实现最优解,C++版 -// 一共有n个点,编号1~n,一共有m条边,每条边有边权,组成一个有向带权图 +// 有n个点编号1~n,有m条边,每条边都是正数边权,组成有向带权图 // 从1号点走到n号点,就认为是一次旅行 -// 一次旅行中,边不能重复选,但是点可以重复经过,如果到达了n号点,那么这次旅行直接停止 -// 从1号点走到n号点,会有很多通路方案,通路方案的路费为所有选择边集的边权和 +// 一次旅行中,边不能重复选,点可以重复经过,如果到达了n号点,那么旅行直接停止 +// 从1号点走到n号点,会有很多通路方案,通路方案的路费为选择边的边权累加和 // 虽然每次旅行都是从1号点到n号点,但是你希望每次旅行的通路方案都是不同的 -// 任何两次旅行,只要选择边集稍有不同,就认为是不同的旅行 +// 任何两次旅行,只要选择的边稍有不同,就认为是不同的通路方案 // 你的钱数为money,用来支付路费,打印你一共能进行几次旅行 // 测试链接 : https://www.luogu.com.cn/problem/P2483 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 From 02e9e99841b9818b35d0f7b04fdffb473d57e945 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 25 Dec 2024 14:09:20 +0800 Subject: [PATCH 0545/2029] modify code --- src/class155/Code05_KShortestPath1.java | 33 ++++++++++++++++++++++--- src/class155/Code05_KShortestPath2.java | 5 ++-- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/class155/Code05_KShortestPath1.java b/src/class155/Code05_KShortestPath1.java index 6476a107a..530fc868d 100644 --- a/src/class155/Code05_KShortestPath1.java +++ b/src/class155/Code05_KShortestPath1.java @@ -3,7 +3,7 @@ // k短路问题,可持久化左偏树实现最优解,java版 // 有n个点编号1~n,有m条边,每条边都是正数边权,组成有向带权图 // 从1号点走到n号点,就认为是一次旅行 -// 一次旅行中,边不能重复选,点可以重复经过,如果到达了n号点,那么旅行直接停止 +// 一次旅行中,边不能重复选,点可以重复经过,如果到达了n号点,那么旅行立刻停止 // 从1号点走到n号点,会有很多通路方案,通路方案的路费为选择边的边权累加和 // 虽然每次旅行都是从1号点到n号点,但是你希望每次旅行的通路方案都是不同的 // 任何两次旅行,只要选择的边稍有不同,就认为是不同的通路方案 @@ -28,33 +28,51 @@ public class Code05_KShortestPath1 { public static int n, m; public static double money; + // 关于正反图有一个非常值得注意的地方 + // 如果正图中,a到b的边,编号为x + // 那么反图中,b到a的边,编号也是x + // 因为每一条边,正图建立的同时,反图也同步建立 + // 所以正反图中这条边分配的编号也是一样的 + // 正图 public static int[] headg = new int[MAXN]; public static int[] tog = new int[MAXM]; public static int[] nextg = new int[MAXM]; public static double[] weightg = new double[MAXM]; public static int cntg = 0; + // 反图 public static int[] headr = new int[MAXN]; public static int[] tor = new int[MAXM]; public static int[] nextr = new int[MAXM]; public static double[] weightr = new double[MAXM]; public static int cntr = 0; - public static int[] rt = new int[MAXN]; + // 左偏树代表基于之前的通路方案,选择非树边的可能性 + // 左偏树的头就代表最优的选择,假设编号为h的节点是头 + // to[h] : 选择最优非树边,这个非树边在正图里指向哪个节点 public static int[] to = new int[MAXT]; + // cost[h] : 基于之前的通路方案,最优选择会让路费增加多少 public static double[] cost = new double[MAXT]; public static int[] left = new int[MAXT]; public static int[] right = new int[MAXT]; public static int[] dist = new int[MAXT]; public static int cntt = 0; + // rt[u] : 在最短路树上,节点u及其所有祖先节点,所拥有的全部非树边,组成的左偏树 + public static int[] rt = new int[MAXN]; + + // heap是经典的小根堆,放着很多(key, val)数据,根据val来组织小根堆 public static int[] key = new int[MAXH]; public static double[] val = new double[MAXH]; public static int[] heap = new int[MAXH]; public static int cntd, cnth; + // dijkstra算法需要,根据反图跑dijkstra,生成从节点n开始的最短路树 + // vis[u] : 节点u到节点n的最短距离,是否已经计算过了 public static boolean[] vis = new boolean[MAXN]; + // path[u] : 最短路树上,到达节点u的树边,编号是什么,也代表正图上,所对应的边 public static int[] path = new int[MAXN]; + // dis[u] : 最短路树上,节点n到节点u的最短距离 public static double[] dis = new double[MAXN]; public static void addEdgeG(int u, int v, double w) { @@ -108,6 +126,7 @@ public static int merge(int i, int j) { return h; } + // (k, v)组成一个数据,放到堆上,根据v来组织小根堆 public static void heapAdd(int k, double v) { key[++cntd] = k; val[cntd] = v; @@ -122,6 +141,8 @@ public static void heapAdd(int k, double v) { } } + // 小根堆上,堆顶的数据(k, v)弹出,并返回数据所在的下标ans + // 根据返回值ans,key[ans]得到k,val[ans]得到v public static int heapPop() { int ans = heap[1]; heap[1] = heap[cnth--]; @@ -180,6 +201,8 @@ public static void mergeRoad() { int u = key[top]; for (int e = headg[u], v; e > 0; e = nextg[e]) { v = tog[e]; + // path[u]既是边在反图中的编号,也是边在正图中的编号 + // 因为正反图同步建立,边的正图编号 == 边的反图编号 if (e != path[u]) { rt[u] = merge(rt[u], init(v, weightg[e] + dis[v] - dis[u])); } @@ -234,9 +257,11 @@ public static void main(String[] args) throws IOException { u = in.nextInt(); v = in.nextInt(); w = in.nextDouble(); + // 题目说了,一旦到达节点n,旅行立刻停止 + // 所以从节点n出发的边,一律忽略 if (u != n) { - addEdgeG(u, v, w); - addEdgeR(v, u, w); + addEdgeG(u, v, w); // 建立正图 + addEdgeR(v, u, w); // 建立反图 } } dijkstra(); diff --git a/src/class155/Code05_KShortestPath2.java b/src/class155/Code05_KShortestPath2.java index 14293594f..143f28576 100644 --- a/src/class155/Code05_KShortestPath2.java +++ b/src/class155/Code05_KShortestPath2.java @@ -3,7 +3,7 @@ // k短路问题,可持久化左偏树实现最优解,C++版 // 有n个点编号1~n,有m条边,每条边都是正数边权,组成有向带权图 // 从1号点走到n号点,就认为是一次旅行 -// 一次旅行中,边不能重复选,点可以重复经过,如果到达了n号点,那么旅行直接停止 +// 一次旅行中,边不能重复选,点可以重复经过,如果到达了n号点,那么旅行立刻停止 // 从1号点走到n号点,会有很多通路方案,通路方案的路费为选择边的边权累加和 // 虽然每次旅行都是从1号点到n号点,但是你希望每次旅行的通路方案都是不同的 // 任何两次旅行,只要选择的边稍有不同,就认为是不同的通路方案 @@ -37,7 +37,6 @@ //double weightr[MAXM]; //int cntr = 0; // -//int rt[MAXN]; //int to[MAXT]; //double cost[MAXT]; //int ls[MAXT]; @@ -45,6 +44,8 @@ //int dist[MAXT]; //int cntt = 0; // +//int rt[MAXN]; +// //int key[MAXH]; //double val[MAXH]; //int heap[MAXH]; From 301d5c9e54dd7d1986b894d1d759e143ef46d54f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 25 Dec 2024 14:17:21 +0800 Subject: [PATCH 0546/2029] modify code --- src/class155/Code05_KShortestPath1.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/class155/Code05_KShortestPath1.java b/src/class155/Code05_KShortestPath1.java index 530fc868d..795842e8b 100644 --- a/src/class155/Code05_KShortestPath1.java +++ b/src/class155/Code05_KShortestPath1.java @@ -167,6 +167,9 @@ public static boolean heapEmpty() { return cnth == 0; } + // 根据反图跑dijkstra算法 + // 得到从节点n出发的最短路树、每个节点到节点n的最短距离信息 + // 最短路树如果有多个,找到任何一个即可 public static void dijkstra() { dis[n] = 0; Arrays.fill(dis, 1, n, INF); @@ -190,6 +193,9 @@ public static void dijkstra() { } } + // 在最短路树上的每个节点,生成自己的左偏树 + // 节点u的左偏树 = 节点u自己的非树边左偏树 + 节点u在最短路树上的父亲的左偏树 + // 课上重点解释了这么做的意义 public static void mergeRoad() { cntd = cnth = 0; for (int i = 1; i <= n; i++) { @@ -213,6 +219,8 @@ public static void mergeRoad() { } } + // 从路费第1小的方案开始,逐渐找到第2小、第3小... + // 看看money能够覆盖几次旅行,返回旅行的次数 public static int expand() { int ans = 0; money -= dis[1]; @@ -231,12 +239,15 @@ public static int expand() { break; } ans++; + // 当前选择的非树边,被左偏树上的左儿子替换 if (left[h] != 0) { heapAdd(left[h], w - cost[h] + cost[left[h]]); } + // 当前选择的非树边,被左偏树上的右儿子替换 if (right[h] != 0) { heapAdd(right[h], w - cost[h] + cost[right[h]]); } + // 当前选择的非树边,指向节点to[h],那么从to[h]的左偏树里,新增一个最优的非树边 if (to[h] != 0 && rt[to[h]] != 0) { heapAdd(rt[to[h]], w + cost[rt[to[h]]]); } From 26ff7cc56316add38ba0c79102f02adf34034f32 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 25 Dec 2024 17:09:31 +0800 Subject: [PATCH 0547/2029] modify code --- ...55\350\267\257\351\227\256\351\242\230.pptx" | Bin 0 -> 49385 bytes src/class155/Code05_KShortestPath1.java | 7 +++++-- src/class155/Code05_KShortestPath2.java | 4 ++-- 3 files changed, 7 insertions(+), 4 deletions(-) create mode 100644 "ppt/\347\256\227\346\263\225\350\256\262\350\247\243155\343\200\220\346\214\272\351\232\276\343\200\221\345\267\246\345\201\217\346\240\221\345\222\214\346\207\222\346\233\264\346\226\260\343\200\201\345\217\257\346\214\201\344\271\205\345\214\226\345\267\246\345\201\217\346\240\221\343\200\201k\347\237\255\350\267\257\351\227\256\351\242\230.pptx" diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243155\343\200\220\346\214\272\351\232\276\343\200\221\345\267\246\345\201\217\346\240\221\345\222\214\346\207\222\346\233\264\346\226\260\343\200\201\345\217\257\346\214\201\344\271\205\345\214\226\345\267\246\345\201\217\346\240\221\343\200\201k\347\237\255\350\267\257\351\227\256\351\242\230.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243155\343\200\220\346\214\272\351\232\276\343\200\221\345\267\246\345\201\217\346\240\221\345\222\214\346\207\222\346\233\264\346\226\260\343\200\201\345\217\257\346\214\201\344\271\205\345\214\226\345\267\246\345\201\217\346\240\221\343\200\201k\347\237\255\350\267\257\351\227\256\351\242\230.pptx" new file mode 100644 index 0000000000000000000000000000000000000000..7f847a7ef90d5eb4999474a6db53c7d959b4de50 GIT binary patch literal 49385 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 z ziKdS#e>c86UQ+FUQeL*%L*TBj zz|W`mzUTY1OIFTuG#3CU0$?gx3YOkRMfxMd&>jyJIZ>Qd2~ zavVNcET{%h<1nfz1nyEX5SXEwL%`?;4g!~Mz?vs(fIH0+8nR7ufIxDZ3j`+8;Bs9W zJVd6!L+^huNYI+T3o5usU)LeQ(KS{xor6tIhqdjTta%2^MrCkl2i90s1_w)Fz}i=w ztVt%!hG%kU``1|IEJrA!d@d5al4S<{VR5oX*)SWH&7tjIV^wlE*!Ub++x&xdg*?M^ zIdq?LVI7JIr}~Wv&mfCw{_i7RI?q6H^=k6-s#{rp>%Y-6pi;r=8bpAUyp2#pMjn!D z1gy$K{i3!kj9vRU3;{OM;9A{$Bv&cunE$KVEHb;cl+3PGSPe< Date: Wed, 26 Mar 2025 18:12:09 +0800 Subject: [PATCH 0865/2029] modify code --- ...346\237\245\351\233\206-\344\270\212.pptx" | Bin 47167 -> 47166 bytes .../Code03_MinimumWindowSubstring.java | 26 ++++++++---------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243056\343\200\220\345\277\205\345\244\207\343\200\221\345\271\266\346\237\245\351\233\206-\344\270\212.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243056\343\200\220\345\277\205\345\244\207\343\200\221\345\271\266\346\237\245\351\233\206-\344\270\212.pptx" index 0f5ced922b7df69fbc6438da0ef0fd96aef59234..c3ac8087d8fe2f536fde9fe3e4a7538137554fb1 100644 GIT binary patch delta 3084 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 int - // cnts[s[r]] : 当前字符欠债情况,负数就是欠债,正数就是多给的 - if (cnts[s[r]]++ < 0) { + // 总债务 + int debt = t.length; + for (int l = 0, r = 0; r < s.length; r++) { + // 窗口右边界向右,给出字符 + if (map[s[r]]++ < 0) { debt--; } if (debt == 0) { - // r位置结尾,真的有覆盖子串! - // 看看这个覆盖子串能不能尽量短 - while (cnts[s[l]] > 0) { - // l位置的字符能拿回 - cnts[s[l++]]--; + // 窗口左边界向右,拿回字符 + while (map[s[l]] > 0) { + map[s[l++]]--; } - // 从while里面出来, - // l....r就是r位置结尾的最小覆盖子串 + // 以r位置结尾的达标窗口,更新答案 if (r - l + 1 < len) { len = r - l + 1; start = l; From c8e23f7006cfd57dba7f18dbdd2f4209e3e3ad09 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 26 Mar 2025 18:36:49 +0800 Subject: [PATCH 0866/2029] modify code --- src/class049/Code03_MinimumWindowSubstring.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/class049/Code03_MinimumWindowSubstring.java b/src/class049/Code03_MinimumWindowSubstring.java index ed07b95d2..bb685e53f 100644 --- a/src/class049/Code03_MinimumWindowSubstring.java +++ b/src/class049/Code03_MinimumWindowSubstring.java @@ -7,14 +7,14 @@ public class Code03_MinimumWindowSubstring { public static String minWindow(String str, String tar) { - if (str.length() < tar.length()) { - return ""; - } char[] s = str.toCharArray(); char[] t = tar.toCharArray(); - int[] map = new int[256]; + // 每种字符的欠债情况 + // cnts[i] = 负数,代表字符i有负债 + // cnts[i] = 正数,代表字符i有盈余 + int[] cnts = new int[256]; for (char cha : t) { - map[cha]--; + cnts[cha]--; } // 最小覆盖子串的长度 int len = Integer.MAX_VALUE; @@ -24,13 +24,13 @@ public static String minWindow(String str, String tar) { int debt = t.length; for (int l = 0, r = 0; r < s.length; r++) { // 窗口右边界向右,给出字符 - if (map[s[r]]++ < 0) { + if (cnts[s[r]]++ < 0) { debt--; } if (debt == 0) { // 窗口左边界向右,拿回字符 - while (map[s[l]] > 0) { - map[s[l++]]--; + while (cnts[s[l]] > 0) { + cnts[s[l++]]--; } // 以r位置结尾的达标窗口,更新答案 if (r - l + 1 < len) { From 00821c457fa75f62fd2eca7f7563cfdf632f8239 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 27 Mar 2025 20:36:09 +0800 Subject: [PATCH 0867/2029] modify code --- src/class164/Code01_KruskalRebuildTree1.java | 73 ++--- src/class164/Code01_KruskalRebuildTree2.java | 55 ++-- src/class164/Code02_Journey1.java | 315 +++++++++++++++++++ src/class164/Code02_Journey2.java | 197 ++++++++++++ 4 files changed, 569 insertions(+), 71 deletions(-) create mode 100644 src/class164/Code02_Journey1.java create mode 100644 src/class164/Code02_Journey2.java diff --git a/src/class164/Code01_KruskalRebuildTree1.java b/src/class164/Code01_KruskalRebuildTree1.java index 3f2d09274..246e77530 100644 --- a/src/class164/Code01_KruskalRebuildTree1.java +++ b/src/class164/Code01_KruskalRebuildTree1.java @@ -11,28 +11,28 @@ public class Code01_KruskalRebuildTree1 { - public static int MAXN = 200001; + public static int MAXK = 200001; public static int MAXM = 300001; public static int n, m, q; public static int[][] arr = new int[MAXM][3]; // 并查集 - public static int[] father = new int[MAXN]; - public static int[] nodeKey = new int[MAXN]; - public static int cnth = 0; + public static int[] father = new int[MAXK]; + public static int[] nodeKey = new int[MAXK]; + public static int cntu = 0; // 链式前向星 - public static int[] head = new int[MAXN]; - public static int[] next = new int[MAXN]; - public static int[] to = new int[MAXN]; + public static int[] head = new int[MAXK]; + public static int[] next = new int[MAXK]; + public static int[] to = new int[MAXK]; 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[] fa = new int[MAXK]; + public static int[] dep = new int[MAXK]; + public static int[] siz = new int[MAXK]; + public static int[] son = new int[MAXK]; + public static int[] top = new int[MAXK]; public static int find(int i) { if (i != father[i]) { @@ -52,16 +52,16 @@ public static void kruskalRebuild() { father[i] = i; } Arrays.sort(arr, 1, m + 1, (a, b) -> a[2] - b[2]); - cnth = n; + cntu = n; for (int i = 1, fx, fy; i <= m; i++) { fx = find(arr[i][0]); fy = find(arr[i][1]); if (fx != fy) { - father[fx] = father[fy] = ++cnth; - father[cnth] = cnth; - nodeKey[cnth] = arr[i][2]; - addEdge(cnth, fx); - addEdge(cnth, fy); + father[fx] = father[fy] = ++cntu; + father[cntu] = cntu; + nodeKey[cntu] = arr[i][2]; + addEdge(cntu, fx); + addEdge(cntu, fy); } } } @@ -70,19 +70,14 @@ 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]; e > 0; e = next[e]) { + dfs1(to[e], 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; - } + siz[u] += siz[v]; + if (son[u] == 0 || siz[son[u]] < siz[v]) { + son[u] = v; } } } @@ -95,14 +90,14 @@ public static void dfs2(int u, int t) { 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]) { + if (v != son[u]) { dfs2(v, v); } } } // 不会改迭代版,去看讲解118,详解了从递归版改迭代版 - public static int[][] fse = new int[MAXN][3]; + public static int[][] fse = new int[MAXK][3]; public static int stacksize, first, second, edge; @@ -136,17 +131,13 @@ public static void dfs3(int u, int f) { } if (edge != 0) { push(first, second, edge); - if (to[edge] != second) { - push(to[edge], first, -1); - } + 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; - } + siz[first] += siz[v]; + if (son[first] == 0 || siz[son[first]] < siz[v]) { + son[first] = v; } } } @@ -174,7 +165,7 @@ public static void dfs4(int u, int t) { } if (edge != 0) { push(first, second, edge); - if (to[edge] != fa[first] && to[edge] != son[first]) { + if (to[edge] != son[first]) { push(to[edge], to[edge], -1); } } @@ -192,7 +183,7 @@ public static int lca(int a, int b) { return dep[a] <= dep[b] ? a : b; } - public static void main(String[] args) throws IOException { + public static void main(String[] args) { FastIO io = new FastIO(System.in, System.out); n = io.nextInt(); m = io.nextInt(); @@ -202,7 +193,7 @@ public static void main(String[] args) throws IOException { arr[i][2] = io.nextInt(); } kruskalRebuild(); - for (int i = 1; i <= cnth; i++) { + for (int i = 1; i <= cntu; i++) { if (i == father[i]) { dfs3(i, 0); // 防止递归爆栈,所以调用dfs1的迭代版 dfs4(i, i); // 防止递归爆栈,所以调用dfs2的迭代版 diff --git a/src/class164/Code01_KruskalRebuildTree2.java b/src/class164/Code01_KruskalRebuildTree2.java index 069e9ec6e..4d6ae9ace 100644 --- a/src/class164/Code01_KruskalRebuildTree2.java +++ b/src/class164/Code01_KruskalRebuildTree2.java @@ -13,25 +13,25 @@ // int u, v, w; //}; // -//const int MAXN = 200001; +//const int MAXK = 200001; //const int MAXM = 300001; //int n, m, q; //Edge arr[MAXM]; // -//int father[MAXN]; -//int nodeKey[MAXN]; -//int cnth = 0; +//int father[MAXK]; +//int nodeKey[MAXK]; +//int cntu = 0; // -//int head[MAXN]; -//int nxt[MAXN]; -//int to[MAXN]; +//int head[MAXK]; +//int nxt[MAXK]; +//int to[MAXK]; //int cntg = 0; // -//int fa[MAXN]; -//int dep[MAXN]; -//int siz[MAXN]; -//int son[MAXN]; -//int top[MAXN]; +//int fa[MAXK]; +//int dep[MAXK]; +//int siz[MAXK]; +//int son[MAXK]; +//int top[MAXK]; // //bool cmp(Edge x, Edge y) { // return x.w < y.w; @@ -55,16 +55,16 @@ // father[i] = i; // } // sort(arr + 1, arr + m + 1, cmp); -// cnth = n; +// cntu = n; // for (int i = 1, fx, fy; i <= m; i++) { // fx = find(arr[i].u); // fy = find(arr[i].v); // if (fx != fy) { -// father[fx] = father[fy] = ++cnth; -// father[cnth] = cnth; -// nodeKey[cnth] = arr[i].w; -// addEdge(cnth, fx); -// addEdge(cnth, fy); +// father[fx] = father[fy] = ++cntu; +// father[cntu] = cntu; +// nodeKey[cntu] = arr[i].w; +// addEdge(cntu, fx); +// addEdge(cntu, fy); // } // } //} @@ -73,19 +73,14 @@ // 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 e = head[u]; e > 0; e = nxt[e]) { +// dfs1(to[e], u); // } // for (int e = head[u], v; e > 0; 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; -// } +// siz[u] += siz[v]; +// if (son[u] == 0 || siz[son[u]] < siz[v]) { +// son[u] = v; // } // } //} @@ -98,7 +93,7 @@ // 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]) { +// if (v != son[u]) { // dfs2(v, v); // } // } @@ -123,7 +118,7 @@ // cin >> arr[i].u >> arr[i].v >> arr[i].w; // } // kruskalRebuild(); -// for (int i = 1; i <= cnth; i++) { +// for (int i = 1; i <= cntu; i++) { // if (i == father[i]) { // dfs1(i, 0); // dfs2(i, i); diff --git a/src/class164/Code02_Journey1.java b/src/class164/Code02_Journey1.java new file mode 100644 index 000000000..40c6904e6 --- /dev/null +++ b/src/class164/Code02_Journey1.java @@ -0,0 +1,315 @@ +package class164; + +// 归程,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P4768 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Arrays; +import java.util.PriorityQueue; + +public class Code02_Journey1 { + + public static int MAXN = 200001; + public static int MAXK = 400001; + public static int MAXM = 400001; + public static int MAXH = 20; + public static int INF = 2000000001; + public static int t, n, m, q, k, s; + public static int[][] arr = new int[MAXM][4]; + + public static int[] headg = new int[MAXN]; + public static int[] nextg = new int[MAXM << 1]; + public static int[] tog = new int[MAXM << 1]; + public static int[] weightg = new int[MAXM << 1]; + public static int cntg; + + public static int[] dist = new int[MAXN]; + public static boolean[] visit = new boolean[MAXN]; + public static PriorityQueue heap = new PriorityQueue<>((a, b) -> a[1] - b[1]); + + public static int[] headk = new int[MAXK]; + public static int[] nextk = new int[MAXK]; + public static int[] tok = new int[MAXK]; + public static int cntk; + + public static int[] father = new int[MAXK]; + public static int[] nodeKey = new int[MAXK]; + public static int[] stack = new int[MAXK]; + public static int cntu; + + public static int[] dep = new int[MAXK]; + public static int[][] stjump = new int[MAXK][MAXH]; + public static int[] mindist = new int[MAXK]; + + public static void prepare() { + cntg = cntk = 0; + Arrays.fill(headg, 1, n + 1, 0); + Arrays.fill(headk, 1, n * 2, 0); + } + + 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 dijkstra() { + for (int i = 1; i <= m; i++) { + addEdgeG(arr[i][0], arr[i][1], arr[i][2]); + addEdgeG(arr[i][1], arr[i][0], arr[i][2]); + } + Arrays.fill(dist, 1, n + 1, INF); + Arrays.fill(visit, 1, n + 1, false); + dist[1] = 0; + heap.add(new int[] { 1, 0 }); + int[] cur; + int x, v; + while (!heap.isEmpty()) { + cur = heap.poll(); + x = cur[0]; + v = cur[1]; + if (!visit[x]) { + visit[x] = true; + for (int e = headg[x], y, w; e > 0; e = nextg[e]) { + y = tog[e]; + w = weightg[e]; + if (!visit[y] && dist[y] > v + w) { + dist[y] = v + w; + heap.add(new int[] { y, dist[y] }); + } + } + } + } + } + + public static void addEdgeK(int u, int v) { + nextk[++cntk] = headk[u]; + tok[cntk] = v; + headk[u] = cntk; + } + + // 并查集查找集合的代表节点,递归版的实现会爆栈的 + public static int find(int i) { + int size = 0; + while (i != father[i]) { + stack[size++] = i; + i = father[i]; + } + while (size > 0) { + father[stack[--size]] = i; + } + return i; + } + + public static void kruskalRebuild() { + for (int i = 1; i <= n; i++) { + father[i] = i; + } + Arrays.sort(arr, 1, m + 1, (a, b) -> b[3] - a[3]); + cntu = n; + for (int i = 1, fx, fy; i <= m; i++) { + fx = find(arr[i][0]); + fy = find(arr[i][1]); + if (fx != fy) { + father[fx] = father[fy] = ++cntu; + father[cntu] = cntu; + nodeKey[cntu] = arr[i][3]; + addEdgeK(cntu, fx); + addEdgeK(cntu, fy); + } + } + } + + 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 = headk[u]; e > 0; e = nextk[e]) { + dfs1(tok[e], u); + } + if (u <= n) { + mindist[u] = dist[u]; + } else { + mindist[u] = INF; + } + for (int e = headk[u]; e > 0; e = nextk[e]) { + mindist[u] = Math.min(mindist[u], mindist[tok[e]]); + } + } + + // 不会改迭代版,去看讲解118,详解了从递归版改迭代版 + public static int[][] fse = new int[MAXK][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 dfs2(int u, int fa) { + stacksize = 0; + push(u, fa, -1); + while (stacksize > 0) { + pop(); + if (edge == -1) { + dep[first] = dep[second] + 1; + stjump[first][0] = second; + for (int p = 1; p < MAXH; p++) { + stjump[first][p] = stjump[stjump[first][p - 1]][p - 1]; + } + edge = headk[first]; + } else { + edge = nextk[edge]; + } + if (edge != 0) { + push(first, second, edge); + push(tok[edge], first, -1); + } else { + if (first <= n) { + mindist[first] = dist[first]; + } else { + mindist[first] = INF; + } + for (int e = headk[first]; e > 0; e = nextk[e]) { + mindist[first] = Math.min(mindist[first], mindist[tok[e]]); + } + } + } + } + + public static int query(int node, int line) { + for (int p = MAXH - 1; p >= 0; p--) { + if (stjump[node][p] > 0 && nodeKey[stjump[node][p]] > line) { + node = stjump[node][p]; + } + } + return mindist[node]; + } + + public static void main(String[] args) { + FastIO io = new FastIO(System.in, System.out); + t = io.nextInt(); + for (int test = 1; test <= t; test++) { + n = io.nextInt(); + m = io.nextInt(); + prepare(); + for (int i = 1; i <= m; i++) { + arr[i][0] = io.nextInt(); + arr[i][1] = io.nextInt(); + arr[i][2] = io.nextInt(); + arr[i][3] = io.nextInt(); + } + dijkstra(); + kruskalRebuild(); + dfs2(cntu, 0); + q = io.nextInt(); + k = io.nextInt(); + s = io.nextInt(); + for (int i = 1, node, line, lastAns = 0; i <= q; i++) { + node = (io.nextInt() + k * lastAns - 1) % n + 1; + line = (io.nextInt() + k * lastAns) % (s + 1); + lastAns = query(node, line); + io.writelnInt(lastAns); + } + } + 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/class164/Code02_Journey2.java b/src/class164/Code02_Journey2.java new file mode 100644 index 000000000..b954b0161 --- /dev/null +++ b/src/class164/Code02_Journey2.java @@ -0,0 +1,197 @@ +package class164; + +// 归程,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P4768 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Edge { +// int u, v, l, a; +//}; +// +//bool EdgeCmp(Edge x, Edge y) { +// return x.a > y.a; +//} +// +//struct HeapNode { +// int cur, cost; +//}; +// +//struct HeapNodeCmp { +// bool operator()(const HeapNode &x, const HeapNode &y) const { +// return x.cost > y.cost; // 距离大,在堆的下方,C++的设定,其实是距离的小根堆 +// } +//}; +// +//const int MAXN = 200001; +//const int MAXK = 400001; +//const int MAXM = 400001; +//const int MAXH = 20; +//int INF = 2000000001; +//int t, n, m, q, k, s; +//Edge arr[MAXM]; +// +//int headg[MAXN]; +//int nextg[MAXM << 1]; +//int tog[MAXM << 1]; +//int weightg[MAXM << 1]; +//int cntg; +// +//int dist[MAXN]; +//bool visit[MAXN]; +//priority_queue, HeapNodeCmp> heap; +// +//int headk[MAXK]; +//int nextk[MAXK]; +//int tok[MAXK]; +//int cntk; +// +//int father[MAXK]; +//int nodeKey[MAXK]; +//int cntu; +// +//int dep[MAXK]; +//int stjump[MAXK][MAXH]; +//int mindist[MAXK]; +// +//void prepare() { +// cntg = 0; +// cntk = 0; +// for(int i = 1; i <= n; i++) { +// headg[i] = 0; +// } +// for(int i = 1; i <= 2 * n; i++) { +// headk[i] = 0; +// } +//} +// +//void addEdgeG(int u, int v, int w) { +// nextg[++cntg] = headg[u]; +// tog[cntg] = v; +// weightg[cntg] = w; +// headg[u] = cntg; +//} +// +//void dijkstra() { +// for(int i = 1; i <= m; i++) { +// addEdgeG(arr[i].u, arr[i].v, arr[i].l); +// addEdgeG(arr[i].v, arr[i].u, arr[i].l); +// } +// for(int i = 1; i <= n; i++) { +// dist[i] = INF; +// visit[i] = false; +// } +// dist[1] = 0; +// heap.push({1, 0}); +// HeapNode node; +// int x, v; +// while(!heap.empty()) { +// node = heap.top(); +// heap.pop(); +// x = node.cur; +// v = node.cost; +// if(!visit[x]) { +// visit[x] = true; +// for(int e = headg[x], y, w; e > 0; e = nextg[e]) { +// y = tog[e]; +// w = weightg[e]; +// if(!visit[y] && dist[y] > v + w) { +// dist[y] = v + w; +// heap.push({y, dist[y]}); +// } +// } +// } +// } +//} +// +//void addEdgeK(int u, int v) { +// nextk[++cntk] = headk[u]; +// tok[cntk] = v; +// headk[u] = cntk; +//} +// +//int find(int i) { +// if(father[i] != i) { +// father[i] = find(father[i]); +// } +// return father[i]; +//} +// +//void kruskalRebuild() { +// for(int i = 1; i <= n; i++) { +// father[i] = i; +// } +// sort(arr + 1, arr + m + 1, EdgeCmp); +// cntu = n; +// for(int i = 1, fx, fy; i <= m; i++) { +// fx = find(arr[i].u); +// fy = find(arr[i].v); +// if(fx != fy) { +// cntu++; +// father[fx] = cntu; +// father[fy] = cntu; +// father[cntu] = cntu; +// nodeKey[cntu] = arr[i].a; +// addEdgeK(cntu, fx); +// addEdgeK(cntu, fy); +// } +// } +//} +// +//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 = headk[u]; e > 0; e = nextk[e]) { +// dfs(tok[e], u); +// } +// if(u <= n) { +// mindist[u] = dist[u]; +// } else { +// mindist[u] = INF; +// } +// for(int e = headk[u]; e > 0; e = nextk[e]) { +// mindist[u] = min(mindist[u], mindist[tok[e]]); +// } +//} +// +//int query(int node, int line) { +// for(int p = MAXH - 1; p >= 0; p--) { +// if(stjump[node][p] > 0 && nodeKey[stjump[node][p]] > line) { +// node = stjump[node][p]; +// } +// } +// return mindist[node]; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> t; +// for(int test = 1; test <= t; test++) { +// cin >> n >> m; +// prepare(); +// for(int i = 1; i <= m; i++) { +// cin >> arr[i].u >> arr[i].v >> arr[i].l >> arr[i].a; +// } +// dijkstra(); +// kruskalRebuild(); +// dfs(cntu, 0); +// cin >> q >> k >> s; +// int lastAns = 0; +// for(int i = 1, node, line; i <= q; i++) { +// cin >> node >> line; +// node = (node + k * lastAns - 1) % n + 1; +// line = (line + k * lastAns) % (s + 1); +// lastAns = query(node, line); +// cout << lastAns << "\n"; +// } +// } +// return 0; +//} \ No newline at end of file From 3210e38a996f706d8c112b8ef8bf721c6933284a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 27 Mar 2025 20:37:03 +0800 Subject: [PATCH 0868/2029] modify code --- .../{Code02_Journey1.java => Code02_ReturnJourney1.java} | 2 +- .../{Code02_Journey2.java => Code02_ReturnJourney2.java} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/class164/{Code02_Journey1.java => Code02_ReturnJourney1.java} (99%) rename src/class164/{Code02_Journey2.java => Code02_ReturnJourney2.java} (100%) diff --git a/src/class164/Code02_Journey1.java b/src/class164/Code02_ReturnJourney1.java similarity index 99% rename from src/class164/Code02_Journey1.java rename to src/class164/Code02_ReturnJourney1.java index 40c6904e6..da8a218dd 100644 --- a/src/class164/Code02_Journey1.java +++ b/src/class164/Code02_ReturnJourney1.java @@ -10,7 +10,7 @@ import java.util.Arrays; import java.util.PriorityQueue; -public class Code02_Journey1 { +public class Code02_ReturnJourney1 { public static int MAXN = 200001; public static int MAXK = 400001; diff --git a/src/class164/Code02_Journey2.java b/src/class164/Code02_ReturnJourney2.java similarity index 100% rename from src/class164/Code02_Journey2.java rename to src/class164/Code02_ReturnJourney2.java From d5d27fa4c7515930b5b22997fe1ea80dcb10e316 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 27 Mar 2025 20:37:49 +0800 Subject: [PATCH 0869/2029] modify code --- ...e01_KruskalRebuildTree1.java => Code01_KruskalRebuild1.java} | 2 +- ...e01_KruskalRebuildTree2.java => Code01_KruskalRebuild2.java} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/class164/{Code01_KruskalRebuildTree1.java => Code01_KruskalRebuild1.java} (99%) rename src/class164/{Code01_KruskalRebuildTree2.java => Code01_KruskalRebuild2.java} (100%) diff --git a/src/class164/Code01_KruskalRebuildTree1.java b/src/class164/Code01_KruskalRebuild1.java similarity index 99% rename from src/class164/Code01_KruskalRebuildTree1.java rename to src/class164/Code01_KruskalRebuild1.java index 246e77530..e7d4f0b74 100644 --- a/src/class164/Code01_KruskalRebuildTree1.java +++ b/src/class164/Code01_KruskalRebuild1.java @@ -9,7 +9,7 @@ import java.io.OutputStream; import java.util.Arrays; -public class Code01_KruskalRebuildTree1 { +public class Code01_KruskalRebuild1 { public static int MAXK = 200001; public static int MAXM = 300001; diff --git a/src/class164/Code01_KruskalRebuildTree2.java b/src/class164/Code01_KruskalRebuild2.java similarity index 100% rename from src/class164/Code01_KruskalRebuildTree2.java rename to src/class164/Code01_KruskalRebuild2.java From d25041ec9de57d4374c5ba2a9169f66f66be1d44 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 27 Mar 2025 20:47:45 +0800 Subject: [PATCH 0870/2029] modify code --- src/class164/Code02_ReturnJourney1.java | 76 +--- src/class164/Code02_ReturnJourney2.java | 484 ++++++++++++++---------- src/class164/Code02_ReturnJourney3.java | 197 ++++++++++ 3 files changed, 497 insertions(+), 260 deletions(-) create mode 100644 src/class164/Code02_ReturnJourney3.java diff --git a/src/class164/Code02_ReturnJourney1.java b/src/class164/Code02_ReturnJourney1.java index da8a218dd..57d203978 100644 --- a/src/class164/Code02_ReturnJourney1.java +++ b/src/class164/Code02_ReturnJourney1.java @@ -1,8 +1,10 @@ package class164; -// 归程,java版 +// 归程,java实现递归版 // 测试链接 : https://www.luogu.com.cn/problem/P4768 -// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 +// 提交以下的code,提交时请把类名改成"Main" +// 因为树的深度太大,递归函数爆栈了,所以无法全部通过所有测试用例 +// find方法、dfs方法都需要改成迭代版,就是本节课Code02_ReturnJourney2文件 import java.io.IOException; import java.io.InputStream; @@ -37,7 +39,6 @@ public class Code02_ReturnJourney1 { public static int[] father = new int[MAXK]; public static int[] nodeKey = new int[MAXK]; - public static int[] stack = new int[MAXK]; public static int cntu; public static int[] dep = new int[MAXK]; @@ -92,17 +93,11 @@ public static void addEdgeK(int u, int v) { headk[u] = cntk; } - // 并查集查找集合的代表节点,递归版的实现会爆栈的 public static int find(int i) { - int size = 0; - while (i != father[i]) { - stack[size++] = i; - i = father[i]; + if (i != father[i]) { + father[i] = find(father[i]); } - while (size > 0) { - father[stack[--size]] = i; - } - return i; + return father[i]; } public static void kruskalRebuild() { @@ -124,14 +119,14 @@ public static void kruskalRebuild() { } } - public static void dfs1(int u, int fa) { + public static 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 = headk[u]; e > 0; e = nextk[e]) { - dfs1(tok[e], u); + dfs(tok[e], u); } if (u <= n) { mindist[u] = dist[u]; @@ -143,57 +138,6 @@ public static void dfs1(int u, int fa) { } } - // 不会改迭代版,去看讲解118,详解了从递归版改迭代版 - public static int[][] fse = new int[MAXK][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 dfs2(int u, int fa) { - stacksize = 0; - push(u, fa, -1); - while (stacksize > 0) { - pop(); - if (edge == -1) { - dep[first] = dep[second] + 1; - stjump[first][0] = second; - for (int p = 1; p < MAXH; p++) { - stjump[first][p] = stjump[stjump[first][p - 1]][p - 1]; - } - edge = headk[first]; - } else { - edge = nextk[edge]; - } - if (edge != 0) { - push(first, second, edge); - push(tok[edge], first, -1); - } else { - if (first <= n) { - mindist[first] = dist[first]; - } else { - mindist[first] = INF; - } - for (int e = headk[first]; e > 0; e = nextk[e]) { - mindist[first] = Math.min(mindist[first], mindist[tok[e]]); - } - } - } - } - public static int query(int node, int line) { for (int p = MAXH - 1; p >= 0; p--) { if (stjump[node][p] > 0 && nodeKey[stjump[node][p]] > line) { @@ -218,7 +162,7 @@ public static void main(String[] args) { } dijkstra(); kruskalRebuild(); - dfs2(cntu, 0); + dfs(cntu, 0); q = io.nextInt(); k = io.nextInt(); s = io.nextInt(); diff --git a/src/class164/Code02_ReturnJourney2.java b/src/class164/Code02_ReturnJourney2.java index b954b0161..665d0df44 100644 --- a/src/class164/Code02_ReturnJourney2.java +++ b/src/class164/Code02_ReturnJourney2.java @@ -1,197 +1,293 @@ package class164; -// 归程,C++版 +// 归程,java实现迭代版 // 测试链接 : https://www.luogu.com.cn/problem/P4768 -// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 -// 提交如下代码,可以通过所有测试用例 - -//#include -// -//using namespace std; -// -//struct Edge { -// int u, v, l, a; -//}; -// -//bool EdgeCmp(Edge x, Edge y) { -// return x.a > y.a; -//} -// -//struct HeapNode { -// int cur, cost; -//}; -// -//struct HeapNodeCmp { -// bool operator()(const HeapNode &x, const HeapNode &y) const { -// return x.cost > y.cost; // 距离大,在堆的下方,C++的设定,其实是距离的小根堆 -// } -//}; -// -//const int MAXN = 200001; -//const int MAXK = 400001; -//const int MAXM = 400001; -//const int MAXH = 20; -//int INF = 2000000001; -//int t, n, m, q, k, s; -//Edge arr[MAXM]; -// -//int headg[MAXN]; -//int nextg[MAXM << 1]; -//int tog[MAXM << 1]; -//int weightg[MAXM << 1]; -//int cntg; -// -//int dist[MAXN]; -//bool visit[MAXN]; -//priority_queue, HeapNodeCmp> heap; -// -//int headk[MAXK]; -//int nextk[MAXK]; -//int tok[MAXK]; -//int cntk; -// -//int father[MAXK]; -//int nodeKey[MAXK]; -//int cntu; -// -//int dep[MAXK]; -//int stjump[MAXK][MAXH]; -//int mindist[MAXK]; -// -//void prepare() { -// cntg = 0; -// cntk = 0; -// for(int i = 1; i <= n; i++) { -// headg[i] = 0; -// } -// for(int i = 1; i <= 2 * n; i++) { -// headk[i] = 0; -// } -//} -// -//void addEdgeG(int u, int v, int w) { -// nextg[++cntg] = headg[u]; -// tog[cntg] = v; -// weightg[cntg] = w; -// headg[u] = cntg; -//} -// -//void dijkstra() { -// for(int i = 1; i <= m; i++) { -// addEdgeG(arr[i].u, arr[i].v, arr[i].l); -// addEdgeG(arr[i].v, arr[i].u, arr[i].l); -// } -// for(int i = 1; i <= n; i++) { -// dist[i] = INF; -// visit[i] = false; -// } -// dist[1] = 0; -// heap.push({1, 0}); -// HeapNode node; -// int x, v; -// while(!heap.empty()) { -// node = heap.top(); -// heap.pop(); -// x = node.cur; -// v = node.cost; -// if(!visit[x]) { -// visit[x] = true; -// for(int e = headg[x], y, w; e > 0; e = nextg[e]) { -// y = tog[e]; -// w = weightg[e]; -// if(!visit[y] && dist[y] > v + w) { -// dist[y] = v + w; -// heap.push({y, dist[y]}); -// } -// } -// } -// } -//} -// -//void addEdgeK(int u, int v) { -// nextk[++cntk] = headk[u]; -// tok[cntk] = v; -// headk[u] = cntk; -//} -// -//int find(int i) { -// if(father[i] != i) { -// father[i] = find(father[i]); -// } -// return father[i]; -//} -// -//void kruskalRebuild() { -// for(int i = 1; i <= n; i++) { -// father[i] = i; -// } -// sort(arr + 1, arr + m + 1, EdgeCmp); -// cntu = n; -// for(int i = 1, fx, fy; i <= m; i++) { -// fx = find(arr[i].u); -// fy = find(arr[i].v); -// if(fx != fy) { -// cntu++; -// father[fx] = cntu; -// father[fy] = cntu; -// father[cntu] = cntu; -// nodeKey[cntu] = arr[i].a; -// addEdgeK(cntu, fx); -// addEdgeK(cntu, fy); -// } -// } -//} -// -//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 = headk[u]; e > 0; e = nextk[e]) { -// dfs(tok[e], u); -// } -// if(u <= n) { -// mindist[u] = dist[u]; -// } else { -// mindist[u] = INF; -// } -// for(int e = headk[u]; e > 0; e = nextk[e]) { -// mindist[u] = min(mindist[u], mindist[tok[e]]); -// } -//} -// -//int query(int node, int line) { -// for(int p = MAXH - 1; p >= 0; p--) { -// if(stjump[node][p] > 0 && nodeKey[stjump[node][p]] > line) { -// node = stjump[node][p]; -// } -// } -// return mindist[node]; -//} -// -//int main() { -// ios::sync_with_stdio(false); -// cin.tie(nullptr); -// cin >> t; -// for(int test = 1; test <= t; test++) { -// cin >> n >> m; -// prepare(); -// for(int i = 1; i <= m; i++) { -// cin >> arr[i].u >> arr[i].v >> arr[i].l >> arr[i].a; -// } -// dijkstra(); -// kruskalRebuild(); -// dfs(cntu, 0); -// cin >> q >> k >> s; -// int lastAns = 0; -// for(int i = 1, node, line; i <= q; i++) { -// cin >> node >> line; -// node = (node + k * lastAns - 1) % n + 1; -// line = (line + k * lastAns) % (s + 1); -// lastAns = query(node, line); -// cout << lastAns << "\n"; -// } -// } -// return 0; -//} \ No newline at end of file +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Arrays; +import java.util.PriorityQueue; + +public class Code02_ReturnJourney2 { + + public static int MAXN = 200001; + public static int MAXK = 400001; + public static int MAXM = 400001; + public static int MAXH = 20; + public static int INF = 2000000001; + public static int t, n, m, q, k, s; + public static int[][] arr = new int[MAXM][4]; + + public static int[] headg = new int[MAXN]; + public static int[] nextg = new int[MAXM << 1]; + public static int[] tog = new int[MAXM << 1]; + public static int[] weightg = new int[MAXM << 1]; + public static int cntg; + + public static int[] dist = new int[MAXN]; + public static boolean[] visit = new boolean[MAXN]; + public static PriorityQueue heap = new PriorityQueue<>((a, b) -> a[1] - b[1]); + + public static int[] headk = new int[MAXK]; + public static int[] nextk = new int[MAXK]; + public static int[] tok = new int[MAXK]; + public static int cntk; + + public static int[] father = new int[MAXK]; + public static int[] nodeKey = new int[MAXK]; + public static int[] stack = new int[MAXK]; + public static int cntu; + + public static int[] dep = new int[MAXK]; + public static int[][] stjump = new int[MAXK][MAXH]; + public static int[] mindist = new int[MAXK]; + + public static void prepare() { + cntg = cntk = 0; + Arrays.fill(headg, 1, n + 1, 0); + Arrays.fill(headk, 1, n * 2, 0); + } + + 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 dijkstra() { + for (int i = 1; i <= m; i++) { + addEdgeG(arr[i][0], arr[i][1], arr[i][2]); + addEdgeG(arr[i][1], arr[i][0], arr[i][2]); + } + Arrays.fill(dist, 1, n + 1, INF); + Arrays.fill(visit, 1, n + 1, false); + dist[1] = 0; + heap.add(new int[] { 1, 0 }); + int[] cur; + int x, v; + while (!heap.isEmpty()) { + cur = heap.poll(); + x = cur[0]; + v = cur[1]; + if (!visit[x]) { + visit[x] = true; + for (int e = headg[x], y, w; e > 0; e = nextg[e]) { + y = tog[e]; + w = weightg[e]; + if (!visit[y] && dist[y] > v + w) { + dist[y] = v + w; + heap.add(new int[] { y, dist[y] }); + } + } + } + } + } + + public static void addEdgeK(int u, int v) { + nextk[++cntk] = headk[u]; + tok[cntk] = v; + headk[u] = cntk; + } + + public static int find(int i) { + int size = 0; + while (i != father[i]) { + stack[size++] = i; + i = father[i]; + } + while (size > 0) { + father[stack[--size]] = i; + } + return i; + } + + public static void kruskalRebuild() { + for (int i = 1; i <= n; i++) { + father[i] = i; + } + Arrays.sort(arr, 1, m + 1, (a, b) -> b[3] - a[3]); + cntu = n; + for (int i = 1, fx, fy; i <= m; i++) { + fx = find(arr[i][0]); + fy = find(arr[i][1]); + if (fx != fy) { + father[fx] = father[fy] = ++cntu; + father[cntu] = cntu; + nodeKey[cntu] = arr[i][3]; + addEdgeK(cntu, fx); + addEdgeK(cntu, fy); + } + } + } + + public static int[][] fse = new int[MAXK][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]; + } + + public static void dfs(int u, int fa) { + stacksize = 0; + push(u, fa, -1); + while (stacksize > 0) { + pop(); + if (edge == -1) { + dep[first] = dep[second] + 1; + stjump[first][0] = second; + for (int p = 1; p < MAXH; p++) { + stjump[first][p] = stjump[stjump[first][p - 1]][p - 1]; + } + edge = headk[first]; + } else { + edge = nextk[edge]; + } + if (edge != 0) { + push(first, second, edge); + push(tok[edge], first, -1); + } else { + if (first <= n) { + mindist[first] = dist[first]; + } else { + mindist[first] = INF; + } + for (int e = headk[first]; e > 0; e = nextk[e]) { + mindist[first] = Math.min(mindist[first], mindist[tok[e]]); + } + } + } + } + + public static int query(int node, int line) { + for (int p = MAXH - 1; p >= 0; p--) { + if (stjump[node][p] > 0 && nodeKey[stjump[node][p]] > line) { + node = stjump[node][p]; + } + } + return mindist[node]; + } + + public static void main(String[] args) { + FastIO io = new FastIO(System.in, System.out); + t = io.nextInt(); + for (int test = 1; test <= t; test++) { + n = io.nextInt(); + m = io.nextInt(); + prepare(); + for (int i = 1; i <= m; i++) { + arr[i][0] = io.nextInt(); + arr[i][1] = io.nextInt(); + arr[i][2] = io.nextInt(); + arr[i][3] = io.nextInt(); + } + dijkstra(); + kruskalRebuild(); + dfs(cntu, 0); + q = io.nextInt(); + k = io.nextInt(); + s = io.nextInt(); + for (int i = 1, node, line, lastAns = 0; i <= q; i++) { + node = (io.nextInt() + k * lastAns - 1) % n + 1; + line = (io.nextInt() + k * lastAns) % (s + 1); + lastAns = query(node, line); + io.writelnInt(lastAns); + } + } + 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/class164/Code02_ReturnJourney3.java b/src/class164/Code02_ReturnJourney3.java new file mode 100644 index 000000000..b954b0161 --- /dev/null +++ b/src/class164/Code02_ReturnJourney3.java @@ -0,0 +1,197 @@ +package class164; + +// 归程,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P4768 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Edge { +// int u, v, l, a; +//}; +// +//bool EdgeCmp(Edge x, Edge y) { +// return x.a > y.a; +//} +// +//struct HeapNode { +// int cur, cost; +//}; +// +//struct HeapNodeCmp { +// bool operator()(const HeapNode &x, const HeapNode &y) const { +// return x.cost > y.cost; // 距离大,在堆的下方,C++的设定,其实是距离的小根堆 +// } +//}; +// +//const int MAXN = 200001; +//const int MAXK = 400001; +//const int MAXM = 400001; +//const int MAXH = 20; +//int INF = 2000000001; +//int t, n, m, q, k, s; +//Edge arr[MAXM]; +// +//int headg[MAXN]; +//int nextg[MAXM << 1]; +//int tog[MAXM << 1]; +//int weightg[MAXM << 1]; +//int cntg; +// +//int dist[MAXN]; +//bool visit[MAXN]; +//priority_queue, HeapNodeCmp> heap; +// +//int headk[MAXK]; +//int nextk[MAXK]; +//int tok[MAXK]; +//int cntk; +// +//int father[MAXK]; +//int nodeKey[MAXK]; +//int cntu; +// +//int dep[MAXK]; +//int stjump[MAXK][MAXH]; +//int mindist[MAXK]; +// +//void prepare() { +// cntg = 0; +// cntk = 0; +// for(int i = 1; i <= n; i++) { +// headg[i] = 0; +// } +// for(int i = 1; i <= 2 * n; i++) { +// headk[i] = 0; +// } +//} +// +//void addEdgeG(int u, int v, int w) { +// nextg[++cntg] = headg[u]; +// tog[cntg] = v; +// weightg[cntg] = w; +// headg[u] = cntg; +//} +// +//void dijkstra() { +// for(int i = 1; i <= m; i++) { +// addEdgeG(arr[i].u, arr[i].v, arr[i].l); +// addEdgeG(arr[i].v, arr[i].u, arr[i].l); +// } +// for(int i = 1; i <= n; i++) { +// dist[i] = INF; +// visit[i] = false; +// } +// dist[1] = 0; +// heap.push({1, 0}); +// HeapNode node; +// int x, v; +// while(!heap.empty()) { +// node = heap.top(); +// heap.pop(); +// x = node.cur; +// v = node.cost; +// if(!visit[x]) { +// visit[x] = true; +// for(int e = headg[x], y, w; e > 0; e = nextg[e]) { +// y = tog[e]; +// w = weightg[e]; +// if(!visit[y] && dist[y] > v + w) { +// dist[y] = v + w; +// heap.push({y, dist[y]}); +// } +// } +// } +// } +//} +// +//void addEdgeK(int u, int v) { +// nextk[++cntk] = headk[u]; +// tok[cntk] = v; +// headk[u] = cntk; +//} +// +//int find(int i) { +// if(father[i] != i) { +// father[i] = find(father[i]); +// } +// return father[i]; +//} +// +//void kruskalRebuild() { +// for(int i = 1; i <= n; i++) { +// father[i] = i; +// } +// sort(arr + 1, arr + m + 1, EdgeCmp); +// cntu = n; +// for(int i = 1, fx, fy; i <= m; i++) { +// fx = find(arr[i].u); +// fy = find(arr[i].v); +// if(fx != fy) { +// cntu++; +// father[fx] = cntu; +// father[fy] = cntu; +// father[cntu] = cntu; +// nodeKey[cntu] = arr[i].a; +// addEdgeK(cntu, fx); +// addEdgeK(cntu, fy); +// } +// } +//} +// +//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 = headk[u]; e > 0; e = nextk[e]) { +// dfs(tok[e], u); +// } +// if(u <= n) { +// mindist[u] = dist[u]; +// } else { +// mindist[u] = INF; +// } +// for(int e = headk[u]; e > 0; e = nextk[e]) { +// mindist[u] = min(mindist[u], mindist[tok[e]]); +// } +//} +// +//int query(int node, int line) { +// for(int p = MAXH - 1; p >= 0; p--) { +// if(stjump[node][p] > 0 && nodeKey[stjump[node][p]] > line) { +// node = stjump[node][p]; +// } +// } +// return mindist[node]; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> t; +// for(int test = 1; test <= t; test++) { +// cin >> n >> m; +// prepare(); +// for(int i = 1; i <= m; i++) { +// cin >> arr[i].u >> arr[i].v >> arr[i].l >> arr[i].a; +// } +// dijkstra(); +// kruskalRebuild(); +// dfs(cntu, 0); +// cin >> q >> k >> s; +// int lastAns = 0; +// for(int i = 1, node, line; i <= q; i++) { +// cin >> node >> line; +// node = (node + k * lastAns - 1) % n + 1; +// line = (line + k * lastAns) % (s + 1); +// lastAns = query(node, line); +// cout << lastAns << "\n"; +// } +// } +// return 0; +//} \ No newline at end of file From 16e081ed4009a16a9b4cc8cf06bdab7101b034a5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 27 Mar 2025 20:55:33 +0800 Subject: [PATCH 0871/2029] modify code --- src/class164/Code02_ReturnJourney3.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class164/Code02_ReturnJourney3.java b/src/class164/Code02_ReturnJourney3.java index b954b0161..b5edb8f21 100644 --- a/src/class164/Code02_ReturnJourney3.java +++ b/src/class164/Code02_ReturnJourney3.java @@ -14,16 +14,16 @@ //}; // //bool EdgeCmp(Edge x, Edge y) { -// return x.a > y.a; +// return x.a > y.a; // 海拔高的边,排序排在数组前面 //} // //struct HeapNode { -// int cur, cost; +// int cur, dis; //}; // //struct HeapNodeCmp { // bool operator()(const HeapNode &x, const HeapNode &y) const { -// return x.cost > y.cost; // 距离大,在堆的下方,C++的设定,其实是距离的小根堆 +// return x.dis > y.dis; // 谁距离大,谁在堆下方,C++的设定,其实是距离的小根堆 // } //}; // @@ -93,7 +93,7 @@ // node = heap.top(); // heap.pop(); // x = node.cur; -// v = node.cost; +// v = node.dis; // if(!visit[x]) { // visit[x] = true; // for(int e = headg[x], y, w; e > 0; e = nextg[e]) { From efdb4a25953d4bd562ee2e772f4de4278529c7be Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 27 Mar 2025 21:16:32 +0800 Subject: [PATCH 0872/2029] modify code --- src/class164/Code01_KruskalRebuild2.java | 10 +++++----- src/class164/Code02_ReturnJourney3.java | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/class164/Code01_KruskalRebuild2.java b/src/class164/Code01_KruskalRebuild2.java index 4d6ae9ace..46bbc372f 100644 --- a/src/class164/Code01_KruskalRebuild2.java +++ b/src/class164/Code01_KruskalRebuild2.java @@ -34,14 +34,14 @@ //int top[MAXK]; // //bool cmp(Edge x, Edge y) { -// return x.w < y.w; +// return x.w < y.w; //} // //int find(int i) { -// if(i != father[i]) { -// father[i] = find(father[i]); -// } -// return father[i]; +// if(i != father[i]) { +// father[i] = find(father[i]); +// } +// return father[i]; //} // //void addEdge(int u, int v) { diff --git a/src/class164/Code02_ReturnJourney3.java b/src/class164/Code02_ReturnJourney3.java index b5edb8f21..00ad3beb3 100644 --- a/src/class164/Code02_ReturnJourney3.java +++ b/src/class164/Code02_ReturnJourney3.java @@ -82,8 +82,8 @@ // addEdgeG(arr[i].v, arr[i].u, arr[i].l); // } // for(int i = 1; i <= n; i++) { -// dist[i] = INF; -// visit[i] = false; +// dist[i] = INF; +// visit[i] = false; // } // dist[1] = 0; // heap.push({1, 0}); @@ -95,12 +95,12 @@ // x = node.cur; // v = node.dis; // if(!visit[x]) { -// visit[x] = true; +// visit[x] = true; // for(int e = headg[x], y, w; e > 0; e = nextg[e]) { // y = tog[e]; // w = weightg[e]; // if(!visit[y] && dist[y] > v + w) { -// dist[y] = v + w; +// dist[y] = v + w; // heap.push({y, dist[y]}); // } // } From 43e399f74c442dc69652396e08e8a821f8ad7e85 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 27 Mar 2025 21:19:54 +0800 Subject: [PATCH 0873/2029] modify code --- src/class164/Code02_ReturnJourney3.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/class164/Code02_ReturnJourney3.java b/src/class164/Code02_ReturnJourney3.java index 00ad3beb3..6ec74f727 100644 --- a/src/class164/Code02_ReturnJourney3.java +++ b/src/class164/Code02_ReturnJourney3.java @@ -184,8 +184,7 @@ // kruskalRebuild(); // dfs(cntu, 0); // cin >> q >> k >> s; -// int lastAns = 0; -// for(int i = 1, node, line; i <= q; i++) { +// for(int i = 1, node, line, lastAns = 0; i <= q; i++) { // cin >> node >> line; // node = (node + k * lastAns - 1) % n + 1; // line = (line + k * lastAns) % (s + 1); From 8050f61f457f62b025d2ca1f10ac4912c041c1f7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 28 Mar 2025 17:31:28 +0800 Subject: [PATCH 0874/2029] modify code --- src/class164/Code02_StampRally1.java | 218 ++++++++++++++++++ src/class164/Code02_StampRally2.java | 140 +++++++++++ ...urney1.java => Code03_ReturnJourney1.java} | 4 +- ...urney2.java => Code03_ReturnJourney2.java} | 2 +- ...urney3.java => Code03_ReturnJourney3.java} | 0 5 files changed, 361 insertions(+), 3 deletions(-) create mode 100644 src/class164/Code02_StampRally1.java create mode 100644 src/class164/Code02_StampRally2.java rename src/class164/{Code02_ReturnJourney1.java => Code03_ReturnJourney1.java} (98%) rename src/class164/{Code02_ReturnJourney2.java => Code03_ReturnJourney2.java} (99%) rename src/class164/{Code02_ReturnJourney3.java => Code03_ReturnJourney3.java} (100%) diff --git a/src/class164/Code02_StampRally1.java b/src/class164/Code02_StampRally1.java new file mode 100644 index 000000000..4bb02f8c0 --- /dev/null +++ b/src/class164/Code02_StampRally1.java @@ -0,0 +1,218 @@ +package class164; + +// 走过z个点的最大边权最小值,java版 +// 测试链接 : https://www.luogu.com.cn/problem/AT_agc002_d +// 测试链接 : https://atcoder.jp/contests/agc002/tasks/agc002_d +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Arrays; + +public class Code02_StampRally1 { + + public static int MAXK = 200001; + public static int MAXM = 100001; + public static int MAXH = 20; + public static int n, m, q; + public static int[][] arr = new int[MAXM][3]; + + public static int[] head = new int[MAXK]; + public static int[] next = new int[MAXK]; + public static int[] to = new int[MAXK]; + public static int cntg; + + public static int[] father = new int[MAXK]; + public static int[] nodeKey = new int[MAXK]; + public static int cntu; + + public static int[] dep = new int[MAXK]; + public static int[] siz = new int[MAXK]; + public static int[][] stjump = new int[MAXK][MAXH]; + + public static void addEdge(int u, int v) { + next[++cntg] = head[u]; + to[cntg] = v; + head[u] = cntg; + } + + public static int find(int i) { + if (i != father[i]) { + father[i] = find(father[i]); + } + return father[i]; + } + + public static void kruskalRebuild() { + for (int i = 1; i <= n; i++) { + father[i] = i; + } + Arrays.sort(arr, 1, m + 1, (a, b) -> a[2] - b[2]); + cntu = n; + for (int i = 1, fx, fy; i <= m; i++) { + fx = find(arr[i][0]); + fy = find(arr[i][1]); + if (fx != fy) { + father[fx] = father[fy] = ++cntu; + father[cntu] = cntu; + nodeKey[cntu] = arr[i][2]; + addEdge(cntu, fx); + addEdge(cntu, fy); + } + } + } + + public static 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 > 0; e = next[e]) { + dfs(to[e], u); + } + if (u <= n) { + siz[u] = 1; + } else { + siz[u] = 0; + } + for (int e = head[u]; e > 0; e = next[e]) { + siz[u] += siz[to[e]]; + } + } + + public static boolean check(int x, int y, int z, int limit) { + for (int p = MAXH - 1; p >= 0; p--) { + if (stjump[x][p] > 0 && nodeKey[stjump[x][p]] <= limit) { + x = stjump[x][p]; + } + } + for (int p = MAXH - 1; p >= 0; p--) { + if (stjump[y][p] > 0 && nodeKey[stjump[y][p]] <= limit) { + y = stjump[y][p]; + } + } + if (x == y) { + return siz[x] >= z; + } else { + return siz[x] + siz[y] >= z; + } + } + + public static int query(int x, int y, int z) { + int l = 1, r = m, mid, ans = 0; + while (l <= r) { + mid = (l + r) / 2; + if (check(x, y, z, mid)) { + ans = mid; + r = mid - 1; + } else { + l = mid + 1; + } + } + return ans; + } + + 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++) { + arr[i][0] = io.nextInt(); + arr[i][1] = io.nextInt(); + arr[i][2] = i; + } + kruskalRebuild(); + dfs(cntu, 0); + q = io.nextInt(); + for (int i = 1, x, y, z; i <= q; i++) { + x = io.nextInt(); + y = io.nextInt(); + z = io.nextInt(); + io.writelnInt(query(x, y, z)); + } + 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/class164/Code02_StampRally2.java b/src/class164/Code02_StampRally2.java new file mode 100644 index 000000000..10eae9866 --- /dev/null +++ b/src/class164/Code02_StampRally2.java @@ -0,0 +1,140 @@ +package class164; + +// 走过z个点的最大边权最小值,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/AT_agc002_d +// 测试链接 : https://atcoder.jp/contests/agc002/tasks/agc002_d +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Edge { +// int u, v, w; +//}; +// +//const int MAXK = 200001; +//const int MAXM = 100001; +//const int MAXH = 20; +//int n, m, q; +//Edge arr[MAXM]; +// +//int head[MAXK]; +//int nxt[MAXK]; +//int to[MAXK]; +//int cntg; +// +//int father[MAXK]; +//int nodeKey[MAXK]; +//int cntu; +// +//int dep[MAXK]; +//int siz[MAXK]; +//int stjump[MAXK][MAXH]; +// +//bool cmp(Edge x, Edge y) { +// return x.w < y.w; +//} +// +//void addEdge(int u, int v) { +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// head[u] = cntg; +//} +// +//int find(int i) { +// if (i != father[i]) { +// father[i] = find(father[i]); +// } +// return father[i]; +//} +// +//void kruskalRebuild() { +// for (int i = 1; i <= n; i++) { +// father[i] = i; +// } +// sort(arr + 1, arr + m + 1, cmp); +// cntu = n; +// for (int i = 1, fx, fy; i <= m; i++) { +// fx = find(arr[i].u); +// fy = find(arr[i].v); +// if (fx != fy) { +// father[fx] = father[fy] = ++cntu; +// father[cntu] = cntu; +// nodeKey[cntu] = arr[i].w; +// addEdge(cntu, fx); +// addEdge(cntu, fy); +// } +// } +//} +// +//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 > 0; e = nxt[e]) { +// dfs(to[e], u); +// } +// if (u <= n) { +// siz[u] = 1; +// } else { +// siz[u] = 0; +// } +// for (int e = head[u]; e > 0; e = nxt[e]) { +// siz[u] += siz[to[e]]; +// } +//} +// +//bool check(int x, int y, int z, int limit) { +// for (int p = MAXH - 1; p >= 0; p--) { +// if (stjump[x][p] > 0 && nodeKey[stjump[x][p]] <= limit) { +// x = stjump[x][p]; +// } +// } +// for (int p = MAXH - 1; p >= 0; p--) { +// if (stjump[y][p] > 0 && nodeKey[stjump[y][p]] <= limit) { +// y = stjump[y][p]; +// } +// } +// if (x == y) { +// return siz[x] >= z; +// } else { +// return siz[x] + siz[y] >= z; +// } +//} +// +//int query(int x, int y, int z) { +// int l = 1, r = m, ans = 0; +// while (l <= r) { +// int mid = (l + r) / 2; +// if (check(x, y, z, mid)) { +// ans = mid; +// r = mid - 1; +// } else { +// l = mid + 1; +// } +// } +// return ans; +//} +// +//int main(){ +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1; i <= m; i++) { +// cin >> arr[i].u >> arr[i].v; +// arr[i].w = i; +// } +// kruskalRebuild(); +// dfs(cntu, 0); +// cin >> q; +// for (int i = 1; i <= q; i++) { +// int x, y, z; +// cin >> x >> y >> z; +// cout << query(x, y, z) << "\n"; +// } +// return 0; +//} \ No newline at end of file diff --git a/src/class164/Code02_ReturnJourney1.java b/src/class164/Code03_ReturnJourney1.java similarity index 98% rename from src/class164/Code02_ReturnJourney1.java rename to src/class164/Code03_ReturnJourney1.java index 57d203978..3892225f9 100644 --- a/src/class164/Code02_ReturnJourney1.java +++ b/src/class164/Code03_ReturnJourney1.java @@ -4,7 +4,7 @@ // 测试链接 : https://www.luogu.com.cn/problem/P4768 // 提交以下的code,提交时请把类名改成"Main" // 因为树的深度太大,递归函数爆栈了,所以无法全部通过所有测试用例 -// find方法、dfs方法都需要改成迭代版,就是本节课Code02_ReturnJourney2文件 +// find方法、dfs方法都需要改成迭代版,就是本节课Code03_ReturnJourney2文件 import java.io.IOException; import java.io.InputStream; @@ -12,7 +12,7 @@ import java.util.Arrays; import java.util.PriorityQueue; -public class Code02_ReturnJourney1 { +public class Code03_ReturnJourney1 { public static int MAXN = 200001; public static int MAXK = 400001; diff --git a/src/class164/Code02_ReturnJourney2.java b/src/class164/Code03_ReturnJourney2.java similarity index 99% rename from src/class164/Code02_ReturnJourney2.java rename to src/class164/Code03_ReturnJourney2.java index 665d0df44..b28aade10 100644 --- a/src/class164/Code02_ReturnJourney2.java +++ b/src/class164/Code03_ReturnJourney2.java @@ -10,7 +10,7 @@ import java.util.Arrays; import java.util.PriorityQueue; -public class Code02_ReturnJourney2 { +public class Code03_ReturnJourney2 { public static int MAXN = 200001; public static int MAXK = 400001; diff --git a/src/class164/Code02_ReturnJourney3.java b/src/class164/Code03_ReturnJourney3.java similarity index 100% rename from src/class164/Code02_ReturnJourney3.java rename to src/class164/Code03_ReturnJourney3.java From 20b9d3d6ff272b8a934c4d38064527a6922cfcea Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 28 Mar 2025 20:30:59 +0800 Subject: [PATCH 0875/2029] modify code --- src/class164/Code01_KruskalRebuild1.java | 10 +- src/class164/Code01_KruskalRebuild2.java | 8 +- src/class164/Code02_StampRally1.java | 2 +- src/class164/Code02_StampRally2.java | 2 +- src/class164/Code04_Peaks1.java | 307 +++++++++++++++++++++++ src/class164/Code04_Peaks2.java | 221 ++++++++++++++++ 6 files changed, 539 insertions(+), 11 deletions(-) create mode 100644 src/class164/Code04_Peaks1.java create mode 100644 src/class164/Code04_Peaks2.java diff --git a/src/class164/Code01_KruskalRebuild1.java b/src/class164/Code01_KruskalRebuild1.java index e7d4f0b74..789f48359 100644 --- a/src/class164/Code01_KruskalRebuild1.java +++ b/src/class164/Code01_KruskalRebuild1.java @@ -16,17 +16,17 @@ public class Code01_KruskalRebuild1 { public static int n, m, q; public static int[][] arr = new int[MAXM][3]; - // 并查集 - public static int[] father = new int[MAXK]; - public static int[] nodeKey = new int[MAXK]; - public static int cntu = 0; - // 链式前向星 public static int[] head = new int[MAXK]; public static int[] next = new int[MAXK]; public static int[] to = new int[MAXK]; public static int cntg = 0; + // 并查集 + public static int[] father = new int[MAXK]; + public static int[] nodeKey = new int[MAXK]; + public static int cntu; + // 树链剖分 public static int[] fa = new int[MAXK]; public static int[] dep = new int[MAXK]; diff --git a/src/class164/Code01_KruskalRebuild2.java b/src/class164/Code01_KruskalRebuild2.java index 46bbc372f..13b74a80a 100644 --- a/src/class164/Code01_KruskalRebuild2.java +++ b/src/class164/Code01_KruskalRebuild2.java @@ -18,15 +18,15 @@ //int n, m, q; //Edge arr[MAXM]; // -//int father[MAXK]; -//int nodeKey[MAXK]; -//int cntu = 0; -// //int head[MAXK]; //int nxt[MAXK]; //int to[MAXK]; //int cntg = 0; // +//int father[MAXK]; +//int nodeKey[MAXK]; +//int cntu; +// //int fa[MAXK]; //int dep[MAXK]; //int siz[MAXK]; diff --git a/src/class164/Code02_StampRally1.java b/src/class164/Code02_StampRally1.java index 4bb02f8c0..b5c3a8da5 100644 --- a/src/class164/Code02_StampRally1.java +++ b/src/class164/Code02_StampRally1.java @@ -21,7 +21,7 @@ public class Code02_StampRally1 { public static int[] head = new int[MAXK]; public static int[] next = new int[MAXK]; public static int[] to = new int[MAXK]; - public static int cntg; + public static int cntg = 0; public static int[] father = new int[MAXK]; public static int[] nodeKey = new int[MAXK]; diff --git a/src/class164/Code02_StampRally2.java b/src/class164/Code02_StampRally2.java index 10eae9866..ea479932e 100644 --- a/src/class164/Code02_StampRally2.java +++ b/src/class164/Code02_StampRally2.java @@ -23,7 +23,7 @@ //int head[MAXK]; //int nxt[MAXK]; //int to[MAXK]; -//int cntg; +//int cntg = 0; // //int father[MAXK]; //int nodeKey[MAXK]; diff --git a/src/class164/Code04_Peaks1.java b/src/class164/Code04_Peaks1.java new file mode 100644 index 000000000..d9482858c --- /dev/null +++ b/src/class164/Code04_Peaks1.java @@ -0,0 +1,307 @@ +package class164; + +// 边权上限内第k大点权,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P7834 +// 提交以下的code,提交时请把类名改成"Main" +// java实现的逻辑一定是正确的,但是通过不了 +// 因为这道题根据C++的运行空间,制定通过标准,根本没考虑java的用户 +// 想通过用C++实现,本节课Code04_Peaks2文件就是C++的实现 +// 两个版本的逻辑完全一样,C++版本可以通过所有测试 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Arrays; + +public class Code04_Peaks1 { + + public static int MAXN = 100001; + public static int MAXK = 200001; + public static int MAXM = 500001; + public static int MAXT = MAXN * 40; + public static int MAXH = 20; + public static int n, m, q; + + public static int[] node = new int[MAXN]; + public static int[] sorted = new int[MAXN]; + public static int diff; + + public static int[][] edge = new int[MAXM][3]; + + public static int[] head = new int[MAXK]; + public static int[] next = new int[MAXK]; + public static int[] to = new int[MAXK]; + public static int cntg = 0; + + public static int[] father = new int[MAXK]; + public static int[] nodeKey = new int[MAXK]; + public static int cntu; + + public static int[] dfn = new int[MAXK]; + public static int[] seg = new int[MAXK]; + public static int[][] stjump = new int[MAXK][MAXH]; + public static int[] siz = new int[MAXK]; + public static int cntd = 0; + + public static int[] root = new int[MAXK]; + public static int[] ls = new int[MAXT]; + public static int[] rs = new int[MAXT]; + public static int[] segsiz = new int[MAXT]; + public static int cntt = 0; + + public static int kth(int num) { + int left = 1, right = diff, 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 prepare() { + for (int i = 1; i <= n; i++) { + sorted[i] = node[i]; + } + sorted[n + 1] = 0; + Arrays.sort(sorted, 1, n + 2); + diff = 1; + for (int i = 2; i <= n + 1; i++) { + if (sorted[diff] != sorted[i]) { + sorted[++diff] = sorted[i]; + } + } + for (int i = 1; i <= n; i++) { + node[i] = kth(node[i]); + } + } + + public static void addEdge(int u, int v) { + next[++cntg] = head[u]; + to[cntg] = v; + head[u] = cntg; + } + + public static int find(int i) { + if (i != father[i]) { + father[i] = find(father[i]); + } + return father[i]; + } + + public static void kruskalRebuild() { + for (int i = 1; i <= n; i++) { + father[i] = i; + } + Arrays.sort(edge, 1, m + 1, (a, b) -> a[2] - b[2]); + cntu = n; + for (int i = 1, fx, fy; i <= m; i++) { + fx = find(edge[i][0]); + fy = find(edge[i][1]); + if (fx != fy) { + father[fx] = father[fy] = ++cntu; + father[cntu] = cntu; + nodeKey[cntu] = edge[i][2]; + addEdge(cntu, fx); + addEdge(cntu, fy); + } + } + } + + public static void dfs(int u, int fa) { + siz[u] = 1; + dfn[u] = ++cntd; + seg[cntd] = u; + 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]) { + dfs(to[e], u); + } + for (int e = head[u]; e > 0; e = next[e]) { + siz[u] += siz[to[e]]; + } + } + + public static int build(int l, int r) { + int rt = ++cntt; + segsiz[rt] = 0; + if (l < r) { + int mid = (l + r) / 2; + ls[rt] = build(l, mid); + rs[rt] = build(mid + 1, r); + } + return rt; + } + + public static int insert(int jobi, int l, int r, int i) { + int rt = ++cntt; + ls[rt] = ls[i]; + rs[rt] = rs[i]; + segsiz[rt] = segsiz[i] + 1; + if (l < r) { + 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]); + } + } + return rt; + } + + public static int query(int jobk, int l, int r, int pre, int post) { + if (l == r) { + return l; + } + int rsize = segsiz[rs[post]] - segsiz[rs[pre]]; + int mid = (l + r) / 2; + if (rsize >= jobk) { + return query(jobk, mid + 1, r, rs[pre], rs[post]); + } else { + return query(jobk - rsize, l, mid, ls[pre], ls[post]); + } + } + + public static int compute(int u, int x, int k) { + for (int p = MAXH - 1; p >= 0; p--) { + if (stjump[u][p] > 0 && nodeKey[stjump[u][p]] <= x) { + u = stjump[u][p]; + } + } + int idx = query(k, 1, diff, root[dfn[u] - 1], root[dfn[u] + siz[u] - 1]); + return sorted[idx]; + } + + public static void main(String[] args) { + FastIO io = new FastIO(System.in, System.out); + n = io.nextInt(); + m = io.nextInt(); + q = io.nextInt(); + for (int i = 1; i <= n; i++) { + node[i] = io.nextInt(); + } + for (int i = 1; i <= m; i++) { + edge[i][0] = io.nextInt(); + edge[i][1] = io.nextInt(); + edge[i][2] = io.nextInt(); + } + prepare(); + kruskalRebuild(); + for (int i = 1; i <= cntu; i++) { + if (i == father[i]) { + dfs(i, 0); + } + } + root[0] = build(1, diff); + for (int i = 1; i <= cntd; i++) { + if (seg[i] <= n) { + root[i] = insert(node[seg[i]], 1, diff, root[i - 1]); + } else { + root[i] = root[i - 1]; + } + } + for (int i = 1, u, x, k, lastAns = 0; i <= q; i++) { + u = io.nextInt(); + x = io.nextInt(); + k = io.nextInt(); + u = (u ^ lastAns) % n + 1; + x = x ^ lastAns; + k = (k ^ lastAns) % n + 1; + lastAns = compute(u, x, k); + if (lastAns == 0) { + io.writelnInt(-1); + } else { + io.writelnInt(lastAns); + } + } + 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/class164/Code04_Peaks2.java b/src/class164/Code04_Peaks2.java new file mode 100644 index 000000000..079548226 --- /dev/null +++ b/src/class164/Code04_Peaks2.java @@ -0,0 +1,221 @@ +package class164; + +// 边权上限内第k大点权,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P7834 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Edge { +// int u, v, w; +//}; +// +//const int MAXN = 100001; +//const int MAXK = 200001; +//const int MAXM = 500001; +//const int MAXT = MAXN * 40; +//const int MAXH = 20; +//int n, m, q; +//int node[MAXN]; +//int sorted[MAXN]; +//int diff; +// +//Edge edge[MAXM]; +// +//int head[MAXK]; +//int nxt[MAXK]; +//int to[MAXK]; +//int cntg; +// +//int father[MAXK]; +//int nodeKey[MAXK]; +//int cntu; +// +//int dfn[MAXK]; +//int seg[MAXK]; +//int stjump[MAXK][MAXH]; +//int siz[MAXK]; +//int cntd; +// +//int root[MAXK]; +//int ls[MAXT]; +//int rs[MAXT]; +//int segsiz[MAXT]; +//int cntt; +// +//bool cmp(Edge x, Edge y) { +// return x.w < y.w; +//} +// +//int kth(int num) { +// int left = 1, right = diff; +// while (left <= right) { +// int 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 prepare() { +// for (int i = 1; i <= n; i++) { +// sorted[i] = node[i]; +// } +// sorted[n + 1] = 0; +// sort(sorted + 1, sorted + n + 2); +// diff = 1; +// for (int i = 2; i <= n + 1; i++) { +// if (sorted[diff] != sorted[i]) { +// sorted[++diff] = sorted[i]; +// } +// } +// for (int i = 1; i <= n; i++) { +// node[i] = kth(node[i]); +// } +//} +// +//void addEdge(int u, int v) { +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// head[u] = cntg; +//} +// +//int find(int i) { +// if (i != father[i]) { +// father[i] = find(father[i]); +// } +// return father[i]; +//} +// +//void kruskalRebuild() { +// for (int i = 1; i <= n; i++) { +// father[i] = i; +// } +// sort(edge + 1, edge + m + 1, cmp); +// cntu = n; +// for (int i = 1, fx, fy; i <= m; i++) { +// fx = find(edge[i].u); +// fy = find(edge[i].v); +// if (fx != fy) { +// father[fx] = father[fy] = ++cntu; +// father[cntu] = cntu; +// nodeKey[cntu] = edge[i].w; +// addEdge(cntu, fx); +// addEdge(cntu, fy); +// } +// } +//} +// +//void dfs(int u, int fa) { +// siz[u] = 1; +// dfn[u] = ++cntd; +// seg[cntd] = u; +// 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]) { +// dfs(to[e], u); +// } +// for (int e = head[u]; e > 0; e = nxt[e]) { +// siz[u] += siz[to[e]]; +// } +//} +// +//int build(int l, int r) { +// int rt = ++cntt; +// segsiz[rt] = 0; +// if (l < r) { +// int mid = (l + r) / 2; +// ls[rt] = build(l, mid); +// rs[rt] = build(mid + 1, r); +// } +// return rt; +//} +// +//int insert(int jobi, int l, int r, int i) { +// int rt = ++cntt; +// ls[rt] = ls[i]; +// rs[rt] = rs[i]; +// segsiz[rt] = segsiz[i] + 1; +// if (l < r) { +// 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]); +// } +// } +// return rt; +//} +// +//int query(int jobk, int l, int r, int pre, int post) { +// if (l == r) { +// return l; +// } +// int mid = (l + r) / 2; +// int rsize = segsiz[ rs[post] ] - segsiz[ rs[pre] ]; +// if (rsize >= jobk) { +// return query(jobk, mid + 1, r, rs[pre], rs[post]); +// } else { +// return query(jobk - rsize, l, mid, ls[pre], ls[post]); +// } +//} +// +//int compute(int u, int x, int k) { +// for (int p = MAXH - 1; p >= 0; p--) { +// if (stjump[u][p] > 0 && nodeKey[stjump[u][p]] <= x) { +// u = stjump[u][p]; +// } +// } +// int idx = query(k, 1, diff, root[dfn[u] - 1], root[dfn[u] + siz[u] - 1]); +// return sorted[idx]; +//} +// +//int main(){ +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m >> q; +// for (int i = 1; i <= n; i++) { +// cin >> node[i]; +// } +// for (int i = 1; i <= m; i++) { +// cin >> edge[i].u >> edge[i].v >> edge[i].w; +// } +// prepare(); +// kruskalRebuild(); +// for (int i = 1; i <= cntu; i++) { +// if (i == father[i]) { +// dfs(i, 0); +// } +// } +// root[0] = build(1, diff); +// for (int i = 1; i <= cntd; i++) { +// if (seg[i] <= n) { +// root[i] = insert(node[seg[i]], 1, diff, root[i - 1]); +// } else { +// root[i] = root[i - 1]; +// } +// } +// for (int i = 1, u, x, k, lastAns = 0; i <= q; i++) { +// cin >> u >> x >> k; +// u = ((u ^ lastAns) % n) + 1; +// x = x ^ lastAns; +// k = ((k ^ lastAns) % n) + 1; +// lastAns = compute(u, x, k); +// if (lastAns == 0) { +// cout << -1 << "\n"; +// } else { +// cout << lastAns << "\n"; +// } +// } +// return 0; +//} \ No newline at end of file From 322cc21befc8cef746b53cb3af6fad620a7c0fa3 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 28 Mar 2025 23:15:09 +0800 Subject: [PATCH 0876/2029] modify code --- src/class164/Code02_YouyouTraining1.java | 266 ++++++++++++++++++ src/class164/Code02_YouyouTraining2.java | 130 +++++++++ src/class164/Code03_ReturnJourney1.java | 259 ----------------- ...ampRally1.java => Code04_StampRally1.java} | 2 +- ...ampRally2.java => Code04_StampRally2.java} | 0 ...turnJourney2.java => Code05_Journey1.java} | 78 +++-- ...turnJourney3.java => Code05_Journey2.java} | 0 ...{Code04_Peaks1.java => Code06_Peaks1.java} | 4 +- ...{Code04_Peaks2.java => Code06_Peaks2.java} | 0 9 files changed, 449 insertions(+), 290 deletions(-) create mode 100644 src/class164/Code02_YouyouTraining1.java create mode 100644 src/class164/Code02_YouyouTraining2.java delete mode 100644 src/class164/Code03_ReturnJourney1.java rename src/class164/{Code02_StampRally1.java => Code04_StampRally1.java} (99%) rename src/class164/{Code02_StampRally2.java => Code04_StampRally2.java} (100%) rename src/class164/{Code03_ReturnJourney2.java => Code05_Journey1.java} (79%) rename src/class164/{Code03_ReturnJourney3.java => Code05_Journey2.java} (100%) rename src/class164/{Code04_Peaks1.java => Code06_Peaks1.java} (98%) rename src/class164/{Code04_Peaks2.java => Code06_Peaks2.java} (100%) diff --git a/src/class164/Code02_YouyouTraining1.java b/src/class164/Code02_YouyouTraining1.java new file mode 100644 index 000000000..ad4e5bb6a --- /dev/null +++ b/src/class164/Code02_YouyouTraining1.java @@ -0,0 +1,266 @@ +package class164; + +// youyou的军训,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P9638 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Arrays; + +public class Code02_YouyouTraining1 { + + public static int MAXK = 800001; + public static int MAXM = 400001; + public static int MAXH = 20; + public static int n, m, q; + public static int[][] edge = new int[MAXM][4]; + public static int[] edgeToTree = new int[MAXM]; + + public static int[] head = new int[MAXK]; + public static int[] next = new int[MAXK]; + public static int[] to = new int[MAXK]; + public static int cntg = 0; + + public static int[] father = new int[MAXK]; + public static int[] nodeKey = new int[MAXK]; + public static int[] stack = new int[MAXK]; + public static int cntu; + + public static int[] siz = new int[MAXK]; + public static int[][] stjump = new int[MAXK][MAXH]; + + // 并查集的find方法,需要改成迭代版不然会爆栈,C++实现不需要 + public static int find(int i) { + int size = 0; + while (i != father[i]) { + stack[size++] = i; + i = father[i]; + } + while (size > 0) { + father[stack[--size]] = i; + } + return i; + } + + public static void addEdge(int u, int v) { + next[++cntg] = head[u]; + to[cntg] = v; + head[u] = cntg; + } + + public static void kruskalRebuild() { + for (int i = 1; i <= n; i++) { + father[i] = i; + } + Arrays.sort(edge, 1, m + 1, (a, b) -> b[2] - a[2]); + cntu = n; + for (int i = 1, fx, fy; i <= m; i++) { + fx = find(edge[i][0]); + fy = find(edge[i][1]); + if (fx != fy) { + father[fx] = father[fy] = ++cntu; + father[cntu] = cntu; + nodeKey[cntu] = edge[i][2]; + addEdge(cntu, fx); + addEdge(cntu, fy); + edgeToTree[edge[i][3]] = cntu; + } + } + } + + // dfs1是递归函数,需要改成迭代版不然会爆栈,C++实现不需要 + public static void dfs1(int u, int fa) { + 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]) { + dfs1(to[e], u); + } + if (u <= n) { + siz[u] = 1; + } else { + siz[u] = 0; + } + for (int e = head[u]; e > 0; e = next[e]) { + siz[u] += siz[to[e]]; + } + } + + public static int[][] ufe = new int[MAXK][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]; + } + + // dfs2是dfs1的迭代版 + public static void dfs2(int cur, int fa) { + stacksize = 0; + push(cur, fa, -1); + while (stacksize > 0) { + pop(); + if (e == -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 = next[e]; + } + if (e != 0) { + push(u, f, e); + push(to[e], u, -1); + } else { + if (u <= n) { + siz[u] = 1; + } else { + siz[u] = 0; + } + for (int ei = head[u]; ei > 0; ei = next[ei]) { + siz[u] += siz[to[ei]]; + } + } + } + } + + public static int query(int u, int limit) { + for (int p = MAXH - 1; p >= 0; p--) { + if (stjump[u][p] > 0 && nodeKey[stjump[u][p]] >= limit) { + u = stjump[u][p]; + } + } + return siz[u]; + } + + public static void main(String[] args) { + FastIO io = new FastIO(System.in, System.out); + n = io.nextInt(); + m = io.nextInt(); + q = io.nextInt(); + for (int i = 1; i <= m; i++) { + edge[i][0] = io.nextInt(); + edge[i][1] = io.nextInt(); + edge[i][2] = io.nextInt(); + edge[i][3] = i; + } + kruskalRebuild(); + for (int i = 1; i <= cntu; i++) { + if (i == father[i]) { + dfs2(i, 0); + } + } + int op, x, y, limit = 0; + for (int i = 1; i <= q; i++) { + op = io.nextInt(); + if (op == 1) { + limit = io.nextInt(); + } else if (op == 2) { + x = io.nextInt(); + io.writelnInt(query(x, limit)); + } else { + x = io.nextInt(); + y = io.nextInt(); + if (edgeToTree[x] != 0) { + nodeKey[edgeToTree[x]] = y; + } + } + } + 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/class164/Code02_YouyouTraining2.java b/src/class164/Code02_YouyouTraining2.java new file mode 100644 index 000000000..e29892252 --- /dev/null +++ b/src/class164/Code02_YouyouTraining2.java @@ -0,0 +1,130 @@ +package class164; + +// youyou的军训,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P9638 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Edge { +// int u, v, w, i; +//}; +// +//const int MAXK = 800001; +//const int MAXM = 400001; +//const int MAXH = 20; +//int n, m, q; +//Edge edge[MAXM]; +//int edgeToTree[MAXM]; +// +//int head[MAXK]; +//int nxt[MAXK]; +//int to[MAXK]; +//int cntg; +// +//int father[MAXK]; +//int nodeKey[MAXK]; +//int stackArr[MAXK]; +//int cntu; +// +//int siz[MAXK]; +//int stjump[MAXK][MAXH]; +// +//bool cmp(Edge x, Edge y) { +// return x.w > y.w; +//} +// +//int find(int i) { +// if (i != father[i]) { +// father[i] = find(father[i]); +// } +// return father[i]; +//} +// +//void addEdge(int u, int v) { +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// head[u] = cntg; +//} +// +//void kruskalRebuild() { +// for (int i = 1; i <= n; i++) { +// father[i] = i; +// } +// sort(edge + 1, edge + m + 1, cmp); +// cntu = n; +// for (int i = 1, fx, fy; i <= m; i++) { +// fx = find(edge[i].u); +// fy = find(edge[i].v); +// if (fx != fy) { +// father[fx] = father[fy] = ++cntu; +// father[cntu] = cntu; +// nodeKey[cntu] = edge[i].w; +// addEdge(cntu, fx); +// addEdge(cntu, fy); +// edgeToTree[edge[i].i] = cntu; +// } +// } +//} +// +//void dfs(int u, int fa) { +// 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]) { +// dfs(to[e], u); +// } +// if (u <= n) { +// siz[u] = 1; +// } else { +// siz[u] = 0; +// } +// for (int e = head[u]; e > 0; e = nxt[e]) { +// siz[u] += siz[to[e]]; +// } +//} +// +//int query(int u, int limit) { +// for (int p = MAXH - 1; p >= 0; p--) { +// if (stjump[u][p] > 0 && nodeKey[stjump[u][p]] >= limit) { +// u = stjump[u][p]; +// } +// } +// return siz[u]; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m >> q; +// for (int i = 1; i <= m; i++) { +// cin >> edge[i].u >> edge[i].v >> edge[i].w; +// edge[i].i = i; +// } +// kruskalRebuild(); +// for (int i = 1; i <= cntu; i++) { +// if (i == father[i]) { +// dfs(i, 0); +// } +// } +// int op, x, y, limit = 0; +// for (int i = 1; i <= q; i++) { +// cin >> op; +// if (op == 1) { +// cin >> limit; +// } else if (op == 2) { +// cin >> x; +// cout << query(x, limit) << "\n"; +// } else { +// cin >> x >> y; +// if (edgeToTree[x] != 0) { +// nodeKey[edgeToTree[x]] = y; +// } +// } +// } +// return 0; +//} \ No newline at end of file diff --git a/src/class164/Code03_ReturnJourney1.java b/src/class164/Code03_ReturnJourney1.java deleted file mode 100644 index 3892225f9..000000000 --- a/src/class164/Code03_ReturnJourney1.java +++ /dev/null @@ -1,259 +0,0 @@ -package class164; - -// 归程,java实现递归版 -// 测试链接 : https://www.luogu.com.cn/problem/P4768 -// 提交以下的code,提交时请把类名改成"Main" -// 因为树的深度太大,递归函数爆栈了,所以无法全部通过所有测试用例 -// find方法、dfs方法都需要改成迭代版,就是本节课Code03_ReturnJourney2文件 - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.Arrays; -import java.util.PriorityQueue; - -public class Code03_ReturnJourney1 { - - public static int MAXN = 200001; - public static int MAXK = 400001; - public static int MAXM = 400001; - public static int MAXH = 20; - public static int INF = 2000000001; - public static int t, n, m, q, k, s; - public static int[][] arr = new int[MAXM][4]; - - public static int[] headg = new int[MAXN]; - public static int[] nextg = new int[MAXM << 1]; - public static int[] tog = new int[MAXM << 1]; - public static int[] weightg = new int[MAXM << 1]; - public static int cntg; - - public static int[] dist = new int[MAXN]; - public static boolean[] visit = new boolean[MAXN]; - public static PriorityQueue heap = new PriorityQueue<>((a, b) -> a[1] - b[1]); - - public static int[] headk = new int[MAXK]; - public static int[] nextk = new int[MAXK]; - public static int[] tok = new int[MAXK]; - public static int cntk; - - public static int[] father = new int[MAXK]; - public static int[] nodeKey = new int[MAXK]; - public static int cntu; - - public static int[] dep = new int[MAXK]; - public static int[][] stjump = new int[MAXK][MAXH]; - public static int[] mindist = new int[MAXK]; - - public static void prepare() { - cntg = cntk = 0; - Arrays.fill(headg, 1, n + 1, 0); - Arrays.fill(headk, 1, n * 2, 0); - } - - 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 dijkstra() { - for (int i = 1; i <= m; i++) { - addEdgeG(arr[i][0], arr[i][1], arr[i][2]); - addEdgeG(arr[i][1], arr[i][0], arr[i][2]); - } - Arrays.fill(dist, 1, n + 1, INF); - Arrays.fill(visit, 1, n + 1, false); - dist[1] = 0; - heap.add(new int[] { 1, 0 }); - int[] cur; - int x, v; - while (!heap.isEmpty()) { - cur = heap.poll(); - x = cur[0]; - v = cur[1]; - if (!visit[x]) { - visit[x] = true; - for (int e = headg[x], y, w; e > 0; e = nextg[e]) { - y = tog[e]; - w = weightg[e]; - if (!visit[y] && dist[y] > v + w) { - dist[y] = v + w; - heap.add(new int[] { y, dist[y] }); - } - } - } - } - } - - public static void addEdgeK(int u, int v) { - nextk[++cntk] = headk[u]; - tok[cntk] = v; - headk[u] = cntk; - } - - public static int find(int i) { - if (i != father[i]) { - father[i] = find(father[i]); - } - return father[i]; - } - - public static void kruskalRebuild() { - for (int i = 1; i <= n; i++) { - father[i] = i; - } - Arrays.sort(arr, 1, m + 1, (a, b) -> b[3] - a[3]); - cntu = n; - for (int i = 1, fx, fy; i <= m; i++) { - fx = find(arr[i][0]); - fy = find(arr[i][1]); - if (fx != fy) { - father[fx] = father[fy] = ++cntu; - father[cntu] = cntu; - nodeKey[cntu] = arr[i][3]; - addEdgeK(cntu, fx); - addEdgeK(cntu, fy); - } - } - } - - public static 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 = headk[u]; e > 0; e = nextk[e]) { - dfs(tok[e], u); - } - if (u <= n) { - mindist[u] = dist[u]; - } else { - mindist[u] = INF; - } - for (int e = headk[u]; e > 0; e = nextk[e]) { - mindist[u] = Math.min(mindist[u], mindist[tok[e]]); - } - } - - public static int query(int node, int line) { - for (int p = MAXH - 1; p >= 0; p--) { - if (stjump[node][p] > 0 && nodeKey[stjump[node][p]] > line) { - node = stjump[node][p]; - } - } - return mindist[node]; - } - - public static void main(String[] args) { - FastIO io = new FastIO(System.in, System.out); - t = io.nextInt(); - for (int test = 1; test <= t; test++) { - n = io.nextInt(); - m = io.nextInt(); - prepare(); - for (int i = 1; i <= m; i++) { - arr[i][0] = io.nextInt(); - arr[i][1] = io.nextInt(); - arr[i][2] = io.nextInt(); - arr[i][3] = io.nextInt(); - } - dijkstra(); - kruskalRebuild(); - dfs(cntu, 0); - q = io.nextInt(); - k = io.nextInt(); - s = io.nextInt(); - for (int i = 1, node, line, lastAns = 0; i <= q; i++) { - node = (io.nextInt() + k * lastAns - 1) % n + 1; - line = (io.nextInt() + k * lastAns) % (s + 1); - lastAns = query(node, line); - io.writelnInt(lastAns); - } - } - 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/class164/Code02_StampRally1.java b/src/class164/Code04_StampRally1.java similarity index 99% rename from src/class164/Code02_StampRally1.java rename to src/class164/Code04_StampRally1.java index b5c3a8da5..9ab183ab0 100644 --- a/src/class164/Code02_StampRally1.java +++ b/src/class164/Code04_StampRally1.java @@ -10,7 +10,7 @@ import java.io.OutputStream; import java.util.Arrays; -public class Code02_StampRally1 { +public class Code04_StampRally1 { public static int MAXK = 200001; public static int MAXM = 100001; diff --git a/src/class164/Code02_StampRally2.java b/src/class164/Code04_StampRally2.java similarity index 100% rename from src/class164/Code02_StampRally2.java rename to src/class164/Code04_StampRally2.java diff --git a/src/class164/Code03_ReturnJourney2.java b/src/class164/Code05_Journey1.java similarity index 79% rename from src/class164/Code03_ReturnJourney2.java rename to src/class164/Code05_Journey1.java index b28aade10..1eb4c7111 100644 --- a/src/class164/Code03_ReturnJourney2.java +++ b/src/class164/Code05_Journey1.java @@ -1,6 +1,6 @@ package class164; -// 归程,java实现迭代版 +// 归程,java版 // 测试链接 : https://www.luogu.com.cn/problem/P4768 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -10,7 +10,7 @@ import java.util.Arrays; import java.util.PriorityQueue; -public class Code03_ReturnJourney2 { +public class Code05_Journey1 { public static int MAXN = 200001; public static int MAXK = 400001; @@ -92,6 +92,7 @@ public static void addEdgeK(int u, int v) { headk[u] = cntk; } + // 并查集的find方法,需要改成迭代版不然会爆栈,C++实现不需要 public static int find(int i) { int size = 0; while (i != father[i]) { @@ -123,50 +124,71 @@ public static void kruskalRebuild() { } } - public static int[][] fse = new int[MAXK][3]; + // dfs1是递归函数,需要改成迭代版不然会爆栈,C++实现不需要 + 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 = headk[u]; e > 0; e = nextk[e]) { + dfs1(tok[e], u); + } + if (u <= n) { + mindist[u] = dist[u]; + } else { + mindist[u] = INF; + } + for (int e = headk[u]; e > 0; e = nextk[e]) { + mindist[u] = Math.min(mindist[u], mindist[tok[e]]); + } + } + + public static int[][] ufe = new int[MAXK][3]; - public static int stacksize, first, second, edge; + public static int stacksize, u, f, e; - public static void push(int fir, int sec, int edg) { - fse[stacksize][0] = fir; - fse[stacksize][1] = sec; - fse[stacksize][2] = edg; + 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]; + u = ufe[stacksize][0]; + f = ufe[stacksize][1]; + e = ufe[stacksize][2]; } - public static void dfs(int u, int fa) { + // dfs2是dfs1的迭代版 + public static void dfs2(int cur, int fa) { stacksize = 0; - push(u, fa, -1); + push(cur, fa, -1); while (stacksize > 0) { pop(); - if (edge == -1) { - dep[first] = dep[second] + 1; - stjump[first][0] = second; + if (e == -1) { + dep[u] = dep[f] + 1; + stjump[u][0] = f; for (int p = 1; p < MAXH; p++) { - stjump[first][p] = stjump[stjump[first][p - 1]][p - 1]; + stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; } - edge = headk[first]; + e = headk[u]; } else { - edge = nextk[edge]; + e = nextk[e]; } - if (edge != 0) { - push(first, second, edge); - push(tok[edge], first, -1); + if (e != 0) { + push(u, f, e); + push(tok[e], u, -1); } else { - if (first <= n) { - mindist[first] = dist[first]; + if (u <= n) { + mindist[u] = dist[u]; } else { - mindist[first] = INF; + mindist[u] = INF; } - for (int e = headk[first]; e > 0; e = nextk[e]) { - mindist[first] = Math.min(mindist[first], mindist[tok[e]]); + for (int ei = headk[u]; ei > 0; ei = nextk[ei]) { + mindist[u] = Math.min(mindist[u], mindist[tok[ei]]); } } } @@ -196,7 +218,7 @@ public static void main(String[] args) { } dijkstra(); kruskalRebuild(); - dfs(cntu, 0); + dfs2(cntu, 0); q = io.nextInt(); k = io.nextInt(); s = io.nextInt(); diff --git a/src/class164/Code03_ReturnJourney3.java b/src/class164/Code05_Journey2.java similarity index 100% rename from src/class164/Code03_ReturnJourney3.java rename to src/class164/Code05_Journey2.java diff --git a/src/class164/Code04_Peaks1.java b/src/class164/Code06_Peaks1.java similarity index 98% rename from src/class164/Code04_Peaks1.java rename to src/class164/Code06_Peaks1.java index d9482858c..65fdee548 100644 --- a/src/class164/Code04_Peaks1.java +++ b/src/class164/Code06_Peaks1.java @@ -5,7 +5,7 @@ // 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但是通过不了 // 因为这道题根据C++的运行空间,制定通过标准,根本没考虑java的用户 -// 想通过用C++实现,本节课Code04_Peaks2文件就是C++的实现 +// 想通过用C++实现,本节课Code06_Peaks2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 import java.io.IOException; @@ -13,7 +13,7 @@ import java.io.OutputStream; import java.util.Arrays; -public class Code04_Peaks1 { +public class Code06_Peaks1 { public static int MAXN = 100001; public static int MAXK = 200001; diff --git a/src/class164/Code04_Peaks2.java b/src/class164/Code06_Peaks2.java similarity index 100% rename from src/class164/Code04_Peaks2.java rename to src/class164/Code06_Peaks2.java From 351d346145bb9e2e0254070e914cd27fefc49b8b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 28 Mar 2025 23:16:31 +0800 Subject: [PATCH 0877/2029] modify code --- .../{Code02_YouyouTraining1.java => Code02_Training1.java} | 2 +- .../{Code02_YouyouTraining2.java => Code02_Training2.java} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/class164/{Code02_YouyouTraining1.java => Code02_Training1.java} (99%) rename src/class164/{Code02_YouyouTraining2.java => Code02_Training2.java} (100%) diff --git a/src/class164/Code02_YouyouTraining1.java b/src/class164/Code02_Training1.java similarity index 99% rename from src/class164/Code02_YouyouTraining1.java rename to src/class164/Code02_Training1.java index ad4e5bb6a..6b75d97a9 100644 --- a/src/class164/Code02_YouyouTraining1.java +++ b/src/class164/Code02_Training1.java @@ -9,7 +9,7 @@ import java.io.OutputStream; import java.util.Arrays; -public class Code02_YouyouTraining1 { +public class Code02_Training1 { public static int MAXK = 800001; public static int MAXM = 400001; diff --git a/src/class164/Code02_YouyouTraining2.java b/src/class164/Code02_Training2.java similarity index 100% rename from src/class164/Code02_YouyouTraining2.java rename to src/class164/Code02_Training2.java From 67f35e54161ffe4456eada9df41c5ec1f3879966 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 29 Mar 2025 00:49:14 +0800 Subject: [PATCH 0878/2029] modify code --- src/class164/Code03_UntilConnect1.java | 257 +++++++++++++++++++++++++ src/class164/Code03_UntilConnect2.java | 179 +++++++++++++++++ src/class164/Code05_Journey1.java | 4 +- src/class164/Code05_Journey2.java | 4 +- 4 files changed, 440 insertions(+), 4 deletions(-) create mode 100644 src/class164/Code03_UntilConnect1.java create mode 100644 src/class164/Code03_UntilConnect2.java diff --git a/src/class164/Code03_UntilConnect1.java b/src/class164/Code03_UntilConnect1.java new file mode 100644 index 000000000..64075d1a5 --- /dev/null +++ b/src/class164/Code03_UntilConnect1.java @@ -0,0 +1,257 @@ +package class164; + +// 加边直到连通,java版 +// 测试链接 : https://www.luogu.com.cn/problem/CF1706E +// 测试链接 : https://codeforces.com/problemset/problem/1706/E +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Arrays; + +public class Code03_UntilConnect1 { + + public static int MAXN = 100001; + public static int MAXK = 200001; + public static int MAXM = 200001; + public static int MAXH = 20; + public static int t, n, m, q; + public static int[][] edge = new int[MAXM][3]; + + public static int[] head = new int[MAXK]; + public static int[] next = new int[MAXK]; + public static int[] to = new int[MAXK]; + public static int cntg; + + public static int[] father = new int[MAXK]; + public static int[] nodeKey = new int[MAXK]; + public static int cntu; + + public static int[] dep = new int[MAXK]; + public static int[] dfn = new int[MAXK]; + public static int[] seg = new int[MAXK]; + public static int[][] stjump = new int[MAXK][MAXH]; + public static int cntd; + + public static int[] lg2 = new int[MAXN]; + public static int[][] stmax = new int[MAXN][MAXH]; + public static int[][] stmin = new int[MAXN][MAXH]; + + public static void clear() { + cntg = cntd = 0; + Arrays.fill(head, 1, n * 2, 0); + } + + public static int find(int i) { + if (i != father[i]) { + father[i] = find(father[i]); + } + return father[i]; + } + + public static void addEdge(int u, int v) { + next[++cntg] = head[u]; + to[cntg] = v; + head[u] = cntg; + } + + public static void kruskalRebuild() { + for (int i = 1; i <= n; i++) { + father[i] = i; + } + Arrays.sort(edge, 1, m + 1, (a, b) -> a[2] - b[2]); + cntu = n; + for (int i = 1, fx, fy; i <= m; i++) { + fx = find(edge[i][0]); + fy = find(edge[i][1]); + if (fx != fy) { + father[fx] = father[fy] = ++cntu; + father[cntu] = cntu; + nodeKey[cntu] = edge[i][2]; + addEdge(cntu, fx); + addEdge(cntu, fy); + } + } + } + + public static void dfs(int u, int fa) { + dep[u] = dep[fa] + 1; + dfn[u] = ++cntd; + seg[cntd] = u; + 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]) { + dfs(to[e], u); + } + } + + public static void buildst() { + lg2[0] = -1; + for (int i = 1; i <= n; i++) { + lg2[i] = lg2[i >> 1] + 1; + stmax[i][0] = dfn[i]; + stmin[i][0] = dfn[i]; + } + for (int p = 1; p <= lg2[n]; p++) { + for (int i = 1; i + (1 << p) - 1 <= n; i++) { + stmax[i][p] = Math.max(stmax[i][p - 1], stmax[i + (1 << (p - 1))][p - 1]); + stmin[i][p] = Math.min(stmin[i][p - 1], stmin[i + (1 << (p - 1))][p - 1]); + } + } + } + + public static int dfnmin(int l, int r) { + int p = lg2[r - l + 1]; + int ans = Math.min(stmin[l][p], stmin[r - (1 << p) + 1][p]); + return ans; + } + + public static int dfnmax(int l, int r) { + int p = lg2[r - l + 1]; + int ans = Math.max(stmax[l][p], stmax[r - (1 << p) + 1][p]); + return ans; + } + + 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 query(int l, int r) { + int x = seg[dfnmin(l, r)]; + int y = seg[dfnmax(l, r)]; + return nodeKey[lca(x, y)]; + } + + public static void main(String[] args) { + FastIO io = new FastIO(System.in, System.out); + t = io.nextInt(); + for (int test = 1; test <= t; test++) { + n = io.nextInt(); + m = io.nextInt(); + q = io.nextInt(); + for (int i = 1; i <= m; i++) { + edge[i][0] = io.nextInt(); + edge[i][1] = io.nextInt(); + edge[i][2] = i; + } + clear(); + kruskalRebuild(); + dfs(cntu, 0); + buildst(); + for (int i = 1, l, r; i <= q; i++) { + l = io.nextInt(); + r = io.nextInt(); + if (l == r) { + io.write("0 "); + } else { + io.write(query(l, r) + " "); + } + } + io.write("\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/class164/Code03_UntilConnect2.java b/src/class164/Code03_UntilConnect2.java new file mode 100644 index 000000000..c93463933 --- /dev/null +++ b/src/class164/Code03_UntilConnect2.java @@ -0,0 +1,179 @@ +package class164; + +// 加边直到连通,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/CF1706E +// 测试链接 : https://codeforces.com/problemset/problem/1706/E +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Edge { +// int u, v, w; +//}; +// +//const int MAXN = 100001; +//const int MAXK = 200001; +//const int MAXM = 200001; +//const int MAXH = 20; +//int t, n, m, q; +// +//Edge edge[MAXM]; +//int head[MAXK]; +//int nxt[MAXK]; +//int to[MAXK]; +//int cntg; +// +//int father[MAXK]; +//int nodeKey[MAXK]; +//int cntu; +// +//int dep[MAXK]; +//int dfn[MAXK]; +//int seg[MAXK]; +//int stjump[MAXK][MAXH]; +//int cntd; +// +//int lg2[MAXN]; +//int stmax[MAXN][MAXH]; +//int stmin[MAXN][MAXH]; +// +//bool cmp(Edge x, Edge y) { +// return x.w < y.w; +//} +// +//void clear() { +// cntg = 0; +// cntd = 0; +// for (int i = 1; i <= n * 2; i++) { +// head[i] = 0; +// } +//} +// +//int find(int i) { +// if (i != father[i]) father[i] = find(father[i]); +// return father[i]; +//} +// +//void addEdge(int u, int v) { +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// head[u] = cntg; +//} +// +//void kruskalRebuild() { +// for (int i = 1; i <= n; i++) { +// father[i] = i; +// } +// sort(edge + 1, edge + m + 1, cmp); +// cntu = n; +// for (int i = 1, fx, fy; i <= m; i++) { +// fx = find(edge[i].u); +// fy = find(edge[i].v); +// if (fx != fy) { +// father[fx] = father[fy] = ++cntu; +// father[cntu] = cntu; +// nodeKey[cntu] = edge[i].w; +// addEdge(cntu, fx); +// addEdge(cntu, fy); +// } +// } +//} +// +//void dfs(int u, int fa) { +// dep[u] = dep[fa] + 1; +// dfn[u] = ++cntd; +// seg[cntd] = u; +// 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]) { +// dfs(to[e], u); +// } +//} +// +//void buildst() { +// lg2[0] = -1; +// for (int i = 1; i <= n; i++) { +// lg2[i] = lg2[i >> 1] + 1; +// stmax[i][0] = dfn[i]; +// stmin[i][0] = dfn[i]; +// } +// for (int p = 1; p <= lg2[n]; p++) { +// for (int i = 1; i + (1 << p) - 1 <= n; i++) { +// stmax[i][p] = max(stmax[i][p - 1], stmax[i + (1 << (p - 1))][p - 1]); +// stmin[i][p] = min(stmin[i][p - 1], stmin[i + (1 << (p - 1))][p - 1]); +// } +// } +//} +// +//int dfnmin(int l, int r) { +// int p = lg2[r - l + 1]; +// int ans = min(stmin[l][p], stmin[r - (1 << p) + 1][p]); +// return ans; +//} +// +//int dfnmax(int l, int r) { +// int p = lg2[r - l + 1]; +// int ans = max(stmax[l][p], stmax[r - (1 << p) + 1][p]); +// return ans; +//} +// +//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 query(int l, int r) { +// int x = seg[dfnmin(l, r)]; +// int y = seg[dfnmax(l, r)]; +// return nodeKey[lca(x, y)]; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> t; +// for (int test = 1; test <= t; test++) { +// cin >> n >> m >> q; +// for (int i = 1; i <= m; i++) { +// cin >> edge[i].u >> edge[i].v; +// edge[i].w = i; +// } +// clear(); +// kruskalRebuild(); +// dfs(cntu, 0); +// buildst(); +// for (int i = 1, l, r; i <= q; i++) { +// cin >> l >> r; +// if (l == r) { +// cout << 0 << " "; +// } else { +// cout << query(l, r) << " "; +// } +// } +// cout << "\n"; +// } +// return 0; +//} \ No newline at end of file diff --git a/src/class164/Code05_Journey1.java b/src/class164/Code05_Journey1.java index 1eb4c7111..0d2ffa714 100644 --- a/src/class164/Code05_Journey1.java +++ b/src/class164/Code05_Journey1.java @@ -44,7 +44,7 @@ public class Code05_Journey1 { public static int[][] stjump = new int[MAXK][MAXH]; public static int[] mindist = new int[MAXK]; - public static void prepare() { + public static void clear() { cntg = cntk = 0; Arrays.fill(headg, 1, n + 1, 0); Arrays.fill(headk, 1, n * 2, 0); @@ -209,7 +209,7 @@ public static void main(String[] args) { for (int test = 1; test <= t; test++) { n = io.nextInt(); m = io.nextInt(); - prepare(); + clear(); for (int i = 1; i <= m; i++) { arr[i][0] = io.nextInt(); arr[i][1] = io.nextInt(); diff --git a/src/class164/Code05_Journey2.java b/src/class164/Code05_Journey2.java index 6ec74f727..5d31f304c 100644 --- a/src/class164/Code05_Journey2.java +++ b/src/class164/Code05_Journey2.java @@ -58,7 +58,7 @@ //int stjump[MAXK][MAXH]; //int mindist[MAXK]; // -//void prepare() { +//void clear() { // cntg = 0; // cntk = 0; // for(int i = 1; i <= n; i++) { @@ -176,7 +176,7 @@ // cin >> t; // for(int test = 1; test <= t; test++) { // cin >> n >> m; -// prepare(); +// clear(); // for(int i = 1; i <= m; i++) { // cin >> arr[i].u >> arr[i].v >> arr[i].l >> arr[i].a; // } From b52d6f32c7e607f736f75da2fdfa2d795ea29ed5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 29 Mar 2025 16:06:26 +0800 Subject: [PATCH 0879/2029] modify code --- .../{Code04_StampRally1.java => Code03_StampRally1.java} | 2 +- .../{Code04_StampRally2.java => Code03_StampRally2.java} | 0 .../{Code05_Journey1.java => Code04_Journey1.java} | 2 +- .../{Code05_Journey2.java => Code04_Journey2.java} | 0 src/class164/{Code06_Peaks1.java => Code05_Peaks1.java} | 4 ++-- src/class164/{Code06_Peaks2.java => Code05_Peaks2.java} | 0 ...de03_UntilConnect1.java => Code06_UntilConnect1.java} | 2 +- ...de03_UntilConnect2.java => Code06_UntilConnect2.java} | 0 src/class164/Code07_DeleteAndQueries1.java | 9 +++++++++ 9 files changed, 14 insertions(+), 5 deletions(-) rename src/class164/{Code04_StampRally1.java => Code03_StampRally1.java} (99%) rename src/class164/{Code04_StampRally2.java => Code03_StampRally2.java} (100%) rename src/class164/{Code05_Journey1.java => Code04_Journey1.java} (99%) rename src/class164/{Code05_Journey2.java => Code04_Journey2.java} (100%) rename src/class164/{Code06_Peaks1.java => Code05_Peaks1.java} (98%) rename src/class164/{Code06_Peaks2.java => Code05_Peaks2.java} (100%) rename src/class164/{Code03_UntilConnect1.java => Code06_UntilConnect1.java} (99%) rename src/class164/{Code03_UntilConnect2.java => Code06_UntilConnect2.java} (100%) create mode 100644 src/class164/Code07_DeleteAndQueries1.java diff --git a/src/class164/Code04_StampRally1.java b/src/class164/Code03_StampRally1.java similarity index 99% rename from src/class164/Code04_StampRally1.java rename to src/class164/Code03_StampRally1.java index 9ab183ab0..69f384a43 100644 --- a/src/class164/Code04_StampRally1.java +++ b/src/class164/Code03_StampRally1.java @@ -10,7 +10,7 @@ import java.io.OutputStream; import java.util.Arrays; -public class Code04_StampRally1 { +public class Code03_StampRally1 { public static int MAXK = 200001; public static int MAXM = 100001; diff --git a/src/class164/Code04_StampRally2.java b/src/class164/Code03_StampRally2.java similarity index 100% rename from src/class164/Code04_StampRally2.java rename to src/class164/Code03_StampRally2.java diff --git a/src/class164/Code05_Journey1.java b/src/class164/Code04_Journey1.java similarity index 99% rename from src/class164/Code05_Journey1.java rename to src/class164/Code04_Journey1.java index 0d2ffa714..a1e4601fb 100644 --- a/src/class164/Code05_Journey1.java +++ b/src/class164/Code04_Journey1.java @@ -10,7 +10,7 @@ import java.util.Arrays; import java.util.PriorityQueue; -public class Code05_Journey1 { +public class Code04_Journey1 { public static int MAXN = 200001; public static int MAXK = 400001; diff --git a/src/class164/Code05_Journey2.java b/src/class164/Code04_Journey2.java similarity index 100% rename from src/class164/Code05_Journey2.java rename to src/class164/Code04_Journey2.java diff --git a/src/class164/Code06_Peaks1.java b/src/class164/Code05_Peaks1.java similarity index 98% rename from src/class164/Code06_Peaks1.java rename to src/class164/Code05_Peaks1.java index 65fdee548..8576fa053 100644 --- a/src/class164/Code06_Peaks1.java +++ b/src/class164/Code05_Peaks1.java @@ -5,7 +5,7 @@ // 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但是通过不了 // 因为这道题根据C++的运行空间,制定通过标准,根本没考虑java的用户 -// 想通过用C++实现,本节课Code06_Peaks2文件就是C++的实现 +// 想通过用C++实现,本节课Code05_Peaks2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 import java.io.IOException; @@ -13,7 +13,7 @@ import java.io.OutputStream; import java.util.Arrays; -public class Code06_Peaks1 { +public class Code05_Peaks1 { public static int MAXN = 100001; public static int MAXK = 200001; diff --git a/src/class164/Code06_Peaks2.java b/src/class164/Code05_Peaks2.java similarity index 100% rename from src/class164/Code06_Peaks2.java rename to src/class164/Code05_Peaks2.java diff --git a/src/class164/Code03_UntilConnect1.java b/src/class164/Code06_UntilConnect1.java similarity index 99% rename from src/class164/Code03_UntilConnect1.java rename to src/class164/Code06_UntilConnect1.java index 64075d1a5..6b8f82491 100644 --- a/src/class164/Code03_UntilConnect1.java +++ b/src/class164/Code06_UntilConnect1.java @@ -10,7 +10,7 @@ import java.io.OutputStream; import java.util.Arrays; -public class Code03_UntilConnect1 { +public class Code06_UntilConnect1 { public static int MAXN = 100001; public static int MAXK = 200001; diff --git a/src/class164/Code03_UntilConnect2.java b/src/class164/Code06_UntilConnect2.java similarity index 100% rename from src/class164/Code03_UntilConnect2.java rename to src/class164/Code06_UntilConnect2.java diff --git a/src/class164/Code07_DeleteAndQueries1.java b/src/class164/Code07_DeleteAndQueries1.java new file mode 100644 index 000000000..5c28f855a --- /dev/null +++ b/src/class164/Code07_DeleteAndQueries1.java @@ -0,0 +1,9 @@ +package class164; + +// 删边和查询,java版 +// 测试链接 : https://www.luogu.com.cn/problem/CF1416D +// 测试链接 : https://codeforces.com/problemset/problem/1416/D + +public class Code07_DeleteAndQueries1 { + +} From da896a1ee37ca5800f944a2ae89466c9a1b5bbab Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 29 Mar 2025 18:44:47 +0800 Subject: [PATCH 0880/2029] modify code --- src/class164/Code06_UntilConnect2.java | 4 +- src/class164/Code07_DeleteAndQueries1.java | 300 +++++++++++++++++++++ src/class164/Code07_DeleteAndQueries2.java | 230 ++++++++++++++++ 3 files changed, 533 insertions(+), 1 deletion(-) create mode 100644 src/class164/Code07_DeleteAndQueries2.java diff --git a/src/class164/Code06_UntilConnect2.java b/src/class164/Code06_UntilConnect2.java index c93463933..35e1d7f5b 100644 --- a/src/class164/Code06_UntilConnect2.java +++ b/src/class164/Code06_UntilConnect2.java @@ -53,7 +53,9 @@ //} // //int find(int i) { -// if (i != father[i]) father[i] = find(father[i]); +// if (i != father[i]) { +// father[i] = find(father[i]); +// } // return father[i]; //} // diff --git a/src/class164/Code07_DeleteAndQueries1.java b/src/class164/Code07_DeleteAndQueries1.java index 5c28f855a..410856d4a 100644 --- a/src/class164/Code07_DeleteAndQueries1.java +++ b/src/class164/Code07_DeleteAndQueries1.java @@ -3,7 +3,307 @@ // 删边和查询,java版 // 测试链接 : https://www.luogu.com.cn/problem/CF1416D // 测试链接 : https://codeforces.com/problemset/problem/1416/D +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Arrays; public class Code07_DeleteAndQueries1 { + public static int MAXN = 200001; + public static int MAXK = 400001; + public static int MAXM = 300001; + public static int MAXQ = 500001; + public static int MAXH = 20; + public static int INF = 1000000001; + public static int n, m, q; + + public static int[] node = new int[MAXN]; + public static int[][] edge = new int[MAXM][3]; + public static int[][] ques = new int[MAXQ][2]; + public static int[] timeline = new int[MAXQ]; + + public static int[] head = new int[MAXK]; + public static int[] next = new int[MAXK]; + public static int[] to = new int[MAXK]; + public static int cntg = 0; + + public static int[] father = new int[MAXK]; + public static int[] nodeKey = new int[MAXK]; + public static int cntu; + + public static int[][] stjump = new int[MAXK][MAXH]; + public static int[] leafsiz = new int[MAXK]; + public static int[] leafstart = new int[MAXK]; + public static int[] leafseg = new int[MAXK]; + public static int cntd = 0; + + public static int[] maxval = new int[MAXN << 2]; + public static int[] maxdfn = new int[MAXN << 2]; + + public static int ansMax; + public static int updateDfn; + + public static void prepare() { + for (int i = 1; i <= q; i++) { + if (ques[i][0] == 2) { + edge[ques[i][1]][2] = -1; + } + } + int time = 0; + for (int i = 1; i <= m; i++) { + if (edge[i][2] != -1) { + edge[i][2] = ++time; + } + } + for (int i = q; i >= 1; i--) { + if (ques[i][0] == 1) { + timeline[i] = time; + } else { + edge[ques[i][1]][2] = ++time; + } + } + } + + public static int find(int i) { + if (i != father[i]) { + father[i] = find(father[i]); + } + return father[i]; + } + + public static void addEdge(int u, int v) { + next[++cntg] = head[u]; + to[cntg] = v; + head[u] = cntg; + } + + public static void kruskalRebuild() { + for (int i = 1; i <= n; i++) { + father[i] = i; + } + Arrays.sort(edge, 1, m + 1, (a, b) -> a[2] - b[2]); + cntu = n; + for (int i = 1, fx, fy; i <= m; i++) { + fx = find(edge[i][0]); + fy = find(edge[i][1]); + if (fx != fy) { + father[fx] = father[fy] = ++cntu; + father[cntu] = cntu; + nodeKey[cntu] = edge[i][2]; + addEdge(cntu, fx); + addEdge(cntu, fy); + } + } + } + + public static void dfs(int u, int fa) { + 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]) { + dfs(to[e], u); + } + if (u <= n) { + leafsiz[u] = 1; + leafstart[u] = ++cntd; + leafseg[cntd] = u; + } else { + leafsiz[u] = 0; + leafstart[u] = INF; + } + for (int e = head[u]; e > 0; e = next[e]) { + leafsiz[u] += leafsiz[to[e]]; + leafstart[u] = Math.min(leafstart[u], leafstart[to[e]]); + } + } + + public static int getAncestor(int u, int limit) { + for (int p = MAXH - 1; p >= 0; p--) { + if (stjump[u][p] > 0 && nodeKey[stjump[u][p]] <= limit) { + u = stjump[u][p]; + } + } + return u; + } + + public static void up(int i) { + int l = i << 1; + int r = i << 1 | 1; + if (maxval[l] > maxval[r]) { + maxval[i] = maxval[l]; + maxdfn[i] = maxdfn[l]; + } else { + maxval[i] = maxval[r]; + maxdfn[i] = maxdfn[r]; + } + } + + public static void build(int l, int r, int i) { + if (l == r) { + maxval[i] = node[leafseg[l]]; + maxdfn[i] = l; + } else { + int mid = (l + r) / 2; + build(l, mid, i << 1); + build(mid + 1, r, i << 1 | 1); + up(i); + } + } + + public static void update(int jobi, int jobv, int l, int r, int i) { + if (l == r) { + maxval[i] = jobv; + } else { + int mid = (l + r) / 2; + if (jobi <= mid) { + update(jobi, jobv, l, mid, i << 1); + } else { + update(jobi, jobv, mid + 1, r, i << 1 | 1); + } + up(i); + } + } + + public static void updateAns(int curmax, int curdfn) { + if (ansMax < curmax) { + ansMax = curmax; + updateDfn = curdfn; + } + } + + public static void queryMax(int jobl, int jobr, int l, int r, int i) { + if (jobl <= l && r <= jobr) { + updateAns(maxval[i], maxdfn[i]); + } else { + int mid = (l + r) / 2; + if (jobl <= mid) { + queryMax(jobl, jobr, l, mid, i << 1); + } + if (jobr > mid) { + queryMax(jobl, jobr, mid + 1, r, i << 1 | 1); + } + } + } + + public static void main(String[] args) { + FastIO io = new FastIO(System.in, System.out); + n = io.nextInt(); + m = io.nextInt(); + q = io.nextInt(); + for (int i = 1; i <= n; i++) { + node[i] = io.nextInt(); + } + for (int i = 1; i <= m; i++) { + edge[i][0] = io.nextInt(); + edge[i][1] = io.nextInt(); + edge[i][2] = 0; + } + for (int i = 1; i <= q; i++) { + ques[i][0] = io.nextInt(); + ques[i][1] = io.nextInt(); + } + prepare(); + kruskalRebuild(); + for (int i = 1; i <= cntu; i++) { + if (i == father[i]) { + dfs(i, 0); + } + } + build(1, n, 1); + for (int i = 1, anc; i <= q; i++) { + if (ques[i][0] == 1) { + ansMax = -INF; + anc = getAncestor(ques[i][1], timeline[i]); + queryMax(leafstart[anc], leafstart[anc] + leafsiz[anc] - 1, 1, n, 1); + update(updateDfn, 0, 1, n, 1); + io.writelnInt(ansMax); + } + } + 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/class164/Code07_DeleteAndQueries2.java b/src/class164/Code07_DeleteAndQueries2.java new file mode 100644 index 000000000..01b6d5812 --- /dev/null +++ b/src/class164/Code07_DeleteAndQueries2.java @@ -0,0 +1,230 @@ +package class164; + +// 删边和查询,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/CF1416D +// 测试链接 : https://codeforces.com/problemset/problem/1416/D +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Edge { +// int u, v, w; +//}; +// +//const int MAXN = 200001; +//const int MAXK = 400001; +//const int MAXM = 300001; +//const int MAXQ = 500001; +//const int MAXH = 20; +//int INF = 1000000001; +//int n, m, q; +// +//int node[MAXN]; +//Edge edge[MAXM]; +//int ques[MAXQ][2]; +//int timeline[MAXQ]; +// +//int head[MAXK]; +//int nxt[MAXK]; +//int to[MAXK]; +//int cntg; +// +//int father[MAXK]; +//int nodeKey[MAXK]; +//int cntu; +// +//int stjump[MAXK][MAXH]; +//int leafsiz[MAXK]; +//int leafstart[MAXK]; +//int leafseg[MAXK]; +//int cntd; +// +//int maxval[MAXN << 2]; +//int maxdfn[MAXN << 2]; +// +//int ansMax; +//int updateDfn; +// +//bool cmp(Edge x, Edge y) { +// return x.w < y.w; +//} +// +//void prepare() { +// for (int i = 1; i <= q; i++) { +// if (ques[i][0] == 2) { +// edge[ques[i][1]].w = -1; +// } +// } +// int time = 0; +// for (int i = 1; i <= m; i++) { +// if (edge[i].w != -1) { +// edge[i].w = ++time; +// } +// } +// for (int i = q; i >= 1; i--) { +// if (ques[i][0] == 1) { +// timeline[i] = time; +// } else { +// edge[ques[i][1]].w = ++time; +// } +// } +//} +// +//int find(int i) { +// if (i != father[i]) { +// father[i] = find(father[i]); +// } +// return father[i]; +//} +// +//void addEdge(int u, int v) { +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// head[u] = cntg; +//} +// +//void kruskalRebuild() { +// for (int i = 1; i <= n; i++) { +// father[i] = i; +// } +// sort(edge + 1, edge + m + 1, cmp); +// cntu = n; +// for (int i = 1; i <= m; i++) { +// int fx = find(edge[i].u); +// int fy = find(edge[i].v); +// if (fx != fy) { +// father[fx] = father[fy] = ++cntu; +// father[cntu] = cntu; +// nodeKey[cntu] = edge[i].w; +// addEdge(cntu, fx); +// addEdge(cntu, fy); +// } +// } +//} +// +//void dfs(int u, int fa) { +// 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]) { +// dfs(to[e], u); +// } +// if (u <= n) { +// leafsiz[u] = 1; +// leafstart[u] = ++cntd; +// leafseg[cntd] = u; +// } else { +// leafsiz[u] = 0; +// leafstart[u] = INF; +// } +// for (int e = head[u]; e > 0; e = nxt[e]) { +// leafsiz[u] += leafsiz[to[e]]; +// leafstart[u] = min(leafstart[u], leafstart[to[e]]); +// } +//} +// +//int getAncestor(int u, int limit) { +// for (int p = MAXH - 1; p >= 0; p--) { +// if (stjump[u][p] > 0 && nodeKey[stjump[u][p]] <= limit) { +// u = stjump[u][p]; +// } +// } +// return u; +//} +// +//void up(int i) { +// int l = i << 1; +// int r = i << 1 | 1; +// if (maxval[l] > maxval[r]) { +// maxval[i] = maxval[l]; +// maxdfn[i] = maxdfn[l]; +// } else { +// maxval[i] = maxval[r]; +// maxdfn[i] = maxdfn[r]; +// } +//} +// +//void build(int l, int r, int i) { +// if (l == r) { +// maxval[i] = node[leafseg[l]]; +// maxdfn[i] = l; +// } else { +// int mid = (l + r) / 2; +// build(l, mid, i << 1); +// build(mid + 1, r, i << 1 | 1); +// up(i); +// } +//} +// +//void update(int jobi, int jobv, int l, int r, int i) { +// if (l == r) { +// maxval[i] = jobv; +// } else { +// int mid = (l + r) / 2; +// if (jobi <= mid) { +// update(jobi, jobv, l, mid, i << 1); +// } else { +// update(jobi, jobv, mid + 1, r, i << 1 | 1); +// } +// up(i); +// } +//} +// +//void updateAns(int curmax, int curdfn) { +// if (ansMax < curmax) { +// ansMax = curmax; +// updateDfn = curdfn; +// } +//} +// +//void queryMax(int jobl, int jobr, int l, int r, int i) { +// if (jobl <= l && r <= jobr) { +// updateAns(maxval[i], maxdfn[i]); +// } else { +// int mid = (l + r) / 2; +// if (jobl <= mid) { +// queryMax(jobl, jobr, l, mid, i << 1); +// } +// if (jobr > mid) { +// queryMax(jobl, jobr, mid + 1, r, i << 1 | 1); +// } +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m >> q; +// for (int i = 1; i <= n; i++) { +// cin >> node[i]; +// } +// for (int i = 1; i <= m; i++) { +// cin >> edge[i].u >> edge[i].v; +// edge[i].w = 0; +// } +// for (int i = 1; i <= q; i++) { +// cin >> ques[i][0] >> ques[i][1]; +// } +// prepare(); +// kruskalRebuild(); +// for (int i = 1; i <= cntu; i++) { +// if (i == father[i]) { +// dfs(i, 0); +// } +// } +// build(1, n, 1); +// for (int i = 1, anc; i <= q; i++) { +// if (ques[i][0] == 1) { +// ansMax = -INF; +// anc = getAncestor(ques[i][1], timeline[i]); +// queryMax(leafstart[anc], leafstart[anc] + leafsiz[anc] - 1, 1, n, 1); +// update(updateDfn, 0, 1, n, 1); +// cout << ansMax << "\n"; +// } +// } +// return 0; +//} \ No newline at end of file From 344fb3de4f916e2297ae0b3b0774cf50911197fe Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 29 Mar 2025 18:45:54 +0800 Subject: [PATCH 0881/2029] modify code --- ...{Code07_DeleteAndQueries1.java => Code07_GraphQueries1.java} | 2 +- ...{Code07_DeleteAndQueries2.java => Code07_GraphQueries2.java} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/class164/{Code07_DeleteAndQueries1.java => Code07_GraphQueries1.java} (99%) rename src/class164/{Code07_DeleteAndQueries2.java => Code07_GraphQueries2.java} (100%) diff --git a/src/class164/Code07_DeleteAndQueries1.java b/src/class164/Code07_GraphQueries1.java similarity index 99% rename from src/class164/Code07_DeleteAndQueries1.java rename to src/class164/Code07_GraphQueries1.java index 410856d4a..b397db6ed 100644 --- a/src/class164/Code07_DeleteAndQueries1.java +++ b/src/class164/Code07_GraphQueries1.java @@ -10,7 +10,7 @@ import java.io.OutputStream; import java.util.Arrays; -public class Code07_DeleteAndQueries1 { +public class Code07_GraphQueries1 { public static int MAXN = 200001; public static int MAXK = 400001; diff --git a/src/class164/Code07_DeleteAndQueries2.java b/src/class164/Code07_GraphQueries2.java similarity index 100% rename from src/class164/Code07_DeleteAndQueries2.java rename to src/class164/Code07_GraphQueries2.java From f9ca8310896cfc8eeac28da19696655387aec1be Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 30 Mar 2025 23:12:50 +0800 Subject: [PATCH 0882/2029] modify code --- src/class164/Code01_KruskalRebuild1.java | 168 +++++++++-------------- src/class164/Code01_KruskalRebuild2.java | 96 ++++++------- src/class164/Code02_Training1.java | 29 ++-- src/class164/Code02_Training2.java | 26 ++-- src/class164/Code03_StampRally1.java | 41 +++--- src/class164/Code03_StampRally2.java | 44 +++--- src/class164/Code04_Journey1.java | 45 +++--- src/class164/Code04_Journey2.java | 35 +++-- src/class164/Code05_Peaks1.java | 12 ++ src/class164/Code05_Peaks2.java | 16 ++- src/class164/Code06_UntilConnect1.java | 9 ++ src/class164/Code06_UntilConnect2.java | 13 +- src/class164/Code07_GraphQueries1.java | 15 +- src/class164/Code07_GraphQueries2.java | 18 ++- 14 files changed, 307 insertions(+), 260 deletions(-) diff --git a/src/class164/Code01_KruskalRebuild1.java b/src/class164/Code01_KruskalRebuild1.java index 789f48359..1d7957609 100644 --- a/src/class164/Code01_KruskalRebuild1.java +++ b/src/class164/Code01_KruskalRebuild1.java @@ -1,6 +1,10 @@ package class164; // Kruskal重构树模版题,java版 +// 图里有n个点,m条无向边,每条边给定边权,图里可能有若干个连通的部分 +// 一共有q条查询,每条查询都是如下的格式 +// 查询 x y : 点x到达点y的路途中,最大的边权希望尽量小,打印这个值 +// 1 <= n <= 10^5 1 <= m <= 3 * 10^5 1 <= q <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P2245 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -13,10 +17,11 @@ public class Code01_KruskalRebuild1 { public static int MAXK = 200001; public static int MAXM = 300001; + public static int MAXH = 20; public static int n, m, q; - public static int[][] arr = new int[MAXM][3]; + public static int[][] edge = new int[MAXM][3]; - // 链式前向星 + // Kruskal重构树 public static int[] head = new int[MAXK]; public static int[] next = new int[MAXK]; public static int[] to = new int[MAXK]; @@ -27,12 +32,9 @@ public class Code01_KruskalRebuild1 { public static int[] nodeKey = new int[MAXK]; public static int cntu; - // 树链剖分 - public static int[] fa = new int[MAXK]; + // 树上dfs public static int[] dep = new int[MAXK]; - public static int[] siz = new int[MAXK]; - public static int[] son = new int[MAXK]; - public static int[] top = new int[MAXK]; + public static int[][] stjump = new int[MAXK][MAXH]; public static int find(int i) { if (i != father[i]) { @@ -51,136 +53,95 @@ public static void kruskalRebuild() { for (int i = 1; i <= n; i++) { father[i] = i; } - Arrays.sort(arr, 1, m + 1, (a, b) -> a[2] - b[2]); + Arrays.sort(edge, 1, m + 1, (a, b) -> a[2] - b[2]); cntu = n; for (int i = 1, fx, fy; i <= m; i++) { - fx = find(arr[i][0]); - fy = find(arr[i][1]); + fx = find(edge[i][0]); + fy = find(edge[i][1]); if (fx != fy) { father[fx] = father[fy] = ++cntu; father[cntu] = cntu; - nodeKey[cntu] = arr[i][2]; + nodeKey[cntu] = edge[i][2]; addEdge(cntu, fx); addEdge(cntu, fy); } } } - public static void dfs1(int u, int f) { - fa[u] = f; - dep[u] = dep[f] + 1; - siz[u] = 1; + // dfs1是递归函数,需要改成迭代版,不然会爆栈,C++实现不需要 + 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 = next[e]) { dfs1(to[e], u); } - for (int e = head[u], v; e > 0; e = next[e]) { - v = to[e]; - 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 != son[u]) { - dfs2(v, v); - } - } - } + public static int[][] ufe = new int[MAXK][3]; - // 不会改迭代版,去看讲解118,详解了从递归版改迭代版 - public static int[][] fse = new int[MAXK][3]; + public static int stacksize, u, f, e; - 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; + 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]; + u = ufe[stacksize][0]; + f = ufe[stacksize][1]; + e = ufe[stacksize][2]; } - // dfs1的迭代版 - public static void dfs3(int u, int f) { + // dfs2是dfs1的迭代版 + public static void dfs2(int cur, int fa) { stacksize = 0; - push(u, f, -1); + push(cur, fa, -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); - push(to[edge], first, -1); - } else { - for (int e = head[first], v; e > 0; e = next[e]) { - v = to[e]; - siz[first] += siz[v]; - if (son[first] == 0 || siz[son[first]] < siz[v]) { - son[first] = v; - } + 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]; } - } - } - } - - // dfs2的迭代版 - public static void dfs4(int u, int t) { - stacksize = 0; - push(u, t, -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]; + e = head[u]; } else { - edge = next[edge]; + e = next[e]; } - if (edge != 0) { - push(first, second, edge); - if (to[edge] != son[first]) { - push(to[edge], to[edge], -1); - } + if (e != 0) { + push(u, f, e); + push(to[e], u, -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 = 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 dep[a] <= dep[b] ? a : b; + return stjump[a][0]; } public static void main(String[] args) { @@ -188,15 +149,14 @@ public static void main(String[] args) { n = io.nextInt(); m = io.nextInt(); for (int i = 1; i <= m; i++) { - arr[i][0] = io.nextInt(); - arr[i][1] = io.nextInt(); - arr[i][2] = io.nextInt(); + edge[i][0] = io.nextInt(); + edge[i][1] = io.nextInt(); + edge[i][2] = io.nextInt(); } kruskalRebuild(); for (int i = 1; i <= cntu; i++) { if (i == father[i]) { - dfs3(i, 0); // 防止递归爆栈,所以调用dfs1的迭代版 - dfs4(i, i); // 防止递归爆栈,所以调用dfs2的迭代版 + dfs2(i, 0); } } q = io.nextInt(); diff --git a/src/class164/Code01_KruskalRebuild2.java b/src/class164/Code01_KruskalRebuild2.java index 13b74a80a..7b57937c7 100644 --- a/src/class164/Code01_KruskalRebuild2.java +++ b/src/class164/Code01_KruskalRebuild2.java @@ -1,6 +1,10 @@ package class164; // Kruskal重构树模版题,C++版 +// 图里有n个点,m条无向边,每条边给定边权,图里可能有若干个连通的部分 +// 一共有q条查询,每条查询都是如下的格式 +// 查询 x y : 点x到达点y的路途中,最大的边权希望尽量小,打印这个值 +// 1 <= n <= 10^5 1 <= m <= 3 * 10^5 1 <= q <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P2245 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -10,35 +14,33 @@ //using namespace std; // //struct Edge { -// int u, v, w; +// int u, v, w; //}; // +//bool cmp(Edge x, Edge y) { +// return x.w < y.w; +//} +// //const int MAXK = 200001; //const int MAXM = 300001; +//const int MAXH = 20; //int n, m, q; -//Edge arr[MAXM]; +//Edge edge[MAXM]; // //int head[MAXK]; //int nxt[MAXK]; //int to[MAXK]; -//int cntg = 0; +//int cntg; // //int father[MAXK]; //int nodeKey[MAXK]; //int cntu; // -//int fa[MAXK]; //int dep[MAXK]; -//int siz[MAXK]; -//int son[MAXK]; -//int top[MAXK]; -// -//bool cmp(Edge x, Edge y) { -// return x.w < y.w; -//} +//int stjump[MAXK][MAXH]; // //int find(int i) { -// if(i != father[i]) { +// if (i != father[i]) { // father[i] = find(father[i]); // } // return father[i]; @@ -54,60 +56,53 @@ // for (int i = 1; i <= n; i++) { // father[i] = i; // } -// sort(arr + 1, arr + m + 1, cmp); +// sort(edge + 1, edge + m + 1, cmp); // cntu = n; -// for (int i = 1, fx, fy; i <= m; i++) { -// fx = find(arr[i].u); -// fy = find(arr[i].v); +// for (int i = 1; i <= m; i++) { +// int fx = find(edge[i].u); +// int fy = find(edge[i].v); // if (fx != fy) { // father[fx] = father[fy] = ++cntu; // father[cntu] = cntu; -// nodeKey[cntu] = arr[i].w; +// nodeKey[cntu] = edge[i].w; // addEdge(cntu, fx); // addEdge(cntu, fy); // } // } //} // -//void dfs1(int u, int f) { -// fa[u] = f; -// dep[u] = dep[f] + 1; -// siz[u] = 1; -// for (int e = head[u]; e > 0; e = nxt[e]) { -// dfs1(to[e], u); +//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], v; e > 0; e = nxt[e]) { -// v = to[e]; -// siz[u] += siz[v]; -// if (son[u] == 0 || siz[son[u]] < siz[v]) { -// son[u] = v; -// } +// for (int e = head[u]; e > 0; e = nxt[e]) { +// dfs(to[e], u); // } //} // -//void dfs2(int u, int t) { -// top[u] = t; -// if (son[u] == 0) { -// return; +//int lca(int a, int b) { +// if (dep[a] < dep[b]) { +// int tmp = a; +// a = b; +// b = tmp; // } -// dfs2(son[u], t); -// for (int e = head[u], v; e > 0; e = nxt[e]) { -// v = to[e]; -// if (v != son[u]) { -// dfs2(v, v); +// for (int p = MAXH - 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 = MAXH - 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]; //} // //int main() { @@ -115,20 +110,19 @@ // cin.tie(nullptr); // cin >> n >> m; // for (int i = 1; i <= m; i++) { -// cin >> arr[i].u >> arr[i].v >> arr[i].w; +// cin >> edge[i].u >> edge[i].v >> edge[i].w; // } // kruskalRebuild(); // for (int i = 1; i <= cntu; i++) { // if (i == father[i]) { -// dfs1(i, 0); -// dfs2(i, i); +// dfs(i, 0); // } // } // cin >> q; // for (int i = 1, x, y; i <= q; i++) { // cin >> x >> y; // if (find(x) != find(y)) { -// cout << "impossible\n"; +// cout << "impossible" << "\n"; // } else { // cout << nodeKey[lca(x, y)] << "\n"; // } diff --git a/src/class164/Code02_Training1.java b/src/class164/Code02_Training1.java index 6b75d97a9..7f10db4f8 100644 --- a/src/class164/Code02_Training1.java +++ b/src/class164/Code02_Training1.java @@ -1,6 +1,12 @@ package class164; // youyou的军训,java版 +// 图里有n个点,m条无向边,每条边给定不同的边权,图里可能有若干个连通的部分 +// 一共有q条操作,每条操作都是如下的三种类型中的一种 +// 操作 1 x : 限制变量limit,把limit的值改成x +// 操作 2 x : 点x不能走过任何边权小于limit的边,打印此时x所在的连通区域大小 +// 操作 3 x y : 第x条边的边权修改为y,题目保证修改之后,第x条边的边权排名不变 +// 1 <= n、m、q <= 4 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P9638 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -16,19 +22,24 @@ public class Code02_Training1 { public static int MAXH = 20; public static int n, m, q; public static int[][] edge = new int[MAXM][4]; + + // 边的编号对应重构树上的点的编号 public static int[] edgeToTree = new int[MAXM]; + // Kruskal重构树 public static int[] head = new int[MAXK]; public static int[] next = new int[MAXK]; public static int[] to = new int[MAXK]; public static int cntg = 0; + // 并查集 public static int[] father = new int[MAXK]; public static int[] nodeKey = new int[MAXK]; public static int[] stack = new int[MAXK]; public static int cntu; - public static int[] siz = new int[MAXK]; + // 树上dfs + public static int[] leafsiz = new int[MAXK]; public static int[][] stjump = new int[MAXK][MAXH]; // 并查集的find方法,需要改成迭代版不然会爆栈,C++实现不需要 @@ -70,7 +81,7 @@ public static void kruskalRebuild() { } } - // dfs1是递归函数,需要改成迭代版不然会爆栈,C++实现不需要 + // dfs1是递归函数,需要改成迭代版,不然会爆栈,C++实现不需要 public static void dfs1(int u, int fa) { stjump[u][0] = fa; for (int p = 1; p < MAXH; p++) { @@ -80,12 +91,12 @@ public static void dfs1(int u, int fa) { dfs1(to[e], u); } if (u <= n) { - siz[u] = 1; + leafsiz[u] = 1; } else { - siz[u] = 0; + leafsiz[u] = 0; } for (int e = head[u]; e > 0; e = next[e]) { - siz[u] += siz[to[e]]; + leafsiz[u] += leafsiz[to[e]]; } } @@ -127,12 +138,12 @@ public static void dfs2(int cur, int fa) { push(to[e], u, -1); } else { if (u <= n) { - siz[u] = 1; + leafsiz[u] = 1; } else { - siz[u] = 0; + leafsiz[u] = 0; } for (int ei = head[u]; ei > 0; ei = next[ei]) { - siz[u] += siz[to[ei]]; + leafsiz[u] += leafsiz[to[ei]]; } } } @@ -144,7 +155,7 @@ public static int query(int u, int limit) { u = stjump[u][p]; } } - return siz[u]; + return leafsiz[u]; } public static void main(String[] args) { diff --git a/src/class164/Code02_Training2.java b/src/class164/Code02_Training2.java index e29892252..19576388d 100644 --- a/src/class164/Code02_Training2.java +++ b/src/class164/Code02_Training2.java @@ -1,6 +1,12 @@ package class164; // youyou的军训,C++版 +// 图里有n个点,m条无向边,每条边给定不同的边权,图里可能有若干个连通的部分 +// 一共有q条操作,每条操作都是如下的三种类型中的一种 +// 操作 1 x : 限制变量limit,把limit的值改成x +// 操作 2 x : 点x不能走过任何边权小于limit的边,打印此时x所在的连通区域大小 +// 操作 3 x y : 第x条边的边权修改为y,题目保证修改之后,第x条边的边权排名不变 +// 1 <= n、m、q <= 4 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P9638 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -13,11 +19,16 @@ // int u, v, w, i; //}; // +//bool cmp(Edge x, Edge y) { +// return x.w > y.w; +//} +// //const int MAXK = 800001; //const int MAXM = 400001; //const int MAXH = 20; //int n, m, q; //Edge edge[MAXM]; +// //int edgeToTree[MAXM]; // //int head[MAXK]; @@ -27,16 +38,11 @@ // //int father[MAXK]; //int nodeKey[MAXK]; -//int stackArr[MAXK]; //int cntu; // -//int siz[MAXK]; +//int leafsiz[MAXK]; //int stjump[MAXK][MAXH]; // -//bool cmp(Edge x, Edge y) { -// return x.w > y.w; -//} -// //int find(int i) { // if (i != father[i]) { // father[i] = find(father[i]); @@ -79,12 +85,12 @@ // dfs(to[e], u); // } // if (u <= n) { -// siz[u] = 1; +// leafsiz[u] = 1; // } else { -// siz[u] = 0; +// leafsiz[u] = 0; // } // for (int e = head[u]; e > 0; e = nxt[e]) { -// siz[u] += siz[to[e]]; +// leafsiz[u] += leafsiz[to[e]]; // } //} // @@ -94,7 +100,7 @@ // u = stjump[u][p]; // } // } -// return siz[u]; +// return leafsiz[u]; //} // //int main() { diff --git a/src/class164/Code03_StampRally1.java b/src/class164/Code03_StampRally1.java index 69f384a43..dd6d6da58 100644 --- a/src/class164/Code03_StampRally1.java +++ b/src/class164/Code03_StampRally1.java @@ -1,6 +1,12 @@ package class164; -// 走过z个点的最大边权最小值,java版 +// 边的最大编号的最小值,java版 +// 图里有n个点,m条无向边,边的编号1~m,没有边权,所有点都连通 +// 一共有q条查询,查询的格式如下 +// 查询 x y z : 从两个点x和y出发,希望经过的点数量等于z +// 每个点可以重复经过,但是重复经过只计算一次 +// 经过边的最大编号,最小是多少 +// 3 <= n、m、q <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/AT_agc002_d // 测试链接 : https://atcoder.jp/contests/agc002/tasks/agc002_d // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -16,20 +22,22 @@ public class Code03_StampRally1 { public static int MAXM = 100001; public static int MAXH = 20; public static int n, m, q; - public static int[][] arr = new int[MAXM][3]; + public static int[][] edge = new int[MAXM][3]; + // Kruskal重构树 public static int[] head = new int[MAXK]; public static int[] next = new int[MAXK]; public static int[] to = new int[MAXK]; public static int cntg = 0; + // 并查集 public static int[] father = new int[MAXK]; public static int[] nodeKey = new int[MAXK]; public static int cntu; - public static int[] dep = new int[MAXK]; - public static int[] siz = new int[MAXK]; + // 树上dfs public static int[][] stjump = new int[MAXK][MAXH]; + public static int[] leafsiz = new int[MAXK]; public static void addEdge(int u, int v) { next[++cntg] = head[u]; @@ -48,15 +56,15 @@ public static void kruskalRebuild() { for (int i = 1; i <= n; i++) { father[i] = i; } - Arrays.sort(arr, 1, m + 1, (a, b) -> a[2] - b[2]); + Arrays.sort(edge, 1, m + 1, (a, b) -> a[2] - b[2]); cntu = n; for (int i = 1, fx, fy; i <= m; i++) { - fx = find(arr[i][0]); - fy = find(arr[i][1]); + fx = find(edge[i][0]); + fy = find(edge[i][1]); if (fx != fy) { father[fx] = father[fy] = ++cntu; father[cntu] = cntu; - nodeKey[cntu] = arr[i][2]; + nodeKey[cntu] = edge[i][2]; addEdge(cntu, fx); addEdge(cntu, fy); } @@ -64,7 +72,6 @@ public static void kruskalRebuild() { } public static 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]; @@ -73,12 +80,12 @@ public static void dfs(int u, int fa) { dfs(to[e], u); } if (u <= n) { - siz[u] = 1; + leafsiz[u] = 1; } else { - siz[u] = 0; + leafsiz[u] = 0; } for (int e = head[u]; e > 0; e = next[e]) { - siz[u] += siz[to[e]]; + leafsiz[u] += leafsiz[to[e]]; } } @@ -94,9 +101,9 @@ public static boolean check(int x, int y, int z, int limit) { } } if (x == y) { - return siz[x] >= z; + return leafsiz[x] >= z; } else { - return siz[x] + siz[y] >= z; + return leafsiz[x] + leafsiz[y] >= z; } } @@ -119,9 +126,9 @@ public static void main(String[] args) { n = io.nextInt(); m = io.nextInt(); for (int i = 1; i <= m; i++) { - arr[i][0] = io.nextInt(); - arr[i][1] = io.nextInt(); - arr[i][2] = i; + edge[i][0] = io.nextInt(); + edge[i][1] = io.nextInt(); + edge[i][2] = i; } kruskalRebuild(); dfs(cntu, 0); diff --git a/src/class164/Code03_StampRally2.java b/src/class164/Code03_StampRally2.java index ea479932e..fa6066571 100644 --- a/src/class164/Code03_StampRally2.java +++ b/src/class164/Code03_StampRally2.java @@ -1,6 +1,12 @@ package class164; -// 走过z个点的最大边权最小值,C++版 +// 边的最大编号的最小值,C++版 +// 图里有n个点,m条无向边,边的编号1~m,没有边权,所有点都连通 +// 一共有q条查询,查询的格式如下 +// 查询 x y z : 从两个点x和y出发,希望经过的点数量等于z +// 每个点可以重复经过,但是重复经过只计算一次 +// 经过边的最大编号,最小是多少 +// 3 <= n、m、q <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/AT_agc002_d // 测试链接 : https://atcoder.jp/contests/agc002/tasks/agc002_d // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 @@ -14,11 +20,15 @@ // int u, v, w; //}; // +//bool cmp(Edge x, Edge y) { +// return x.w < y.w; +//} +// //const int MAXK = 200001; //const int MAXM = 100001; //const int MAXH = 20; //int n, m, q; -//Edge arr[MAXM]; +//Edge edge[MAXM]; // //int head[MAXK]; //int nxt[MAXK]; @@ -29,13 +39,8 @@ //int nodeKey[MAXK]; //int cntu; // -//int dep[MAXK]; -//int siz[MAXK]; //int stjump[MAXK][MAXH]; -// -//bool cmp(Edge x, Edge y) { -// return x.w < y.w; -//} +//int leafsiz[MAXK]; // //void addEdge(int u, int v) { // nxt[++cntg] = head[u]; @@ -54,15 +59,15 @@ // for (int i = 1; i <= n; i++) { // father[i] = i; // } -// sort(arr + 1, arr + m + 1, cmp); +// sort(edge + 1, edge + m + 1, cmp); // cntu = n; // for (int i = 1, fx, fy; i <= m; i++) { -// fx = find(arr[i].u); -// fy = find(arr[i].v); +// fx = find(edge[i].u); +// fy = find(edge[i].v); // if (fx != fy) { // father[fx] = father[fy] = ++cntu; // father[cntu] = cntu; -// nodeKey[cntu] = arr[i].w; +// nodeKey[cntu] = edge[i].w; // addEdge(cntu, fx); // addEdge(cntu, fy); // } @@ -70,7 +75,6 @@ //} // //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]; @@ -79,12 +83,12 @@ // dfs(to[e], u); // } // if (u <= n) { -// siz[u] = 1; +// leafsiz[u] = 1; // } else { -// siz[u] = 0; +// leafsiz[u] = 0; // } // for (int e = head[u]; e > 0; e = nxt[e]) { -// siz[u] += siz[to[e]]; +// leafsiz[u] += leafsiz[to[e]]; // } //} // @@ -100,9 +104,9 @@ // } // } // if (x == y) { -// return siz[x] >= z; +// return leafsiz[x] >= z; // } else { -// return siz[x] + siz[y] >= z; +// return leafsiz[x] + leafsiz[y] >= z; // } //} // @@ -125,8 +129,8 @@ // cin.tie(nullptr); // cin >> n >> m; // for (int i = 1; i <= m; i++) { -// cin >> arr[i].u >> arr[i].v; -// arr[i].w = i; +// cin >> edge[i].u >> edge[i].v; +// edge[i].w = i; // } // kruskalRebuild(); // dfs(cntu, 0); diff --git a/src/class164/Code04_Journey1.java b/src/class164/Code04_Journey1.java index a1e4601fb..a40e82c3e 100644 --- a/src/class164/Code04_Journey1.java +++ b/src/class164/Code04_Journey1.java @@ -1,6 +1,13 @@ package class164; // 归程,java版 +// 图里有n个点,m条无向边,每条边给定长度l和海拔a,所有点都连通 +// 一共有q条查询,查询格式如下 +// 查询 x y : 海拔 > y的边,走过没有代价 +// 海拔 <= y的边,走过的代价为边的长度 +// 从点x出发到达1号点,打印最小的代价 +// 1 <= n <= 2 * 10^5 1 <= m、q <= 4 * 10^5 +// 本题要求强制在线,具体规定请打开测试链接查看 // 测试链接 : https://www.luogu.com.cn/problem/P4768 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -18,29 +25,33 @@ public class Code04_Journey1 { public static int MAXH = 20; public static int INF = 2000000001; public static int t, n, m, q, k, s; - public static int[][] arr = new int[MAXM][4]; + public static int[][] edge = new int[MAXM][4]; + // 建图 public static int[] headg = new int[MAXN]; public static int[] nextg = new int[MAXM << 1]; public static int[] tog = new int[MAXM << 1]; public static int[] weightg = new int[MAXM << 1]; public static int cntg; + // dijkstra算法 public static int[] dist = new int[MAXN]; public static boolean[] visit = new boolean[MAXN]; public static PriorityQueue heap = new PriorityQueue<>((a, b) -> a[1] - b[1]); + // Kruskal重构树 public static int[] headk = new int[MAXK]; public static int[] nextk = new int[MAXK]; public static int[] tok = new int[MAXK]; public static int cntk; + // 并查集 public static int[] father = new int[MAXK]; public static int[] nodeKey = new int[MAXK]; public static int[] stack = new int[MAXK]; public static int cntu; - public static int[] dep = new int[MAXK]; + // 树上dfs public static int[][] stjump = new int[MAXK][MAXH]; public static int[] mindist = new int[MAXK]; @@ -59,8 +70,8 @@ public static void addEdgeG(int u, int v, int w) { public static void dijkstra() { for (int i = 1; i <= m; i++) { - addEdgeG(arr[i][0], arr[i][1], arr[i][2]); - addEdgeG(arr[i][1], arr[i][0], arr[i][2]); + addEdgeG(edge[i][0], edge[i][1], edge[i][2]); + addEdgeG(edge[i][1], edge[i][0], edge[i][2]); } Arrays.fill(dist, 1, n + 1, INF); Arrays.fill(visit, 1, n + 1, false); @@ -109,15 +120,15 @@ public static void kruskalRebuild() { for (int i = 1; i <= n; i++) { father[i] = i; } - Arrays.sort(arr, 1, m + 1, (a, b) -> b[3] - a[3]); + Arrays.sort(edge, 1, m + 1, (a, b) -> b[3] - a[3]); cntu = n; for (int i = 1, fx, fy; i <= m; i++) { - fx = find(arr[i][0]); - fy = find(arr[i][1]); + fx = find(edge[i][0]); + fy = find(edge[i][1]); if (fx != fy) { father[fx] = father[fy] = ++cntu; father[cntu] = cntu; - nodeKey[cntu] = arr[i][3]; + nodeKey[cntu] = edge[i][3]; addEdgeK(cntu, fx); addEdgeK(cntu, fy); } @@ -126,7 +137,6 @@ public static void kruskalRebuild() { // dfs1是递归函数,需要改成迭代版不然会爆栈,C++实现不需要 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]; @@ -169,7 +179,6 @@ public static void dfs2(int cur, int fa) { 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]; @@ -211,10 +220,10 @@ public static void main(String[] args) { m = io.nextInt(); clear(); for (int i = 1; i <= m; i++) { - arr[i][0] = io.nextInt(); - arr[i][1] = io.nextInt(); - arr[i][2] = io.nextInt(); - arr[i][3] = io.nextInt(); + edge[i][0] = io.nextInt(); + edge[i][1] = io.nextInt(); + edge[i][2] = io.nextInt(); + edge[i][3] = io.nextInt(); } dijkstra(); kruskalRebuild(); @@ -222,10 +231,10 @@ public static void main(String[] args) { q = io.nextInt(); k = io.nextInt(); s = io.nextInt(); - for (int i = 1, node, line, lastAns = 0; i <= q; i++) { - node = (io.nextInt() + k * lastAns - 1) % n + 1; - line = (io.nextInt() + k * lastAns) % (s + 1); - lastAns = query(node, line); + for (int i = 1, x, y, lastAns = 0; i <= q; i++) { + x = (io.nextInt() + k * lastAns - 1) % n + 1; + y = (io.nextInt() + k * lastAns) % (s + 1); + lastAns = query(x, y); io.writelnInt(lastAns); } } diff --git a/src/class164/Code04_Journey2.java b/src/class164/Code04_Journey2.java index 5d31f304c..bfdc08fdc 100644 --- a/src/class164/Code04_Journey2.java +++ b/src/class164/Code04_Journey2.java @@ -1,6 +1,13 @@ package class164; // 归程,C++版 +// 图里有n个点,m条无向边,每条边给定长度l和海拔a,所有点都连通 +// 一共有q条查询,查询格式如下 +// 查询 x y : 海拔 > y的边,走过没有代价 +// 海拔 <= y的边,走过的代价为边的长度 +// 从点x出发到达1号点,打印最小的代价 +// 1 <= n <= 2 * 10^5 1 <= m、q <= 4 * 10^5 +// 本题要求强制在线,具体规定请打开测试链接查看 // 测试链接 : https://www.luogu.com.cn/problem/P4768 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -33,7 +40,7 @@ //const int MAXH = 20; //int INF = 2000000001; //int t, n, m, q, k, s; -//Edge arr[MAXM]; +//Edge edge[MAXM]; // //int headg[MAXN]; //int nextg[MAXM << 1]; @@ -54,7 +61,6 @@ //int nodeKey[MAXK]; //int cntu; // -//int dep[MAXK]; //int stjump[MAXK][MAXH]; //int mindist[MAXK]; // @@ -78,8 +84,8 @@ // //void dijkstra() { // for(int i = 1; i <= m; i++) { -// addEdgeG(arr[i].u, arr[i].v, arr[i].l); -// addEdgeG(arr[i].v, arr[i].u, arr[i].l); +// addEdgeG(edge[i].u, edge[i].v, edge[i].l); +// addEdgeG(edge[i].v, edge[i].u, edge[i].l); // } // for(int i = 1; i <= n; i++) { // dist[i] = INF; @@ -125,17 +131,17 @@ // for(int i = 1; i <= n; i++) { // father[i] = i; // } -// sort(arr + 1, arr + m + 1, EdgeCmp); +// sort(edge + 1, edge + m + 1, EdgeCmp); // cntu = n; // for(int i = 1, fx, fy; i <= m; i++) { -// fx = find(arr[i].u); -// fy = find(arr[i].v); +// fx = find(edge[i].u); +// fy = find(edge[i].v); // if(fx != fy) { // cntu++; // father[fx] = cntu; // father[fy] = cntu; // father[cntu] = cntu; -// nodeKey[cntu] = arr[i].a; +// nodeKey[cntu] = edge[i].a; // addEdgeK(cntu, fx); // addEdgeK(cntu, fy); // } @@ -143,7 +149,6 @@ //} // //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]; @@ -178,17 +183,17 @@ // cin >> n >> m; // clear(); // for(int i = 1; i <= m; i++) { -// cin >> arr[i].u >> arr[i].v >> arr[i].l >> arr[i].a; +// cin >> edge[i].u >> edge[i].v >> edge[i].l >> edge[i].a; // } // dijkstra(); // kruskalRebuild(); // dfs(cntu, 0); // cin >> q >> k >> s; -// for(int i = 1, node, line, lastAns = 0; i <= q; i++) { -// cin >> node >> line; -// node = (node + k * lastAns - 1) % n + 1; -// line = (line + k * lastAns) % (s + 1); -// lastAns = query(node, line); +// for(int i = 1, x, y, lastAns = 0; i <= q; i++) { +// cin >> x >> y; +// x = (x + k * lastAns - 1) % n + 1; +// y = (y + k * lastAns) % (s + 1); +// lastAns = query(x, y); // cout << lastAns << "\n"; // } // } diff --git a/src/class164/Code05_Peaks1.java b/src/class164/Code05_Peaks1.java index 8576fa053..0a055f19c 100644 --- a/src/class164/Code05_Peaks1.java +++ b/src/class164/Code05_Peaks1.java @@ -1,6 +1,14 @@ package class164; // 边权上限内第k大点权,java版 +// 图里有n个点,m条无向边,点有点权,边有边权,图里可能有若干个连通的部分 +// 一共有q条查询,查询格式如下 +// 查询 u x k : 从点u开始,只能走过权值<=x的边 +// 所有能到达的点中,打印第k大点权,如果不存在打印-1 +// 1 <= n <= 10^5 +// 0 <= m、q <= 5 * 10^5 +// 1 <= 点权、边权 <= 10^9 +// 本题要求强制在线,具体规定请打开测试链接查看 // 测试链接 : https://www.luogu.com.cn/problem/P7834 // 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但是通过不了 @@ -28,21 +36,25 @@ public class Code05_Peaks1 { public static int[][] edge = new int[MAXM][3]; + // Kruskal重构树 public static int[] head = new int[MAXK]; public static int[] next = new int[MAXK]; public static int[] to = new int[MAXK]; public static int cntg = 0; + // 并查集 public static int[] father = new int[MAXK]; public static int[] nodeKey = new int[MAXK]; public static int cntu; + // 树上dfs public static int[] dfn = new int[MAXK]; public static int[] seg = new int[MAXK]; public static int[][] stjump = new int[MAXK][MAXH]; public static int[] siz = new int[MAXK]; public static int cntd = 0; + // 可持久化线段树 public static int[] root = new int[MAXK]; public static int[] ls = new int[MAXT]; public static int[] rs = new int[MAXT]; diff --git a/src/class164/Code05_Peaks2.java b/src/class164/Code05_Peaks2.java index 079548226..d2cb70750 100644 --- a/src/class164/Code05_Peaks2.java +++ b/src/class164/Code05_Peaks2.java @@ -1,6 +1,14 @@ package class164; // 边权上限内第k大点权,C++版 +// 图里有n个点,m条无向边,点有点权,边有边权,图里可能有若干个连通的部分 +// 一共有q条查询,查询格式如下 +// 查询 u x k : 从点u开始,只能走过权值<=x的边 +// 所有能到达的点中,打印第k大点权,如果不存在打印-1 +// 1 <= n <= 10^5 +// 0 <= m、q <= 5 * 10^5 +// 1 <= 点权、边权 <= 10^9 +// 本题要求强制在线,具体规定请打开测试链接查看 // 测试链接 : https://www.luogu.com.cn/problem/P7834 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -13,6 +21,10 @@ // int u, v, w; //}; // +//bool cmp(Edge x, Edge y) { +// return x.w < y.w; +//} +// //const int MAXN = 100001; //const int MAXK = 200001; //const int MAXM = 500001; @@ -46,10 +58,6 @@ //int segsiz[MAXT]; //int cntt; // -//bool cmp(Edge x, Edge y) { -// return x.w < y.w; -//} -// //int kth(int num) { // int left = 1, right = diff; // while (left <= right) { diff --git a/src/class164/Code06_UntilConnect1.java b/src/class164/Code06_UntilConnect1.java index 6b8f82491..e80e161de 100644 --- a/src/class164/Code06_UntilConnect1.java +++ b/src/class164/Code06_UntilConnect1.java @@ -1,6 +1,11 @@ package class164; // 加边直到连通,java版 +// 图里有n个点,m条无向边,所有点都连通 +// 一共有q条查询,每条查询格式如下 +// 查询 l r : 至少要加完编号前多少的边,才能使得[l, r]中的所有点连通 +// 1 <= n <= 10^5 +// 1 <= m、q <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/CF1706E // 测试链接 : https://codeforces.com/problemset/problem/1706/E // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -19,21 +24,25 @@ public class Code06_UntilConnect1 { public static int t, n, m, q; public static int[][] edge = new int[MAXM][3]; + // Kruskal重构树 public static int[] head = new int[MAXK]; public static int[] next = new int[MAXK]; public static int[] to = new int[MAXK]; public static int cntg; + // 并查集 public static int[] father = new int[MAXK]; public static int[] nodeKey = new int[MAXK]; public static int cntu; + // 树上dfs public static int[] dep = new int[MAXK]; public static int[] dfn = new int[MAXK]; public static int[] seg = new int[MAXK]; public static int[][] stjump = new int[MAXK][MAXH]; public static int cntd; + // 倍增表查询区间最大值、最小值 public static int[] lg2 = new int[MAXN]; public static int[][] stmax = new int[MAXN][MAXH]; public static int[][] stmin = new int[MAXN][MAXH]; diff --git a/src/class164/Code06_UntilConnect2.java b/src/class164/Code06_UntilConnect2.java index 35e1d7f5b..3887c2462 100644 --- a/src/class164/Code06_UntilConnect2.java +++ b/src/class164/Code06_UntilConnect2.java @@ -1,6 +1,11 @@ package class164; // 加边直到连通,C++版 +// 图里有n个点,m条无向边,所有点都连通 +// 一共有q条查询,每条查询格式如下 +// 查询 l r : 至少要加完编号前多少的边,才能使得[l, r]中的所有点连通 +// 1 <= n <= 10^5 +// 1 <= m、q <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/CF1706E // 测试链接 : https://codeforces.com/problemset/problem/1706/E // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 @@ -14,6 +19,10 @@ // int u, v, w; //}; // +//bool cmp(Edge x, Edge y) { +// return x.w < y.w; +//} +// //const int MAXN = 100001; //const int MAXK = 200001; //const int MAXM = 200001; @@ -40,10 +49,6 @@ //int stmax[MAXN][MAXH]; //int stmin[MAXN][MAXH]; // -//bool cmp(Edge x, Edge y) { -// return x.w < y.w; -//} -// //void clear() { // cntg = 0; // cntd = 0; diff --git a/src/class164/Code07_GraphQueries1.java b/src/class164/Code07_GraphQueries1.java index b397db6ed..931c0219f 100644 --- a/src/class164/Code07_GraphQueries1.java +++ b/src/class164/Code07_GraphQueries1.java @@ -1,6 +1,12 @@ package class164; // 删边和查询,java版 +// 图里有n个点,m条无向边,初始时点权都不同,图里可能有若干个连通的部分 +// 一共有q条操作,每条操作是如下两种类型中的一种 +// 操作 1 x : 点x所在的连通区域中,假设点y拥有最大的点权 +// 打印y的点权,然后把y的点权修改为0 +// 操作 2 x : 删掉第x条边 +// 1 <= n <= 2 * 10^5 1 <= m <= 3 * 10^5 1 <= q <= 5 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/CF1416D // 测试链接 : https://codeforces.com/problemset/problem/1416/D // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -20,26 +26,31 @@ public class Code07_GraphQueries1 { public static int INF = 1000000001; public static int n, m, q; + // 根据删除操作,给每条边设置边权,给查询操作设置时间线 public static int[] node = new int[MAXN]; public static int[][] edge = new int[MAXM][3]; public static int[][] ques = new int[MAXQ][2]; public static int[] timeline = new int[MAXQ]; + // Kruskal重构树 public static int[] head = new int[MAXK]; public static int[] next = new int[MAXK]; public static int[] to = new int[MAXK]; public static int cntg = 0; + // 并查集 public static int[] father = new int[MAXK]; public static int[] nodeKey = new int[MAXK]; public static int cntu; + // 树上dfs public static int[][] stjump = new int[MAXK][MAXH]; public static int[] leafsiz = new int[MAXK]; public static int[] leafstart = new int[MAXK]; public static int[] leafseg = new int[MAXK]; public static int cntd = 0; + // 线段树维护dfn区间的最大值、最大值来自哪个dfn编号 public static int[] maxval = new int[MAXN << 2]; public static int[] maxdfn = new int[MAXN << 2]; @@ -216,11 +227,11 @@ public static void main(String[] args) { build(1, n, 1); for (int i = 1, anc; i <= q; i++) { if (ques[i][0] == 1) { - ansMax = -INF; anc = getAncestor(ques[i][1], timeline[i]); + ansMax = -INF; queryMax(leafstart[anc], leafstart[anc] + leafsiz[anc] - 1, 1, n, 1); - update(updateDfn, 0, 1, n, 1); io.writelnInt(ansMax); + update(updateDfn, 0, 1, n, 1); } } io.flush(); diff --git a/src/class164/Code07_GraphQueries2.java b/src/class164/Code07_GraphQueries2.java index 01b6d5812..b9c894572 100644 --- a/src/class164/Code07_GraphQueries2.java +++ b/src/class164/Code07_GraphQueries2.java @@ -1,6 +1,12 @@ package class164; // 删边和查询,C++版 +// 图里有n个点,m条无向边,初始时点权都不同,图里可能有若干个连通的部分 +// 一共有q条操作,每条操作是如下两种类型中的一种 +// 操作 1 x : 点x所在的连通区域中,假设点y拥有最大的点权 +// 打印y的点权,然后把y的点权修改为0 +// 操作 2 x : 删掉第x条边 +// 1 <= n <= 2 * 10^5 1 <= m <= 3 * 10^5 1 <= q <= 5 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/CF1416D // 测试链接 : https://codeforces.com/problemset/problem/1416/D // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 @@ -14,6 +20,10 @@ // int u, v, w; //}; // +//bool cmp(Edge x, Edge y) { +// return x.w < y.w; +//} +// //const int MAXN = 200001; //const int MAXK = 400001; //const int MAXM = 300001; @@ -48,10 +58,6 @@ //int ansMax; //int updateDfn; // -//bool cmp(Edge x, Edge y) { -// return x.w < y.w; -//} -// //void prepare() { // for (int i = 1; i <= q; i++) { // if (ques[i][0] == 2) { @@ -219,11 +225,11 @@ // build(1, n, 1); // for (int i = 1, anc; i <= q; i++) { // if (ques[i][0] == 1) { -// ansMax = -INF; // anc = getAncestor(ques[i][1], timeline[i]); +// ansMax = -INF; // queryMax(leafstart[anc], leafstart[anc] + leafsiz[anc] - 1, 1, n, 1); -// update(updateDfn, 0, 1, n, 1); // cout << ansMax << "\n"; +// update(updateDfn, 0, 1, n, 1); // } // } // return 0; From 9888b83d26f3b7652fa0278764b8b37095201b84 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 30 Mar 2025 23:31:29 +0800 Subject: [PATCH 0883/2029] modify code --- src/class164/Code01_KruskalRebuild1.java | 4 +++- src/class164/Code01_KruskalRebuild2.java | 4 +++- src/class164/Code04_Journey1.java | 3 ++- src/class164/Code04_Journey2.java | 3 ++- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/class164/Code01_KruskalRebuild1.java b/src/class164/Code01_KruskalRebuild1.java index 1d7957609..04714d136 100644 --- a/src/class164/Code01_KruskalRebuild1.java +++ b/src/class164/Code01_KruskalRebuild1.java @@ -4,7 +4,9 @@ // 图里有n个点,m条无向边,每条边给定边权,图里可能有若干个连通的部分 // 一共有q条查询,每条查询都是如下的格式 // 查询 x y : 点x到达点y的路途中,最大的边权希望尽量小,打印这个值 -// 1 <= n <= 10^5 1 <= m <= 3 * 10^5 1 <= q <= 10^5 +// 1 <= n <= 10^5 +// 1 <= m <= 3 * 10^5 +// 1 <= q <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P2245 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class164/Code01_KruskalRebuild2.java b/src/class164/Code01_KruskalRebuild2.java index 7b57937c7..34478ed99 100644 --- a/src/class164/Code01_KruskalRebuild2.java +++ b/src/class164/Code01_KruskalRebuild2.java @@ -4,7 +4,9 @@ // 图里有n个点,m条无向边,每条边给定边权,图里可能有若干个连通的部分 // 一共有q条查询,每条查询都是如下的格式 // 查询 x y : 点x到达点y的路途中,最大的边权希望尽量小,打印这个值 -// 1 <= n <= 10^5 1 <= m <= 3 * 10^5 1 <= q <= 10^5 +// 1 <= n <= 10^5 +// 1 <= m <= 3 * 10^5 +// 1 <= q <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P2245 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class164/Code04_Journey1.java b/src/class164/Code04_Journey1.java index a40e82c3e..1b5beb700 100644 --- a/src/class164/Code04_Journey1.java +++ b/src/class164/Code04_Journey1.java @@ -6,7 +6,8 @@ // 查询 x y : 海拔 > y的边,走过没有代价 // 海拔 <= y的边,走过的代价为边的长度 // 从点x出发到达1号点,打印最小的代价 -// 1 <= n <= 2 * 10^5 1 <= m、q <= 4 * 10^5 +// 1 <= n <= 2 * 10^5 +// 1 <= m、q <= 4 * 10^5 // 本题要求强制在线,具体规定请打开测试链接查看 // 测试链接 : https://www.luogu.com.cn/problem/P4768 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class164/Code04_Journey2.java b/src/class164/Code04_Journey2.java index bfdc08fdc..04db4fe13 100644 --- a/src/class164/Code04_Journey2.java +++ b/src/class164/Code04_Journey2.java @@ -6,7 +6,8 @@ // 查询 x y : 海拔 > y的边,走过没有代价 // 海拔 <= y的边,走过的代价为边的长度 // 从点x出发到达1号点,打印最小的代价 -// 1 <= n <= 2 * 10^5 1 <= m、q <= 4 * 10^5 +// 1 <= n <= 2 * 10^5 +// 1 <= m、q <= 4 * 10^5 // 本题要求强制在线,具体规定请打开测试链接查看 // 测试链接 : https://www.luogu.com.cn/problem/P4768 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 From 8b7ee1867f051d357142eb0778fdd0395e43ed93 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 31 Mar 2025 00:27:38 +0800 Subject: [PATCH 0884/2029] modify code --- .../{Code06_UntilConnect1.java => Code05_UntilConnect1.java} | 2 +- .../{Code06_UntilConnect2.java => Code05_UntilConnect2.java} | 0 .../{Code07_GraphQueries1.java => Code06_GraphQueries1.java} | 2 +- .../{Code07_GraphQueries2.java => Code06_GraphQueries2.java} | 0 src/class164/{Code05_Peaks1.java => Code07_Peaks1.java} | 4 ++-- src/class164/{Code05_Peaks2.java => Code07_Peaks2.java} | 0 6 files changed, 4 insertions(+), 4 deletions(-) rename src/class164/{Code06_UntilConnect1.java => Code05_UntilConnect1.java} (99%) rename src/class164/{Code06_UntilConnect2.java => Code05_UntilConnect2.java} (100%) rename src/class164/{Code07_GraphQueries1.java => Code06_GraphQueries1.java} (99%) rename src/class164/{Code07_GraphQueries2.java => Code06_GraphQueries2.java} (100%) rename src/class164/{Code05_Peaks1.java => Code07_Peaks1.java} (98%) rename src/class164/{Code05_Peaks2.java => Code07_Peaks2.java} (100%) diff --git a/src/class164/Code06_UntilConnect1.java b/src/class164/Code05_UntilConnect1.java similarity index 99% rename from src/class164/Code06_UntilConnect1.java rename to src/class164/Code05_UntilConnect1.java index e80e161de..5ae73287e 100644 --- a/src/class164/Code06_UntilConnect1.java +++ b/src/class164/Code05_UntilConnect1.java @@ -15,7 +15,7 @@ import java.io.OutputStream; import java.util.Arrays; -public class Code06_UntilConnect1 { +public class Code05_UntilConnect1 { public static int MAXN = 100001; public static int MAXK = 200001; diff --git a/src/class164/Code06_UntilConnect2.java b/src/class164/Code05_UntilConnect2.java similarity index 100% rename from src/class164/Code06_UntilConnect2.java rename to src/class164/Code05_UntilConnect2.java diff --git a/src/class164/Code07_GraphQueries1.java b/src/class164/Code06_GraphQueries1.java similarity index 99% rename from src/class164/Code07_GraphQueries1.java rename to src/class164/Code06_GraphQueries1.java index 931c0219f..c134c78cf 100644 --- a/src/class164/Code07_GraphQueries1.java +++ b/src/class164/Code06_GraphQueries1.java @@ -16,7 +16,7 @@ import java.io.OutputStream; import java.util.Arrays; -public class Code07_GraphQueries1 { +public class Code06_GraphQueries1 { public static int MAXN = 200001; public static int MAXK = 400001; diff --git a/src/class164/Code07_GraphQueries2.java b/src/class164/Code06_GraphQueries2.java similarity index 100% rename from src/class164/Code07_GraphQueries2.java rename to src/class164/Code06_GraphQueries2.java diff --git a/src/class164/Code05_Peaks1.java b/src/class164/Code07_Peaks1.java similarity index 98% rename from src/class164/Code05_Peaks1.java rename to src/class164/Code07_Peaks1.java index 0a055f19c..13ccfb707 100644 --- a/src/class164/Code05_Peaks1.java +++ b/src/class164/Code07_Peaks1.java @@ -13,7 +13,7 @@ // 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但是通过不了 // 因为这道题根据C++的运行空间,制定通过标准,根本没考虑java的用户 -// 想通过用C++实现,本节课Code05_Peaks2文件就是C++的实现 +// 想通过用C++实现,本节课Code07_Peaks2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 import java.io.IOException; @@ -21,7 +21,7 @@ import java.io.OutputStream; import java.util.Arrays; -public class Code05_Peaks1 { +public class Code07_Peaks1 { public static int MAXN = 100001; public static int MAXK = 200001; diff --git a/src/class164/Code05_Peaks2.java b/src/class164/Code07_Peaks2.java similarity index 100% rename from src/class164/Code05_Peaks2.java rename to src/class164/Code07_Peaks2.java From 685e762dc2bf7f8b3f73c7230872054701d397f8 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 31 Mar 2025 16:38:17 +0800 Subject: [PATCH 0885/2029] modify code --- src/class164/Code01_KruskalRebuild1.java | 13 ++++++++----- src/class164/Code01_KruskalRebuild2.java | 3 +-- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/class164/Code01_KruskalRebuild1.java b/src/class164/Code01_KruskalRebuild1.java index 04714d136..d4a51d475 100644 --- a/src/class164/Code01_KruskalRebuild1.java +++ b/src/class164/Code01_KruskalRebuild1.java @@ -21,20 +21,23 @@ public class Code01_KruskalRebuild1 { public static int MAXM = 300001; public static int MAXH = 20; public static int n, m, q; + + // 每条边有三个信息,节点u、节点v、边权w public static int[][] edge = new int[MAXM][3]; - // Kruskal重构树 + // 并查集 + public static int[] father = new int[MAXK]; + // Kruskal重构树的建图 public static int[] head = new int[MAXK]; public static int[] next = new int[MAXK]; public static int[] to = new int[MAXK]; public static int cntg = 0; - - // 并查集 - public static int[] father = new int[MAXK]; + // Kruskal重构树上,节点的权值 public static int[] nodeKey = new int[MAXK]; + // Kruskal重构树上,点的数量 public static int cntu; - // 树上dfs + // Kruskal重构树上,dfs过程建立的信息 public static int[] dep = new int[MAXK]; public static int[][] stjump = new int[MAXK][MAXH]; diff --git a/src/class164/Code01_KruskalRebuild2.java b/src/class164/Code01_KruskalRebuild2.java index 34478ed99..0f9c2f75c 100644 --- a/src/class164/Code01_KruskalRebuild2.java +++ b/src/class164/Code01_KruskalRebuild2.java @@ -29,12 +29,11 @@ //int n, m, q; //Edge edge[MAXM]; // +//int father[MAXK]; //int head[MAXK]; //int nxt[MAXK]; //int to[MAXK]; //int cntg; -// -//int father[MAXK]; //int nodeKey[MAXK]; //int cntu; // From a2822ba45e43a7d0815272d316a96cda9ed87116 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 31 Mar 2025 17:13:29 +0800 Subject: [PATCH 0886/2029] modify code --- src/class164/Code01_KruskalRebuild1.java | 3 ++- src/class164/Code01_KruskalRebuild2.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/class164/Code01_KruskalRebuild1.java b/src/class164/Code01_KruskalRebuild1.java index d4a51d475..831192090 100644 --- a/src/class164/Code01_KruskalRebuild1.java +++ b/src/class164/Code01_KruskalRebuild1.java @@ -3,7 +3,8 @@ // Kruskal重构树模版题,java版 // 图里有n个点,m条无向边,每条边给定边权,图里可能有若干个连通的部分 // 一共有q条查询,每条查询都是如下的格式 -// 查询 x y : 点x到达点y的路途中,最大的边权希望尽量小,打印这个值 +// 查询 x y : 点x和点y希望连通起来,其中的最大边权希望尽量小,打印这个值 +// 如果怎样都无法联通,打印"impossible" // 1 <= n <= 10^5 // 1 <= m <= 3 * 10^5 // 1 <= q <= 10^5 diff --git a/src/class164/Code01_KruskalRebuild2.java b/src/class164/Code01_KruskalRebuild2.java index 0f9c2f75c..391ae08a5 100644 --- a/src/class164/Code01_KruskalRebuild2.java +++ b/src/class164/Code01_KruskalRebuild2.java @@ -3,7 +3,8 @@ // Kruskal重构树模版题,C++版 // 图里有n个点,m条无向边,每条边给定边权,图里可能有若干个连通的部分 // 一共有q条查询,每条查询都是如下的格式 -// 查询 x y : 点x到达点y的路途中,最大的边权希望尽量小,打印这个值 +// 查询 x y : 点x和点y希望连通起来,其中的最大边权希望尽量小,打印这个值 +// 如果怎样都无法联通,打印"impossible" // 1 <= n <= 10^5 // 1 <= m <= 3 * 10^5 // 1 <= q <= 10^5 From 3fa71d99e6a7a15ef8c82859f05cbcbfe6f57b95 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 31 Mar 2025 19:01:47 +0800 Subject: [PATCH 0887/2029] modify code --- src/class164/Code02_Training1.java | 14 ++++++++------ src/class164/Code02_Training2.java | 5 ++--- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/class164/Code02_Training1.java b/src/class164/Code02_Training1.java index 7f10db4f8..bbb1eea0b 100644 --- a/src/class164/Code02_Training1.java +++ b/src/class164/Code02_Training1.java @@ -21,25 +21,27 @@ public class Code02_Training1 { public static int MAXM = 400001; public static int MAXH = 20; public static int n, m, q; - public static int[][] edge = new int[MAXM][4]; + // 每条边的信息,节点u、节点v、边权w、边的编号i + public static int[][] edge = new int[MAXM][4]; // 边的编号对应重构树上的点的编号 public static int[] edgeToTree = new int[MAXM]; + // 并查集 + public static int[] father = new int[MAXK]; + public static int[] stack = new int[MAXK]; + // Kruskal重构树 public static int[] head = new int[MAXK]; public static int[] next = new int[MAXK]; public static int[] to = new int[MAXK]; public static int cntg = 0; - - // 并查集 - public static int[] father = new int[MAXK]; public static int[] nodeKey = new int[MAXK]; - public static int[] stack = new int[MAXK]; public static int cntu; - // 树上dfs + // 树上dfs,Kruskal重构树的节点,子树上面有几个叶节点 public static int[] leafsiz = new int[MAXK]; + // 树上dfs,Kruskal重构树的节点,倍增表 public static int[][] stjump = new int[MAXK][MAXH]; // 并查集的find方法,需要改成迭代版不然会爆栈,C++实现不需要 diff --git a/src/class164/Code02_Training2.java b/src/class164/Code02_Training2.java index 19576388d..2211ff9f3 100644 --- a/src/class164/Code02_Training2.java +++ b/src/class164/Code02_Training2.java @@ -28,15 +28,14 @@ //const int MAXH = 20; //int n, m, q; //Edge edge[MAXM]; -// //int edgeToTree[MAXM]; // +//int father[MAXK]; +// //int head[MAXK]; //int nxt[MAXK]; //int to[MAXK]; //int cntg; -// -//int father[MAXK]; //int nodeKey[MAXK]; //int cntu; // From 2bb4073e910417f5b4f7f2b6f1f5d521357d538e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 31 Mar 2025 20:46:58 +0800 Subject: [PATCH 0888/2029] modify code --- src/class164/Code03_StampRally1.java | 8 ++++---- src/class164/Code03_StampRally2.java | 6 +++--- src/class164/Code04_Journey1.java | 13 +++++++------ src/class164/Code04_Journey2.java | 6 +++--- src/class164/Code05_UntilConnect1.java | 6 +++--- src/class164/Code05_UntilConnect2.java | 6 +++--- src/class164/Code06_GraphQueries1.java | 6 +++--- src/class164/Code06_GraphQueries2.java | 4 ++-- src/class164/Code07_Peaks1.java | 7 +++---- src/class164/Code07_Peaks2.java | 5 ++--- 10 files changed, 33 insertions(+), 34 deletions(-) diff --git a/src/class164/Code03_StampRally1.java b/src/class164/Code03_StampRally1.java index dd6d6da58..15b0cc32b 100644 --- a/src/class164/Code03_StampRally1.java +++ b/src/class164/Code03_StampRally1.java @@ -24,20 +24,20 @@ public class Code03_StampRally1 { public static int n, m, q; public static int[][] edge = new int[MAXM][3]; + // 并查集 + public static int[] father = new int[MAXK]; + // Kruskal重构树 public static int[] head = new int[MAXK]; public static int[] next = new int[MAXK]; public static int[] to = new int[MAXK]; public static int cntg = 0; - - // 并查集 - public static int[] father = new int[MAXK]; public static int[] nodeKey = new int[MAXK]; public static int cntu; // 树上dfs - public static int[][] stjump = new int[MAXK][MAXH]; public static int[] leafsiz = new int[MAXK]; + public static int[][] stjump = new int[MAXK][MAXH]; public static void addEdge(int u, int v) { next[++cntg] = head[u]; diff --git a/src/class164/Code03_StampRally2.java b/src/class164/Code03_StampRally2.java index fa6066571..de890edbe 100644 --- a/src/class164/Code03_StampRally2.java +++ b/src/class164/Code03_StampRally2.java @@ -30,17 +30,17 @@ //int n, m, q; //Edge edge[MAXM]; // +//int father[MAXK]; +// //int head[MAXK]; //int nxt[MAXK]; //int to[MAXK]; //int cntg = 0; -// -//int father[MAXK]; //int nodeKey[MAXK]; //int cntu; // -//int stjump[MAXK][MAXH]; //int leafsiz[MAXK]; +//int stjump[MAXK][MAXH]; // //void addEdge(int u, int v) { // nxt[++cntg] = head[u]; diff --git a/src/class164/Code04_Journey1.java b/src/class164/Code04_Journey1.java index 1b5beb700..9621d5bdc 100644 --- a/src/class164/Code04_Journey1.java +++ b/src/class164/Code04_Journey1.java @@ -40,21 +40,22 @@ public class Code04_Journey1 { public static boolean[] visit = new boolean[MAXN]; public static PriorityQueue heap = new PriorityQueue<>((a, b) -> a[1] - b[1]); + // 并查集 + public static int[] father = new int[MAXK]; + public static int[] stack = new int[MAXK]; + // Kruskal重构树 public static int[] headk = new int[MAXK]; public static int[] nextk = new int[MAXK]; public static int[] tok = new int[MAXK]; public static int cntk; - - // 并查集 - public static int[] father = new int[MAXK]; public static int[] nodeKey = new int[MAXK]; - public static int[] stack = new int[MAXK]; public static int cntu; - // 树上dfs - public static int[][] stjump = new int[MAXK][MAXH]; + // 树上dfs,Kruskal重构树的节点,子树中的所有点,走到1号节点的最小距离 public static int[] mindist = new int[MAXK]; + // 树上dfs,Kruskal重构树的节点,倍增表 + public static int[][] stjump = new int[MAXK][MAXH]; public static void clear() { cntg = cntk = 0; diff --git a/src/class164/Code04_Journey2.java b/src/class164/Code04_Journey2.java index 04db4fe13..e91df1ecd 100644 --- a/src/class164/Code04_Journey2.java +++ b/src/class164/Code04_Journey2.java @@ -53,17 +53,17 @@ //bool visit[MAXN]; //priority_queue, HeapNodeCmp> heap; // +//int father[MAXK]; +// //int headk[MAXK]; //int nextk[MAXK]; //int tok[MAXK]; //int cntk; -// -//int father[MAXK]; //int nodeKey[MAXK]; //int cntu; // -//int stjump[MAXK][MAXH]; //int mindist[MAXK]; +//int stjump[MAXK][MAXH]; // //void clear() { // cntg = 0; diff --git a/src/class164/Code05_UntilConnect1.java b/src/class164/Code05_UntilConnect1.java index 5ae73287e..37b263073 100644 --- a/src/class164/Code05_UntilConnect1.java +++ b/src/class164/Code05_UntilConnect1.java @@ -24,14 +24,14 @@ public class Code05_UntilConnect1 { public static int t, n, m, q; public static int[][] edge = new int[MAXM][3]; + // 并查集 + public static int[] father = new int[MAXK]; + // Kruskal重构树 public static int[] head = new int[MAXK]; public static int[] next = new int[MAXK]; public static int[] to = new int[MAXK]; public static int cntg; - - // 并查集 - public static int[] father = new int[MAXK]; public static int[] nodeKey = new int[MAXK]; public static int cntu; diff --git a/src/class164/Code05_UntilConnect2.java b/src/class164/Code05_UntilConnect2.java index 3887c2462..2fbe9ecd2 100644 --- a/src/class164/Code05_UntilConnect2.java +++ b/src/class164/Code05_UntilConnect2.java @@ -28,14 +28,14 @@ //const int MAXM = 200001; //const int MAXH = 20; //int t, n, m, q; -// //Edge edge[MAXM]; +// +//int father[MAXK]; +// //int head[MAXK]; //int nxt[MAXK]; //int to[MAXK]; //int cntg; -// -//int father[MAXK]; //int nodeKey[MAXK]; //int cntu; // diff --git a/src/class164/Code06_GraphQueries1.java b/src/class164/Code06_GraphQueries1.java index c134c78cf..32eb42d7c 100644 --- a/src/class164/Code06_GraphQueries1.java +++ b/src/class164/Code06_GraphQueries1.java @@ -32,14 +32,14 @@ public class Code06_GraphQueries1 { public static int[][] ques = new int[MAXQ][2]; public static int[] timeline = new int[MAXQ]; + // 并查集 + public static int[] father = new int[MAXK]; + // Kruskal重构树 public static int[] head = new int[MAXK]; public static int[] next = new int[MAXK]; public static int[] to = new int[MAXK]; public static int cntg = 0; - - // 并查集 - public static int[] father = new int[MAXK]; public static int[] nodeKey = new int[MAXK]; public static int cntu; diff --git a/src/class164/Code06_GraphQueries2.java b/src/class164/Code06_GraphQueries2.java index b9c894572..6f0a61c41 100644 --- a/src/class164/Code06_GraphQueries2.java +++ b/src/class164/Code06_GraphQueries2.java @@ -37,12 +37,12 @@ //int ques[MAXQ][2]; //int timeline[MAXQ]; // +//int father[MAXK]; +// //int head[MAXK]; //int nxt[MAXK]; //int to[MAXK]; //int cntg; -// -//int father[MAXK]; //int nodeKey[MAXK]; //int cntu; // diff --git a/src/class164/Code07_Peaks1.java b/src/class164/Code07_Peaks1.java index 13ccfb707..658d82fa2 100644 --- a/src/class164/Code07_Peaks1.java +++ b/src/class164/Code07_Peaks1.java @@ -33,17 +33,16 @@ public class Code07_Peaks1 { public static int[] node = new int[MAXN]; public static int[] sorted = new int[MAXN]; public static int diff; - public static int[][] edge = new int[MAXM][3]; + // 并查集 + public static int[] father = new int[MAXK]; + // Kruskal重构树 public static int[] head = new int[MAXK]; public static int[] next = new int[MAXK]; public static int[] to = new int[MAXK]; public static int cntg = 0; - - // 并查集 - public static int[] father = new int[MAXK]; public static int[] nodeKey = new int[MAXK]; public static int cntu; diff --git a/src/class164/Code07_Peaks2.java b/src/class164/Code07_Peaks2.java index d2cb70750..0de136e37 100644 --- a/src/class164/Code07_Peaks2.java +++ b/src/class164/Code07_Peaks2.java @@ -34,15 +34,14 @@ //int node[MAXN]; //int sorted[MAXN]; //int diff; -// //Edge edge[MAXM]; // +//int father[MAXK]; +// //int head[MAXK]; //int nxt[MAXK]; //int to[MAXK]; //int cntg; -// -//int father[MAXK]; //int nodeKey[MAXK]; //int cntu; // From 41e426433620c045a303f938c340f2396f1d9965 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 31 Mar 2025 21:18:09 +0800 Subject: [PATCH 0889/2029] modify code --- src/class164/Code03_StampRally1.java | 2 +- src/class164/Code03_StampRally2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class164/Code03_StampRally1.java b/src/class164/Code03_StampRally1.java index 15b0cc32b..8b025bed1 100644 --- a/src/class164/Code03_StampRally1.java +++ b/src/class164/Code03_StampRally1.java @@ -7,6 +7,7 @@ // 每个点可以重复经过,但是重复经过只计算一次 // 经过边的最大编号,最小是多少 // 3 <= n、m、q <= 10^5 +// 3 <= z <= n // 测试链接 : https://www.luogu.com.cn/problem/AT_agc002_d // 测试链接 : https://atcoder.jp/contests/agc002/tasks/agc002_d // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -23,7 +24,6 @@ public class Code03_StampRally1 { public static int MAXH = 20; public static int n, m, q; public static int[][] edge = new int[MAXM][3]; - // 并查集 public static int[] father = new int[MAXK]; diff --git a/src/class164/Code03_StampRally2.java b/src/class164/Code03_StampRally2.java index de890edbe..c269b243a 100644 --- a/src/class164/Code03_StampRally2.java +++ b/src/class164/Code03_StampRally2.java @@ -7,6 +7,7 @@ // 每个点可以重复经过,但是重复经过只计算一次 // 经过边的最大编号,最小是多少 // 3 <= n、m、q <= 10^5 +// 3 <= z <= n // 测试链接 : https://www.luogu.com.cn/problem/AT_agc002_d // 测试链接 : https://atcoder.jp/contests/agc002/tasks/agc002_d // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 @@ -29,7 +30,6 @@ //const int MAXH = 20; //int n, m, q; //Edge edge[MAXM]; -// //int father[MAXK]; // //int head[MAXK]; From 76b420f4fc1e0d3acb8bd3b417c9c5e01dcd9c67 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 31 Mar 2025 21:59:37 +0800 Subject: [PATCH 0890/2029] modify code --- src/class164/Code05_UntilConnect1.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/class164/Code05_UntilConnect1.java b/src/class164/Code05_UntilConnect1.java index 37b263073..9c9b1a7a3 100644 --- a/src/class164/Code05_UntilConnect1.java +++ b/src/class164/Code05_UntilConnect1.java @@ -35,11 +35,15 @@ public class Code05_UntilConnect1 { public static int[] nodeKey = new int[MAXK]; public static int cntu; - // 树上dfs + // 树上dfs,Kruskal重构树的节点,深度 public static int[] dep = new int[MAXK]; + // 树上dfs,Kruskal重构树的节点,dfn序 public static int[] dfn = new int[MAXK]; + // 树上dfs,seg[i] = j,代表dfn序号为i的节点,对应的原始节点编号为j public static int[] seg = new int[MAXK]; + // 树上dfs,Kruskal重构树的节点,倍增表 public static int[][] stjump = new int[MAXK][MAXH]; + // 树上dfs,dfn序号的计数 public static int cntd; // 倍增表查询区间最大值、最小值 @@ -97,6 +101,7 @@ public static void dfs(int u, int fa) { } } + // 构建数组上的st表,讲解117进行了详细的讲述 public static void buildst() { lg2[0] = -1; for (int i = 1; i <= n; i++) { @@ -112,12 +117,14 @@ public static void buildst() { } } + // 根据st表,[l..r]范围上的最小值,讲解117进行了详细的讲述 public static int dfnmin(int l, int r) { int p = lg2[r - l + 1]; int ans = Math.min(stmin[l][p], stmin[r - (1 << p) + 1][p]); return ans; } + // 根据st表,[l..r]范围上的最大值,讲解117进行了详细的讲述 public static int dfnmax(int l, int r) { int p = lg2[r - l + 1]; int ans = Math.max(stmax[l][p], stmax[r - (1 << p) + 1][p]); From 0b1c0e58f9d026eaea45e7df04bad8aa49e4fa12 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 31 Mar 2025 22:03:05 +0800 Subject: [PATCH 0891/2029] modify code --- src/class164/Code05_UntilConnect1.java | 2 +- src/class164/Code05_UntilConnect2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class164/Code05_UntilConnect1.java b/src/class164/Code05_UntilConnect1.java index 9c9b1a7a3..62e22ca14 100644 --- a/src/class164/Code05_UntilConnect1.java +++ b/src/class164/Code05_UntilConnect1.java @@ -1,7 +1,7 @@ package class164; // 加边直到连通,java版 -// 图里有n个点,m条无向边,所有点都连通 +// 图里有n个点,m条无向边,点的编号1~n,边的编号1~m,所有点都连通 // 一共有q条查询,每条查询格式如下 // 查询 l r : 至少要加完编号前多少的边,才能使得[l, r]中的所有点连通 // 1 <= n <= 10^5 diff --git a/src/class164/Code05_UntilConnect2.java b/src/class164/Code05_UntilConnect2.java index 2fbe9ecd2..43932c98d 100644 --- a/src/class164/Code05_UntilConnect2.java +++ b/src/class164/Code05_UntilConnect2.java @@ -1,7 +1,7 @@ package class164; // 加边直到连通,C++版 -// 图里有n个点,m条无向边,所有点都连通 +// 图里有n个点,m条无向边,点的编号1~n,边的编号1~m,所有点都连通 // 一共有q条查询,每条查询格式如下 // 查询 l r : 至少要加完编号前多少的边,才能使得[l, r]中的所有点连通 // 1 <= n <= 10^5 From 73fb0a4640862b507ff3f228c0125e591926a12f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 31 Mar 2025 22:09:29 +0800 Subject: [PATCH 0892/2029] modify code --- src/class164/Code05_UntilConnect1.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/class164/Code05_UntilConnect1.java b/src/class164/Code05_UntilConnect1.java index 62e22ca14..accb9dc00 100644 --- a/src/class164/Code05_UntilConnect1.java +++ b/src/class164/Code05_UntilConnect1.java @@ -35,18 +35,18 @@ public class Code05_UntilConnect1 { public static int[] nodeKey = new int[MAXK]; public static int cntu; - // 树上dfs,Kruskal重构树的节点,深度 + // 深度 public static int[] dep = new int[MAXK]; - // 树上dfs,Kruskal重构树的节点,dfn序 + // dfn序 public static int[] dfn = new int[MAXK]; - // 树上dfs,seg[i] = j,代表dfn序号为i的节点,对应的原始节点编号为j + // seg[i] = j,代表树上节点的dfn序号为i,对应原始节点的编号为j public static int[] seg = new int[MAXK]; - // 树上dfs,Kruskal重构树的节点,倍增表 + // 树上的倍增表 public static int[][] stjump = new int[MAXK][MAXH]; - // 树上dfs,dfn序号的计数 + // dfn序号的计数 public static int cntd; - // 倍增表查询区间最大值、最小值 + // 一维数组的倍增表,查询区间最大值、最小值 public static int[] lg2 = new int[MAXN]; public static int[][] stmax = new int[MAXN][MAXH]; public static int[][] stmin = new int[MAXN][MAXH]; From 5623018cdc89db20a7aaae06f8d605df28c6b340 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 1 Apr 2025 12:14:50 +0800 Subject: [PATCH 0893/2029] modify code --- src/class164/Code06_GraphQueries1.java | 57 +++++++++++--------------- src/class164/Code06_GraphQueries2.java | 51 ++++++++++------------- 2 files changed, 46 insertions(+), 62 deletions(-) diff --git a/src/class164/Code06_GraphQueries1.java b/src/class164/Code06_GraphQueries1.java index 32eb42d7c..05f967191 100644 --- a/src/class164/Code06_GraphQueries1.java +++ b/src/class164/Code06_GraphQueries1.java @@ -26,11 +26,12 @@ public class Code06_GraphQueries1 { public static int INF = 1000000001; public static int n, m, q; - // 根据删除操作,给每条边设置边权,给查询操作设置时间线 + // 所有节点的值 public static int[] node = new int[MAXN]; + // 所有边,根据删除操作,设置每条边的权值 public static int[][] edge = new int[MAXM][3]; + // 所有操作 public static int[][] ques = new int[MAXQ][2]; - public static int[] timeline = new int[MAXQ]; // 并查集 public static int[] father = new int[MAXK]; @@ -50,13 +51,9 @@ public class Code06_GraphQueries1 { public static int[] leafseg = new int[MAXK]; public static int cntd = 0; - // 线段树维护dfn区间的最大值、最大值来自哪个dfn编号 - public static int[] maxval = new int[MAXN << 2]; + // 线段树维护最大值来自哪个dfn编号 public static int[] maxdfn = new int[MAXN << 2]; - public static int ansMax; - public static int updateDfn; - public static void prepare() { for (int i = 1; i <= q; i++) { if (ques[i][0] == 2) { @@ -70,9 +67,7 @@ public static void prepare() { } } for (int i = q; i >= 1; i--) { - if (ques[i][0] == 1) { - timeline[i] = time; - } else { + if (ques[i][0] == 2) { edge[ques[i][1]][2] = ++time; } } @@ -144,18 +139,15 @@ public static int getAncestor(int u, int limit) { public static void up(int i) { int l = i << 1; int r = i << 1 | 1; - if (maxval[l] > maxval[r]) { - maxval[i] = maxval[l]; + if (node[leafseg[maxdfn[l]]] > node[leafseg[maxdfn[r]]]) { maxdfn[i] = maxdfn[l]; } else { - maxval[i] = maxval[r]; maxdfn[i] = maxdfn[r]; } } public static void build(int l, int r, int i) { if (l == r) { - maxval[i] = node[leafseg[l]]; maxdfn[i] = l; } else { int mid = (l + r) / 2; @@ -167,7 +159,7 @@ public static void build(int l, int r, int i) { public static void update(int jobi, int jobv, int l, int r, int i) { if (l == r) { - maxval[i] = jobv; + node[leafseg[jobi]] = jobv; } else { int mid = (l + r) / 2; if (jobi <= mid) { @@ -179,23 +171,22 @@ public static void update(int jobi, int jobv, int l, int r, int i) { } } - public static void updateAns(int curmax, int curdfn) { - if (ansMax < curmax) { - ansMax = curmax; - updateDfn = curdfn; - } - } - - public static void queryMax(int jobl, int jobr, int l, int r, int i) { + public static int queryMaxDfn(int jobl, int jobr, int l, int r, int i) { if (jobl <= l && r <= jobr) { - updateAns(maxval[i], maxdfn[i]); + return maxdfn[i]; } else { int mid = (l + r) / 2; + int ldfn = 0, rdfn = 0; if (jobl <= mid) { - queryMax(jobl, jobr, l, mid, i << 1); + ldfn = queryMaxDfn(jobl, jobr, l, mid, i << 1); } if (jobr > mid) { - queryMax(jobl, jobr, mid + 1, r, i << 1 | 1); + rdfn = queryMaxDfn(jobl, jobr, mid + 1, r, i << 1 | 1); + } + if (node[leafseg[ldfn]] > node[leafseg[rdfn]]) { + return ldfn; + } else { + return rdfn; } } } @@ -225,13 +216,15 @@ public static void main(String[] args) { } } build(1, n, 1); - for (int i = 1, anc; i <= q; i++) { + int limit = m, anc, ansDfn; + for (int i = 1; i <= q; i++) { if (ques[i][0] == 1) { - anc = getAncestor(ques[i][1], timeline[i]); - ansMax = -INF; - queryMax(leafstart[anc], leafstart[anc] + leafsiz[anc] - 1, 1, n, 1); - io.writelnInt(ansMax); - update(updateDfn, 0, 1, n, 1); + anc = getAncestor(ques[i][1], limit); + ansDfn = queryMaxDfn(leafstart[anc], leafstart[anc] + leafsiz[anc] - 1, 1, n, 1); + io.writelnInt(node[leafseg[ansDfn]]); + update(ansDfn, 0, 1, n, 1); + } else { + limit--; } } io.flush(); diff --git a/src/class164/Code06_GraphQueries2.java b/src/class164/Code06_GraphQueries2.java index 6f0a61c41..f7e539f69 100644 --- a/src/class164/Code06_GraphQueries2.java +++ b/src/class164/Code06_GraphQueries2.java @@ -35,7 +35,6 @@ //int node[MAXN]; //Edge edge[MAXM]; //int ques[MAXQ][2]; -//int timeline[MAXQ]; // //int father[MAXK]; // @@ -52,12 +51,8 @@ //int leafseg[MAXK]; //int cntd; // -//int maxval[MAXN << 2]; //int maxdfn[MAXN << 2]; // -//int ansMax; -//int updateDfn; -// //void prepare() { // for (int i = 1; i <= q; i++) { // if (ques[i][0] == 2) { @@ -71,9 +66,7 @@ // } // } // for (int i = q; i >= 1; i--) { -// if (ques[i][0] == 1) { -// timeline[i] = time; -// } else { +// if (ques[i][0] == 2) { // edge[ques[i][1]].w = ++time; // } // } @@ -145,18 +138,15 @@ //void up(int i) { // int l = i << 1; // int r = i << 1 | 1; -// if (maxval[l] > maxval[r]) { -// maxval[i] = maxval[l]; +// if (node[leafseg[maxdfn[l]]] > node[leafseg[maxdfn[r]]]) { // maxdfn[i] = maxdfn[l]; // } else { -// maxval[i] = maxval[r]; // maxdfn[i] = maxdfn[r]; // } //} // //void build(int l, int r, int i) { // if (l == r) { -// maxval[i] = node[leafseg[l]]; // maxdfn[i] = l; // } else { // int mid = (l + r) / 2; @@ -168,7 +158,7 @@ // //void update(int jobi, int jobv, int l, int r, int i) { // if (l == r) { -// maxval[i] = jobv; +// node[leafseg[jobi]] = jobv; // } else { // int mid = (l + r) / 2; // if (jobi <= mid) { @@ -180,23 +170,22 @@ // } //} // -//void updateAns(int curmax, int curdfn) { -// if (ansMax < curmax) { -// ansMax = curmax; -// updateDfn = curdfn; -// } -//} -// -//void queryMax(int jobl, int jobr, int l, int r, int i) { +//int queryMaxDfn(int jobl, int jobr, int l, int r, int i) { // if (jobl <= l && r <= jobr) { -// updateAns(maxval[i], maxdfn[i]); +// return maxdfn[i]; // } else { // int mid = (l + r) / 2; +// int ldfn = 0, rdfn = 0; // if (jobl <= mid) { -// queryMax(jobl, jobr, l, mid, i << 1); +// ldfn = queryMaxDfn(jobl, jobr, l, mid, i << 1); // } // if (jobr > mid) { -// queryMax(jobl, jobr, mid + 1, r, i << 1 | 1); +// rdfn = queryMaxDfn(jobl, jobr, mid + 1, r, i << 1 | 1); +// } +// if (node[leafseg[ldfn]] > node[leafseg[rdfn]]) { +// return ldfn; +// } else { +// return rdfn; // } // } //} @@ -223,13 +212,15 @@ // } // } // build(1, n, 1); -// for (int i = 1, anc; i <= q; i++) { +// int limit = m, anc, ansDfn; +// for (int i = 1; i <= q; i++) { // if (ques[i][0] == 1) { -// anc = getAncestor(ques[i][1], timeline[i]); -// ansMax = -INF; -// queryMax(leafstart[anc], leafstart[anc] + leafsiz[anc] - 1, 1, n, 1); -// cout << ansMax << "\n"; -// update(updateDfn, 0, 1, n, 1); +// anc = getAncestor(ques[i][1], limit); +// ansDfn = queryMaxDfn(leafstart[anc], leafstart[anc] + leafsiz[anc] - 1, 1, n, 1); +// cout << node[leafseg[ansDfn]] << "\n"; +// update(ansDfn, 0, 1, n, 1); +// } else { +// limit--; // } // } // return 0; From 6e4f50377b1cb016892444c04c4ca5994f51eccb Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 1 Apr 2025 12:16:08 +0800 Subject: [PATCH 0894/2029] modify code --- src/class164/Code06_GraphQueries1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class164/Code06_GraphQueries1.java b/src/class164/Code06_GraphQueries1.java index 05f967191..f04c752b3 100644 --- a/src/class164/Code06_GraphQueries1.java +++ b/src/class164/Code06_GraphQueries1.java @@ -26,7 +26,7 @@ public class Code06_GraphQueries1 { public static int INF = 1000000001; public static int n, m, q; - // 所有节点的值 + // 所有节点的值,需要记录,线段树也要使用 public static int[] node = new int[MAXN]; // 所有边,根据删除操作,设置每条边的权值 public static int[][] edge = new int[MAXM][3]; From fe3fe32ef5392e891a5c472f9956f01a1834bba0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 1 Apr 2025 14:37:28 +0800 Subject: [PATCH 0895/2029] modify code --- src/class164/Code06_GraphQueries1.java | 52 +++++++++++++++----------- src/class164/Code06_GraphQueries2.java | 42 +++++++++++---------- 2 files changed, 54 insertions(+), 40 deletions(-) diff --git a/src/class164/Code06_GraphQueries1.java b/src/class164/Code06_GraphQueries1.java index f04c752b3..7c941f849 100644 --- a/src/class164/Code06_GraphQueries1.java +++ b/src/class164/Code06_GraphQueries1.java @@ -23,7 +23,6 @@ public class Code06_GraphQueries1 { public static int MAXM = 300001; public static int MAXQ = 500001; public static int MAXH = 20; - public static int INF = 1000000001; public static int n, m, q; // 所有节点的值,需要记录,线段树也要使用 @@ -44,15 +43,19 @@ public class Code06_GraphQueries1 { public static int[] nodeKey = new int[MAXK]; public static int cntu; - // 树上dfs + // 倍增表 public static int[][] stjump = new int[MAXK][MAXH]; + // 子树上的叶节点个数 public static int[] leafsiz = new int[MAXK]; - public static int[] leafstart = new int[MAXK]; + // 子树上叶节点的dfn序号最小值 + public static int[] leafDfnMin = new int[MAXK]; + // leafseg[i] = j,表示dfn序号为i的叶节点,原始编号为j public static int[] leafseg = new int[MAXK]; + // dfn的计数 public static int cntd = 0; - // 线段树维护最大值来自哪个dfn编号 - public static int[] maxdfn = new int[MAXN << 2]; + // 线段树的下标是dfn序号,维护范围内,拥有节点最大值的dfn序号 + public static int[] maxValueDfn = new int[MAXN << 2]; public static void prepare() { for (int i = 1; i <= q; i++) { @@ -115,15 +118,15 @@ public static void dfs(int u, int fa) { } if (u <= n) { leafsiz[u] = 1; - leafstart[u] = ++cntd; + leafDfnMin[u] = ++cntd; leafseg[cntd] = u; } else { leafsiz[u] = 0; - leafstart[u] = INF; + leafDfnMin[u] = n + 1; } for (int e = head[u]; e > 0; e = next[e]) { leafsiz[u] += leafsiz[to[e]]; - leafstart[u] = Math.min(leafstart[u], leafstart[to[e]]); + leafDfnMin[u] = Math.min(leafDfnMin[u], leafDfnMin[to[e]]); } } @@ -139,16 +142,16 @@ public static int getAncestor(int u, int limit) { public static void up(int i) { int l = i << 1; int r = i << 1 | 1; - if (node[leafseg[maxdfn[l]]] > node[leafseg[maxdfn[r]]]) { - maxdfn[i] = maxdfn[l]; + if (node[leafseg[maxValueDfn[l]]] > node[leafseg[maxValueDfn[r]]]) { + maxValueDfn[i] = maxValueDfn[l]; } else { - maxdfn[i] = maxdfn[r]; + maxValueDfn[i] = maxValueDfn[r]; } } public static void build(int l, int r, int i) { if (l == r) { - maxdfn[i] = l; + maxValueDfn[i] = l; } else { int mid = (l + r) / 2; build(l, mid, i << 1); @@ -157,6 +160,7 @@ public static void build(int l, int r, int i) { } } + // dfn序号为jobi,节点值更新成jobv public static void update(int jobi, int jobv, int l, int r, int i) { if (l == r) { node[leafseg[jobi]] = jobv; @@ -171,17 +175,18 @@ public static void update(int jobi, int jobv, int l, int r, int i) { } } - public static int queryMaxDfn(int jobl, int jobr, int l, int r, int i) { + // dfn范围[jobl..jobr],哪个节点拥有最大值,返回该节点的dfn序号 + public static int query(int jobl, int jobr, int l, int r, int i) { if (jobl <= l && r <= jobr) { - return maxdfn[i]; + return maxValueDfn[i]; } else { int mid = (l + r) / 2; int ldfn = 0, rdfn = 0; if (jobl <= mid) { - ldfn = queryMaxDfn(jobl, jobr, l, mid, i << 1); + ldfn = query(jobl, jobr, l, mid, i << 1); } if (jobr > mid) { - rdfn = queryMaxDfn(jobl, jobr, mid + 1, r, i << 1 | 1); + rdfn = query(jobl, jobr, mid + 1, r, i << 1 | 1); } if (node[leafseg[ldfn]] > node[leafseg[rdfn]]) { return ldfn; @@ -191,6 +196,14 @@ public static int queryMaxDfn(int jobl, int jobr, int l, int r, int i) { } } + public static int queryAndUpdate(int x, int limit) { + int anc = getAncestor(x, limit); + int dfn = query(leafDfnMin[anc], leafDfnMin[anc] + leafsiz[anc] - 1, 1, n, 1); + int ans = node[leafseg[dfn]]; + update(dfn, 0, 1, n, 1); + return ans; + } + public static void main(String[] args) { FastIO io = new FastIO(System.in, System.out); n = io.nextInt(); @@ -216,13 +229,10 @@ public static void main(String[] args) { } } build(1, n, 1); - int limit = m, anc, ansDfn; + int limit = m; for (int i = 1; i <= q; i++) { if (ques[i][0] == 1) { - anc = getAncestor(ques[i][1], limit); - ansDfn = queryMaxDfn(leafstart[anc], leafstart[anc] + leafsiz[anc] - 1, 1, n, 1); - io.writelnInt(node[leafseg[ansDfn]]); - update(ansDfn, 0, 1, n, 1); + io.writelnInt(queryAndUpdate(ques[i][1], limit)); } else { limit--; } diff --git a/src/class164/Code06_GraphQueries2.java b/src/class164/Code06_GraphQueries2.java index f7e539f69..5de91b5f7 100644 --- a/src/class164/Code06_GraphQueries2.java +++ b/src/class164/Code06_GraphQueries2.java @@ -29,7 +29,6 @@ //const int MAXM = 300001; //const int MAXQ = 500001; //const int MAXH = 20; -//int INF = 1000000001; //int n, m, q; // //int node[MAXN]; @@ -47,11 +46,11 @@ // //int stjump[MAXK][MAXH]; //int leafsiz[MAXK]; -//int leafstart[MAXK]; +//int leafDfnMin[MAXK]; //int leafseg[MAXK]; //int cntd; // -//int maxdfn[MAXN << 2]; +//int maxValueDfn[MAXN << 2]; // //void prepare() { // for (int i = 1; i <= q; i++) { @@ -114,15 +113,15 @@ // } // if (u <= n) { // leafsiz[u] = 1; -// leafstart[u] = ++cntd; +// leafDfnMin[u] = ++cntd; // leafseg[cntd] = u; // } else { // leafsiz[u] = 0; -// leafstart[u] = INF; +// leafDfnMin[u] = n + 1; // } // for (int e = head[u]; e > 0; e = nxt[e]) { // leafsiz[u] += leafsiz[to[e]]; -// leafstart[u] = min(leafstart[u], leafstart[to[e]]); +// leafDfnMin[u] = min(leafDfnMin[u], leafDfnMin[to[e]]); // } //} // @@ -138,16 +137,16 @@ //void up(int i) { // int l = i << 1; // int r = i << 1 | 1; -// if (node[leafseg[maxdfn[l]]] > node[leafseg[maxdfn[r]]]) { -// maxdfn[i] = maxdfn[l]; +// if (node[leafseg[maxValueDfn[l]]] > node[leafseg[maxValueDfn[r]]]) { +// maxValueDfn[i] = maxValueDfn[l]; // } else { -// maxdfn[i] = maxdfn[r]; +// maxValueDfn[i] = maxValueDfn[r]; // } //} // //void build(int l, int r, int i) { // if (l == r) { -// maxdfn[i] = l; +// maxValueDfn[i] = l; // } else { // int mid = (l + r) / 2; // build(l, mid, i << 1); @@ -170,17 +169,17 @@ // } //} // -//int queryMaxDfn(int jobl, int jobr, int l, int r, int i) { +//int query(int jobl, int jobr, int l, int r, int i) { // if (jobl <= l && r <= jobr) { -// return maxdfn[i]; +// return maxValueDfn[i]; // } else { // int mid = (l + r) / 2; // int ldfn = 0, rdfn = 0; // if (jobl <= mid) { -// ldfn = queryMaxDfn(jobl, jobr, l, mid, i << 1); +// ldfn = query(jobl, jobr, l, mid, i << 1); // } // if (jobr > mid) { -// rdfn = queryMaxDfn(jobl, jobr, mid + 1, r, i << 1 | 1); +// rdfn = query(jobl, jobr, mid + 1, r, i << 1 | 1); // } // if (node[leafseg[ldfn]] > node[leafseg[rdfn]]) { // return ldfn; @@ -190,6 +189,14 @@ // } //} // +//int queryAndUpdate(int x, int limit) { +// int anc = getAncestor(x, limit); +// int dfn = query(leafDfnMin[anc], leafDfnMin[anc] + leafsiz[anc] - 1, 1, n, 1); +// int ans = node[leafseg[dfn]]; +// update(dfn, 0, 1, n, 1); +// return ans; +//} +// //int main() { // ios::sync_with_stdio(false); // cin.tie(nullptr); @@ -212,13 +219,10 @@ // } // } // build(1, n, 1); -// int limit = m, anc, ansDfn; +// int limit = m; // for (int i = 1; i <= q; i++) { // if (ques[i][0] == 1) { -// anc = getAncestor(ques[i][1], limit); -// ansDfn = queryMaxDfn(leafstart[anc], leafstart[anc] + leafsiz[anc] - 1, 1, n, 1); -// cout << node[leafseg[ansDfn]] << "\n"; -// update(ansDfn, 0, 1, n, 1); +// cout << queryAndUpdate(ques[i][1], limit) << "\n"; // } else { // limit--; // } From acb4fd0189c3a2e96b0731916a9becf75a2b4951 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 1 Apr 2025 14:42:22 +0800 Subject: [PATCH 0896/2029] modify code --- src/class164/Code07_Peaks1.java | 8 ++++---- src/class164/Code07_Peaks2.java | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/class164/Code07_Peaks1.java b/src/class164/Code07_Peaks1.java index 658d82fa2..9500870f1 100644 --- a/src/class164/Code07_Peaks1.java +++ b/src/class164/Code07_Peaks1.java @@ -57,7 +57,7 @@ public class Code07_Peaks1 { public static int[] root = new int[MAXK]; public static int[] ls = new int[MAXT]; public static int[] rs = new int[MAXT]; - public static int[] segsiz = new int[MAXT]; + public static int[] numcnt = new int[MAXT]; public static int cntt = 0; public static int kth(int num) { @@ -142,7 +142,7 @@ public static void dfs(int u, int fa) { public static int build(int l, int r) { int rt = ++cntt; - segsiz[rt] = 0; + numcnt[rt] = 0; if (l < r) { int mid = (l + r) / 2; ls[rt] = build(l, mid); @@ -155,7 +155,7 @@ public static int insert(int jobi, int l, int r, int i) { int rt = ++cntt; ls[rt] = ls[i]; rs[rt] = rs[i]; - segsiz[rt] = segsiz[i] + 1; + numcnt[rt] = numcnt[i] + 1; if (l < r) { int mid = (l + r) / 2; if (jobi <= mid) { @@ -171,7 +171,7 @@ public static int query(int jobk, int l, int r, int pre, int post) { if (l == r) { return l; } - int rsize = segsiz[rs[post]] - segsiz[rs[pre]]; + int rsize = numcnt[rs[post]] - numcnt[rs[pre]]; int mid = (l + r) / 2; if (rsize >= jobk) { return query(jobk, mid + 1, r, rs[pre], rs[post]); diff --git a/src/class164/Code07_Peaks2.java b/src/class164/Code07_Peaks2.java index 0de136e37..998e76ba2 100644 --- a/src/class164/Code07_Peaks2.java +++ b/src/class164/Code07_Peaks2.java @@ -54,7 +54,7 @@ //int root[MAXK]; //int ls[MAXT]; //int rs[MAXT]; -//int segsiz[MAXT]; +//int numcnt[MAXT]; //int cntt; // //int kth(int num) { @@ -139,7 +139,7 @@ // //int build(int l, int r) { // int rt = ++cntt; -// segsiz[rt] = 0; +// numcnt[rt] = 0; // if (l < r) { // int mid = (l + r) / 2; // ls[rt] = build(l, mid); @@ -152,7 +152,7 @@ // int rt = ++cntt; // ls[rt] = ls[i]; // rs[rt] = rs[i]; -// segsiz[rt] = segsiz[i] + 1; +// numcnt[rt] = numcnt[i] + 1; // if (l < r) { // int mid = (l + r) / 2; // if (jobi <= mid) { @@ -169,7 +169,7 @@ // return l; // } // int mid = (l + r) / 2; -// int rsize = segsiz[ rs[post] ] - segsiz[ rs[pre] ]; +// int rsize = numcnt[ rs[post] ] - numcnt[ rs[pre] ]; // if (rsize >= jobk) { // return query(jobk, mid + 1, r, rs[pre], rs[post]); // } else { From 77f464541d1606acf7143f13e8ec3cda058af9e6 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 1 Apr 2025 14:48:13 +0800 Subject: [PATCH 0897/2029] modify code --- src/class164/Code07_Peaks1.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/class164/Code07_Peaks1.java b/src/class164/Code07_Peaks1.java index 9500870f1..4c5e6c916 100644 --- a/src/class164/Code07_Peaks1.java +++ b/src/class164/Code07_Peaks1.java @@ -46,14 +46,20 @@ public class Code07_Peaks1 { public static int[] nodeKey = new int[MAXK]; public static int cntu; - // 树上dfs + // 节点dfn序号 public static int[] dfn = new int[MAXK]; + // seg[i] = j,代表dfn序号为i的节点,是原始编号为j的节点 public static int[] seg = new int[MAXK]; + // 倍增表 public static int[][] stjump = new int[MAXK][MAXH]; + // 子树大小 public static int[] siz = new int[MAXK]; + // dfn计数 public static int cntd = 0; // 可持久化线段树 + // 线段树的下标为某个数字,所以是值域线段树 + // 数值范围[l..r]上,一共有几个数字,就是numcnt的含义 public static int[] root = new int[MAXK]; public static int[] ls = new int[MAXT]; public static int[] rs = new int[MAXT]; From a5130113f1be6fb223de40662675468c64c7162b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 1 Apr 2025 15:05:33 +0800 Subject: [PATCH 0898/2029] modify code --- src/class164/Code06_GraphQueries1.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/class164/Code06_GraphQueries1.java b/src/class164/Code06_GraphQueries1.java index 7c941f849..83771ea7f 100644 --- a/src/class164/Code06_GraphQueries1.java +++ b/src/class164/Code06_GraphQueries1.java @@ -25,11 +25,11 @@ public class Code06_GraphQueries1 { public static int MAXH = 20; public static int n, m, q; - // 所有节点的值,需要记录,线段树也要使用 + // 节点值的数组,需要记录,线段树也要使用 public static int[] node = new int[MAXN]; - // 所有边,根据删除操作,设置每条边的权值 + // 所有边的数组,逆序处理删除操作,设置每条边的权值 public static int[][] edge = new int[MAXM][3]; - // 所有操作 + // 记录所有操作 public static int[][] ques = new int[MAXQ][2]; // 并查集 From 0c6123ce640718a8128aacdcdcbb33267f4faed2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 1 Apr 2025 15:09:28 +0800 Subject: [PATCH 0899/2029] modify code --- src/class164/Code06_GraphQueries1.java | 6 +++--- src/class164/Code06_GraphQueries2.java | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/class164/Code06_GraphQueries1.java b/src/class164/Code06_GraphQueries1.java index 83771ea7f..506d9305b 100644 --- a/src/class164/Code06_GraphQueries1.java +++ b/src/class164/Code06_GraphQueries1.java @@ -63,15 +63,15 @@ public static void prepare() { edge[ques[i][1]][2] = -1; } } - int time = 0; + int weight = 0; for (int i = 1; i <= m; i++) { if (edge[i][2] != -1) { - edge[i][2] = ++time; + edge[i][2] = ++weight; } } for (int i = q; i >= 1; i--) { if (ques[i][0] == 2) { - edge[ques[i][1]][2] = ++time; + edge[ques[i][1]][2] = ++weight; } } } diff --git a/src/class164/Code06_GraphQueries2.java b/src/class164/Code06_GraphQueries2.java index 5de91b5f7..dfd6fe193 100644 --- a/src/class164/Code06_GraphQueries2.java +++ b/src/class164/Code06_GraphQueries2.java @@ -58,15 +58,15 @@ // edge[ques[i][1]].w = -1; // } // } -// int time = 0; +// int weight = 0; // for (int i = 1; i <= m; i++) { // if (edge[i].w != -1) { -// edge[i].w = ++time; +// edge[i].w = ++weight; // } // } // for (int i = q; i >= 1; i--) { // if (ques[i][0] == 2) { -// edge[ques[i][1]].w = ++time; +// edge[ques[i][1]].w = ++weight; // } // } //} From 45eb116b3a3c01793ce45c0ca09cdc822dfc3988 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 1 Apr 2025 17:03:14 +0800 Subject: [PATCH 0900/2029] modify code --- src/class164/Code06_GraphQueries1.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/class164/Code06_GraphQueries1.java b/src/class164/Code06_GraphQueries1.java index 506d9305b..8f524ad70 100644 --- a/src/class164/Code06_GraphQueries1.java +++ b/src/class164/Code06_GraphQueries1.java @@ -54,7 +54,7 @@ public class Code06_GraphQueries1 { // dfn的计数 public static int cntd = 0; - // 线段树的下标是dfn序号,维护范围内,拥有节点最大值的dfn序号 + // 线段树的下标是dfn序号,维护范围内,拥有最大点权的dfn序号 public static int[] maxValueDfn = new int[MAXN << 2]; public static void prepare() { @@ -160,7 +160,7 @@ public static void build(int l, int r, int i) { } } - // dfn序号为jobi,节点值更新成jobv + // dfn序号为jobi,点权更新成jobv public static void update(int jobi, int jobv, int l, int r, int i) { if (l == r) { node[leafseg[jobi]] = jobv; @@ -175,7 +175,7 @@ public static void update(int jobi, int jobv, int l, int r, int i) { } } - // dfn范围[jobl..jobr],哪个节点拥有最大值,返回该节点的dfn序号 + // dfn范围[jobl..jobr],哪个节点拥有最大点权,返回该节点的dfn序号 public static int query(int jobl, int jobr, int l, int r, int i) { if (jobl <= l && r <= jobr) { return maxValueDfn[i]; From e652793a503fc6f7e37374a724e75fb10fd664b0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 1 Apr 2025 17:22:43 +0800 Subject: [PATCH 0901/2029] modify code --- src/class164/Code07_Peaks1.java | 38 +++++++++++++++++---------------- src/class164/Code07_Peaks2.java | 36 ++++++++++++++++--------------- 2 files changed, 39 insertions(+), 35 deletions(-) diff --git a/src/class164/Code07_Peaks1.java b/src/class164/Code07_Peaks1.java index 4c5e6c916..bbb6c54af 100644 --- a/src/class164/Code07_Peaks1.java +++ b/src/class164/Code07_Peaks1.java @@ -46,21 +46,21 @@ public class Code07_Peaks1 { public static int[] nodeKey = new int[MAXK]; public static int cntu; - // 节点dfn序号 - public static int[] dfn = new int[MAXK]; - // seg[i] = j,代表dfn序号为i的节点,是原始编号为j的节点 - public static int[] seg = new int[MAXK]; // 倍增表 public static int[][] stjump = new int[MAXK][MAXH]; - // 子树大小 - public static int[] siz = new int[MAXK]; + // 子树上的叶节点个数 + public static int[] leafsiz = new int[MAXK]; + // 子树上叶节点的dfn序号最小值 + public static int[] leafDfnMin = new int[MAXK]; + // leafseg[i] = j,表示dfn序号为i的叶节点,原始编号为j + public static int[] leafseg = new int[MAXK]; // dfn计数 public static int cntd = 0; // 可持久化线段树 // 线段树的下标为某个数字,所以是值域线段树 // 数值范围[l..r]上,一共有几个数字,就是numcnt的含义 - public static int[] root = new int[MAXK]; + public static int[] root = new int[MAXN]; public static int[] ls = new int[MAXT]; public static int[] rs = new int[MAXT]; public static int[] numcnt = new int[MAXT]; @@ -131,9 +131,6 @@ public static void kruskalRebuild() { } public static void dfs(int u, int fa) { - siz[u] = 1; - dfn[u] = ++cntd; - seg[cntd] = u; stjump[u][0] = fa; for (int p = 1; p < MAXH; p++) { stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; @@ -141,8 +138,17 @@ public static void dfs(int u, int fa) { for (int e = head[u]; e > 0; e = next[e]) { dfs(to[e], u); } + if (u <= n) { + leafsiz[u] = 1; + leafDfnMin[u] = ++cntd; + leafseg[cntd] = u; + } else { + leafsiz[u] = 0; + leafDfnMin[u] = n + 1; + } for (int e = head[u]; e > 0; e = next[e]) { - siz[u] += siz[to[e]]; + leafsiz[u] += leafsiz[to[e]]; + leafDfnMin[u] = Math.min(leafDfnMin[u], leafDfnMin[to[e]]); } } @@ -192,7 +198,7 @@ public static int compute(int u, int x, int k) { u = stjump[u][p]; } } - int idx = query(k, 1, diff, root[dfn[u] - 1], root[dfn[u] + siz[u] - 1]); + int idx = query(k, 1, diff, root[leafDfnMin[u] - 1], root[leafDfnMin[u] + leafsiz[u] - 1]); return sorted[idx]; } @@ -217,12 +223,8 @@ public static void main(String[] args) { } } root[0] = build(1, diff); - for (int i = 1; i <= cntd; i++) { - if (seg[i] <= n) { - root[i] = insert(node[seg[i]], 1, diff, root[i - 1]); - } else { - root[i] = root[i - 1]; - } + for (int i = 1; i <= n; i++) { + root[i] = insert(node[leafseg[i]], 1, diff, root[i - 1]); } for (int i = 1, u, x, k, lastAns = 0; i <= q; i++) { u = io.nextInt(); diff --git a/src/class164/Code07_Peaks2.java b/src/class164/Code07_Peaks2.java index 998e76ba2..c77631155 100644 --- a/src/class164/Code07_Peaks2.java +++ b/src/class164/Code07_Peaks2.java @@ -45,13 +45,13 @@ //int nodeKey[MAXK]; //int cntu; // -//int dfn[MAXK]; -//int seg[MAXK]; //int stjump[MAXK][MAXH]; -//int siz[MAXK]; +//int leafsiz[MAXK]; +//int leafDfnMin[MAXK]; +//int leafseg[MAXK]; //int cntd; // -//int root[MAXK]; +//int root[MAXN]; //int ls[MAXT]; //int rs[MAXT]; //int numcnt[MAXT]; @@ -122,18 +122,24 @@ //} // //void dfs(int u, int fa) { -// siz[u] = 1; -// dfn[u] = ++cntd; -// seg[cntd] = u; // stjump[u][0] = fa; // for (int p = 1; p < MAXH; p++) { -// stjump[u][p] = stjump[ stjump[u][p - 1] ][p - 1]; +// stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; // } // for (int e = head[u]; e > 0; e = nxt[e]) { // dfs(to[e], u); // } +// if (u <= n) { +// leafsiz[u] = 1; +// leafDfnMin[u] = ++cntd; +// leafseg[cntd] = u; +// } else { +// leafsiz[u] = 0; +// leafDfnMin[u] = n + 1; +// } // for (int e = head[u]; e > 0; e = nxt[e]) { -// siz[u] += siz[to[e]]; +// leafsiz[u] += leafsiz[to[e]]; +// leafDfnMin[u] = min(leafDfnMin[u], leafDfnMin[to[e]]); // } //} // @@ -169,7 +175,7 @@ // return l; // } // int mid = (l + r) / 2; -// int rsize = numcnt[ rs[post] ] - numcnt[ rs[pre] ]; +// int rsize = numcnt[rs[post]] - numcnt[rs[pre]]; // if (rsize >= jobk) { // return query(jobk, mid + 1, r, rs[pre], rs[post]); // } else { @@ -183,7 +189,7 @@ // u = stjump[u][p]; // } // } -// int idx = query(k, 1, diff, root[dfn[u] - 1], root[dfn[u] + siz[u] - 1]); +// int idx = query(k, 1, diff, root[leafDfnMin[u] - 1], root[leafDfnMin[u] + leafsiz[u] - 1]); // return sorted[idx]; //} // @@ -205,12 +211,8 @@ // } // } // root[0] = build(1, diff); -// for (int i = 1; i <= cntd; i++) { -// if (seg[i] <= n) { -// root[i] = insert(node[seg[i]], 1, diff, root[i - 1]); -// } else { -// root[i] = root[i - 1]; -// } +// for (int i = 1; i <= n; i++) { +// root[i] = insert(node[leafseg[i]], 1, diff, root[i - 1]); // } // for (int i = 1, u, x, k, lastAns = 0; i <= q; i++) { // cin >> u >> x >> k; From 3cd8e798423bfacb44bef76764c6dbf3b99e6bea Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 1 Apr 2025 17:33:11 +0800 Subject: [PATCH 0902/2029] modify code --- src/class164/Code07_Peaks1.java | 10 +++++++--- src/class164/Code07_Peaks2.java | 4 ++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/class164/Code07_Peaks1.java b/src/class164/Code07_Peaks1.java index bbb6c54af..c7400a28b 100644 --- a/src/class164/Code07_Peaks1.java +++ b/src/class164/Code07_Peaks1.java @@ -54,7 +54,7 @@ public class Code07_Peaks1 { public static int[] leafDfnMin = new int[MAXK]; // leafseg[i] = j,表示dfn序号为i的叶节点,原始编号为j public static int[] leafseg = new int[MAXK]; - // dfn计数 + // dfn的计数 public static int cntd = 0; // 可持久化线段树 @@ -152,6 +152,7 @@ public static void dfs(int u, int fa) { } } + // 可持久化线段树的build public static int build(int l, int r) { int rt = ++cntt; numcnt[rt] = 0; @@ -163,6 +164,7 @@ public static int build(int l, int r) { return rt; } + // 数值范围[l..r],加了一个数字jobi,生成新版本的可持久化线段树 public static int insert(int jobi, int l, int r, int i) { int rt = ++cntt; ls[rt] = ls[i]; @@ -179,6 +181,8 @@ public static int insert(int jobi, int l, int r, int i) { return rt; } + // 可持久化线段树,前版本pre,后版本post,两个版本做差,得到数值范围[l..r]的词频 + // 查询这个数值范围上,第jobk大的数字是什么 public static int query(int jobk, int l, int r, int pre, int post) { if (l == r) { return l; @@ -192,7 +196,7 @@ public static int query(int jobk, int l, int r, int pre, int post) { } } - public static int compute(int u, int x, int k) { + public static int kthMax(int u, int x, int k) { for (int p = MAXH - 1; p >= 0; p--) { if (stjump[u][p] > 0 && nodeKey[stjump[u][p]] <= x) { u = stjump[u][p]; @@ -233,7 +237,7 @@ public static void main(String[] args) { u = (u ^ lastAns) % n + 1; x = x ^ lastAns; k = (k ^ lastAns) % n + 1; - lastAns = compute(u, x, k); + lastAns = kthMax(u, x, k); if (lastAns == 0) { io.writelnInt(-1); } else { diff --git a/src/class164/Code07_Peaks2.java b/src/class164/Code07_Peaks2.java index c77631155..3a2cee25f 100644 --- a/src/class164/Code07_Peaks2.java +++ b/src/class164/Code07_Peaks2.java @@ -183,7 +183,7 @@ // } //} // -//int compute(int u, int x, int k) { +//int kthMax(int u, int x, int k) { // for (int p = MAXH - 1; p >= 0; p--) { // if (stjump[u][p] > 0 && nodeKey[stjump[u][p]] <= x) { // u = stjump[u][p]; @@ -219,7 +219,7 @@ // u = ((u ^ lastAns) % n) + 1; // x = x ^ lastAns; // k = ((k ^ lastAns) % n) + 1; -// lastAns = compute(u, x, k); +// lastAns = kthMax(u, x, k); // if (lastAns == 0) { // cout << -1 << "\n"; // } else { From d6d3302a8ba8c719e628adfdfbbab2a4bb8b5f90 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 1 Apr 2025 17:36:34 +0800 Subject: [PATCH 0903/2029] modify code --- src/class164/Code07_Peaks1.java | 17 ++++++++--------- src/class164/Code07_Peaks2.java | 17 ++++++++--------- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/src/class164/Code07_Peaks1.java b/src/class164/Code07_Peaks1.java index c7400a28b..d9d5b17d6 100644 --- a/src/class164/Code07_Peaks1.java +++ b/src/class164/Code07_Peaks1.java @@ -28,11 +28,10 @@ public class Code07_Peaks1 { public static int MAXM = 500001; public static int MAXT = MAXN * 40; public static int MAXH = 20; - public static int n, m, q; + public static int n, m, q, s; public static int[] node = new int[MAXN]; public static int[] sorted = new int[MAXN]; - public static int diff; public static int[][] edge = new int[MAXM][3]; // 并查集 @@ -67,7 +66,7 @@ public class Code07_Peaks1 { public static int cntt = 0; public static int kth(int num) { - int left = 1, right = diff, mid; + int left = 1, right = s, mid; while (left <= right) { mid = (left + right) / 2; if (sorted[mid] == num) { @@ -87,10 +86,10 @@ public static void prepare() { } sorted[n + 1] = 0; Arrays.sort(sorted, 1, n + 2); - diff = 1; + s = 1; for (int i = 2; i <= n + 1; i++) { - if (sorted[diff] != sorted[i]) { - sorted[++diff] = sorted[i]; + if (sorted[s] != sorted[i]) { + sorted[++s] = sorted[i]; } } for (int i = 1; i <= n; i++) { @@ -202,7 +201,7 @@ public static int kthMax(int u, int x, int k) { u = stjump[u][p]; } } - int idx = query(k, 1, diff, root[leafDfnMin[u] - 1], root[leafDfnMin[u] + leafsiz[u] - 1]); + int idx = query(k, 1, s, root[leafDfnMin[u] - 1], root[leafDfnMin[u] + leafsiz[u] - 1]); return sorted[idx]; } @@ -226,9 +225,9 @@ public static void main(String[] args) { dfs(i, 0); } } - root[0] = build(1, diff); + root[0] = build(1, s); for (int i = 1; i <= n; i++) { - root[i] = insert(node[leafseg[i]], 1, diff, root[i - 1]); + root[i] = insert(node[leafseg[i]], 1, s, root[i - 1]); } for (int i = 1, u, x, k, lastAns = 0; i <= q; i++) { u = io.nextInt(); diff --git a/src/class164/Code07_Peaks2.java b/src/class164/Code07_Peaks2.java index 3a2cee25f..2b764c1f6 100644 --- a/src/class164/Code07_Peaks2.java +++ b/src/class164/Code07_Peaks2.java @@ -30,10 +30,9 @@ //const int MAXM = 500001; //const int MAXT = MAXN * 40; //const int MAXH = 20; -//int n, m, q; +//int n, m, q, s; //int node[MAXN]; //int sorted[MAXN]; -//int diff; //Edge edge[MAXM]; // //int father[MAXK]; @@ -58,7 +57,7 @@ //int cntt; // //int kth(int num) { -// int left = 1, right = diff; +// int left = 1, right = s; // while (left <= right) { // int mid = (left + right) / 2; // if (sorted[mid] == num) { @@ -78,10 +77,10 @@ // } // sorted[n + 1] = 0; // sort(sorted + 1, sorted + n + 2); -// diff = 1; +// s = 1; // for (int i = 2; i <= n + 1; i++) { -// if (sorted[diff] != sorted[i]) { -// sorted[++diff] = sorted[i]; +// if (sorted[s] != sorted[i]) { +// sorted[++s] = sorted[i]; // } // } // for (int i = 1; i <= n; i++) { @@ -189,7 +188,7 @@ // u = stjump[u][p]; // } // } -// int idx = query(k, 1, diff, root[leafDfnMin[u] - 1], root[leafDfnMin[u] + leafsiz[u] - 1]); +// int idx = query(k, 1, s, root[leafDfnMin[u] - 1], root[leafDfnMin[u] + leafsiz[u] - 1]); // return sorted[idx]; //} // @@ -210,9 +209,9 @@ // dfs(i, 0); // } // } -// root[0] = build(1, diff); +// root[0] = build(1, s); // for (int i = 1; i <= n; i++) { -// root[i] = insert(node[leafseg[i]], 1, diff, root[i - 1]); +// root[i] = insert(node[leafseg[i]], 1, s, root[i - 1]); // } // for (int i = 1, u, x, k, lastAns = 0; i <= q; i++) { // cin >> u >> x >> k; From 0f712482873b23807eefef7e62b1939a04148cb8 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 1 Apr 2025 17:39:50 +0800 Subject: [PATCH 0904/2029] modify code --- src/class164/Code07_Peaks1.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/class164/Code07_Peaks1.java b/src/class164/Code07_Peaks1.java index d9d5b17d6..af5c31e30 100644 --- a/src/class164/Code07_Peaks1.java +++ b/src/class164/Code07_Peaks1.java @@ -84,6 +84,9 @@ public static void prepare() { for (int i = 1; i <= n; i++) { sorted[i] = node[i]; } + // 加入0这个数值,这个数值一定排第1名 + // 如果第k大不存在,那么查到的第k大点权为0,可以用作判断 + // 题目说了所有点权都大于0,所以不会有问题 sorted[n + 1] = 0; Arrays.sort(sorted, 1, n + 2); s = 1; From 7be47170ebbab01e7f2731415760811cf2b87b03 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 1 Apr 2025 17:41:10 +0800 Subject: [PATCH 0905/2029] modify code --- src/class164/Code07_Peaks1.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/class164/Code07_Peaks1.java b/src/class164/Code07_Peaks1.java index af5c31e30..9d459d7bf 100644 --- a/src/class164/Code07_Peaks1.java +++ b/src/class164/Code07_Peaks1.java @@ -84,9 +84,9 @@ public static void prepare() { for (int i = 1; i <= n; i++) { sorted[i] = node[i]; } - // 加入0这个数值,这个数值一定排第1名 - // 如果第k大不存在,那么查到的第k大点权为0,可以用作判断 - // 题目说了所有点权都大于0,所以不会有问题 + // 加入0这个数值,0这个数值一定排第1名 + // 如果第k大不存在,那么会查出第1名的数值0,可以用作判断 + // 题目保证所有点权都大于0,所以这么做不会有问题 sorted[n + 1] = 0; Arrays.sort(sorted, 1, n + 2); s = 1; From 9a74687333533c2230e1c9d4d6d2a4f2c94c38b0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 1 Apr 2025 19:02:45 +0800 Subject: [PATCH 0906/2029] modify code --- ...70\345\205\263\351\242\230\347\233\256.pptx" | Bin 0 -> 54142 bytes src/class164/Code07_Peaks1.java | 11 +++++------ src/class164/Code07_Peaks2.java | 8 +++++--- 3 files changed, 10 insertions(+), 9 deletions(-) create mode 100644 "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" 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" new file mode 100644 index 0000000000000000000000000000000000000000..5bb5c6ddf8e296952cf831e9e94f92b06db290b1 GIT binary patch literal 54142 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 literal 0 HcmV?d00001 diff --git a/src/class164/Code07_Peaks1.java b/src/class164/Code07_Peaks1.java index 9d459d7bf..b21193373 100644 --- a/src/class164/Code07_Peaks1.java +++ b/src/class164/Code07_Peaks1.java @@ -84,13 +84,9 @@ public static void prepare() { for (int i = 1; i <= n; i++) { sorted[i] = node[i]; } - // 加入0这个数值,0这个数值一定排第1名 - // 如果第k大不存在,那么会查出第1名的数值0,可以用作判断 - // 题目保证所有点权都大于0,所以这么做不会有问题 - sorted[n + 1] = 0; - Arrays.sort(sorted, 1, n + 2); + Arrays.sort(sorted, 1, n + 1); s = 1; - for (int i = 2; i <= n + 1; i++) { + for (int i = 2; i <= n; i++) { if (sorted[s] != sorted[i]) { sorted[++s] = sorted[i]; } @@ -204,6 +200,9 @@ public static int kthMax(int u, int x, int k) { u = stjump[u][p]; } } + if (leafsiz[u] < k) { + return 0; + } int idx = query(k, 1, s, root[leafDfnMin[u] - 1], root[leafDfnMin[u] + leafsiz[u] - 1]); return sorted[idx]; } diff --git a/src/class164/Code07_Peaks2.java b/src/class164/Code07_Peaks2.java index 2b764c1f6..d3719e31c 100644 --- a/src/class164/Code07_Peaks2.java +++ b/src/class164/Code07_Peaks2.java @@ -75,10 +75,9 @@ // for (int i = 1; i <= n; i++) { // sorted[i] = node[i]; // } -// sorted[n + 1] = 0; -// sort(sorted + 1, sorted + n + 2); +// sort(sorted + 1, sorted + n + 1); // s = 1; -// for (int i = 2; i <= n + 1; i++) { +// for (int i = 2; i <= n; i++) { // if (sorted[s] != sorted[i]) { // sorted[++s] = sorted[i]; // } @@ -188,6 +187,9 @@ // u = stjump[u][p]; // } // } +// if(leafsiz[u] < k) { +// return 0; +// } // int idx = query(k, 1, s, root[leafDfnMin[u] - 1], root[leafDfnMin[u] + leafsiz[u] - 1]); // return sorted[idx]; //} From 7c9e88d420d05809cdb2eb031f302f4c1a46e7b6 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 2 Apr 2025 22:07:01 +0800 Subject: [PATCH 0907/2029] modify code --- src/class165/Code01_PersistentUnionFind1.java | 147 ++++++++++++++++++ src/class165/Code01_PersistentUnionFind2.java | 126 +++++++++++++++ 2 files changed, 273 insertions(+) create mode 100644 src/class165/Code01_PersistentUnionFind1.java create mode 100644 src/class165/Code01_PersistentUnionFind2.java diff --git a/src/class165/Code01_PersistentUnionFind1.java b/src/class165/Code01_PersistentUnionFind1.java new file mode 100644 index 000000000..6da25a3c4 --- /dev/null +++ b/src/class165/Code01_PersistentUnionFind1.java @@ -0,0 +1,147 @@ +package class165; + +// 可持久化并查集,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P3402 +// 提交以下的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 Code01_PersistentUnionFind1 { + + public static int MAXM = 200001; + public static int MAXT = 8000001; + public static int n, m; + + public static int[] rootfa = new int[MAXM]; + public static int[] rootsiz = new int[MAXM]; + public static int[] ls = new int[MAXT]; + public static int[] rs = new int[MAXT]; + public static int[] val = new int[MAXT]; + public static int cnt = 0; + + public static int buildfa(int l, int r) { + int rt = ++cnt; + if (l == r) { + val[rt] = l; + } else { + int mid = (l + r) / 2; + ls[rt] = buildfa(l, mid); + rs[rt] = buildfa(mid + 1, r); + } + return rt; + } + + public static int buildsiz(int l, int r) { + int rt = ++cnt; + if (l == r) { + val[rt] = 1; + } else { + int mid = (l + r) / 2; + ls[rt] = buildsiz(l, mid); + rs[rt] = buildsiz(mid + 1, r); + } + return rt; + } + + public static int update(int jobi, int jobv, int l, int r, int i) { + int rt = ++cnt; + ls[rt] = ls[i]; + rs[rt] = rs[i]; + if (l == r) { + val[rt] = jobv; + } else { + int mid = (l + r) / 2; + if (jobi <= mid) { + ls[rt] = update(jobi, jobv, l, mid, ls[rt]); + } else { + rs[rt] = update(jobi, jobv, mid + 1, r, rs[rt]); + } + } + return rt; + } + + public static int query(int jobi, int l, int r, int i) { + if (l == r) { + return val[i]; + } + int mid = (l + r) / 2; + if (jobi <= mid) { + return query(jobi, l, mid, ls[i]); + } else { + return query(jobi, mid + 1, r, rs[i]); + } + } + + public static int find(int x, int version) { + int fa = query(x, 1, n, rootfa[version]); + if (x == fa) { + return x; + } + return find(fa, version); + } + + public static void merge(int x, int y, int version) { + int fx = find(x, version); + int fy = find(y, version); + if (fx != fy) { + int xsiz = query(fx, 1, n, rootsiz[version]); + int ysiz = query(fy, 1, n, rootsiz[version]); + if (xsiz >= ysiz) { + rootfa[version] = update(fy, fx, 1, n, rootfa[version]); + rootsiz[version] = update(fx, xsiz + ysiz, 1, n, rootsiz[version]); + } else { + rootfa[version] = update(fx, fy, 1, n, rootfa[version]); + rootsiz[version] = update(fy, xsiz + ysiz, 1, n, rootsiz[version]); + } + } + } + + 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; + rootfa[0] = buildfa(1, n); + rootsiz[0] = buildsiz(1, n); + for (int version = 1, op, x, y; version <= m; version++) { + in.nextToken(); + op = (int) in.nval; + rootfa[version] = rootfa[version - 1]; + rootsiz[version] = rootsiz[version - 1]; + if (op == 1) { + in.nextToken(); + x = (int) in.nval; + in.nextToken(); + y = (int) in.nval; + merge(x, y, version); + } else if (op == 2) { + in.nextToken(); + x = (int) in.nval; + rootfa[version] = rootfa[x]; + rootsiz[version] = rootsiz[x]; + } else { + in.nextToken(); + x = (int) in.nval; + in.nextToken(); + y = (int) in.nval; + if (find(x, version) == find(y, version)) { + out.println(1); + } else { + out.println(0); + } + } + } + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class165/Code01_PersistentUnionFind2.java b/src/class165/Code01_PersistentUnionFind2.java new file mode 100644 index 000000000..899bedad3 --- /dev/null +++ b/src/class165/Code01_PersistentUnionFind2.java @@ -0,0 +1,126 @@ +package class165; + +// 可持久化并查集,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P3402 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXM = 200001; +//const int MAXT = 8000001; +//int n, m; +//int rootfa[MAXM]; +//int rootsiz[MAXM]; +//int ls[MAXT]; +//int rs[MAXT]; +//int val[MAXT]; +//int cnt = 0; +// +//int buildfa(int l, int r) { +// int rt = ++cnt; +// if (l == r) { +// val[rt] = l; +// } else { +// int mid = (l + r) / 2; +// ls[rt] = buildfa(l, mid); +// rs[rt] = buildfa(mid + 1, r); +// } +// return rt; +//} +// +//int buildsiz(int l, int r) { +// int rt = ++cnt; +// if (l == r) { +// val[rt] = 1; +// } else { +// int mid = (l + r) / 2; +// ls[rt] = buildsiz(l, mid); +// rs[rt] = buildsiz(mid + 1, r); +// } +// return rt; +//} +// +//int update(int jobi, int jobv, int l, int r, int i) { +// int rt = ++cnt; +// ls[rt] = ls[i]; +// rs[rt] = rs[i]; +// if (l == r) { +// val[rt] = jobv; +// } else { +// int mid = (l + r) / 2; +// if (jobi <= mid) { +// ls[rt] = update(jobi, jobv, l, mid, ls[rt]); +// } else { +// rs[rt] = update(jobi, jobv, mid + 1, r, rs[rt]); +// } +// } +// return rt; +//} +// +//int query(int jobi, int l, int r, int i) { +// if (l == r) { +// return val[i]; +// } +// int mid = (l + r) / 2; +// if (jobi <= mid) { +// return query(jobi, l, mid, ls[i]); +// } else { +// return query(jobi, mid + 1, r, rs[i]); +// } +//} +// +//int find(int x, int version) { +// int fa = query(x, 1, n, rootfa[version]); +// if (x == fa) { +// return x; +// } +// return find(fa, version); +//} +// +//void merge(int x, int y, int version) { +// int fx = find(x, version); +// int fy = find(y, version); +// if (fx != fy) { +// int xsiz = query(fx, 1, n, rootsiz[version]); +// int ysiz = query(fy, 1, n, rootsiz[version]); +// if (xsiz >= ysiz) { +// rootfa[version] = update(fy, fx, 1, n, rootfa[version]); +// rootsiz[version] = update(fx, xsiz + ysiz, 1, n, rootsiz[version]); +// } else { +// rootfa[version] = update(fx, fy, 1, n, rootfa[version]); +// rootsiz[version] = update(fy, xsiz + ysiz, 1, n, rootsiz[version]); +// } +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// rootfa[0] = buildfa(1, n); +// rootsiz[0] = buildsiz(1, n); +// for (int version = 1, op, x, y; version <= m; version++) { +// cin >> op; +// rootfa[version] = rootfa[version - 1]; +// rootsiz[version] = rootsiz[version - 1]; +// if (op == 1) { +// cin >> x >> y; +// merge(x, y, version); +// } else if (op == 2) { +// cin >> x; +// rootfa[version] = rootfa[x]; +// rootsiz[version] = rootsiz[x]; +// } else { +// cin >> x >> y; +// if (find(x, version) == find(y, version)) { +// cout << 1 << "\n"; +// } else { +// cout << 0 << "\n"; +// } +// } +// } +// return 0; +//} \ No newline at end of file From 0b6762486e608bcd7c6b8e54b37dc6e8dec6f0b4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 3 Apr 2025 16:29:34 +0800 Subject: [PATCH 0908/2029] modify code --- src/class165/Code01_PersistentUnionFind1.java | 38 +++++++++---------- src/class165/Code01_PersistentUnionFind2.java | 38 +++++++++---------- 2 files changed, 38 insertions(+), 38 deletions(-) diff --git a/src/class165/Code01_PersistentUnionFind1.java b/src/class165/Code01_PersistentUnionFind1.java index 6da25a3c4..dbc318f70 100644 --- a/src/class165/Code01_PersistentUnionFind1.java +++ b/src/class165/Code01_PersistentUnionFind1.java @@ -77,26 +77,26 @@ public static int query(int jobi, int l, int r, int i) { } } - public static int find(int x, int version) { - int fa = query(x, 1, n, rootfa[version]); + public static int find(int x, int v) { + int fa = query(x, 1, n, rootfa[v]); if (x == fa) { return x; } - return find(fa, version); + return find(fa, v); } - public static void merge(int x, int y, int version) { - int fx = find(x, version); - int fy = find(y, version); + public static void merge(int x, int y, int v) { + int fx = find(x, v); + int fy = find(y, v); if (fx != fy) { - int xsiz = query(fx, 1, n, rootsiz[version]); - int ysiz = query(fy, 1, n, rootsiz[version]); + int xsiz = query(fx, 1, n, rootsiz[v]); + int ysiz = query(fy, 1, n, rootsiz[v]); if (xsiz >= ysiz) { - rootfa[version] = update(fy, fx, 1, n, rootfa[version]); - rootsiz[version] = update(fx, xsiz + ysiz, 1, n, rootsiz[version]); + rootfa[v] = update(fy, fx, 1, n, rootfa[v]); + rootsiz[v] = update(fx, xsiz + ysiz, 1, n, rootsiz[v]); } else { - rootfa[version] = update(fx, fy, 1, n, rootfa[version]); - rootsiz[version] = update(fy, xsiz + ysiz, 1, n, rootsiz[version]); + rootfa[v] = update(fx, fy, 1, n, rootfa[v]); + rootsiz[v] = update(fy, xsiz + ysiz, 1, n, rootsiz[v]); } } } @@ -111,28 +111,28 @@ public static void main(String[] args) throws IOException { m = (int) in.nval; rootfa[0] = buildfa(1, n); rootsiz[0] = buildsiz(1, n); - for (int version = 1, op, x, y; version <= m; version++) { + for (int v = 1, op, x, y; v <= m; v++) { in.nextToken(); op = (int) in.nval; - rootfa[version] = rootfa[version - 1]; - rootsiz[version] = rootsiz[version - 1]; + rootfa[v] = rootfa[v - 1]; + rootsiz[v] = rootsiz[v - 1]; if (op == 1) { in.nextToken(); x = (int) in.nval; in.nextToken(); y = (int) in.nval; - merge(x, y, version); + merge(x, y, v); } else if (op == 2) { in.nextToken(); x = (int) in.nval; - rootfa[version] = rootfa[x]; - rootsiz[version] = rootsiz[x]; + rootfa[v] = rootfa[x]; + rootsiz[v] = rootsiz[x]; } else { in.nextToken(); x = (int) in.nval; in.nextToken(); y = (int) in.nval; - if (find(x, version) == find(y, version)) { + if (find(x, v) == find(y, v)) { out.println(1); } else { out.println(0); diff --git a/src/class165/Code01_PersistentUnionFind2.java b/src/class165/Code01_PersistentUnionFind2.java index 899bedad3..500e67b0f 100644 --- a/src/class165/Code01_PersistentUnionFind2.java +++ b/src/class165/Code01_PersistentUnionFind2.java @@ -72,26 +72,26 @@ // } //} // -//int find(int x, int version) { -// int fa = query(x, 1, n, rootfa[version]); +//int find(int x, int v) { +// int fa = query(x, 1, n, rootfa[v]); // if (x == fa) { // return x; // } -// return find(fa, version); +// return find(fa, v); //} // -//void merge(int x, int y, int version) { -// int fx = find(x, version); -// int fy = find(y, version); +//void merge(int x, int y, int v) { +// int fx = find(x, v); +// int fy = find(y, v); // if (fx != fy) { -// int xsiz = query(fx, 1, n, rootsiz[version]); -// int ysiz = query(fy, 1, n, rootsiz[version]); +// int xsiz = query(fx, 1, n, rootsiz[v]); +// int ysiz = query(fy, 1, n, rootsiz[v]); // if (xsiz >= ysiz) { -// rootfa[version] = update(fy, fx, 1, n, rootfa[version]); -// rootsiz[version] = update(fx, xsiz + ysiz, 1, n, rootsiz[version]); +// rootfa[v] = update(fy, fx, 1, n, rootfa[v]); +// rootsiz[v] = update(fx, xsiz + ysiz, 1, n, rootsiz[v]); // } else { -// rootfa[version] = update(fx, fy, 1, n, rootfa[version]); -// rootsiz[version] = update(fy, xsiz + ysiz, 1, n, rootsiz[version]); +// rootfa[v] = update(fx, fy, 1, n, rootfa[v]); +// rootsiz[v] = update(fy, xsiz + ysiz, 1, n, rootsiz[v]); // } // } //} @@ -102,20 +102,20 @@ // cin >> n >> m; // rootfa[0] = buildfa(1, n); // rootsiz[0] = buildsiz(1, n); -// for (int version = 1, op, x, y; version <= m; version++) { +// for (int v = 1, op, x, y; v <= m; v++) { // cin >> op; -// rootfa[version] = rootfa[version - 1]; -// rootsiz[version] = rootsiz[version - 1]; +// rootfa[v] = rootfa[v - 1]; +// rootsiz[v] = rootsiz[v - 1]; // if (op == 1) { // cin >> x >> y; -// merge(x, y, version); +// merge(x, y, v); // } else if (op == 2) { // cin >> x; -// rootfa[version] = rootfa[x]; -// rootsiz[version] = rootsiz[x]; +// rootfa[v] = rootfa[x]; +// rootsiz[v] = rootsiz[x]; // } else { // cin >> x >> y; -// if (find(x, version) == find(y, version)) { +// if (find(x, v) == find(y, v)) { // cout << 1 << "\n"; // } else { // cout << 0 << "\n"; From 6dd32ffe3892e633a5b9714db88f9c561637088d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 3 Apr 2025 16:43:45 +0800 Subject: [PATCH 0909/2029] modify code --- src/class165/Code01_PersistentUnionFind2.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class165/Code01_PersistentUnionFind2.java b/src/class165/Code01_PersistentUnionFind2.java index 500e67b0f..7340825aa 100644 --- a/src/class165/Code01_PersistentUnionFind2.java +++ b/src/class165/Code01_PersistentUnionFind2.java @@ -5,7 +5,7 @@ // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 -//#include +//#include // //using namespace std; // From 3cfed78132f85d59672ad4650aab262d9cdee65e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 3 Apr 2025 18:39:20 +0800 Subject: [PATCH 0910/2029] modify code --- src/class165/Code01_PersistentUnionFind1.java | 9 +- src/class165/Code01_PersistentUnionFind2.java | 9 +- src/class165/Code02_UndoUnionFind1.java | 144 ++++++++++++++++++ src/class165/Code02_UndoUnionFind2.java | 129 ++++++++++++++++ 4 files changed, 283 insertions(+), 8 deletions(-) create mode 100644 src/class165/Code02_UndoUnionFind1.java create mode 100644 src/class165/Code02_UndoUnionFind2.java diff --git a/src/class165/Code01_PersistentUnionFind1.java b/src/class165/Code01_PersistentUnionFind1.java index dbc318f70..29379ba16 100644 --- a/src/class165/Code01_PersistentUnionFind1.java +++ b/src/class165/Code01_PersistentUnionFind1.java @@ -1,6 +1,6 @@ package class165; -// 可持久化并查集,java版 +// 可持久化并查集模版题,java版 // 测试链接 : https://www.luogu.com.cn/problem/P3402 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -79,10 +79,11 @@ public static int query(int jobi, int l, int r, int i) { public static int find(int x, int v) { int fa = query(x, 1, n, rootfa[v]); - if (x == fa) { - return x; + while (x != fa) { + x = fa; + fa = query(x, 1, n, rootfa[v]); } - return find(fa, v); + return x; } public static void merge(int x, int y, int v) { diff --git a/src/class165/Code01_PersistentUnionFind2.java b/src/class165/Code01_PersistentUnionFind2.java index 7340825aa..6882f8b7c 100644 --- a/src/class165/Code01_PersistentUnionFind2.java +++ b/src/class165/Code01_PersistentUnionFind2.java @@ -1,6 +1,6 @@ package class165; -// 可持久化并查集,C++版 +// 可持久化并查集模版题,C++版 // 测试链接 : https://www.luogu.com.cn/problem/P3402 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -74,10 +74,11 @@ // //int find(int x, int v) { // int fa = query(x, 1, n, rootfa[v]); -// if (x == fa) { -// return x; +// while(x != fa) { +// x = fa; +// fa = query(x, 1, n, rootfa[v]); // } -// return find(fa, v); +// return x; //} // //void merge(int x, int y, int v) { diff --git a/src/class165/Code02_UndoUnionFind1.java b/src/class165/Code02_UndoUnionFind1.java new file mode 100644 index 000000000..517e9ef81 --- /dev/null +++ b/src/class165/Code02_UndoUnionFind1.java @@ -0,0 +1,144 @@ +package class165; + +// 可撤销并查集模版题,java版 +// 测试链接 : https://www.luogu.com.cn/problem/AT_abc302_h +// 测试链接 : https://atcoder.jp/contests/abc302/tasks/abc302_h +// 提交以下的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 Code02_UndoUnionFind1 { + + public static int MAXN = 200001; + public static int[] a = new int[MAXN]; + public static int[] b = 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 cnt; + + public static int[] father = new int[MAXN]; + public static int[] ncnt = new int[MAXN]; + public static int[] ecnt = new int[MAXN]; + + public static int[][] opstack = new int[MAXN][2]; + public static int stacksiz = 0; + + public static int[] ans = new int[MAXN]; + public static int ball = 0; + + public static void addEdge(int u, int v) { + next[++cnt] = head[u]; + to[cnt] = v; + head[u] = cnt; + } + + public static int find(int i) { + while (i != father[i]) { + i = father[i]; + } + return i; + } + + public static void merge(int h1, int h2) { + int big, small; + if (ncnt[h1] >= ncnt[h2]) { + big = h1; + small = h2; + } else { + big = h2; + small = h1; + } + stacksiz++; + opstack[stacksiz][0] = big; + opstack[stacksiz][1] = small; + father[small] = big; + ncnt[big] += ncnt[small]; + ecnt[big] += ecnt[small] + 1; + } + + public static void undo() { + int big = opstack[stacksiz][0]; + int small = opstack[stacksiz][1]; + stacksiz--; + father[small] = small; + ncnt[big] -= ncnt[small]; + ecnt[big] -= ecnt[small] + 1; + } + + public static void dfs(int u, int fa) { + int h1 = find(a[u]), h2 = find(b[u]); + boolean merged = false; + int add = 0; + if (h1 == h2) { + ecnt[h1]++; + if (ncnt[h1] == ecnt[h1]) { + ball++; + add = 1; + } + } else { + if (ecnt[h1] < ncnt[h1] || ecnt[h2] < ncnt[h2]) { + ball++; + add = 1; + } + merge(h1, h2); + merged = true; + } + if (u != 1) { + ans[u] = ball; + } + for (int e = head[u]; e > 0; e = next[e]) { + if (to[e] != fa) { + dfs(to[e], u); + } + } + if (merged) { + undo(); + } else { + ecnt[h1]--; + } + ball -= add; + } + + 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(); + int n = (int) in.nval; + for (int i = 1; i <= n; i++) { + in.nextToken(); + a[i] = (int) in.nval; + in.nextToken(); + b[i] = (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 <= n; i++) { + father[i] = i; + ncnt[i] = 1; + ecnt[i] = 0; + } + dfs(1, 0); + for (int i = 2; i < n; i++) { + out.print(ans[i] + " "); + } + out.println(ans[n]); + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class165/Code02_UndoUnionFind2.java b/src/class165/Code02_UndoUnionFind2.java new file mode 100644 index 000000000..67a114701 --- /dev/null +++ b/src/class165/Code02_UndoUnionFind2.java @@ -0,0 +1,129 @@ +package class165; + +// 可撤销并查集模版题,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/AT_abc302_h +// 测试链接 : https://atcoder.jp/contests/abc302/tasks/abc302_h +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 200001; +//int a[MAXN]; +//int b[MAXN]; +// +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int cnt; +// +//int father[MAXN]; +//int ncnt[MAXN]; +//int ecnt[MAXN]; +// +//int opstack[MAXN][2]; +//int stacksiz = 0; +// +//int ans[MAXN]; +//int ball = 0; +// +//void addEdge(int u, int v) { +// nxt[++cnt] = head[u]; +// to[cnt] = v; +// head[u] = cnt; +//} +// +//int find(int i) { +// while(i != father[i]) { +// i = father[i]; +// } +// return i; +//} +// +//void merge(int h1, int h2) { +// int big, small; +// if (ncnt[h1] >= ncnt[h2]) { +// big = h1; +// small = h2; +// } else { +// big = h2; +// small = h1; +// } +// stacksiz++; +// opstack[stacksiz][0] = big; +// opstack[stacksiz][1] = small; +// father[small] = big; +// ncnt[big] += ncnt[small]; +// ecnt[big] += ecnt[small] + 1; +//} +// +//void undo() { +// int big = opstack[stacksiz][0]; +// int small = opstack[stacksiz][1]; +// stacksiz--; +// father[small] = small; +// ncnt[big] -= ncnt[small]; +// ecnt[big] -= ecnt[small] + 1; +//} +// +//void dfs(int u, int fa) { +// int h1 = find(a[u]), h2 = find(b[u]); +// bool merged = false; +// int add = 0; +// if (h1 == h2) { +// ecnt[h1]++; +// if (ncnt[h1] == ecnt[h1]) { +// ball++; +// add = 1; +// } +// } else { +// if (ecnt[h1] < ncnt[h1] || ecnt[h2] < ncnt[h2]) { +// ball++; +// add = 1; +// } +// merge(h1, h2); +// merged = true; +// } +// if (u != 1) { +// ans[u] = ball; +// } +// for (int e = head[u]; e > 0; e = nxt[e]) { +// if (to[e] != fa) { +// dfs(to[e], u); +// } +// } +// if (merged) { +// undo(); +// } else { +// ecnt[h1]--; +// } +// ball -= add; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// int n; +// cin >> n; +// for (int i = 1; i <= n; i++) { +// cin >> a[i] >> b[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++) { +// father[i] = i; +// ncnt[i] = 1; +// ecnt[i] = 0; +// } +// dfs(1, 0); +// for (int i = 2; i < n; i++) { +// cout << ans[i] << " "; +// } +// cout << ans[n] << "\n"; +// return 0; +//} \ No newline at end of file From 16475e67795a2483fb8789068c25817b2dc21291 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 3 Apr 2025 18:44:17 +0800 Subject: [PATCH 0911/2029] modify code --- src/class165/Code02_UndoUnionFind1.java | 6 +++--- src/class165/Code02_UndoUnionFind2.java | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/class165/Code02_UndoUnionFind1.java b/src/class165/Code02_UndoUnionFind1.java index 517e9ef81..c45b0cb2c 100644 --- a/src/class165/Code02_UndoUnionFind1.java +++ b/src/class165/Code02_UndoUnionFind1.java @@ -55,12 +55,12 @@ public static void merge(int h1, int h2) { big = h2; small = h1; } - stacksiz++; - opstack[stacksiz][0] = big; - opstack[stacksiz][1] = small; father[small] = big; ncnt[big] += ncnt[small]; ecnt[big] += ecnt[small] + 1; + stacksiz++; + opstack[stacksiz][0] = big; + opstack[stacksiz][1] = small; } public static void undo() { diff --git a/src/class165/Code02_UndoUnionFind2.java b/src/class165/Code02_UndoUnionFind2.java index 67a114701..df5399bdf 100644 --- a/src/class165/Code02_UndoUnionFind2.java +++ b/src/class165/Code02_UndoUnionFind2.java @@ -51,12 +51,12 @@ // big = h2; // small = h1; // } -// stacksiz++; -// opstack[stacksiz][0] = big; -// opstack[stacksiz][1] = small; // father[small] = big; // ncnt[big] += ncnt[small]; // ecnt[big] += ecnt[small] + 1; +// stacksiz++; +// opstack[stacksiz][0] = big; +// opstack[stacksiz][1] = small; //} // //void undo() { From 1446f6f237009e57b81baac374482f9683c91b8b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 3 Apr 2025 19:11:30 +0800 Subject: [PATCH 0912/2029] modify code --- ...doUnionFind1.java => Code03_BallCollector1.java} | 13 ++++++------- ...doUnionFind2.java => Code03_BallCollector2.java} | 9 ++++----- 2 files changed, 10 insertions(+), 12 deletions(-) rename src/class165/{Code02_UndoUnionFind1.java => Code03_BallCollector1.java} (92%) rename src/class165/{Code02_UndoUnionFind2.java => Code03_BallCollector2.java} (94%) diff --git a/src/class165/Code02_UndoUnionFind1.java b/src/class165/Code03_BallCollector1.java similarity index 92% rename from src/class165/Code02_UndoUnionFind1.java rename to src/class165/Code03_BallCollector1.java index c45b0cb2c..cee9ee25b 100644 --- a/src/class165/Code02_UndoUnionFind1.java +++ b/src/class165/Code03_BallCollector1.java @@ -1,6 +1,6 @@ package class165; -// 可撤销并查集模版题,java版 +// 选球,java版 // 测试链接 : https://www.luogu.com.cn/problem/AT_abc302_h // 测试链接 : https://atcoder.jp/contests/abc302/tasks/abc302_h // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -12,11 +12,10 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code02_UndoUnionFind1 { +public class Code03_BallCollector1 { public static int MAXN = 200001; - public static int[] a = new int[MAXN]; - public static int[] b = new int[MAXN]; + public static int[][] arr = new int[MAXN][2]; public static int[] head = new int[MAXN]; public static int[] next = new int[MAXN << 1]; @@ -73,7 +72,7 @@ public static void undo() { } public static void dfs(int u, int fa) { - int h1 = find(a[u]), h2 = find(b[u]); + int h1 = find(arr[u][0]), h2 = find(arr[u][1]); boolean merged = false; int add = 0; if (h1 == h2) { @@ -114,9 +113,9 @@ public static void main(String[] args) throws IOException { int n = (int) in.nval; for (int i = 1; i <= n; i++) { in.nextToken(); - a[i] = (int) in.nval; + arr[i][0] = (int) in.nval; in.nextToken(); - b[i] = (int) in.nval; + arr[i][1] = (int) in.nval; } for (int i = 1, u, v; i < n; i++) { in.nextToken(); diff --git a/src/class165/Code02_UndoUnionFind2.java b/src/class165/Code03_BallCollector2.java similarity index 94% rename from src/class165/Code02_UndoUnionFind2.java rename to src/class165/Code03_BallCollector2.java index df5399bdf..7aeaf5af1 100644 --- a/src/class165/Code02_UndoUnionFind2.java +++ b/src/class165/Code03_BallCollector2.java @@ -1,6 +1,6 @@ package class165; -// 可撤销并查集模版题,C++版 +// 选球,C++版 // 测试链接 : https://www.luogu.com.cn/problem/AT_abc302_h // 测试链接 : https://atcoder.jp/contests/abc302/tasks/abc302_h // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 @@ -11,8 +11,7 @@ //using namespace std; // //const int MAXN = 200001; -//int a[MAXN]; -//int b[MAXN]; +//int arr[MAXN][2]; // //int head[MAXN]; //int nxt[MAXN << 1]; @@ -69,7 +68,7 @@ //} // //void dfs(int u, int fa) { -// int h1 = find(a[u]), h2 = find(b[u]); +// int h1 = find(arr[u][0]), h2 = find(arr[u][1]); // bool merged = false; // int add = 0; // if (h1 == h2) { @@ -108,7 +107,7 @@ // int n; // cin >> n; // for (int i = 1; i <= n; i++) { -// cin >> a[i] >> b[i]; +// cin >> arr[i][0] >> arr[i][1]; // } // for (int i = 1, u, v; i < n; i++) { // cin >> u >> v; From 71d7e87c586b6983d6e45a373d168dbfe16251fa Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 3 Apr 2025 23:47:03 +0800 Subject: [PATCH 0913/2029] modify code --- ...ector1.java => Code02_UndoUnionFind1.java} | 71 ++++++++++--------- ...ector2.java => Code02_UndoUnionFind2.java} | 71 ++++++++++--------- 2 files changed, 74 insertions(+), 68 deletions(-) rename src/class165/{Code03_BallCollector1.java => Code02_UndoUnionFind1.java} (69%) rename src/class165/{Code03_BallCollector2.java => Code02_UndoUnionFind2.java} (62%) diff --git a/src/class165/Code03_BallCollector1.java b/src/class165/Code02_UndoUnionFind1.java similarity index 69% rename from src/class165/Code03_BallCollector1.java rename to src/class165/Code02_UndoUnionFind1.java index cee9ee25b..f4b41cf88 100644 --- a/src/class165/Code03_BallCollector1.java +++ b/src/class165/Code02_UndoUnionFind1.java @@ -1,6 +1,6 @@ package class165; -// 选球,java版 +// 可撤销并查集模版题,java版 // 测试链接 : https://www.luogu.com.cn/problem/AT_abc302_h // 测试链接 : https://atcoder.jp/contests/abc302/tasks/abc302_h // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -12,7 +12,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code03_BallCollector1 { +public class Code02_UndoUnionFind1 { public static int MAXN = 200001; public static int[][] arr = new int[MAXN][2]; @@ -23,11 +23,11 @@ public class Code03_BallCollector1 { public static int cnt; public static int[] father = new int[MAXN]; - public static int[] ncnt = new int[MAXN]; - public static int[] ecnt = new int[MAXN]; + public static int[] siz = new int[MAXN]; + public static int[] edgeCnt = new int[MAXN]; public static int[][] opstack = new int[MAXN][2]; - public static int stacksiz = 0; + public static int opsize = 0; public static int[] ans = new int[MAXN]; public static int ball = 0; @@ -45,48 +45,51 @@ public static int find(int i) { return i; } - public static void merge(int h1, int h2) { - int big, small; - if (ncnt[h1] >= ncnt[h2]) { - big = h1; - small = h2; + public static void merge(int x, int y) { + int fx = find(x), fy = find(y); + if (fx == fy) { + opstack[++opsize][0] = 0; } else { - big = h2; - small = h1; + if (siz[fx] < siz[fy]) { + int tmp = fx; + fx = fy; + fy = tmp; + } + father[fy] = fx; + siz[fx] += siz[fy]; + edgeCnt[fx] += edgeCnt[fy] + 1; + opstack[++opsize][0] = fx; + opstack[opsize][1] = fy; } - father[small] = big; - ncnt[big] += ncnt[small]; - ecnt[big] += ecnt[small] + 1; - stacksiz++; - opstack[stacksiz][0] = big; - opstack[stacksiz][1] = small; } public static void undo() { - int big = opstack[stacksiz][0]; - int small = opstack[stacksiz][1]; - stacksiz--; - father[small] = small; - ncnt[big] -= ncnt[small]; - ecnt[big] -= ecnt[small] + 1; + if (opsize > 0 && opstack[opsize][0] != 0) { + int fx = opstack[opsize][0]; + int fy = opstack[opsize--][1]; + father[fy] = fy; + siz[fx] -= siz[fy]; + edgeCnt[fx] -= edgeCnt[fy] + 1; + } } public static void dfs(int u, int fa) { - int h1 = find(arr[u][0]), h2 = find(arr[u][1]); + int x = arr[u][0], y = arr[u][1]; + int fx = find(x), fy = find(y); boolean merged = false; int add = 0; - if (h1 == h2) { - ecnt[h1]++; - if (ncnt[h1] == ecnt[h1]) { + if (fx == fy) { + if (edgeCnt[fx] < siz[fx]) { ball++; add = 1; } + edgeCnt[fx]++; } else { - if (ecnt[h1] < ncnt[h1] || ecnt[h2] < ncnt[h2]) { + if (edgeCnt[fx] < siz[fx] || edgeCnt[fy] < siz[fy]) { ball++; add = 1; } - merge(h1, h2); + merge(x, y); merged = true; } if (u != 1) { @@ -97,12 +100,12 @@ public static void dfs(int u, int fa) { dfs(to[e], u); } } + ball -= add; if (merged) { undo(); } else { - ecnt[h1]--; + edgeCnt[fx]--; } - ball -= add; } public static void main(String[] args) throws IOException { @@ -127,8 +130,8 @@ public static void main(String[] args) throws IOException { } for (int i = 1; i <= n; i++) { father[i] = i; - ncnt[i] = 1; - ecnt[i] = 0; + siz[i] = 1; + edgeCnt[i] = 0; } dfs(1, 0); for (int i = 2; i < n; i++) { diff --git a/src/class165/Code03_BallCollector2.java b/src/class165/Code02_UndoUnionFind2.java similarity index 62% rename from src/class165/Code03_BallCollector2.java rename to src/class165/Code02_UndoUnionFind2.java index 7aeaf5af1..7252c4f10 100644 --- a/src/class165/Code03_BallCollector2.java +++ b/src/class165/Code02_UndoUnionFind2.java @@ -1,6 +1,6 @@ package class165; -// 选球,C++版 +// 可撤销并查集模版题,C++版 // 测试链接 : https://www.luogu.com.cn/problem/AT_abc302_h // 测试链接 : https://atcoder.jp/contests/abc302/tasks/abc302_h // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 @@ -19,11 +19,11 @@ //int cnt; // //int father[MAXN]; -//int ncnt[MAXN]; -//int ecnt[MAXN]; +//int siz[MAXN]; +//int edgeCnt[MAXN]; // //int opstack[MAXN][2]; -//int stacksiz = 0; +//int opsize = 0; // //int ans[MAXN]; //int ball = 0; @@ -41,48 +41,51 @@ // return i; //} // -//void merge(int h1, int h2) { -// int big, small; -// if (ncnt[h1] >= ncnt[h2]) { -// big = h1; -// small = h2; +//void merge(int x, int y) { +// int fx = find(x), fy = find(y); +// if (fx == fy) { +// opstack[++opsize][0] = 0; // } else { -// big = h2; -// small = h1; +// if (siz[fx] < siz[fy]) { +// int tmp = fx; +// fx = fy; +// fy = tmp; +// } +// father[fy] = fx; +// siz[fx] += siz[fy]; +// edgeCnt[fx] += edgeCnt[fy] + 1; +// opstack[++opsize][0] = fx; +// opstack[opsize][1] = fy; // } -// father[small] = big; -// ncnt[big] += ncnt[small]; -// ecnt[big] += ecnt[small] + 1; -// stacksiz++; -// opstack[stacksiz][0] = big; -// opstack[stacksiz][1] = small; //} // //void undo() { -// int big = opstack[stacksiz][0]; -// int small = opstack[stacksiz][1]; -// stacksiz--; -// father[small] = small; -// ncnt[big] -= ncnt[small]; -// ecnt[big] -= ecnt[small] + 1; +// if (opsize > 0 && opstack[opsize][0] != 0) { +// int fx = opstack[opsize][0]; +// int fy = opstack[opsize--][1]; +// father[fy] = fy; +// siz[fx] -= siz[fy]; +// edgeCnt[fx] -= edgeCnt[fy] + 1; +// } //} // //void dfs(int u, int fa) { -// int h1 = find(arr[u][0]), h2 = find(arr[u][1]); +// int x = arr[u][0], y = arr[u][1]; +// int fx = find(x), fy = find(y); // bool merged = false; // int add = 0; -// if (h1 == h2) { -// ecnt[h1]++; -// if (ncnt[h1] == ecnt[h1]) { +// if (fx == fy) { +// if (edgeCnt[fx] < siz[fx]) { // ball++; // add = 1; -// } +// } +// edgeCnt[fx]++; // } else { -// if (ecnt[h1] < ncnt[h1] || ecnt[h2] < ncnt[h2]) { +// if (edgeCnt[fx] < siz[fx] || edgeCnt[fy] < siz[fy]) { // ball++; // add = 1; // } -// merge(h1, h2); +// merge(x, y); // merged = true; // } // if (u != 1) { @@ -93,12 +96,12 @@ // dfs(to[e], u); // } // } +// ball -= add; // if (merged) { // undo(); // } else { -// ecnt[h1]--; +// edgeCnt[fx]--; // } -// ball -= add; //} // //int main() { @@ -116,8 +119,8 @@ // } // for (int i = 1; i <= n; i++) { // father[i] = i; -// ncnt[i] = 1; -// ecnt[i] = 0; +// siz[i] = 1; +// edgeCnt[i] = 0; // } // dfs(1, 0); // for (int i = 2; i < n; i++) { From d857fd38f06b3cb3ea0e92349e8c432ff1d5ce40 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 4 Apr 2025 15:21:37 +0800 Subject: [PATCH 0914/2029] modify code --- src/class120/Code04_LinkCutCentroids.java | 47 ++++++++++++----------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/src/class120/Code04_LinkCutCentroids.java b/src/class120/Code04_LinkCutCentroids.java index 61c0d4086..2305918c5 100644 --- a/src/class120/Code04_LinkCutCentroids.java +++ b/src/class120/Code04_LinkCutCentroids.java @@ -10,6 +10,7 @@ // "3 4" // "4 7" // 测试链接 : https://www.luogu.com.cn/problem/CF1406C +// 测试链接 : https://codeforces.com/problemset/problem/1406/C // 提交以下的code,提交时请把类名改成"Main",可以通过所有用例 import java.io.BufferedReader; @@ -43,11 +44,11 @@ public class Code04_LinkCutCentroids { // 收集所有的重心 public static int[] centers = new int[2]; - // 任何一个叶节点 - public static int anyLeaf; + // 最大子树上的叶节点 + public static int leaf; - // 该叶节点的父亲节点 - public static int anyLeafFather; + // 叶节点的父亲节点 + public static int leafFather; public static void build() { cnt = 1; @@ -83,8 +84,23 @@ public static void find(int u, int f) { return; } } - anyLeaf = u; - anyLeafFather = f; + leaf = u; + leafFather = f; + } + + // 返回重心的数量 + public static int compute() { + dfs(1, 0); + int m = 0; + for (int i = 1; i <= n; i++) { + if (maxsub[i] <= n / 2) { + centers[m++] = i; + } + } + if (m == 2) { + find(centers[1], centers[0]); + } + return m; } public static void main(String[] args) throws IOException { @@ -109,8 +125,8 @@ public static void main(String[] args) throws IOException { out.println(centers[0] + " " + to[head[centers[0]]]); out.println(centers[0] + " " + to[head[centers[0]]]); } else { - out.println(anyLeafFather + " " + anyLeaf); - out.println(centers[0] + " " + anyLeaf); + out.println(leafFather + " " + leaf); + out.println(centers[0] + " " + leaf); } } out.flush(); @@ -118,19 +134,4 @@ public static void main(String[] args) throws IOException { br.close(); } - // 返回重心的数量 - public static int compute() { - dfs(1, 0); - int m = 0; - for (int i = 1; i <= n; i++) { - if (maxsub[i] <= n / 2) { - centers[m++] = i; - } - } - if (m == 2) { - find(centers[1], centers[0]); - } - return m; - } - } From 6f8e83ecd63f887ed092337a8c4f4fdc964d7810 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 4 Apr 2025 15:23:18 +0800 Subject: [PATCH 0915/2029] modify code --- ...\347\232\204\351\207\215\345\277\203.pptx" | Bin 45348 -> 45540 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243120\343\200\220\346\211\251\345\261\225\343\200\221\346\240\221\344\270\212\351\227\256\351\242\230\344\270\223\351\242\2303-\346\240\221\347\232\204\351\207\215\345\277\203.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243120\343\200\220\346\211\251\345\261\225\343\200\221\346\240\221\344\270\212\351\227\256\351\242\230\344\270\223\351\242\2303-\346\240\221\347\232\204\351\207\215\345\277\203.pptx" index 207d0351b0159727cde6b77bac19a1ec72339554..87824d7add866907535b884a9ab28358b1a7732e 100644 GIT binary patch delta 3231 zcmZ9Oc|2768^^~sjAd+No2-M82xH&Ny~Nl;*=1K$mMco6aVdN1I#OhBOtu(zD9LiC zAt9G+g~E@BB5P_Qe(4-Fzu)}zIq&E5Jm2U0{myxvhd9OjcA6P!XT`#bg27-Mu-WJ< zZna23Ce~d6$TQJFfno0YAt=ktXIVhy4Nm}Fly~f$kov^I3}tR2wn5uBPFHqNxe0_r zwm!iCILP$S7*vRJ1orr&fU3$MxB|QCTV_x#;r6U_b%(ulojvBNtId%9hQtZ<8bG_x zH}q!+=^TbC^O`I`hq7b3R|RpT8?wH()d09G2Y+yEM%fDRgD%GJtPZGvg78gn<@|G}e^HyGlK$ztQ#y`46V$WPfwtA56LbA?kNJF~>n&cME2g8O+ldSr1&eAxn6`0$0B}AK|u1 z9qk^Wyu0-7lG5VG@mL_cb134iSVsO#sn1{UBHSZ2X)34ae$!WrQLUj7y`DPLIcWC3 zAKbG4`x2XhXP-gpG=q4MFVq~9B&TrNz!T3^9ZK(|N$6`xa zmWdToVS^Q=W49Ge8q2-Ogn>%YYLTFG7w-0$HL{&_zAM^cKvPqqElX{c5(9P%m2-mj=ZNfRgRdUrgb&HE= zQ`nZ*g&qp2bkplMce;OR*xW4{%NLE6_ry(qZ2%T@QB|ISXP?*C7@wVJ8GhBkv9lr* zcxGI8$e1!2TDYKVT^AM=-l~D0ocm%^5OS4vOlAKu99oB5zQ&Ixdd<~SKkz1_1O>zO z%}(4D4EIQ1YQthn2|(uluIKZ&IX>0Z(IVxiF}zZP5^1tmm9Iw#tr1U@$A0v|qEqbd zHucF(0orDA3X^!*a(`=Hk(I3Sf$*NJ+Tb z$Le;kVpI9^@TvG(Q;$>yfmp!W7oUCQ@=9}f`jvu8U?kJ$(m|GN>3`+8ZZv6_{bq33 z%HLi{%ys+2mIXmQ+bV;YB=Cqo$RfLK&`w3+X(AF8?rWRHMXzhx+1D3Ljm{~TZIARh zD4w(u=RiH)HOs6`6_caI#Zn#np5+j`YD@8Yu!>5g_3lhkJ?yU>7= zhb6C0x0^(m{739jxZ?sUozIU%w=r~luHF>OKT$}Q;X)9Wrc%f~=d6EM5+&i4$_)R~ z;s4!sfoA|&OE7RY*rLOT>E=Y%r#hj=S%gB*&A6(pfuOD~7yTT|_O=#cI?jPKox(r) zPuxwZLGir|%O&UhNJHM|+Db7x|mWyRx0+{e@Dwy?ArDyXWcf1HxCuO}k~)`#Rbrb{PK- z6UWYaFLl-RaqUWxmd-%l$ktl>quDg2?S74U_kCT&Pz%n>4Q%_rx<5=9SyRI{tg#w5 z!}$bu?xbDcn%UfjOGg6oE@8p>GoqL7oL37r(iig}Yzw)?E8W>nlgFHk7G9;qep6w} zn%eAGPnj*hw@o**a3h4&4;aI8GcN{XU0hF&!3gtAa#$E^Q1@Z>y z7sIhpPlPbRzd0^un!YwU=)ivL#^+Xdj@enav6r+3Y;texLZR2%sTy`?=Y)=1V*@&F zW2d$Vr&=`&Rq4FW@d|5&+`cQPl>?pB^BMmX&A(s`H}1gwx5-EHr+#E=Bw~`EG?Izg;S7Oe1;XMf&(%;| zcKX`dw%qaMh7tUchaLM-0EZlKh5iT zA<&d?vQX;>0tyQaKrvpZ4+`-jV^DY&;XzSZ1bN=?3B}^WU?{lQ3KUJnPM{Djfzn+{ zppe~NG(ase1j9^se^Mx+;uk>!f<(x7jQG=s2AcNh79$NPg}kMu3|=G&qP8Rk`f!ha zW~AQtAaBt<1}~xvqWCgvu<7MWG(agc0w2~Hsb@Jv3(Fb2hzf{WRxr@IJ^G1}dR0Q+ zqRO9MXK*E}DyXa6D(I}%tDwWxzJCbx*pkrza9<64=wPIB)ev>5KE$y%w*hK3!a)6A zWWE}zqFiGMR*0^FNOO(l|BqxsWG$K9I=|jI7)<*69Qf;(lnn!F<3zr{hMYh;nHwyb dM@BP^01wF+@bL{9%}mM%=wx}gaM5n+e*xUA*~>`p>V+k3>2qjBdl0B3dWC>B0$d)xzlr@pdG-zyDGMK?w!W2pi z*+Q~4MMbtOS&O`Juikmz|9zzK3t&`6g z0WxJFF*vB~kq9X2DvSjgV2_jsOmo=*)nEa@M7Dx^bEd{GR3ripgSBx3yl63sm;?$c zV1n8%U?rUe&bUy0u_+q^Be3;@OAr#B!NGq&B5M+A@-1D=B@oTDflna{$8Xm1|So+ z4@e+yj>iv--uw<4yKcpUM*KJZ0Xm~dDLbGn%MTPpK}H~2ADZOzJw=AC+GpXr3Y(c> zu%XsqOA%5-E zpQ^h^OTu_XKT@HiE~Qls9UrY$kQQtHuGKnY!;#AWc9unFdAi#7p51Umub+=p#|PUF z?QG$Xdd!)W58z7DIx&@{w`?Adq?tB8W;3ekV#{kxUHZ#>^O%lmrO{vva>3K~s+Y~p4Q5t%Pt@bxyn zFaC^83pQWkY_e6CH}8a%D`rCKveWAm#nuR2_8??Y>|5Y^&swW@s_PZ42%qpoJ>wLV zqcQ_V1&}IG_3S5fnOl2K?9_jjWAXZ(_UfcsX3Rk#NAKyROTUF)V_C|Pm*3L#qWrYy zIYuTgG^{v%b_q8|;wguo40&JCCTfJ5{~}c$vBc^ibyy9z z|B!BZ)wn&3g`g0yaP^YtNt=n7RSK$8v_VU+S&3HxxwAW@wzo#<)1URVK|!f0f+PI0 z))7>OfnLmcH<4y>opQy6xS6IS@{2ZcLo)kY$=QuNo5n9OBn6m>M>A1x^Byh5jn$(h zyRmaxDyi{#?D{B4Lq|yqspz@B>~orjqkRhTDLcYAo^e^CeP!-??CpK-Ex1D}#qT`F zN}qk&GPPJpuYa-czIfG>@|(km;grZVgtGUqf_$cZyA|M}O4g0o~b^WKK!mg;GxSv!C&_Fjm&Zd9Vk|KQp8$eT~44MkhpHSodb@z*+5 zuviT|Lk-h7v-BPj>V~KwZHgG+p7-04^0acA5d7SZpBgtg9X~FrA&!MTS6z&&4}Im~ zH8j)S=I3&3BRH(;=URF7!uenAx8=v<^#3F%F`V|A#HojHzgnpleo^#+M=J??c`my; zv||vK>nRt$iuthT_2-Wj39ie-Y#Uu(o!Ak3+Cm1JH{FcV&_SzIg`39CWOlz+J(w9d zCUC2QHsn@+gH>_Y&w;!3<*ii=w5}T>k}!CMa~4z6bjf?#ykEfd@rDU>#<(YWB~HD} zuHotWR4Ue|FagyU@(I1->-%xqouQ6x#8)_Yte4vF{wKwJ<6RzYVe!Y3>&!TrfW2%; zi`ca>x2F4|CNN0$yY^6waZ}wjLi?AcA}yg2WaIjLKGs*@+VT&ZnIT(|qJ>lr+VfL^ zO_fSvl7Sy>X9bW!hLfjyzQ1eybs9$M(5#X?NEL1`Pa2{;?0i4Ck1@W4r7+KeafyFzfgF;Zn`2Y0@=LV zm9Jlvq7V_ycKqcVKgIGk&U(`+|00hIGP?$GI_k1hp+cpHf@r3P)S{%@a!9B>_J{%j z#&s!$+8M9^eOmnen@9q6I3!>aTn+va#vU{?gQ|ky3H_%evyN^dz&=YA6d746pcu+J z2?}JkJ}BI?ArEm|jAv_rA(fLo8$z;NS#DU{%rOXus( zg?xN@bTl*%qEvb+kq=Sld^&IYHsvm$qX7kwx0;@cJcj7S$8_H2ZOT??1P)zVECl!# zo&XmW^b|>is6CO++q_NLi|D9d5#+6;r^3Y$y;%Iuivc@vlt5Eimq2G#Q34(AQi(d~ zX(0&#W+XXq5k>k(4L~ADR%hLO(`~*QfLXEt;7^9Ug=EM(MTWd8r4YGMYViNhf%m1* zefisuNeBl6%5Ludd&}4XqcTpglTDcr!yX`@OblES%7hq49|ARH5(taTzt0uee*mLq BjsE}u From 16ed8ecffd057fc8935bd50109739558931b4f6d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 4 Apr 2025 16:12:11 +0800 Subject: [PATCH 0916/2029] modify code --- src/class120/Code04_LinkCutCentroids.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/class120/Code04_LinkCutCentroids.java b/src/class120/Code04_LinkCutCentroids.java index 2305918c5..9d1e2245c 100644 --- a/src/class120/Code04_LinkCutCentroids.java +++ b/src/class120/Code04_LinkCutCentroids.java @@ -89,17 +89,13 @@ public static void find(int u, int f) { } // 返回重心的数量 - public static int compute() { - dfs(1, 0); + public static int centerCnt() { int m = 0; for (int i = 1; i <= n; i++) { if (maxsub[i] <= n / 2) { centers[m++] = i; } } - if (m == 2) { - find(centers[1], centers[0]); - } return m; } @@ -121,10 +117,12 @@ public static void main(String[] args) throws IOException { addEdge(u, v); addEdge(v, u); } - if (compute() == 1) { + dfs(1, 0); + if (centerCnt() == 1) { out.println(centers[0] + " " + to[head[centers[0]]]); out.println(centers[0] + " " + to[head[centers[0]]]); } else { + find(centers[1], centers[0]); out.println(leafFather + " " + leaf); out.println(centers[0] + " " + leaf); } From 7ab006fce0372759abeb0f71500357b6510d1b0b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 4 Apr 2025 18:19:00 +0800 Subject: [PATCH 0917/2029] modify code --- src/class163/Code01_DsuOnTree1.java | 6 +++--- src/class163/Code01_DsuOnTree2.java | 6 +++--- src/class163/Code01_DsuOnTree3.java | 6 +++--- src/class163/Code02_ColorBanlance1.java | 6 +++--- src/class163/Code02_ColorBanlance2.java | 6 +++--- src/class163/Code02_ColorBanlance3.java | 6 +++--- src/class163/Code03_LomsatGelral1.java | 6 +++--- src/class163/Code03_LomsatGelral2.java | 6 +++--- src/class163/Code04_DifferntName1.java | 6 +++--- src/class163/Code04_DifferntName2.java | 6 +++--- src/class163/Code05_BloodCousins1.java | 6 +++--- src/class163/Code05_BloodCousins2.java | 6 +++--- src/class163/Code06_RearrangePalindrome1.java | 6 +++--- src/class163/Code06_RearrangePalindrome2.java | 6 +++--- 14 files changed, 42 insertions(+), 42 deletions(-) diff --git a/src/class163/Code01_DsuOnTree1.java b/src/class163/Code01_DsuOnTree1.java index 79bfcf359..205ae9d5e 100644 --- a/src/class163/Code01_DsuOnTree1.java +++ b/src/class163/Code01_DsuOnTree1.java @@ -82,14 +82,14 @@ public static void effect(int u) { } // 子树u每个节点取消贡献 - public static void cancle(int u) { + public static void cancel(int u) { if (--colorCnt[arr[u]] == 0) { diffColors--; } for (int e = head[u], v; e > 0; e = next[e]) { v = to[e]; if (v != fa[u]) { - cancle(v); + cancel(v); } } } @@ -122,7 +122,7 @@ public static void dfs2(int u, int keep) { ans[u] = diffColors; // 如果u是上级节点的轻儿子,子树u的贡献取消,否则保留 if (keep == 0) { - cancle(u); + cancel(u); } } diff --git a/src/class163/Code01_DsuOnTree2.java b/src/class163/Code01_DsuOnTree2.java index 95fbf0763..ee1b0fad3 100644 --- a/src/class163/Code01_DsuOnTree2.java +++ b/src/class163/Code01_DsuOnTree2.java @@ -69,12 +69,12 @@ public static void effect(int u) { } } - public static void cancle(int u) { + public static void cancel(int u) { colorCnt[arr[u]] = 0; // 出现任何颜色,直接把该颜色的计数重置为0 for (int e = head[u], v; e > 0; e = next[e]) { v = to[e]; if (v != fa[u]) { - cancle(v); + cancel(v); } } } @@ -101,7 +101,7 @@ public static void dfs2(int u, int keep) { ans[u] = diffColors; if (keep == 0) { diffColors = 0; // 直接把全局的不同颜色数量重置为0 - cancle(u); + cancel(u); } } diff --git a/src/class163/Code01_DsuOnTree3.java b/src/class163/Code01_DsuOnTree3.java index 5bb8dfebf..270dcb769 100644 --- a/src/class163/Code01_DsuOnTree3.java +++ b/src/class163/Code01_DsuOnTree3.java @@ -68,12 +68,12 @@ // } //} // -//void cancle(int u) { +//void cancel(int u) { // colorCnt[arr[u]] = 0; // for (int e = head[u], v; e > 0; e = nxt[e]) { // v = to[e]; // if (v != fa[u]) { -// cancle(v); +// cancel(v); // } // } //} @@ -100,7 +100,7 @@ // ans[u] = diffColors; // if (keep == 0) { // diffColors = 0; -// cancle(u); +// cancel(u); // } //} // diff --git a/src/class163/Code02_ColorBanlance1.java b/src/class163/Code02_ColorBanlance1.java index 382d19ba8..0184c3481 100644 --- a/src/class163/Code02_ColorBanlance1.java +++ b/src/class163/Code02_ColorBanlance1.java @@ -68,12 +68,12 @@ public static void effect(int u) { } } - public static void cancle(int u) { + public static void cancel(int u) { colorCnt[color[u]]--; colorNum[colorCnt[color[u]] + 1]--; colorNum[colorCnt[color[u]]]++; for (int e = head[u]; e > 0; e = next[e]) { - cancle(to[e]); + cancel(to[e]); } } @@ -100,7 +100,7 @@ public static void dfs2(int u, int keep) { ans++; } if (keep == 0) { - cancle(u); + cancel(u); } } diff --git a/src/class163/Code02_ColorBanlance2.java b/src/class163/Code02_ColorBanlance2.java index 721ad2a13..8d560dc6e 100644 --- a/src/class163/Code02_ColorBanlance2.java +++ b/src/class163/Code02_ColorBanlance2.java @@ -34,7 +34,7 @@ public static void addEdge(int u, int v) { } // stack1、size1、cur1、edge1 - // 用于把effect、cancle、dfs1改成迭代版 + // 用于把effect、cancel、dfs1改成迭代版 public static int[][] stack1 = new int[MAXN][2]; public static int size1, cur1, edge1; @@ -115,7 +115,7 @@ public static void effect(int root) { } } - public static void cancle(int root) { + public static void cancel(int root) { size1 = 0; push1(root, -1); while (size1 > 0) { @@ -176,7 +176,7 @@ public static void dfs2(int u, int keep) { ans++; } if (keep2 == 0) { - cancle(cur2); + cancel(cur2); } } } diff --git a/src/class163/Code02_ColorBanlance3.java b/src/class163/Code02_ColorBanlance3.java index d622af603..4eb862357 100644 --- a/src/class163/Code02_ColorBanlance3.java +++ b/src/class163/Code02_ColorBanlance3.java @@ -56,12 +56,12 @@ // } //} // -//void cancle(int u) { +//void cancel(int u) { // colorCnt[color[u]]--; // colorNum[colorCnt[color[u]] + 1]--; // colorNum[colorCnt[color[u]]]++; // for (int e = head[u]; e > 0; e = nxt[e]) { -// cancle(to[e]); +// cancel(to[e]); // } //} // @@ -88,7 +88,7 @@ // ans++; // } // if (keep == 0) { -// cancle(u); +// cancel(u); // } //} // diff --git a/src/class163/Code03_LomsatGelral1.java b/src/class163/Code03_LomsatGelral1.java index b90737671..a6b491efc 100644 --- a/src/class163/Code03_LomsatGelral1.java +++ b/src/class163/Code03_LomsatGelral1.java @@ -79,13 +79,13 @@ public static void effect(int u, int h) { } } - public static void cancle(int u) { + public static void cancel(int u) { colorCnt[color[u]] = 0; maxCnt[u] = 0; for (int e = head[u], v; e > 0; e = next[e]) { v = to[e]; if (v != fa[u]) { - cancle(v); + cancel(v); } } } @@ -116,7 +116,7 @@ public static void dfs2(int u, int keep) { } } if (keep == 0) { - cancle(u); + cancel(u); } } diff --git a/src/class163/Code03_LomsatGelral2.java b/src/class163/Code03_LomsatGelral2.java index 495d53a39..93bb2d797 100644 --- a/src/class163/Code03_LomsatGelral2.java +++ b/src/class163/Code03_LomsatGelral2.java @@ -75,13 +75,13 @@ // } //} // -//void cancle(int u) { +//void cancel(int u) { // colorCnt[color[u]] = 0; // maxCnt[u] = 0; // for (int e = head[u], v; e > 0; e = nxt[e]) { // v = to[e]; // if (v != fa[u]) { -// cancle(v); +// cancel(v); // } // } //} @@ -112,7 +112,7 @@ // } // } // if (keep == 0) { -// cancle(u); +// cancel(u); // } //} // diff --git a/src/class163/Code04_DifferntName1.java b/src/class163/Code04_DifferntName1.java index 1d6d6115d..ce902ae7a 100644 --- a/src/class163/Code04_DifferntName1.java +++ b/src/class163/Code04_DifferntName1.java @@ -114,10 +114,10 @@ public static void effect(int u) { } } - public static void cancle(int u) { + public static void cancel(int u) { removeId(dep[u], id[u]); for (int e = headg[u]; e > 0; e = nextg[e]) { - cancle(tog[e]); + cancel(tog[e]); } } @@ -142,7 +142,7 @@ public static void dfs2(int u, int keep) { ans[ansiq[i]] = sizeOfDeep(dep[u] + kq[i]); } if (keep == 0) { - cancle(u); + cancel(u); } } diff --git a/src/class163/Code04_DifferntName2.java b/src/class163/Code04_DifferntName2.java index 035a3dac8..15cee2fab 100644 --- a/src/class163/Code04_DifferntName2.java +++ b/src/class163/Code04_DifferntName2.java @@ -102,10 +102,10 @@ // } //} // -//void cancle(int u) { +//void cancel(int u) { // removeId(dep[u], id[u]); // for (int e = headg[u]; e > 0; e = nextg[e]) { -// cancle(tog[e]); +// cancel(tog[e]); // } //} // @@ -130,7 +130,7 @@ // ans[ansiq[i]] = sizeOfDeep(dep[u] + kq[i]); // } // if (keep == 0) { -// cancle(u); +// cancel(u); // } //} // diff --git a/src/class163/Code05_BloodCousins1.java b/src/class163/Code05_BloodCousins1.java index 5459c91d5..ed02a853a 100644 --- a/src/class163/Code05_BloodCousins1.java +++ b/src/class163/Code05_BloodCousins1.java @@ -98,10 +98,10 @@ public static void effect(int u) { } } - public static void cancle(int u) { + public static void cancel(int u) { depCnt[dep[u]]--; for (int e = headg[u]; e > 0; e = nextg[e]) { - cancle(tog[e]); + cancel(tog[e]); } } @@ -126,7 +126,7 @@ public static void dfs2(int u, int keep) { ans[ansiq[i]] = depCnt[dep[u] + kq[i]]; } if (keep == 0) { - cancle(u); + cancel(u); } } diff --git a/src/class163/Code05_BloodCousins2.java b/src/class163/Code05_BloodCousins2.java index d991d176a..702d58b94 100644 --- a/src/class163/Code05_BloodCousins2.java +++ b/src/class163/Code05_BloodCousins2.java @@ -90,10 +90,10 @@ // } //} // -//void cancle(int u) { +//void cancel(int u) { // depCnt[dep[u]]--; // for (int e = headg[u]; e > 0; e = nextg[e]) { -// cancle(tog[e]); +// cancel(tog[e]); // } //} // @@ -118,7 +118,7 @@ // ans[ansiq[i]] = depCnt[dep[u] + kq[i]]; // } // if (keep == 0) { -// cancle(u); +// cancel(u); // } //} // diff --git a/src/class163/Code06_RearrangePalindrome1.java b/src/class163/Code06_RearrangePalindrome1.java index 7467426ef..93b194165 100644 --- a/src/class163/Code06_RearrangePalindrome1.java +++ b/src/class163/Code06_RearrangePalindrome1.java @@ -69,10 +69,10 @@ public static void effect(int u) { } } - public static void cancle(int u) { + public static void cancel(int u) { maxdep[eor[u]] = 0; for (int e = head[u]; e > 0; e = next[e]) { - cancle(to[e]); + cancel(to[e]); } } @@ -125,7 +125,7 @@ public static void dfs2(int u, int keep) { } } if (keep == 0) { - cancle(u); + cancel(u); } } diff --git a/src/class163/Code06_RearrangePalindrome2.java b/src/class163/Code06_RearrangePalindrome2.java index 9f97f353a..b1839bf76 100644 --- a/src/class163/Code06_RearrangePalindrome2.java +++ b/src/class163/Code06_RearrangePalindrome2.java @@ -60,10 +60,10 @@ // } //} // -//void cancle(int u) { +//void cancel(int u) { // maxdep[eor[u]] = 0; // for (int e = head[u]; e > 0; e = nxt[e]) { -// cancle(to[e]); +// cancel(to[e]); // } //} // @@ -111,7 +111,7 @@ // } // } // if (keep == 0) { -// cancle(u); +// cancel(u); // } //} // From 2c090e1b43ddaec0075df12b4fb67f882fc57eb9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 5 Apr 2025 13:43:12 +0800 Subject: [PATCH 0918/2029] modify code --- src/class165/Code02_UndoUnionFind1.java | 49 ++++++++++-------------- src/class165/Code02_UndoUnionFind2.java | 51 +++++++++++-------------- 2 files changed, 43 insertions(+), 57 deletions(-) diff --git a/src/class165/Code02_UndoUnionFind1.java b/src/class165/Code02_UndoUnionFind1.java index f4b41cf88..8fb9a2faf 100644 --- a/src/class165/Code02_UndoUnionFind1.java +++ b/src/class165/Code02_UndoUnionFind1.java @@ -46,36 +46,31 @@ public static int find(int i) { } public static void merge(int x, int y) { - int fx = find(x), fy = find(y); - if (fx == fy) { - opstack[++opsize][0] = 0; - } else { - if (siz[fx] < siz[fy]) { - int tmp = fx; - fx = fy; - fy = tmp; - } - father[fy] = fx; - siz[fx] += siz[fy]; - edgeCnt[fx] += edgeCnt[fy] + 1; - opstack[++opsize][0] = fx; - opstack[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]; + edgeCnt[fx] += edgeCnt[fy] + 1; + opstack[++opsize][0] = fx; + opstack[opsize][1] = fy; } public static void undo() { - if (opsize > 0 && opstack[opsize][0] != 0) { - int fx = opstack[opsize][0]; - int fy = opstack[opsize--][1]; - father[fy] = fy; - siz[fx] -= siz[fy]; - edgeCnt[fx] -= edgeCnt[fy] + 1; - } + int fx = opstack[opsize][0]; + int fy = opstack[opsize--][1]; + father[fy] = fy; + siz[fx] -= siz[fy]; + edgeCnt[fx] -= edgeCnt[fy] + 1; } public static void dfs(int u, int fa) { - int x = arr[u][0], y = arr[u][1]; - int fx = find(x), fy = find(y); + int fx = find(arr[u][0]); + int fy = find(arr[u][1]); boolean merged = false; int add = 0; if (fx == fy) { @@ -89,23 +84,21 @@ public static void dfs(int u, int fa) { ball++; add = 1; } - merge(x, y); + merge(fx, fy); merged = true; } - if (u != 1) { - ans[u] = ball; - } + ans[u] = ball; for (int e = head[u]; e > 0; e = next[e]) { if (to[e] != fa) { dfs(to[e], u); } } - ball -= add; if (merged) { undo(); } else { edgeCnt[fx]--; } + ball -= add; } public static void main(String[] args) throws IOException { diff --git a/src/class165/Code02_UndoUnionFind2.java b/src/class165/Code02_UndoUnionFind2.java index 7252c4f10..648233424 100644 --- a/src/class165/Code02_UndoUnionFind2.java +++ b/src/class165/Code02_UndoUnionFind2.java @@ -42,66 +42,59 @@ //} // //void merge(int x, int y) { -// int fx = find(x), fy = find(y); -// if (fx == fy) { -// opstack[++opsize][0] = 0; -// } else { -// if (siz[fx] < siz[fy]) { -// int tmp = fx; -// fx = fy; -// fy = tmp; -// } -// father[fy] = fx; -// siz[fx] += siz[fy]; -// edgeCnt[fx] += edgeCnt[fy] + 1; -// opstack[++opsize][0] = fx; -// opstack[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]; +// edgeCnt[fx] += edgeCnt[fy] + 1; +// opstack[++opsize][0] = fx; +// opstack[opsize][1] = fy; //} // //void undo() { -// if (opsize > 0 && opstack[opsize][0] != 0) { -// int fx = opstack[opsize][0]; -// int fy = opstack[opsize--][1]; -// father[fy] = fy; -// siz[fx] -= siz[fy]; -// edgeCnt[fx] -= edgeCnt[fy] + 1; -// } +// int fx = opstack[opsize][0]; +// int fy = opstack[opsize--][1]; +// father[fy] = fy; +// siz[fx] -= siz[fy]; +// edgeCnt[fx] -= edgeCnt[fy] + 1; //} // //void dfs(int u, int fa) { -// int x = arr[u][0], y = arr[u][1]; -// int fx = find(x), fy = find(y); +// int fx = find(arr[u][0]); +// int fy = find(arr[u][1]); // bool merged = false; // int add = 0; // if (fx == fy) { // if (edgeCnt[fx] < siz[fx]) { // ball++; // add = 1; -// } +// } // edgeCnt[fx]++; // } else { // if (edgeCnt[fx] < siz[fx] || edgeCnt[fy] < siz[fy]) { // ball++; // add = 1; // } -// merge(x, y); +// merge(fx, fy); // merged = true; // } -// if (u != 1) { -// ans[u] = ball; -// } +// ans[u] = ball; // for (int e = head[u]; e > 0; e = nxt[e]) { // if (to[e] != fa) { // dfs(to[e], u); // } // } -// ball -= add; // if (merged) { // undo(); // } else { // edgeCnt[fx]--; // } +// ball -= add; //} // //int main() { From f221129e6087aa38c4bdfdc6565564ebf35a0c8c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 6 Apr 2025 21:50:23 +0800 Subject: [PATCH 0919/2029] modify code --- src/class165/Code02_UndoUnionFind1.java | 10 +- src/class165/Code02_UndoUnionFind2.java | 10 +- src/class165/Code03_Envy1.java | 148 ++++++++++++++++++++++++ src/class165/Code03_Envy2.java | 143 +++++++++++++++++++++++ 4 files changed, 301 insertions(+), 10 deletions(-) create mode 100644 src/class165/Code03_Envy1.java create mode 100644 src/class165/Code03_Envy2.java diff --git a/src/class165/Code02_UndoUnionFind1.java b/src/class165/Code02_UndoUnionFind1.java index 8fb9a2faf..733270de1 100644 --- a/src/class165/Code02_UndoUnionFind1.java +++ b/src/class165/Code02_UndoUnionFind1.java @@ -26,7 +26,7 @@ public class Code02_UndoUnionFind1 { public static int[] siz = new int[MAXN]; public static int[] edgeCnt = new int[MAXN]; - public static int[][] opstack = new int[MAXN][2]; + public static int[][] rollback = new int[MAXN][2]; public static int opsize = 0; public static int[] ans = new int[MAXN]; @@ -56,13 +56,13 @@ public static void merge(int x, int y) { father[fy] = fx; siz[fx] += siz[fy]; edgeCnt[fx] += edgeCnt[fy] + 1; - opstack[++opsize][0] = fx; - opstack[opsize][1] = fy; + rollback[++opsize][0] = fx; + rollback[opsize][1] = fy; } public static void undo() { - int fx = opstack[opsize][0]; - int fy = opstack[opsize--][1]; + int fx = rollback[opsize][0]; + int fy = rollback[opsize--][1]; father[fy] = fy; siz[fx] -= siz[fy]; edgeCnt[fx] -= edgeCnt[fy] + 1; diff --git a/src/class165/Code02_UndoUnionFind2.java b/src/class165/Code02_UndoUnionFind2.java index 648233424..38a58646e 100644 --- a/src/class165/Code02_UndoUnionFind2.java +++ b/src/class165/Code02_UndoUnionFind2.java @@ -22,7 +22,7 @@ //int siz[MAXN]; //int edgeCnt[MAXN]; // -//int opstack[MAXN][2]; +//int rollback[MAXN][2]; //int opsize = 0; // //int ans[MAXN]; @@ -52,13 +52,13 @@ // father[fy] = fx; // siz[fx] += siz[fy]; // edgeCnt[fx] += edgeCnt[fy] + 1; -// opstack[++opsize][0] = fx; -// opstack[opsize][1] = fy; +// rollback[++opsize][0] = fx; +// rollback[opsize][1] = fy; //} // //void undo() { -// int fx = opstack[opsize][0]; -// int fy = opstack[opsize--][1]; +// int fx = rollback[opsize][0]; +// int fy = rollback[opsize--][1]; // father[fy] = fy; // siz[fx] -= siz[fy]; // edgeCnt[fx] -= edgeCnt[fy] + 1; diff --git a/src/class165/Code03_Envy1.java b/src/class165/Code03_Envy1.java new file mode 100644 index 000000000..de6d6ce17 --- /dev/null +++ b/src/class165/Code03_Envy1.java @@ -0,0 +1,148 @@ +package class165; + +// k条边同在最小生成树里,java版 +// 测试链接 : https://www.luogu.com.cn/problem/CF891C +// 测试链接 : https://codeforces.com/problemset/problem/891/C +// 提交以下的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_Envy1 { + + public static int MAXN = 500001; + public static int n, m, q, k; + + // 节点u、节点v、边权w + public static int[][] edge = new int[MAXN][3]; + + // 节点u、节点v、边权w、问题编号i + public static int[][] queryEdge = new int[MAXN][4]; + + // 可撤销并查集 + public static int[] father = new int[MAXN]; + public static int[] siz = new int[MAXN]; + public static int[][] rollback = new int[MAXN << 1][2]; + public static int opsize; + + // 答案数组 + public static boolean[] ans = new boolean[MAXN]; + + public static int find(int i) { + while (i != father[i]) { + i = father[i]; + } + return i; + } + + public static boolean merge(int x, int y) { + int fx = find(x); + int fy = find(y); + if (fx == fy) { + rollback[++opsize][0] = 0; + return false; + } + 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() { + if (rollback[opsize][0] == 0) { + opsize--; + } else { + int fx = rollback[opsize][0]; + int fy = rollback[opsize--][1]; + father[fy] = fy; + siz[fx] -= siz[fy]; + } + } + + public static void prepare() { + for (int i = 1; i <= n; i++) { + father[i] = i; + siz[i] = 1; + } + Arrays.sort(edge, 1, m + 1, (a, b) -> a[2] - b[2]); + Arrays.sort(queryEdge, 1, k + 1, (a, b) -> a[2] != b[2] ? (a[2] - b[2]) : (a[3] - b[3])); + Arrays.fill(ans, 1, q + 1, true); + } + + public static void compute() { + int ei = 1; + for (int l = 1, r = 1; l <= k; l = ++r) { + for (; ei <= m && edge[ei][2] < queryEdge[l][2]; ei++) { + merge(edge[ei][0], edge[ei][1]); + } + while (r + 1 <= k && queryEdge[l][2] == queryEdge[r + 1][2] && queryEdge[l][3] == queryEdge[r + 1][3]) { + r++; + } + for (int i = l; i <= r; i++) { + if (!merge(queryEdge[i][0], queryEdge[i][1])) { + ans[queryEdge[i][3]] = false; + } + } + for (int i = l; i <= r; i++) { + undo(); + } + } + } + + 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; i <= m; i++) { + in.nextToken(); + edge[i][0] = (int) in.nval; + in.nextToken(); + edge[i][1] = (int) in.nval; + in.nextToken(); + edge[i][2] = (int) in.nval; + } + in.nextToken(); + q = (int) in.nval; + k = 0; + for (int i = 1, s; i <= q; i++) { + in.nextToken(); + s = (int) in.nval; + for (int j = 1, ei; j <= s; j++) { + in.nextToken(); + ei = (int) in.nval; + queryEdge[++k][0] = edge[ei][0]; + queryEdge[k][1] = edge[ei][1]; + queryEdge[k][2] = edge[ei][2]; + queryEdge[k][3] = i; + } + } + prepare(); + compute(); + for (int i = 1; i <= q; i++) { + if (ans[i]) { + out.println("YES"); + } else { + out.println("NO"); + } + } + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class165/Code03_Envy2.java b/src/class165/Code03_Envy2.java new file mode 100644 index 000000000..01e568048 --- /dev/null +++ b/src/class165/Code03_Envy2.java @@ -0,0 +1,143 @@ +package class165; + +// k条边同在最小生成树里,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/CF891C +// 测试链接 : https://codeforces.com/problemset/problem/891/C +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Edge { +// int u, v, w; +//}; +// +//bool EdgeCmp(Edge x, Edge y) { +// return x.w < y.w; +//} +// +//struct QueryEdge { +// int u, v, w, i; +//}; +// +//bool QueryEdgeCmp(QueryEdge x, QueryEdge y) { +// if(x.w != y.w) { +// return x.w < y.w; +// } else { +// return x.i < y.i; +// } +//} +// +//const int MAXN = 500001; +//int n, m, q, k; +//Edge edge[MAXN]; +//QueryEdge queryEdge[MAXN]; +// +//int father[MAXN]; +//int siz[MAXN]; +//int rollback[MAXN << 1][2]; +//int opsize; +// +//bool ans[MAXN]; +// +//int find(int i) { +// while (i != father[i]) { +// i = father[i]; +// } +// return i; +//} +// +//bool merge(int x, int y) { +// int fx = find(x); +// int fy = find(y); +// if (fx == fy) { +// rollback[++opsize][0] = 0; +// return false; +// } +// 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() { +// if (rollback[opsize][0] == 0) { +// opsize--; +// } else { +// int fx = rollback[opsize][0]; +// int fy = rollback[opsize--][1]; +// father[fy] = fy; +// siz[fx] -= siz[fy]; +// } +//} +// +//void prepare() { +// for (int i = 1; i <= n; i++) { +// father[i] = i; +// siz[i] = 1; +// } +// sort(edge + 1, edge + m + 1, EdgeCmp); +// sort(queryEdge + 1, queryEdge + k + 1, QueryEdgeCmp); +// for (int i = 1; i <= q; i++) { +// ans[i] = true; +// } +//} +// +//void compute() { +// int ei = 1; +// for (int l = 1, r = 1; l <= k; l = ++r) { +// for (; ei <= m && edge[ei].w < queryEdge[l].w; ei++) { +// merge(edge[ei].u, edge[ei].v); +// } +// while (r + 1 <= k && queryEdge[l].w == queryEdge[r + 1].w && queryEdge[l].i == queryEdge[r + 1].i) { +// r++; +// } +// for (int i = l; i <= r; i++) { +// if (!merge(queryEdge[i].u, queryEdge[i].v)) { +// ans[queryEdge[i].i] = false; +// } +// } +// for (int i = l; i <= r; i++) { +// undo(); +// } +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1; i <= m; i++) { +// cin >> edge[i].u >> edge[i].v >> edge[i].w; +// } +// cin >> q; +// k = 0; +// for (int i = 1, s; i <= q; i++) { +// cin >> s; +// for (int j = 1, ei; j <= s; j++) { +// cin >> ei; +// queryEdge[++k].u = edge[ei].u; +// queryEdge[k].v = edge[ei].v; +// queryEdge[k].w = edge[ei].w; +// queryEdge[k].i = i; +// } +// } +// prepare(); +// compute(); +// 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 4a69d218ee846e177b8e32da1cad2b568d7cc27b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 6 Apr 2025 22:01:26 +0800 Subject: [PATCH 0920/2029] modify code --- src/class165/Code03_Envy1.java | 2 +- src/class165/Code03_Envy2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class165/Code03_Envy1.java b/src/class165/Code03_Envy1.java index de6d6ce17..7681de0ed 100644 --- a/src/class165/Code03_Envy1.java +++ b/src/class165/Code03_Envy1.java @@ -1,6 +1,6 @@ package class165; -// k条边同在最小生成树里,java版 +// 同在最小生成树里,java版 // 测试链接 : https://www.luogu.com.cn/problem/CF891C // 测试链接 : https://codeforces.com/problemset/problem/891/C // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class165/Code03_Envy2.java b/src/class165/Code03_Envy2.java index 01e568048..aff5a4586 100644 --- a/src/class165/Code03_Envy2.java +++ b/src/class165/Code03_Envy2.java @@ -1,6 +1,6 @@ package class165; -// k条边同在最小生成树里,C++版 +// 同在最小生成树里,C++版 // 测试链接 : https://www.luogu.com.cn/problem/CF891C // 测试链接 : https://codeforces.com/problemset/problem/891/C // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 From fe528c0a531c3ef725fd0b5b284f1dd0d3068faf Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 8 Apr 2025 16:52:12 +0800 Subject: [PATCH 0921/2029] modify code --- src/class165/Code01_PersistentUnionFind1.java | 4 +- src/class165/Code01_PersistentUnionFind2.java | 4 +- src/class165/Code02_UndoUnionFind1.java | 10 +- src/class165/Code02_UndoUnionFind2.java | 10 +- src/class165/Code03_Envy1.java | 33 ++-- src/class165/Code03_Envy2.java | 35 ++-- src/class165/Code04_TeamBuilding1.java | 153 ++++++++++++++++++ src/class165/Code04_TeamBuilding2.java | 147 +++++++++++++++++ 8 files changed, 346 insertions(+), 50 deletions(-) create mode 100644 src/class165/Code04_TeamBuilding1.java create mode 100644 src/class165/Code04_TeamBuilding2.java diff --git a/src/class165/Code01_PersistentUnionFind1.java b/src/class165/Code01_PersistentUnionFind1.java index 29379ba16..a04a36597 100644 --- a/src/class165/Code01_PersistentUnionFind1.java +++ b/src/class165/Code01_PersistentUnionFind1.java @@ -86,7 +86,7 @@ public static int find(int x, int v) { return x; } - public static void merge(int x, int y, int v) { + public static void union(int x, int y, int v) { int fx = find(x, v); int fy = find(y, v); if (fx != fy) { @@ -122,7 +122,7 @@ public static void main(String[] args) throws IOException { x = (int) in.nval; in.nextToken(); y = (int) in.nval; - merge(x, y, v); + union(x, y, v); } else if (op == 2) { in.nextToken(); x = (int) in.nval; diff --git a/src/class165/Code01_PersistentUnionFind2.java b/src/class165/Code01_PersistentUnionFind2.java index 6882f8b7c..1d58ae11f 100644 --- a/src/class165/Code01_PersistentUnionFind2.java +++ b/src/class165/Code01_PersistentUnionFind2.java @@ -81,7 +81,7 @@ // return x; //} // -//void merge(int x, int y, int v) { +//void Union(int x, int y, int v) { // int fx = find(x, v); // int fy = find(y, v); // if (fx != fy) { @@ -109,7 +109,7 @@ // rootsiz[v] = rootsiz[v - 1]; // if (op == 1) { // cin >> x >> y; -// merge(x, y, v); +// Union(x, y, v); // } else if (op == 2) { // cin >> x; // rootfa[v] = rootfa[x]; diff --git a/src/class165/Code02_UndoUnionFind1.java b/src/class165/Code02_UndoUnionFind1.java index 733270de1..07afc3936 100644 --- a/src/class165/Code02_UndoUnionFind1.java +++ b/src/class165/Code02_UndoUnionFind1.java @@ -45,7 +45,7 @@ public static int find(int i) { return i; } - public static void merge(int x, int y) { + public static void union(int x, int y) { int fx = find(x); int fy = find(y); if (siz[fx] < siz[fy]) { @@ -71,7 +71,7 @@ public static void undo() { public static void dfs(int u, int fa) { int fx = find(arr[u][0]); int fy = find(arr[u][1]); - boolean merged = false; + boolean unioned = false; int add = 0; if (fx == fy) { if (edgeCnt[fx] < siz[fx]) { @@ -84,8 +84,8 @@ public static void dfs(int u, int fa) { ball++; add = 1; } - merge(fx, fy); - merged = true; + union(fx, fy); + unioned = true; } ans[u] = ball; for (int e = head[u]; e > 0; e = next[e]) { @@ -93,7 +93,7 @@ public static void dfs(int u, int fa) { dfs(to[e], u); } } - if (merged) { + if (unioned) { undo(); } else { edgeCnt[fx]--; diff --git a/src/class165/Code02_UndoUnionFind2.java b/src/class165/Code02_UndoUnionFind2.java index 38a58646e..f80232477 100644 --- a/src/class165/Code02_UndoUnionFind2.java +++ b/src/class165/Code02_UndoUnionFind2.java @@ -41,7 +41,7 @@ // return i; //} // -//void merge(int x, int y) { +//void Union(int x, int y) { // int fx = find(x); // int fy = find(y); // if (siz[fx] < siz[fy]) { @@ -67,7 +67,7 @@ //void dfs(int u, int fa) { // int fx = find(arr[u][0]); // int fy = find(arr[u][1]); -// bool merged = false; +// bool unioned = false; // int add = 0; // if (fx == fy) { // if (edgeCnt[fx] < siz[fx]) { @@ -80,8 +80,8 @@ // ball++; // add = 1; // } -// merge(fx, fy); -// merged = true; +// Union(fx, fy); +// unioned = true; // } // ans[u] = ball; // for (int e = head[u]; e > 0; e = nxt[e]) { @@ -89,7 +89,7 @@ // dfs(to[e], u); // } // } -// if (merged) { +// if (unioned) { // undo(); // } else { // edgeCnt[fx]--; diff --git a/src/class165/Code03_Envy1.java b/src/class165/Code03_Envy1.java index 7681de0ed..f8d2399b8 100644 --- a/src/class165/Code03_Envy1.java +++ b/src/class165/Code03_Envy1.java @@ -20,7 +20,6 @@ public class Code03_Envy1 { // 节点u、节点v、边权w public static int[][] edge = new int[MAXN][3]; - // 节点u、节点v、边权w、问题编号i public static int[][] queryEdge = new int[MAXN][4]; @@ -40,13 +39,9 @@ public static int find(int i) { return i; } - public static boolean merge(int x, int y) { + public static void union(int x, int y) { int fx = find(x); int fy = find(y); - if (fx == fy) { - rollback[++opsize][0] = 0; - return false; - } if (siz[fx] < siz[fy]) { int tmp = fx; fx = fy; @@ -56,18 +51,13 @@ public static boolean merge(int x, int y) { siz[fx] += siz[fy]; rollback[++opsize][0] = fx; rollback[opsize][1] = fy; - return true; } public static void undo() { - if (rollback[opsize][0] == 0) { - opsize--; - } else { - 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]; } public static void prepare() { @@ -84,17 +74,24 @@ public static void compute() { int ei = 1; for (int l = 1, r = 1; l <= k; l = ++r) { for (; ei <= m && edge[ei][2] < queryEdge[l][2]; ei++) { - merge(edge[ei][0], edge[ei][1]); + if (find(edge[ei][0]) != find(edge[ei][1])) { + union(edge[ei][0], edge[ei][1]); + } } while (r + 1 <= k && queryEdge[l][2] == queryEdge[r + 1][2] && queryEdge[l][3] == queryEdge[r + 1][3]) { r++; } + int unionCnt = 0; for (int i = l; i <= r; i++) { - if (!merge(queryEdge[i][0], queryEdge[i][1])) { + if (find(queryEdge[i][0]) == find(queryEdge[i][1])) { ans[queryEdge[i][3]] = false; + break; + } else { + union(queryEdge[i][0], queryEdge[i][1]); + unionCnt++; } } - for (int i = l; i <= r; i++) { + for (int i = 1; i <= unionCnt; i++) { undo(); } } diff --git a/src/class165/Code03_Envy2.java b/src/class165/Code03_Envy2.java index aff5a4586..f0fb73b16 100644 --- a/src/class165/Code03_Envy2.java +++ b/src/class165/Code03_Envy2.java @@ -24,7 +24,7 @@ // //bool QueryEdgeCmp(QueryEdge x, QueryEdge y) { // if(x.w != y.w) { -// return x.w < y.w; +// return x.w < y.w; // } else { // return x.i < y.i; // } @@ -32,6 +32,7 @@ // //const int MAXN = 500001; //int n, m, q, k; +// //Edge edge[MAXN]; //QueryEdge queryEdge[MAXN]; // @@ -49,13 +50,9 @@ // return i; //} // -//bool merge(int x, int y) { +//void Union(int x, int y) { // int fx = find(x); // int fy = find(y); -// if (fx == fy) { -// rollback[++opsize][0] = 0; -// return false; -// } // if (siz[fx] < siz[fy]) { // int tmp = fx; // fx = fy; @@ -65,18 +62,13 @@ // siz[fx] += siz[fy]; // rollback[++opsize][0] = fx; // rollback[opsize][1] = fy; -// return true; //} // //void undo() { -// if (rollback[opsize][0] == 0) { -// opsize--; -// } else { -// 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 prepare() { @@ -95,17 +87,24 @@ // int ei = 1; // for (int l = 1, r = 1; l <= k; l = ++r) { // for (; ei <= m && edge[ei].w < queryEdge[l].w; ei++) { -// merge(edge[ei].u, edge[ei].v); +// if (find(edge[ei].u) != find(edge[ei].v)) { +// Union(edge[ei].u, edge[ei].v); +// } // } // while (r + 1 <= k && queryEdge[l].w == queryEdge[r + 1].w && queryEdge[l].i == queryEdge[r + 1].i) { // r++; // } +// int unionCnt = 0; // for (int i = l; i <= r; i++) { -// if (!merge(queryEdge[i].u, queryEdge[i].v)) { +// if (find(queryEdge[i].u) == find(queryEdge[i].v)) { // ans[queryEdge[i].i] = false; +// break; +// } else { +// Union(queryEdge[i].u, queryEdge[i].v); +// unionCnt++; // } // } -// for (int i = l; i <= r; i++) { +// for (int i = 1; i <= unionCnt; i++) { // undo(); // } // } diff --git a/src/class165/Code04_TeamBuilding1.java b/src/class165/Code04_TeamBuilding1.java new file mode 100644 index 000000000..356ac2353 --- /dev/null +++ b/src/class165/Code04_TeamBuilding1.java @@ -0,0 +1,153 @@ +package class165; + +// 团建,java版 +// 测试链接 : https://www.luogu.com.cn/problem/CF1444C +// 测试链接 : https://codeforces.com/problemset/problem/1444/C +// 提交以下的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 Code04_TeamBuilding1 { + + public static int MAXN = 500001; + public static int n, m, k; + + public static int[] color = new int[MAXN]; + public static int[][] edge = new int[MAXN][2]; + public static int[][] crossEdge = new int[MAXN][4]; + public static int cnt = 0; + + public static boolean[] conflict = new boolean[MAXN]; + + 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 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 filter() { + for (int i = 1; i <= 2 * n; ++i) { + father[i] = i; + siz[i] = 1; + } + for (int i = 1, u, v; i <= m; i++) { + u = edge[i][0]; + v = edge[i][1]; + if (color[u] < color[v]) { + crossEdge[++cnt][0] = u; + crossEdge[cnt][1] = color[u]; + crossEdge[cnt][2] = v; + crossEdge[cnt][3] = color[v]; + } else if (color[u] > color[v]) { + crossEdge[++cnt][0] = v; + crossEdge[cnt][1] = color[v]; + crossEdge[cnt][2] = u; + crossEdge[cnt][3] = color[u]; + } else { + if (conflict[color[u]]) { + continue; + } + if (find(u) == find(v)) { + k--; + conflict[color[u]] = true; + } else { + union(u, v + n); + union(v, u + n); + } + } + } + } + + public static long compute() { + Arrays.sort(crossEdge, 1, cnt + 1, (a, b) -> a[1] != b[1] ? (a[1] - b[1]) : (a[3] - b[3])); + long ans = (long) k * (k - 1) / 2; + for (int l = 1, r = 1; l <= cnt; l = ++r) { + while (r + 1 <= cnt && crossEdge[r + 1][1] == crossEdge[l][1] && crossEdge[r + 1][3] == crossEdge[l][3]) { + r++; + } + int u, ucolor, v, vcolor, unionCnt = 0; + for (int i = l; i <= r; i++) { + u = crossEdge[i][0]; + ucolor = crossEdge[i][1]; + v = crossEdge[i][2]; + vcolor = crossEdge[i][3]; + if (conflict[ucolor] || conflict[vcolor]) { + break; + } + if (find(u) == find(v)) { + ans--; + break; + } else { + union(u, v + n); + union(v, u + n); + unionCnt += 2; + } + } + for (int i = 1; i <= unionCnt; i++) { + undo(); + } + } + return ans; + } + + 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; + in.nextToken(); + k = (int) in.nval; + for (int i = 1; i <= n; i++) { + in.nextToken(); + color[i] = (int) in.nval; + } + for (int i = 1; i <= m; i++) { + in.nextToken(); + edge[i][0] = (int) in.nval; + in.nextToken(); + edge[i][1] = (int) in.nval; + } + filter(); + out.println(compute()); + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class165/Code04_TeamBuilding2.java b/src/class165/Code04_TeamBuilding2.java new file mode 100644 index 000000000..5e3b6d4c0 --- /dev/null +++ b/src/class165/Code04_TeamBuilding2.java @@ -0,0 +1,147 @@ +package class165; + +// 团建,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/CF1444C +// 测试链接 : https://codeforces.com/problemset/problem/1444/C +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct CrossEdge { +// int u, ucolor, v, vcolor; +//}; +// +//bool CrossEdgeCmp(CrossEdge x, CrossEdge y) { +// if(x.ucolor != y.ucolor) { +// return x.ucolor < y.ucolor; +// } else { +// return x.vcolor < y.vcolor; +// } +//} +// +//const int MAXN = 500001; +//int n, m, k; +// +//int color[MAXN]; +//int edge[MAXN][2]; +//CrossEdge crossEdge[MAXN]; +//int cnt = 0; +// +//bool conflict[MAXN]; +// +//int father[MAXN << 1]; +//int siz[MAXN << 1]; +//int rollback[MAXN << 1][2]; +//int opsize; +// +//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 filter() { +// for (int i = 1; i <= 2 * n; ++i) { +// father[i] = i; +// siz[i] = 1; +// } +// for (int i = 1, u, v; i <= m; i++) { +// u = edge[i][0]; +// v = edge[i][1]; +// if (color[u] < color[v]) { +// crossEdge[++cnt].u = u; +// crossEdge[cnt].ucolor = color[u]; +// crossEdge[cnt].v = v; +// crossEdge[cnt].vcolor = color[v]; +// } else if (color[u] > color[v]) { +// crossEdge[++cnt].u = v; +// crossEdge[cnt].ucolor = color[v]; +// crossEdge[cnt].v = u; +// crossEdge[cnt].vcolor = color[u]; +// } else { +// if (conflict[color[u]]) { +// continue; +// } +// if (find(u) == find(v)) { +// k--; +// conflict[color[u]] = true; +// } else { +// Union(u, v + n); +// Union(v, u + n); +// } +// } +// } +//} +// +//long long compute() { +// sort(crossEdge + 1, crossEdge + cnt + 1, CrossEdgeCmp); +// long long ans = (long long)k * (k - 1) / 2; +// for (int l = 1, r = 1; l <= cnt; l = ++r) { +// while (r + 1 <= cnt && crossEdge[r + 1].ucolor == crossEdge[l].ucolor +// && crossEdge[r + 1].vcolor == crossEdge[l].vcolor) { +// r++; +// } +// int u, v, ucolor, vcolor, unionCnt = 0; +// for (int i = l; i <= r; i++) { +// u = crossEdge[i].u; +// ucolor = crossEdge[i].ucolor; +// v = crossEdge[i].v; +// vcolor = crossEdge[i].vcolor; +// if (conflict[ucolor] || conflict[vcolor]) { +// break; +// } +// if (find(u) == find(v)) { +// ans--; +// break; +// } else { +// Union(u, v + n); +// Union(v, u + n); +// unionCnt += 2; +// } +// } +// for (int i = 1; i <= unionCnt; i++) { +// undo(); +// } +// } +// return ans; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m >> k; +// for (int i = 1; i <= n; i++) { +// cin >> color[i]; +// } +// for (int i = 1; i <= m; i++) { +// cin >> edge[i][0] >> edge[i][1]; +// } +// filter(); +// cout << compute() << "\n"; +// return 0; +//} \ No newline at end of file From 6ba39f215d7e6374df886bd9d1bd910e41cc405b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 8 Apr 2025 17:39:45 +0800 Subject: [PATCH 0922/2029] modify code --- src/class165/Code01_PersistentUnionFind1.java | 7 +++++++ src/class165/Code01_PersistentUnionFind2.java | 7 +++++++ src/class165/Code02_UndoUnionFind1.java | 5 +++++ src/class165/Code02_UndoUnionFind2.java | 5 +++++ src/class165/Code03_Envy1.java | 4 ++++ src/class165/Code03_Envy2.java | 4 ++++ src/class165/Code04_TeamBuilding1.java | 8 ++++++++ src/class165/Code04_TeamBuilding2.java | 8 ++++++++ 8 files changed, 48 insertions(+) diff --git a/src/class165/Code01_PersistentUnionFind1.java b/src/class165/Code01_PersistentUnionFind1.java index a04a36597..7f518a5be 100644 --- a/src/class165/Code01_PersistentUnionFind1.java +++ b/src/class165/Code01_PersistentUnionFind1.java @@ -1,6 +1,13 @@ package class165; // 可持久化并查集模版题,java版 +// 数字从1到n,一开始每个数字所在的集合只有自己 +// 实现如下三种操作,第i条操作发生后,所有数字的状况记为i版本,操作一共发生m次 +// 操作 1 x y : 基于上个操作生成的版本,将x的集合与y的集合合并,生成当前的版本 +// 操作 2 x : 拷贝第x号版本的状况,生成当前的版本 +// 操作 3 x y : 拷贝上个操作生成的版本,生成当前的版本,查询x和y是否属于一个集合 +// 1 <= n <= 10^5 +// 1 <= m <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3402 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class165/Code01_PersistentUnionFind2.java b/src/class165/Code01_PersistentUnionFind2.java index 1d58ae11f..a65671c0c 100644 --- a/src/class165/Code01_PersistentUnionFind2.java +++ b/src/class165/Code01_PersistentUnionFind2.java @@ -1,6 +1,13 @@ package class165; // 可持久化并查集模版题,C++版 +// 数字从1到n,一开始每个数字所在的集合只有自己 +// 实现如下三种操作,第i条操作发生后,所有数字的状况记为i版本,操作一共发生m次 +// 操作 1 x y : 基于上个操作生成的版本,将x的集合与y的集合合并,生成当前的版本 +// 操作 2 x : 拷贝第x号版本的状况,生成当前的版本 +// 操作 3 x y : 拷贝上个操作生成的版本,生成当前的版本,查询x和y是否属于一个集合 +// 1 <= n <= 10^5 +// 1 <= m <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3402 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class165/Code02_UndoUnionFind1.java b/src/class165/Code02_UndoUnionFind1.java index 07afc3936..bf4f02fa1 100644 --- a/src/class165/Code02_UndoUnionFind1.java +++ b/src/class165/Code02_UndoUnionFind1.java @@ -1,6 +1,11 @@ package class165; // 可撤销并查集模版题,java版 +// 一共有n个点,每个点有两个小球,每个点给定两个小球的编号 +// 一共有n-1条无向边,所有节点连成一棵树 +// 对i号点,2 <= i <= n,都计算如下问题的答案并打印 +// 从1号点到i号点的最短路径上,每个点只能拿一个小球,最多能拿几个编号不同的小球 +// 1 <= n <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/AT_abc302_h // 测试链接 : https://atcoder.jp/contests/abc302/tasks/abc302_h // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class165/Code02_UndoUnionFind2.java b/src/class165/Code02_UndoUnionFind2.java index f80232477..e5e752cb1 100644 --- a/src/class165/Code02_UndoUnionFind2.java +++ b/src/class165/Code02_UndoUnionFind2.java @@ -1,6 +1,11 @@ package class165; // 可撤销并查集模版题,C++版 +// 一共有n个点,每个点有两个小球,每个点给定两个小球的编号 +// 一共有n-1条无向边,所有节点连成一棵树 +// 对i号点,2 <= i <= n,都计算如下问题的答案并打印 +// 从1号点到i号点的最短路径上,每个点只能拿一个小球,最多能拿几个编号不同的小球 +// 1 <= n <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/AT_abc302_h // 测试链接 : https://atcoder.jp/contests/abc302/tasks/abc302_h // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 diff --git a/src/class165/Code03_Envy1.java b/src/class165/Code03_Envy1.java index f8d2399b8..17be5e062 100644 --- a/src/class165/Code03_Envy1.java +++ b/src/class165/Code03_Envy1.java @@ -1,6 +1,10 @@ package class165; // 同在最小生成树里,java版 +// 一共有n个点,m条无向边,每条边有边权 +// 一共有q次查询,每条查询都给定参数k,表示该查询涉及k条边 +// 然后依次给出k条边的编号,打印这k条边能否同时出现在一颗最小生成树上 +// 1 <= n、m、q、所有查询涉及边的总量 <= 5 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/CF891C // 测试链接 : https://codeforces.com/problemset/problem/891/C // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class165/Code03_Envy2.java b/src/class165/Code03_Envy2.java index f0fb73b16..6dcc88e68 100644 --- a/src/class165/Code03_Envy2.java +++ b/src/class165/Code03_Envy2.java @@ -1,6 +1,10 @@ package class165; // 同在最小生成树里,C++版 +// 一共有n个点,m条无向边,每条边有边权 +// 一共有q次查询,每条查询都给定参数k,表示该查询涉及k条边 +// 然后依次给出k条边的编号,打印这k条边能否同时出现在一颗最小生成树上 +// 1 <= n、m、q、所有查询涉及边的总量 <= 5 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/CF891C // 测试链接 : https://codeforces.com/problemset/problem/891/C // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 diff --git a/src/class165/Code04_TeamBuilding1.java b/src/class165/Code04_TeamBuilding1.java index 356ac2353..f4e899bfc 100644 --- a/src/class165/Code04_TeamBuilding1.java +++ b/src/class165/Code04_TeamBuilding1.java @@ -1,6 +1,14 @@ package class165; // 团建,java版 +// 一共有n个人,编号1~n,一共有k种颜色,编号1~k +// 每个人给定一种颜色,颜色相同的人认为是一个小组,可能有的颜色的组是没人的 +// 给定m条边,每条边连接两个人,代表这两人之间有矛盾 +// 假设组a和组b,两个组的人一起去团建,组a和组b的所有人,可以重新打乱 +// 目的是所有人最多分成两个集团,并且每个集团的内部不存在矛盾,每人都要参加 +// 那么组a和组b就叫做一个"合法组对",注意,组b和组a就不用重复计算了 +// 一共有k个组,随意选两个组的情况很多,计算一共有多少个"合法组对" +// 1 <= n、m、k <= 5 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/CF1444C // 测试链接 : https://codeforces.com/problemset/problem/1444/C // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class165/Code04_TeamBuilding2.java b/src/class165/Code04_TeamBuilding2.java index 5e3b6d4c0..45dc820f4 100644 --- a/src/class165/Code04_TeamBuilding2.java +++ b/src/class165/Code04_TeamBuilding2.java @@ -1,6 +1,14 @@ package class165; // 团建,C++版 +// 一共有n个人,编号1~n,一共有k种颜色,编号1~k +// 每个人给定一种颜色,颜色相同的人认为是一个小组,可能有的颜色的组是没人的 +// 给定m条边,每条边连接两个人,代表这两人之间有矛盾 +// 假设组a和组b,两个组的人一起去团建,组a和组b的所有人,可以重新打乱 +// 目的是所有人最多分成两个集团,并且每个集团的内部不存在矛盾,每人都要参加 +// 那么组a和组b就叫做一个"合法组对",注意,组b和组a就不用重复计算了 +// 一共有k个组,随意选两个组的情况很多,计算一共有多少个"合法组对" +// 1 <= n、m、k <= 5 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/CF1444C // 测试链接 : https://codeforces.com/problemset/problem/1444/C // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 From 68b4e794999d2402a73b4afe678db98cf670a366 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 10 Apr 2025 15:13:17 +0800 Subject: [PATCH 0923/2029] modify code --- src/class165/Code04_TeamBuilding1.java | 23 ++++++++++++++++------- src/class165/Code04_TeamBuilding2.java | 17 +++++++++-------- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/src/class165/Code04_TeamBuilding1.java b/src/class165/Code04_TeamBuilding1.java index f4e899bfc..27fcac2ad 100644 --- a/src/class165/Code04_TeamBuilding1.java +++ b/src/class165/Code04_TeamBuilding1.java @@ -26,13 +26,21 @@ public class Code04_TeamBuilding1 { public static int MAXN = 500001; public static int n, m, k; + // 每个节点的颜色 public static int[] color = new int[MAXN]; + // 每条边有两个端点 public static int[][] edge = new int[MAXN][2]; + + // 两个端点为不同颜色的边,u、ucolor、v、vcolor public static int[][] crossEdge = new int[MAXN][4]; + // 两个端点为不同颜色的边的数量 public static int cnt = 0; + // conflict[i] = true,表示颜色为i的组,组内即便是二分图,也无法调和矛盾 + // conflict[i] = false,表示颜色为i的组,组内构成二分图,可以调和矛盾 public static boolean[] conflict = new boolean[MAXN]; + // 可撤销并查集 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]; @@ -102,19 +110,20 @@ public static void filter() { public static long compute() { Arrays.sort(crossEdge, 1, cnt + 1, (a, b) -> a[1] != b[1] ? (a[1] - b[1]) : (a[3] - b[3])); long ans = (long) k * (k - 1) / 2; + int u, ucolor, v, vcolor, unionCnt; for (int l = 1, r = 1; l <= cnt; l = ++r) { - while (r + 1 <= cnt && crossEdge[r + 1][1] == crossEdge[l][1] && crossEdge[r + 1][3] == crossEdge[l][3]) { + ucolor = crossEdge[l][1]; + vcolor = crossEdge[l][3]; + while (r + 1 <= cnt && crossEdge[r + 1][1] == ucolor && crossEdge[r + 1][3] == vcolor) { r++; } - int u, ucolor, v, vcolor, unionCnt = 0; + if (conflict[ucolor] || conflict[vcolor]) { + continue; + } + unionCnt = 0; for (int i = l; i <= r; i++) { u = crossEdge[i][0]; - ucolor = crossEdge[i][1]; v = crossEdge[i][2]; - vcolor = crossEdge[i][3]; - if (conflict[ucolor] || conflict[vcolor]) { - break; - } if (find(u) == find(v)) { ans--; break; diff --git a/src/class165/Code04_TeamBuilding2.java b/src/class165/Code04_TeamBuilding2.java index 45dc820f4..7865fe42c 100644 --- a/src/class165/Code04_TeamBuilding2.java +++ b/src/class165/Code04_TeamBuilding2.java @@ -35,6 +35,7 @@ // //int color[MAXN]; //int edge[MAXN][2]; +// //CrossEdge crossEdge[MAXN]; //int cnt = 0; // @@ -109,20 +110,20 @@ //long long compute() { // sort(crossEdge + 1, crossEdge + cnt + 1, CrossEdgeCmp); // long long ans = (long long)k * (k - 1) / 2; +// int u, ucolor, v, vcolor, unionCnt; // for (int l = 1, r = 1; l <= cnt; l = ++r) { -// while (r + 1 <= cnt && crossEdge[r + 1].ucolor == crossEdge[l].ucolor -// && crossEdge[r + 1].vcolor == crossEdge[l].vcolor) { +// ucolor = crossEdge[l].ucolor; +// vcolor = crossEdge[l].vcolor; +// while (r + 1 <= cnt && crossEdge[r + 1].ucolor == ucolor && crossEdge[r + 1].vcolor == vcolor) { // r++; // } -// int u, v, ucolor, vcolor, unionCnt = 0; +// if (conflict[ucolor] || conflict[vcolor]) { +// continue; +// } +// unionCnt = 0; // for (int i = l; i <= r; i++) { // u = crossEdge[i].u; -// ucolor = crossEdge[i].ucolor; // v = crossEdge[i].v; -// vcolor = crossEdge[i].vcolor; -// if (conflict[ucolor] || conflict[vcolor]) { -// break; -// } // if (find(u) == find(v)) { // ans--; // break; From 50a2deec6d7e466517d0067f048985deb6d37ec0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 10 Apr 2025 15:43:13 +0800 Subject: [PATCH 0924/2029] modify code --- src/class165/Code04_TeamBuilding1.java | 2 +- src/class165/Code04_TeamBuilding2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class165/Code04_TeamBuilding1.java b/src/class165/Code04_TeamBuilding1.java index 27fcac2ad..c598ba80e 100644 --- a/src/class165/Code04_TeamBuilding1.java +++ b/src/class165/Code04_TeamBuilding1.java @@ -5,7 +5,7 @@ // 每个人给定一种颜色,颜色相同的人认为是一个小组,可能有的颜色的组是没人的 // 给定m条边,每条边连接两个人,代表这两人之间有矛盾 // 假设组a和组b,两个组的人一起去团建,组a和组b的所有人,可以重新打乱 -// 目的是所有人最多分成两个集团,并且每个集团的内部不存在矛盾,每人都要参加 +// 如果所有人最多分成两个集团,每人都要参加划分,并且每个集团的内部不存在矛盾 // 那么组a和组b就叫做一个"合法组对",注意,组b和组a就不用重复计算了 // 一共有k个组,随意选两个组的情况很多,计算一共有多少个"合法组对" // 1 <= n、m、k <= 5 * 10^5 diff --git a/src/class165/Code04_TeamBuilding2.java b/src/class165/Code04_TeamBuilding2.java index 7865fe42c..736017613 100644 --- a/src/class165/Code04_TeamBuilding2.java +++ b/src/class165/Code04_TeamBuilding2.java @@ -5,7 +5,7 @@ // 每个人给定一种颜色,颜色相同的人认为是一个小组,可能有的颜色的组是没人的 // 给定m条边,每条边连接两个人,代表这两人之间有矛盾 // 假设组a和组b,两个组的人一起去团建,组a和组b的所有人,可以重新打乱 -// 目的是所有人最多分成两个集团,并且每个集团的内部不存在矛盾,每人都要参加 +// 如果所有人最多分成两个集团,每人都要参加划分,并且每个集团的内部不存在矛盾 // 那么组a和组b就叫做一个"合法组对",注意,组b和组a就不用重复计算了 // 一共有k个组,随意选两个组的情况很多,计算一共有多少个"合法组对" // 1 <= n、m、k <= 5 * 10^5 From cbcb9853bc6fc9112416f68605a5938d63ac2b71 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 10 Apr 2025 15:52:26 +0800 Subject: [PATCH 0925/2029] modify code --- src/class165/Code04_TeamBuilding1.java | 5 ++--- src/class165/Code04_TeamBuilding2.java | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/class165/Code04_TeamBuilding1.java b/src/class165/Code04_TeamBuilding1.java index c598ba80e..5b89d3e7c 100644 --- a/src/class165/Code04_TeamBuilding1.java +++ b/src/class165/Code04_TeamBuilding1.java @@ -1,9 +1,8 @@ package class165; // 团建,java版 -// 一共有n个人,编号1~n,一共有k种颜色,编号1~k -// 每个人给定一种颜色,颜色相同的人认为是一个小组,可能有的颜色的组是没人的 -// 给定m条边,每条边连接两个人,代表这两人之间有矛盾 +// 一共有n个人,每个人给定一种颜色,一共有m条边,每条边连接两个人,代表这两人之间有矛盾 +// 一共有k种颜色,颜色相同的人在一个小组,一种颜色代表一个组,可能有的组没人,但组是存在的 // 假设组a和组b,两个组的人一起去团建,组a和组b的所有人,可以重新打乱 // 如果所有人最多分成两个集团,每人都要参加划分,并且每个集团的内部不存在矛盾 // 那么组a和组b就叫做一个"合法组对",注意,组b和组a就不用重复计算了 diff --git a/src/class165/Code04_TeamBuilding2.java b/src/class165/Code04_TeamBuilding2.java index 736017613..e415524f9 100644 --- a/src/class165/Code04_TeamBuilding2.java +++ b/src/class165/Code04_TeamBuilding2.java @@ -1,9 +1,8 @@ package class165; // 团建,C++版 -// 一共有n个人,编号1~n,一共有k种颜色,编号1~k -// 每个人给定一种颜色,颜色相同的人认为是一个小组,可能有的颜色的组是没人的 -// 给定m条边,每条边连接两个人,代表这两人之间有矛盾 +// 一共有n个人,每个人给定一种颜色,一共有m条边,每条边连接两个人,代表这两人之间有矛盾 +// 一共有k种颜色,颜色相同的人在一个小组,一种颜色代表一个组,可能有的组没人,但组是存在的 // 假设组a和组b,两个组的人一起去团建,组a和组b的所有人,可以重新打乱 // 如果所有人最多分成两个集团,每人都要参加划分,并且每个集团的内部不存在矛盾 // 那么组a和组b就叫做一个"合法组对",注意,组b和组a就不用重复计算了 From c831d7d02bd411d9d9e5589bca45def8a77ac4d7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 10 Apr 2025 16:06:29 +0800 Subject: [PATCH 0926/2029] modify code --- src/class165/Code04_TeamBuilding1.java | 44 +++++++++++++------------- src/class165/Code04_TeamBuilding2.java | 42 ++++++++++++------------ 2 files changed, 43 insertions(+), 43 deletions(-) diff --git a/src/class165/Code04_TeamBuilding1.java b/src/class165/Code04_TeamBuilding1.java index 5b89d3e7c..421923c12 100644 --- a/src/class165/Code04_TeamBuilding1.java +++ b/src/class165/Code04_TeamBuilding1.java @@ -1,8 +1,8 @@ package class165; // 团建,java版 -// 一共有n个人,每个人给定一种颜色,一共有m条边,每条边连接两个人,代表这两人之间有矛盾 -// 一共有k种颜色,颜色相同的人在一个小组,一种颜色代表一个组,可能有的组没人,但组是存在的 +// 一共有n个人,每个人给定组号,一共有m条边,代表两人之间有矛盾 +// 一共有k个小组,可能有的组没人,但是组依然存在 // 假设组a和组b,两个组的人一起去团建,组a和组b的所有人,可以重新打乱 // 如果所有人最多分成两个集团,每人都要参加划分,并且每个集团的内部不存在矛盾 // 那么组a和组b就叫做一个"合法组对",注意,组b和组a就不用重复计算了 @@ -25,18 +25,18 @@ public class Code04_TeamBuilding1 { public static int MAXN = 500001; public static int n, m, k; - // 每个节点的颜色 - public static int[] color = new int[MAXN]; + // 每个节点的组号 + public static int[] team = new int[MAXN]; // 每条边有两个端点 public static int[][] edge = new int[MAXN][2]; - // 两个端点为不同颜色的边,u、ucolor、v、vcolor + // 两个端点为不同组的边,u、uteam、v、vteam public static int[][] crossEdge = new int[MAXN][4]; - // 两个端点为不同颜色的边的数量 + // 两个端点为不同组的边的数量 public static int cnt = 0; - // conflict[i] = true,表示颜色为i的组,组内即便是二分图,也无法调和矛盾 - // conflict[i] = false,表示颜色为i的组,组内构成二分图,可以调和矛盾 + // conflict[i] = true,表示i号组去划分二分图,也无法调和矛盾 + // conflict[i] = false,表示i号组去划分二分图,可以调和矛盾 public static boolean[] conflict = new boolean[MAXN]; // 可撤销并查集 @@ -81,23 +81,23 @@ public static void filter() { for (int i = 1, u, v; i <= m; i++) { u = edge[i][0]; v = edge[i][1]; - if (color[u] < color[v]) { + if (team[u] < team[v]) { crossEdge[++cnt][0] = u; - crossEdge[cnt][1] = color[u]; + crossEdge[cnt][1] = team[u]; crossEdge[cnt][2] = v; - crossEdge[cnt][3] = color[v]; - } else if (color[u] > color[v]) { + crossEdge[cnt][3] = team[v]; + } else if (team[u] > team[v]) { crossEdge[++cnt][0] = v; - crossEdge[cnt][1] = color[v]; + crossEdge[cnt][1] = team[v]; crossEdge[cnt][2] = u; - crossEdge[cnt][3] = color[u]; + crossEdge[cnt][3] = team[u]; } else { - if (conflict[color[u]]) { + if (conflict[team[u]]) { continue; } if (find(u) == find(v)) { k--; - conflict[color[u]] = true; + conflict[team[u]] = true; } else { union(u, v + n); union(v, u + n); @@ -109,14 +109,14 @@ public static void filter() { public static long compute() { Arrays.sort(crossEdge, 1, cnt + 1, (a, b) -> a[1] != b[1] ? (a[1] - b[1]) : (a[3] - b[3])); long ans = (long) k * (k - 1) / 2; - int u, ucolor, v, vcolor, unionCnt; + int u, uteam, v, vteam, unionCnt; for (int l = 1, r = 1; l <= cnt; l = ++r) { - ucolor = crossEdge[l][1]; - vcolor = crossEdge[l][3]; - while (r + 1 <= cnt && crossEdge[r + 1][1] == ucolor && crossEdge[r + 1][3] == vcolor) { + uteam = crossEdge[l][1]; + vteam = crossEdge[l][3]; + while (r + 1 <= cnt && crossEdge[r + 1][1] == uteam && crossEdge[r + 1][3] == vteam) { r++; } - if (conflict[ucolor] || conflict[vcolor]) { + if (conflict[uteam] || conflict[vteam]) { continue; } unionCnt = 0; @@ -151,7 +151,7 @@ public static void main(String[] args) throws IOException { k = (int) in.nval; for (int i = 1; i <= n; i++) { in.nextToken(); - color[i] = (int) in.nval; + team[i] = (int) in.nval; } for (int i = 1; i <= m; i++) { in.nextToken(); diff --git a/src/class165/Code04_TeamBuilding2.java b/src/class165/Code04_TeamBuilding2.java index e415524f9..f7f9d83e5 100644 --- a/src/class165/Code04_TeamBuilding2.java +++ b/src/class165/Code04_TeamBuilding2.java @@ -1,8 +1,8 @@ package class165; // 团建,C++版 -// 一共有n个人,每个人给定一种颜色,一共有m条边,每条边连接两个人,代表这两人之间有矛盾 -// 一共有k种颜色,颜色相同的人在一个小组,一种颜色代表一个组,可能有的组没人,但组是存在的 +// 一共有n个人,每个人给定组号,一共有m条边,代表两人之间有矛盾 +// 一共有k个小组,可能有的组没人,但是组依然存在 // 假设组a和组b,两个组的人一起去团建,组a和组b的所有人,可以重新打乱 // 如果所有人最多分成两个集团,每人都要参加划分,并且每个集团的内部不存在矛盾 // 那么组a和组b就叫做一个"合法组对",注意,组b和组a就不用重复计算了 @@ -18,21 +18,21 @@ //using namespace std; // //struct CrossEdge { -// int u, ucolor, v, vcolor; +// int u, uteam, v, vteam; //}; // //bool CrossEdgeCmp(CrossEdge x, CrossEdge y) { -// if(x.ucolor != y.ucolor) { -// return x.ucolor < y.ucolor; +// if(x.uteam != y.uteam) { +// return x.uteam < y.uteam; // } else { -// return x.vcolor < y.vcolor; +// return x.vteam < y.vteam; // } //} // //const int MAXN = 500001; //int n, m, k; // -//int color[MAXN]; +//int team[MAXN]; //int edge[MAXN][2]; // //CrossEdge crossEdge[MAXN]; @@ -81,23 +81,23 @@ // for (int i = 1, u, v; i <= m; i++) { // u = edge[i][0]; // v = edge[i][1]; -// if (color[u] < color[v]) { +// if (team[u] < team[v]) { // crossEdge[++cnt].u = u; -// crossEdge[cnt].ucolor = color[u]; +// crossEdge[cnt].uteam = team[u]; // crossEdge[cnt].v = v; -// crossEdge[cnt].vcolor = color[v]; -// } else if (color[u] > color[v]) { +// crossEdge[cnt].vteam = team[v]; +// } else if (team[u] > team[v]) { // crossEdge[++cnt].u = v; -// crossEdge[cnt].ucolor = color[v]; +// crossEdge[cnt].uteam = team[v]; // crossEdge[cnt].v = u; -// crossEdge[cnt].vcolor = color[u]; +// crossEdge[cnt].vteam = team[u]; // } else { -// if (conflict[color[u]]) { +// if (conflict[team[u]]) { // continue; // } // if (find(u) == find(v)) { // k--; -// conflict[color[u]] = true; +// conflict[team[u]] = true; // } else { // Union(u, v + n); // Union(v, u + n); @@ -109,14 +109,14 @@ //long long compute() { // sort(crossEdge + 1, crossEdge + cnt + 1, CrossEdgeCmp); // long long ans = (long long)k * (k - 1) / 2; -// int u, ucolor, v, vcolor, unionCnt; +// int u, uteam, v, vteam, unionCnt; // for (int l = 1, r = 1; l <= cnt; l = ++r) { -// ucolor = crossEdge[l].ucolor; -// vcolor = crossEdge[l].vcolor; -// while (r + 1 <= cnt && crossEdge[r + 1].ucolor == ucolor && crossEdge[r + 1].vcolor == vcolor) { +// uteam = crossEdge[l].uteam; +// vteam = crossEdge[l].vteam; +// while (r + 1 <= cnt && crossEdge[r + 1].uteam == uteam && crossEdge[r + 1].vteam == vteam) { // r++; // } -// if (conflict[ucolor] || conflict[vcolor]) { +// if (conflict[uteam] || conflict[vteam]) { // continue; // } // unionCnt = 0; @@ -144,7 +144,7 @@ // cin.tie(nullptr); // cin >> n >> m >> k; // for (int i = 1; i <= n; i++) { -// cin >> color[i]; +// cin >> team[i]; // } // for (int i = 1; i <= m; i++) { // cin >> edge[i][0] >> edge[i][1]; From 674b054012a999a327c4dea03acc50f157815a87 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 10 Apr 2025 16:16:30 +0800 Subject: [PATCH 0927/2029] modify code --- src/class165/Code02_UndoUnionFind1.java | 10 ++++++---- src/class165/Code02_UndoUnionFind2.java | 10 ++++++---- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/class165/Code02_UndoUnionFind1.java b/src/class165/Code02_UndoUnionFind1.java index bf4f02fa1..610a20d6b 100644 --- a/src/class165/Code02_UndoUnionFind1.java +++ b/src/class165/Code02_UndoUnionFind1.java @@ -76,18 +76,18 @@ public static void undo() { public static void dfs(int u, int fa) { int fx = find(arr[u][0]); int fy = find(arr[u][1]); + boolean added = false; boolean unioned = false; - int add = 0; if (fx == fy) { if (edgeCnt[fx] < siz[fx]) { ball++; - add = 1; + added = true; } edgeCnt[fx]++; } else { if (edgeCnt[fx] < siz[fx] || edgeCnt[fy] < siz[fy]) { ball++; - add = 1; + added = true; } union(fx, fy); unioned = true; @@ -98,12 +98,14 @@ public static void dfs(int u, int fa) { dfs(to[e], u); } } + if (added) { + ball--; + } if (unioned) { undo(); } else { edgeCnt[fx]--; } - ball -= add; } public static void main(String[] args) throws IOException { diff --git a/src/class165/Code02_UndoUnionFind2.java b/src/class165/Code02_UndoUnionFind2.java index e5e752cb1..d9d5e2528 100644 --- a/src/class165/Code02_UndoUnionFind2.java +++ b/src/class165/Code02_UndoUnionFind2.java @@ -72,18 +72,18 @@ //void dfs(int u, int fa) { // int fx = find(arr[u][0]); // int fy = find(arr[u][1]); +// bool added = false; // bool unioned = false; -// int add = 0; // if (fx == fy) { // if (edgeCnt[fx] < siz[fx]) { // ball++; -// add = 1; +// added = true; // } // edgeCnt[fx]++; // } else { // if (edgeCnt[fx] < siz[fx] || edgeCnt[fy] < siz[fy]) { // ball++; -// add = 1; +// added = true; // } // Union(fx, fy); // unioned = true; @@ -94,12 +94,14 @@ // dfs(to[e], u); // } // } +// if (added) { +// ball--; +// } // if (unioned) { // undo(); // } else { // edgeCnt[fx]--; // } -// ball -= add; //} // //int main() { From cbe3da72c0659886ce1247cb43df015f4a15514c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 10 Apr 2025 16:56:52 +0800 Subject: [PATCH 0928/2029] modify code --- src/class165/Code02_UndoUnionFind1.java | 4 ++-- src/class165/Code02_UndoUnionFind2.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class165/Code02_UndoUnionFind1.java b/src/class165/Code02_UndoUnionFind1.java index 610a20d6b..bbeaca744 100644 --- a/src/class165/Code02_UndoUnionFind1.java +++ b/src/class165/Code02_UndoUnionFind1.java @@ -79,13 +79,13 @@ public static void dfs(int u, int fa) { boolean added = false; boolean unioned = false; if (fx == fy) { - if (edgeCnt[fx] < siz[fx]) { + if (edgeCnt[fx] == siz[fx] - 1) { ball++; added = true; } edgeCnt[fx]++; } else { - if (edgeCnt[fx] < siz[fx] || edgeCnt[fy] < siz[fy]) { + if (edgeCnt[fx] == siz[fx] - 1 || edgeCnt[fy] == siz[fy] - 1) { ball++; added = true; } diff --git a/src/class165/Code02_UndoUnionFind2.java b/src/class165/Code02_UndoUnionFind2.java index d9d5e2528..061c7ef54 100644 --- a/src/class165/Code02_UndoUnionFind2.java +++ b/src/class165/Code02_UndoUnionFind2.java @@ -75,13 +75,13 @@ // bool added = false; // bool unioned = false; // if (fx == fy) { -// if (edgeCnt[fx] < siz[fx]) { +// if (edgeCnt[fx] == siz[fx] - 1) { // ball++; // added = true; // } // edgeCnt[fx]++; // } else { -// if (edgeCnt[fx] < siz[fx] || edgeCnt[fy] < siz[fy]) { +// if (edgeCnt[fx] == siz[fx] - 1 || edgeCnt[fy] == siz[fy] - 1) { // ball++; // added = true; // } From 3f5acfae1165b3cdd1f3d83d76ea0f8e4602d72d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 10 Apr 2025 17:02:18 +0800 Subject: [PATCH 0929/2029] modify code --- src/class165/Code01_PersistentUnionFind1.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/class165/Code01_PersistentUnionFind1.java b/src/class165/Code01_PersistentUnionFind1.java index 7f518a5be..4c2a82baa 100644 --- a/src/class165/Code01_PersistentUnionFind1.java +++ b/src/class165/Code01_PersistentUnionFind1.java @@ -24,6 +24,7 @@ public class Code01_PersistentUnionFind1 { public static int MAXT = 8000001; public static int n, m; + // 可持久化线段树 public static int[] rootfa = new int[MAXM]; public static int[] rootsiz = new int[MAXM]; public static int[] ls = new int[MAXT]; @@ -31,6 +32,7 @@ public class Code01_PersistentUnionFind1 { public static int[] val = new int[MAXT]; public static int cnt = 0; + // 建立可持久化的father数组 public static int buildfa(int l, int r) { int rt = ++cnt; if (l == r) { @@ -43,6 +45,7 @@ public static int buildfa(int l, int r) { return rt; } + // 建立可持久化的siz数组 public static int buildsiz(int l, int r) { int rt = ++cnt; if (l == r) { @@ -55,6 +58,7 @@ public static int buildsiz(int l, int r) { return rt; } + // 来自讲解157,题目1,修改数组中一个位置的值,生成新版本的树 public static int update(int jobi, int jobv, int l, int r, int i) { int rt = ++cnt; ls[rt] = ls[i]; @@ -72,6 +76,7 @@ public static int update(int jobi, int jobv, int l, int r, int i) { return rt; } + // 来自讲解157,题目1,查询数组中一个位置的值 public static int query(int jobi, int l, int r, int i) { if (l == r) { return val[i]; @@ -84,6 +89,7 @@ public static int query(int jobi, int l, int r, int i) { } } + // 基于v版本,查询x的集合头节点,不做扁平化 public static int find(int x, int v) { int fa = query(x, 1, n, rootfa[v]); while (x != fa) { @@ -93,6 +99,7 @@ public static int find(int x, int v) { return x; } + // 基于v版本,合并x所在的集合和y所在的集合,生成新版本的树 public static void union(int x, int y, int v) { int fx = find(x, v); int fy = find(y, v); From bb925b78c98a64e2d1d8dfa4b3211b4e7fa132b7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 10 Apr 2025 17:11:57 +0800 Subject: [PATCH 0930/2029] modify code --- src/class165/Code01_PersistentUnionFind1.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/class165/Code01_PersistentUnionFind1.java b/src/class165/Code01_PersistentUnionFind1.java index 4c2a82baa..e6879b571 100644 --- a/src/class165/Code01_PersistentUnionFind1.java +++ b/src/class165/Code01_PersistentUnionFind1.java @@ -24,9 +24,14 @@ public class Code01_PersistentUnionFind1 { public static int MAXT = 8000001; public static int n, m; - // 可持久化线段树 + // rootfa[i] = j,表示father数组,i版本的头节点编号为j public static int[] rootfa = new int[MAXM]; + + // rootsiz[i] = j,表示siz数组,i版本的头节点编号为j public static int[] rootsiz = new int[MAXM]; + + // 可持久化father数组和可持久化siz数组,共用一个ls、rs、val + // 因为可持久化时,分配的节点编号不同,所以可以共用 public static int[] ls = new int[MAXT]; public static int[] rs = new int[MAXT]; public static int[] val = new int[MAXT]; @@ -58,7 +63,9 @@ public static int buildsiz(int l, int r) { return rt; } - // 来自讲解157,题目1,修改数组中一个位置的值,生成新版本的树 + // 来自讲解157,题目1,修改数组中一个位置的值,生成新版本的数组 + // 如果i属于可持久化father数组的节点,那么修改的就是father数组 + // 如果i属于可持久化siz数组的节点,那么修改的就是siz数组 public static int update(int jobi, int jobv, int l, int r, int i) { int rt = ++cnt; ls[rt] = ls[i]; @@ -77,6 +84,8 @@ public static int update(int jobi, int jobv, int l, int r, int i) { } // 来自讲解157,题目1,查询数组中一个位置的值 + // 如果i属于可持久化father数组的节点,那么查询的就是father数组 + // 如果i属于可持久化siz数组的节点,那么查询的就是siz数组 public static int query(int jobi, int l, int r, int i) { if (l == r) { return val[i]; @@ -99,7 +108,7 @@ public static int find(int x, int v) { return x; } - // 基于v版本,合并x所在的集合和y所在的集合,生成新版本的树 + // 基于v版本,合并x所在的集合和y所在的集合,生成新版本的数组 public static void union(int x, int y, int v) { int fx = find(x, v); int fy = find(y, v); From 73b477fa24bb7cb57e8c22b6c5749934ea549c48 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 10 Apr 2025 19:30:39 +0800 Subject: [PATCH 0931/2029] modify code --- src/class165/Code01_PersistentUnionFind1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class165/Code01_PersistentUnionFind1.java b/src/class165/Code01_PersistentUnionFind1.java index e6879b571..b13925220 100644 --- a/src/class165/Code01_PersistentUnionFind1.java +++ b/src/class165/Code01_PersistentUnionFind1.java @@ -108,7 +108,7 @@ public static int find(int x, int v) { return x; } - // 基于v版本,合并x所在的集合和y所在的集合,生成新版本的数组 + // v版本已经拷贝了v-1版本,合并x所在的集合和y所在的集合,去更新v版本 public static void union(int x, int y, int v) { int fx = find(x, v); int fy = find(y, v); From 1066bd60776cc8697e43c0542870f41f7259c603 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 11 Apr 2025 17:53:21 +0800 Subject: [PATCH 0932/2029] modify code --- src/class165/Code02_UndoUnionFind1.java | 4 ++-- src/class165/Code02_UndoUnionFind2.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class165/Code02_UndoUnionFind1.java b/src/class165/Code02_UndoUnionFind1.java index bbeaca744..610a20d6b 100644 --- a/src/class165/Code02_UndoUnionFind1.java +++ b/src/class165/Code02_UndoUnionFind1.java @@ -79,13 +79,13 @@ public static void dfs(int u, int fa) { boolean added = false; boolean unioned = false; if (fx == fy) { - if (edgeCnt[fx] == siz[fx] - 1) { + if (edgeCnt[fx] < siz[fx]) { ball++; added = true; } edgeCnt[fx]++; } else { - if (edgeCnt[fx] == siz[fx] - 1 || edgeCnt[fy] == siz[fy] - 1) { + if (edgeCnt[fx] < siz[fx] || edgeCnt[fy] < siz[fy]) { ball++; added = true; } diff --git a/src/class165/Code02_UndoUnionFind2.java b/src/class165/Code02_UndoUnionFind2.java index 061c7ef54..e72fb93d1 100644 --- a/src/class165/Code02_UndoUnionFind2.java +++ b/src/class165/Code02_UndoUnionFind2.java @@ -75,13 +75,13 @@ // bool added = false; // bool unioned = false; // if (fx == fy) { -// if (edgeCnt[fx] == siz[fx] - 1) { +// if (edgeCnt[fx] < siz[fx]) { // ball++; // added = true; // } // edgeCnt[fx]++; // } else { -// if (edgeCnt[fx] == siz[fx] - 1 || edgeCnt[fy] == siz[fy] - 1) { +// if (edgeCnt[fx] < siz[fx]|| edgeCnt[fy] < siz[fy]) { // ball++; // added = true; // } From af22f513ab6ed5ce6bd19e78d8936863034ac8c3 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 11 Apr 2025 18:45:21 +0800 Subject: [PATCH 0933/2029] modify code --- src/class165/Code03_Envy1.java | 33 ++++++++++++++++++------------- src/class165/Code03_Envy2.java | 36 +++++++++++++++++++--------------- 2 files changed, 39 insertions(+), 30 deletions(-) diff --git a/src/class165/Code03_Envy1.java b/src/class165/Code03_Envy1.java index 17be5e062..fb0226a8c 100644 --- a/src/class165/Code03_Envy1.java +++ b/src/class165/Code03_Envy1.java @@ -25,7 +25,7 @@ public class Code03_Envy1 { // 节点u、节点v、边权w public static int[][] edge = new int[MAXN][3]; // 节点u、节点v、边权w、问题编号i - public static int[][] queryEdge = new int[MAXN][4]; + public static int[][] queries = new int[MAXN][4]; // 可撤销并查集 public static int[] father = new int[MAXN]; @@ -70,28 +70,33 @@ public static void prepare() { siz[i] = 1; } Arrays.sort(edge, 1, m + 1, (a, b) -> a[2] - b[2]); - Arrays.sort(queryEdge, 1, k + 1, (a, b) -> a[2] != b[2] ? (a[2] - b[2]) : (a[3] - b[3])); + Arrays.sort(queries, 1, k + 1, (a, b) -> a[2] != b[2] ? (a[2] - b[2]) : (a[3] - b[3])); Arrays.fill(ans, 1, q + 1, true); } public static void compute() { - int ei = 1; + int ei = 1, queryId, unionCnt; for (int l = 1, r = 1; l <= k; l = ++r) { - for (; ei <= m && edge[ei][2] < queryEdge[l][2]; ei++) { + while (r + 1 <= k && queries[l][2] == queries[r + 1][2] && queries[l][3] == queries[r + 1][3]) { + r++; + } + // 添加小于当前边权的边,利用Kruskal算法增加连通性,ei是不回退的 + for (; ei <= m && edge[ei][2] < queries[l][2]; ei++) { if (find(edge[ei][0]) != find(edge[ei][1])) { union(edge[ei][0], edge[ei][1]); } } - while (r + 1 <= k && queryEdge[l][2] == queryEdge[r + 1][2] && queryEdge[l][3] == queryEdge[r + 1][3]) { - r++; + queryId = queries[l][3]; + if (!ans[queryId]) { + continue; } - int unionCnt = 0; + unionCnt = 0; for (int i = l; i <= r; i++) { - if (find(queryEdge[i][0]) == find(queryEdge[i][1])) { - ans[queryEdge[i][3]] = false; + if (find(queries[i][0]) == find(queries[i][1])) { + ans[queryId] = false; break; } else { - union(queryEdge[i][0], queryEdge[i][1]); + union(queries[i][0], queries[i][1]); unionCnt++; } } @@ -126,10 +131,10 @@ public static void main(String[] args) throws IOException { for (int j = 1, ei; j <= s; j++) { in.nextToken(); ei = (int) in.nval; - queryEdge[++k][0] = edge[ei][0]; - queryEdge[k][1] = edge[ei][1]; - queryEdge[k][2] = edge[ei][2]; - queryEdge[k][3] = i; + queries[++k][0] = edge[ei][0]; + queries[k][1] = edge[ei][1]; + queries[k][2] = edge[ei][2]; + queries[k][3] = i; } } prepare(); diff --git a/src/class165/Code03_Envy2.java b/src/class165/Code03_Envy2.java index 6dcc88e68..723ac946b 100644 --- a/src/class165/Code03_Envy2.java +++ b/src/class165/Code03_Envy2.java @@ -22,11 +22,11 @@ // return x.w < y.w; //} // -//struct QueryEdge { +//struct Query { // int u, v, w, i; //}; // -//bool QueryEdgeCmp(QueryEdge x, QueryEdge y) { +//bool QueryCmp(Query x, Query y) { // if(x.w != y.w) { // return x.w < y.w; // } else { @@ -38,7 +38,7 @@ //int n, m, q, k; // //Edge edge[MAXN]; -//QueryEdge queryEdge[MAXN]; +//Query queries[MAXN]; // //int father[MAXN]; //int siz[MAXN]; @@ -81,30 +81,34 @@ // siz[i] = 1; // } // sort(edge + 1, edge + m + 1, EdgeCmp); -// sort(queryEdge + 1, queryEdge + k + 1, QueryEdgeCmp); +// sort(queries + 1, queries + k + 1, QueryCmp); // for (int i = 1; i <= q; i++) { // ans[i] = true; // } //} // //void compute() { -// int ei = 1; +// int ei = 1, queryId, unionCnt; // for (int l = 1, r = 1; l <= k; l = ++r) { -// for (; ei <= m && edge[ei].w < queryEdge[l].w; ei++) { +// while (r + 1 <= k && queries[l].w == queries[r + 1].w && queries[l].i == queries[r + 1].i) { +// r++; +// } +// for (; ei <= m && edge[ei].w < queries[l].w; ei++) { // if (find(edge[ei].u) != find(edge[ei].v)) { // Union(edge[ei].u, edge[ei].v); // } // } -// while (r + 1 <= k && queryEdge[l].w == queryEdge[r + 1].w && queryEdge[l].i == queryEdge[r + 1].i) { -// r++; +// queryId = queries[l].i; +// if (!ans[queryId]) { +// continue; // } -// int unionCnt = 0; +// unionCnt = 0; // for (int i = l; i <= r; i++) { -// if (find(queryEdge[i].u) == find(queryEdge[i].v)) { -// ans[queryEdge[i].i] = false; +// if (find(queries[i].u) == find(queries[i].v)) { +// ans[queryId] = false; // break; // } else { -// Union(queryEdge[i].u, queryEdge[i].v); +// Union(queries[i].u, queries[i].v); // unionCnt++; // } // } @@ -127,10 +131,10 @@ // cin >> s; // for (int j = 1, ei; j <= s; j++) { // cin >> ei; -// queryEdge[++k].u = edge[ei].u; -// queryEdge[k].v = edge[ei].v; -// queryEdge[k].w = edge[ei].w; -// queryEdge[k].i = i; +// queries[++k].u = edge[ei].u; +// queries[k].v = edge[ei].v; +// queries[k].w = edge[ei].w; +// queries[k].i = i; // } // } // prepare(); From 6d3b1dae929e73b7792b4e6bb55f99d6582c52c6 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 11 Apr 2025 20:09:47 +0800 Subject: [PATCH 0934/2029] modify code --- src/class165/Code03_Envy1.java | 2 +- src/class165/Code03_Envy2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class165/Code03_Envy1.java b/src/class165/Code03_Envy1.java index fb0226a8c..0efc5ef15 100644 --- a/src/class165/Code03_Envy1.java +++ b/src/class165/Code03_Envy1.java @@ -1,7 +1,7 @@ package class165; // 同在最小生成树里,java版 -// 一共有n个点,m条无向边,每条边有边权 +// 一共有n个点,m条无向边,每条边有边权,图保证是连通的 // 一共有q次查询,每条查询都给定参数k,表示该查询涉及k条边 // 然后依次给出k条边的编号,打印这k条边能否同时出现在一颗最小生成树上 // 1 <= n、m、q、所有查询涉及边的总量 <= 5 * 10^5 diff --git a/src/class165/Code03_Envy2.java b/src/class165/Code03_Envy2.java index 723ac946b..81c651d07 100644 --- a/src/class165/Code03_Envy2.java +++ b/src/class165/Code03_Envy2.java @@ -1,7 +1,7 @@ package class165; // 同在最小生成树里,C++版 -// 一共有n个点,m条无向边,每条边有边权 +// 一共有n个点,m条无向边,每条边有边权,图保证是连通的 // 一共有q次查询,每条查询都给定参数k,表示该查询涉及k条边 // 然后依次给出k条边的编号,打印这k条边能否同时出现在一颗最小生成树上 // 1 <= n、m、q、所有查询涉及边的总量 <= 5 * 10^5 From 5b552a8672ffe7914ec21cc416d676752e8965c0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 11 Apr 2025 22:23:29 +0800 Subject: [PATCH 0935/2029] modify code --- ...00\345\271\266\346\237\245\351\233\206.pptx" | Bin 0 -> 47600 bytes src/class165/Code04_TeamBuilding1.java | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 "ppt/\347\256\227\346\263\225\350\256\262\350\247\243165\343\200\220\346\214\272\351\232\276\343\200\221\345\217\257\346\214\201\344\271\205\345\214\226\345\271\266\346\237\245\351\233\206\343\200\201\345\217\257\346\222\244\351\224\200\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\243165\343\200\220\346\214\272\351\232\276\343\200\221\345\217\257\346\214\201\344\271\205\345\214\226\345\271\266\346\237\245\351\233\206\343\200\201\345\217\257\346\222\244\351\224\200\345\271\266\346\237\245\351\233\206.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243165\343\200\220\346\214\272\351\232\276\343\200\221\345\217\257\346\214\201\344\271\205\345\214\226\345\271\266\346\237\245\351\233\206\343\200\201\345\217\257\346\222\244\351\224\200\345\271\266\346\237\245\351\233\206.pptx" new file mode 100644 index 0000000000000000000000000000000000000000..e1a1c8353254d0175c9aa06fa22f7d5d54be021d GIT binary patch literal 47600 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 Date: Mon, 14 Apr 2025 18:13:56 +0800 Subject: [PATCH 0936/2029] modify code --- .../Code01_SegmentTreeDivideAndConquer1.java | 154 ++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 src/class166/Code01_SegmentTreeDivideAndConquer1.java diff --git a/src/class166/Code01_SegmentTreeDivideAndConquer1.java b/src/class166/Code01_SegmentTreeDivideAndConquer1.java new file mode 100644 index 000000000..94d2308ca --- /dev/null +++ b/src/class166/Code01_SegmentTreeDivideAndConquer1.java @@ -0,0 +1,154 @@ +package class166; + +// 线段树分治模版题,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P5787 +// 提交以下的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 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[][] edge = new int[MAXM][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; + + public static int[] head = new int[MAXT]; + public static int[] next = new int[MAXT]; + public static int[] to = new int[MAXT]; + public static int cnt = 0; + + public static boolean[] ans = new boolean[MAXN]; + + public static void addQuery(int u, int v) { + next[++cnt] = head[u]; + to[cnt] = v; + head[u] = 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 jobv, int l, int r, int i) { + if (l > jobr || r < jobl) { + return; + } + if (jobl <= l && r <= jobr) { + addQuery(i, jobv); + } else { + int mid = (l + r) / 2; + add(jobl, jobr, jobv, l, mid, i << 1); + add(jobl, jobr, jobv, mid + 1, r, i << 1 | 1); + } + } + + public static void dfs(int l, int r, int i) { + boolean check = true; + int x, y, fx, fy, unionCnt = 0; + for (int e = head[i]; e > 0; e = next[e]) { + x = edge[to[e]][0]; + y = edge[to[e]][1]; + 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) / 2; + 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(); + } + } + + 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; + in.nextToken(); + k = (int) in.nval; + for (int i = 1, l, r; i <= m; i++) { + in.nextToken(); + edge[i][0] = (int) in.nval; + in.nextToken(); + edge[i][1] = (int) in.nval; + in.nextToken(); + l = (int) in.nval + 1; + in.nextToken(); + r = (int) in.nval; + add(l, r, i, 1, k, 1); + } + for (int i = 1; i <= n * 2; i++) { + father[i] = i; + siz[i] = 1; + } + dfs(1, k, 1); + for (int i = 1; i <= k; i++) { + if (ans[i]) { + out.println("Yes"); + } else { + out.println("No"); + } + } + out.flush(); + out.close(); + br.close(); + } + +} From 8f5cd23e17ddeacd75a20df86607c08050798f85 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 17 Apr 2025 17:44:49 +0800 Subject: [PATCH 0937/2029] modify code --- .../Code01_SegmentTreeDivideAndConquer1.java | 156 +++++++++---- src/class166/Code02_MinimumMexTree1.java | 219 ++++++++++++++++++ 2 files changed, 333 insertions(+), 42 deletions(-) create mode 100644 src/class166/Code02_MinimumMexTree1.java diff --git a/src/class166/Code01_SegmentTreeDivideAndConquer1.java b/src/class166/Code01_SegmentTreeDivideAndConquer1.java index 94d2308ca..9d347d963 100644 --- a/src/class166/Code01_SegmentTreeDivideAndConquer1.java +++ b/src/class166/Code01_SegmentTreeDivideAndConquer1.java @@ -4,12 +4,9 @@ // 测试链接 : https://www.luogu.com.cn/problem/P5787 // 提交以下的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.io.InputStream; +import java.io.OutputStream; public class Code01_SegmentTreeDivideAndConquer1 { @@ -17,7 +14,9 @@ public class Code01_SegmentTreeDivideAndConquer1 { public static int MAXM = 200001; public static int MAXT = 3000001; public static int n, m, k; - public static int[][] edge = new int[MAXM][2]; + + 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]; @@ -31,7 +30,7 @@ public class Code01_SegmentTreeDivideAndConquer1 { public static boolean[] ans = new boolean[MAXN]; - public static void addQuery(int u, int v) { + public static void addEdge(int u, int v) { next[++cnt] = head[u]; to[cnt] = v; head[u] = cnt; @@ -66,32 +65,36 @@ public static void undo() { } public static void add(int jobl, int jobr, int jobv, int l, int r, int i) { - if (l > jobr || r < jobl) { + if (jobl > r || jobr < l) { return; } if (jobl <= l && r <= jobr) { - addQuery(i, jobv); + addEdge(i, jobv); } else { int mid = (l + r) / 2; - add(jobl, jobr, jobv, l, mid, i << 1); - add(jobl, jobr, jobv, mid + 1, r, i << 1 | 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) { boolean check = true; - int x, y, fx, fy, unionCnt = 0; - for (int e = head[i]; e > 0; e = next[e]) { - x = edge[to[e]][0]; - y = edge[to[e]][1]; - fx = find(x); - fy = find(y); - if (fx == fy) { + 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) { check = false; break; } else { - union(x, y + n); - union(y, x + n); + union(u, v + n); + union(v, u + n); unionCnt += 2; } } @@ -114,24 +117,15 @@ public static void dfs(int l, int r, int i) { } 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; - in.nextToken(); - k = (int) in.nval; + FastIO io = new FastIO(System.in, System.out); + n = io.nextInt(); + m = io.nextInt(); + k = io.nextInt(); for (int i = 1, l, r; i <= m; i++) { - in.nextToken(); - edge[i][0] = (int) in.nval; - in.nextToken(); - edge[i][1] = (int) in.nval; - in.nextToken(); - l = (int) in.nval + 1; - in.nextToken(); - r = (int) in.nval; + 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++) { @@ -141,14 +135,92 @@ public static void main(String[] args) throws IOException { dfs(1, k, 1); for (int i = 1; i <= k; i++) { if (ans[i]) { - out.println("Yes"); + io.write("Yes\n"); } else { - out.println("No"); + 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); } } - out.flush(); - out.close(); - br.close(); } } diff --git a/src/class166/Code02_MinimumMexTree1.java b/src/class166/Code02_MinimumMexTree1.java new file mode 100644 index 000000000..d8c1a5f4d --- /dev/null +++ b/src/class166/Code02_MinimumMexTree1.java @@ -0,0 +1,219 @@ +package class166; + +// 最小mex生成树,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P5631 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +public class Code02_MinimumMexTree1 { + + public static int MAXN = 1000001; + public static int MAXM = 2000001; + 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[] next = new int[MAXT]; + public static int[] to = 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 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 jobv, int l, int r, int i) { + if (jobl > r || jobr < l) { + return; + } + 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 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]]); + 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; + } + + public static void main(String[] args) throws IOException { + 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); + } + for (int i = 1; i <= n; i++) { + father[i] = i; + siz[i] = 1; + } + for (int i = 1; i <= m; i++) { + add(0, w[i] - 1, i, 0, v, 1); + add(w[i] + 1, v, i, 0, v, 1); + } + part = n; + io.writelnInt(dfs(0, v, 1)); + 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); + } + } + } + +} \ No newline at end of file From ff99ad16b373f4943b77a06ffe1cb681c74a343f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 17 Apr 2025 17:52:35 +0800 Subject: [PATCH 0938/2029] modify code --- src/class166/Code01_SegmentTreeDivideAndConquer1.java | 3 --- src/class166/Code02_MinimumMexTree1.java | 7 +++---- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/class166/Code01_SegmentTreeDivideAndConquer1.java b/src/class166/Code01_SegmentTreeDivideAndConquer1.java index 9d347d963..27678b108 100644 --- a/src/class166/Code01_SegmentTreeDivideAndConquer1.java +++ b/src/class166/Code01_SegmentTreeDivideAndConquer1.java @@ -65,9 +65,6 @@ public static void undo() { } public static void add(int jobl, int jobr, int jobv, int l, int r, int i) { - if (jobl > r || jobr < l) { - return; - } if (jobl <= l && r <= jobr) { addEdge(i, jobv); } else { diff --git a/src/class166/Code02_MinimumMexTree1.java b/src/class166/Code02_MinimumMexTree1.java index d8c1a5f4d..35586311c 100644 --- a/src/class166/Code02_MinimumMexTree1.java +++ b/src/class166/Code02_MinimumMexTree1.java @@ -66,9 +66,6 @@ public static void undo() { } public static void add(int jobl, int jobr, int jobv, int l, int r, int i) { - if (jobl > r || jobr < l) { - return; - } if (jobl <= l && r <= jobr) { addEdge(i, jobv); } else { @@ -128,7 +125,9 @@ public static void main(String[] args) throws IOException { siz[i] = 1; } for (int i = 1; i <= m; i++) { - add(0, w[i] - 1, i, 0, v, 1); + if (w[i] > 0) { + add(0, w[i] - 1, i, 0, v, 1); + } add(w[i] + 1, v, i, 0, v, 1); } part = n; From 46b250b7eaeb321d16ee6083f786b25a30cdc875 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 17 Apr 2025 21:47:53 +0800 Subject: [PATCH 0939/2029] modify code --- .../Code01_SegmentTreeDivideAndConquer1.java | 2 +- src/class166/Code02_MinimumMexTree1.java | 2 +- src/class166/Code03_UniqueOccurrences1.java | 217 ++++++++++++++++++ 3 files changed, 219 insertions(+), 2 deletions(-) create mode 100644 src/class166/Code03_UniqueOccurrences1.java diff --git a/src/class166/Code01_SegmentTreeDivideAndConquer1.java b/src/class166/Code01_SegmentTreeDivideAndConquer1.java index 27678b108..7392dd07b 100644 --- a/src/class166/Code01_SegmentTreeDivideAndConquer1.java +++ b/src/class166/Code01_SegmentTreeDivideAndConquer1.java @@ -113,7 +113,7 @@ public static void dfs(int l, int r, int i) { } } - public static void main(String[] args) throws IOException { + public static void main(String[] args) { FastIO io = new FastIO(System.in, System.out); n = io.nextInt(); m = io.nextInt(); diff --git a/src/class166/Code02_MinimumMexTree1.java b/src/class166/Code02_MinimumMexTree1.java index 35586311c..942958275 100644 --- a/src/class166/Code02_MinimumMexTree1.java +++ b/src/class166/Code02_MinimumMexTree1.java @@ -109,7 +109,7 @@ public static int dfs(int l, int r, int i) { return ans; } - public static void main(String[] args) throws IOException { + public static void main(String[] args) { FastIO io = new FastIO(System.in, System.out); n = io.nextInt(); m = io.nextInt(); diff --git a/src/class166/Code03_UniqueOccurrences1.java b/src/class166/Code03_UniqueOccurrences1.java new file mode 100644 index 000000000..44ee2ddbd --- /dev/null +++ b/src/class166/Code03_UniqueOccurrences1.java @@ -0,0 +1,217 @@ +package class166; + +// 独特事件,java版 +// 测试链接 : https://www.luogu.com.cn/problem/CF1681F +// 测试链接 : https://codeforces.com/problemset/problem/1681/F +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +public class Code03_UniqueOccurrences1 { + + public static int MAXN = 500001; + 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]; + public static int opsize; + + 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 = 0; + + public static int[] heads = new int[MAXT]; + public static int[] nexts = new int[MAXT]; + public static int[] tos = 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 addEdgeS(int u, int v) { + nexts[++cnts] = heads[u]; + tos[cnts] = v; + heads[u] = cnts; + } + + 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 jobv, int l, int r, int i) { + if (jobl <= l && r <= jobr) { + addEdgeS(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 unionCnt = 0; + for (int ei = heads[i], fx, fy; ei > 0; ei = nexts[ei]) { + fx = find(x[tos[ei]]); + fy = find(y[tos[ei]]); + if (fx != fy) { + union(fx, fy); + unionCnt++; + } + } + 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]]); + ans += (long) 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(); + } + } + + 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); + } + if (c[i] < n) { + add(c[i] + 1, n, i, 1, n, 1); + } + } + for (int i = 1; i <= n; i++) { + father[i] = i; + siz[i] = 1; + } + dfs(1, n, 1); + io.writelnLong(ans); + 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 writelnLong(long 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 c06bb4b4788d55c023fefa5dc8854186c9e6cd81 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 19 Apr 2025 00:24:41 +0800 Subject: [PATCH 0940/2029] 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 0941/2029] 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 0942/2029] 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 0943/2029] 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 0944/2029] 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 0945/2029] 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 0946/2029] 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 0947/2029] 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 0948/2029] 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 0949/2029] 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 0950/2029] 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 0951/2029] 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 0952/2029] 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 0953/2029] 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 0954/2029] 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 0955/2029] 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 0956/2029] 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 0957/2029] 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 0958/2029] 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 0959/2029] 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 0960/2029] 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 0961/2029] 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 0962/2029] 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 0963/2029] 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 0964/2029] 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 0965/2029] 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 0966/2029] 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 0967/2029] 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 0968/2029] 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 0969/2029] 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 0970/2029] 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 0971/2029] 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 0972/2029] 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 0973/2029] 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 0974/2029] 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 0975/2029] 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 0976/2029] 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 0977/2029] 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 0978/2029] 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 0979/2029] 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 0980/2029] 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 0981/2029] 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 0982/2029] 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 0983/2029] 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 0984/2029] 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 0985/2029] 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 0986/2029] 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 0987/2029] 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 0988/2029] 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 0989/2029] 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 0990/2029] 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 0991/2029] 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 0992/2029] 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 0993/2029] 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 0994/2029] 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 0995/2029] 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 0996/2029] 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 0997/2029] 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 0998/2029] 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 0999/2029] 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 1000/2029] 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 1001/2029] 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 1002/2029] 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 1003/2029] 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 1004/2029] 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 1005/2029] 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 1006/2029] 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 1007/2029] 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 1008/2029] 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 1009/2029] 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 1010/2029] 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 1011/2029] 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 1012/2029] 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 1013/2029] 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 1014/2029] 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 1015/2029] 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 1016/2029] 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 1017/2029] 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 1018/2029] 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 1019/2029] 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 1020/2029] 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 1021/2029] 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 1022/2029] 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 1023/2029] 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 1024/2029] 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 1025/2029] 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 1026/2029] 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 1027/2029] 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 1028/2029] 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 1029/2029] 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 1030/2029] 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 1031/2029] 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 1032/2029] 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 1033/2029] 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 1034/2029] 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 1035/2029] 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 1036/2029] 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 1037/2029] 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 1038/2029] 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 1039/2029] 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 1040/2029] 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 1041/2029] 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 1042/2029] 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 1043/2029] 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 1044/2029] 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 1045/2029] 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 1046/2029] 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 1047/2029] 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 1048/2029] 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 1049/2029] 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 1050/2029] 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 1051/2029] 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 1052/2029] 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 1053/2029] 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 1054/2029] 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 1055/2029] 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 1056/2029] 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 1057/2029] 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 1058/2029] 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 1059/2029] 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 1060/2029] 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 1061/2029] 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 1062/2029] 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 1063/2029] 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 1064/2029] 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 1065/2029] 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 1066/2029] 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 1067/2029] 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 1068/2029] 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 1069/2029] 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 1070/2029] 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 1071/2029] 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 1072/2029] 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 1073/2029] 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 1074/2029] 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 1075/2029] 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 1076/2029] 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 1077/2029] 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 1078/2029] 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 1079/2029] 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 1080/2029] 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 1081/2029] 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 1082/2029] 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 1083/2029] 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 1084/2029] 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 1085/2029] 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 1086/2029] 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 1087/2029] 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 1088/2029] 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 1089/2029] 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 1090/2029] 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 1091/2029] 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 1092/2029] 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 1093/2029] 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 1094/2029] 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 1095/2029] 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 1096/2029] 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 1097/2029] 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 1098/2029] 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 1099/2029] 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 1100/2029] 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 1101/2029] 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 1102/2029] 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 1103/2029] 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 1104/2029] 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 1105/2029] 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 1106/2029] 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 1107/2029] 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 1108/2029] 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 1109/2029] 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 1110/2029] 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 1111/2029] 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 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&JZHk`ih7XJQ3!Eoord4qlDL ztIfiLcC_*G>UR3hr1u6G*eE9PQ)Kou=9iJtnezX>d<+yVM+0r!Mkg=ZaNjcTPgK`K zOCw?$5eGN-5HD++?k-;t!CFAOXzB3OI^m zbg&7t!(9g%19%Cf0E&1R5gq@Fg-G0yr<^m?Avqr1Xy~3})e%^uO)p4h3w%SbRUIo| zAKY@3?R`Q;pC?#V$eepVnp5)^qoWBvuC^vuHLO{1Jyl_T_6gxlbO5E3nVUEC_MqZRu|tpm(3&TP8r? zse-jWK?X6PBi~QB);^oE5i7{ej{;w|KR#osKDW%cuP)5mqHO&AUS+{A3t&I&V5!cv zb36T16bu3*1o#%Fh`aJ#d@vB(1y|1w+Y+*7RFt)baf4h$=U=6;Gbi6$yl6ruCfh}H zUq3)rvYrVeJ6yK9qIyYMpBC4Yz~blJ&Le8gVEj_%VJ%ZzL$&Z6JEj>BIkq!Si3$UI zQCYchNrW0m6y#Q-ItO9X!#8v$j7y3Z-p5GMk;SYHF-ca_l?+}Mr`RrxK4zJ+{@8m+uq|B4jkb2hJL) zD5P3XkFCS|=@R>})*%lQYbPS9kCQ3u)}u2$sp>&Cn}VrPaU5v&7Jy)5ue3OA9LVeW z%`kRH35`ngqy?ql%~867Z)IeiZzrD>!lp&aF+yR{5-n< z^i>me?L5z1gid z!}%CDlLTM5;tSIPyLj=y_J(BhlsBidS|1^;z5X>Wljm-x41EYua1-~NN{smQA9z-h6rW33yVowLBi&+CZ80s9SVPfqX!ty-l-YTd;SG@Qy0Qi;T}B!4L6-?K z&%dV++iXDy^K!j-bfKj7$HIx9OF*^dKCG`3=<&tuWwE8;1uZT?S(FXd`fg($@=`)6 z56kO_&tT+f=0s^iZNm|Zx}tbILCowS5=$5m^B_k|-7k?M5&JA*OaNycYIAGW0vT?( z7cW^1F80DylX3CxfGz6A$on_nv2UK-rwiRQYvW0qjNhEx?J_*?|AhkkTw~qA47p*OR zAo;tqM`3bGpw#1RIozzg)7gD~Gq^#gHP`HsJ3D=k8BiLv#?X|CEgM}XgzB-5CBC+e zEvz#@?iAT2Z21VWA_o@6EIvoDA70m!d|~SHlT3ya_gZme7^!4wKH*<^MCmxrfCOPE zuW7jS9H=}l=?GP1v#c*|3p{MpsKE?PX#X9IvPuqEb@&^H#q{gH{TtBV$9n(6&hLLK zhu_>v`?>MOVE}(|82|CW`dbjcLg7yl?#G6f&a+(!5(JfiL>cd*>C8&*^gBQtb6+Zw zTO(w($)|_WPf{H|4TcD~noIY`r;CfQ*>7EhQ9LNGtO zy)UB6GpcKhHnW;7#r&J%3MM}t4+X!OZKZfv;f7x!JsrSqhg5+4o0+h6auY6n_=h*C zb8bOQN{6uiG;aMG053Yd&QgaiO(R>lIAv4RoN{4OwCa+=ubb6aG)Wg21Cd000V0au zRxx7a9W%vft8rMigKIyS(F1v=tf%3GWT+t{Nps}BNPX>EZc8M+am28UOvSA5 z3JEnNoMe-p+O`z&#|c|da_XO)iNpg*I`qx{3%9)V*g?2Q7sI7?JMCgFZ8fyJ;~EUf zZ14k==bF@6u{T+*QSJP&2+@s+Rtok@iuR<=BU7`5$}}GG1bbJGl_^q6P{gRt-Lua> zcCD~Vx6kY6U)`=h&_?q|!#9=i%`b#i9$GdqAVoIp@Y=H%%UY(2bMXfrKNjn`2g9+~ zM8M;*wH8W%G7PCnv75Mv^PYdD3OIFKzd25|LFX1TVMG~r4C_;42|mV6JG(z3b$w;A zNxyfo5(tB0_)cQ>MhWi-6ebfUtFP+JE)+&0I#%wqfwEH*1KYOOVDBFzWr>=^$%o(B zJu?agd1^t$XmU*$(5?p3H1RUL>Q3vl{+|zz|E*ZO<5Qp&!Pnu@{{_na$HU`qx%dqE z(JzYYk6S$KD}LV1TeLJO=&9y6+JSe#$SMP=%2A>{$&N3V9kCYLs;J^jiS`bY(;Pxd zoo!b9DDz{=mHMFry$GSn`DBN-X}On|QGOunRF)TaYl_cwEX5gN0C?x=`Nj5 z`o2p!GvYm(IpMgliH2czd=I|~$=ER>3YFn0WrCO%w-jWoM-)RZK;kNiXv*O3#f-#`|8LdfTr2+cNu{Rs02XQ0frh|bKdcW;Xp8?{2KwebSr zWSc894Qs>wnR(~Sh%%{i*NTKQhTZSNzn3b`p!p(`hvTr^0{ad_Lj7VC>UkCnScDJ_ ztn2Ga#}1N}q|L@vUvm*citsEF3Y`c0%v_RHVTN)~>eKD$tR?4pm4ZVJwm95gYq<-H z0tNM*b6pb9>HPjfv~cv-#Lm2SqkHpr_wW7JxG55KJh5wrT04XKtZ5aVd3m(e{JxEq z(b7C#w3Z(IMTOlKa-gSVx4d_1-|0iAJVxPXI&D_xUbg6fzvhh}{{$phTG<=e z{gSy!g?5DKtA$Uz{*{Egpl3kLbK=lHc8!B z$N9bodKA2QrbExYOubjKbS=x1Zxt;w1_ZKaSuW@{-KpisWyoG$Z|<18qhWD&ENBti zFOjCbD8AS^hxGjcG`5n#hM-j?oMwb*TccPCa==lh0<;2NycMnZK8F$_5@J5D?)Qmr z#FJtJT#RQe2R-%z$W_HYo(?ji=cU6<@^PVNB(sJ%rX?SXiN95v@#msE$>oy78Cr+O zG0aXneP_YQo-`K+Kq1Ca6%3Uqa8M2x5KqmB&~A7dE?)2bcn!eP0%Ecmq-cmc^56(G zWX+;G?h@#Z-Q&tuDyLvp^3feV&AdYTp9XLje9XC3uJ5^jk#l|zCcXgGzmpv;HM;=F zAaV3Z1x>(K`AxH$W1yshTbBS|R(2-V(GyvEAA1dTr_BqG=%9B#>=n%d_*c4rP`2uI(96hw~o5I#(03(OC&B!aoV8wWceLrZD z-Dd&~O3k&D!68W{8}iDzxQZ?JI%5fPw*W(t*t^#UOu+q49tF2>AhimK zCeT&6L^-gZ=X?~B3PSuUFri~NhqLUl&i z$^!*M+>EPQ><#WwT0Yv+xY*=dPd~bVwzIkE6|=M6FS&h;rL}1lf5V*aDrwV_P=6=C zdZDm>Llg&xG-N~cr~Awp>siL-X(s@@^7`3J{ew{0kuccrDMP%Mzcp%kS_onJndxz7 z@84uBDc4Rr#a~()q<_-V{L>$j9o0X!WB>H&e;5pN3M{pWtbS=}js^TR3plxjn@p;o z@j`N~tg_LdezgA@n;2^{U+p;K%|ws8j^vXd$32S2iI~N<>^1Q6mpoe`r=(31PL&YO zw^!exKE##`Ct}D;2zl|YWR8ncJiyO0v4) zSp|RBYHYBM%~mXzFA+`|?HEBA#z|=$QadLdub4kesMW=H@?$t8jd&fE4Ho{^b_fF& zE@(&kDy@l$l&;bQFE*S?{Pn(%o&>IzdOI!Pd2#<{e$3tNZWYUxL@!kqcuE~RHUL8` z1xGazB0D*FQALtvPCz9F5pr2qF97uUTSxwwEpc2)Lacw9!mDo9g9asS-4*u8{-|p?%On?o@Z&q8K@WFE*dtC$JYCPAXRh`f6#c6R~a>ix40IK74A; z$l|=wvyKwUZ1$pKg#dh<;kDP}Qi$IM$)`r@TNP&*#c=3U;;9|+tS~r`R83-P2-SIW zCXO1%`S)oE$xAra3UOI2kW=2$ho10>S%m8v{3D86Hy{WmL8f}wmYW<2Ad}`tD!v0| zhrA^R7}Tsfz)LW(HX&&6RGw&S>0ER_Le`0GWzLv;si%Hs)0gQ86J-t##reckY@6z~XVG<1jj-Y)2;+g|b0{i>|e|l1FXWDsYE;|cp8a?4aaKYPyM6g*FRhnPL zv$}V3ms;L-0n_GCfO0bY3{q8oEJ_qafZ2Z(>J-N!z zpw{@?V)ku09rOHr)C!MbT+*f!+km4Jx*M$vhTbbd;{y(31A}_5;-QS>A(&Bx`8%k7 z)^ER^!~`PzAoUbwlwO6-+o5^Cgoy=5*p~@Kg==x2@|zl^nI3HsRf;Z=Ngb!}@iPN3 z41hKs!y#JmL1mETj0~QCzJ)1+z33~9(C?HtW05O4Ghgsl zn7C8KZ|r1IkQSR%b2UrLQO_dHjU%s*wWe*a-gykv<7a0`D!xkLrA+X~UIFYStVY(1 zhv_4Y8h+m!RD*mdb+>2Hwa}Voy@?hiujUgCrCY}%oN&P3#uK+A&0k)I_STBM@BjV_ z@0_fj7BhbWU=UN7n+*C7Rpe9Kj;PY$6@T2-xap{$AkWhHP4*nUGN@k=TUnH|5)!$x zh>T3Jp;XfYb1d9e>B>E-v$Km{!f{v|amfU|#DUyEiKJ+4WeEr>Gq_*HeenXnw6l61 zYhKDo4kUUNvBEP&*j{L9D^!LrB6apD$*sjHvC=BNNF9}dSfww)ua-OZP#98iNrby-?guO3QWO^b2r7Z}{mnpJoKR5`R=MPh)8OsiVQ1q86 z@>(rYJceNC4^yOCBsT7!-~KQ~@AiIb3w6Rx(f0!bz zyZ$gm`lh7OT6l|29u!u$P;0+!jPv}Q>)M5VDhXV+8Gj+yB>jD3e|VqZdx*1i`y!fC zs^VnUc`V8UONs1UNQs<#*ecDVu}hlxn6(IdRg}vv@@z?>rHyhIwQlrG|&*Zd<4#Xy7{;y_3GanT74}a;e~^v)i<~fmG?S?5Pm@*MBN&N-F?Jq3-Zq&cp|m!aaeB5{>2pO`TB3g zmS%R!tr-*mU>6$z0Og-il)oI2f7`a6tEgGc3H~D`H^o8KS~%?phEe79BTGQ6IfhFf zbFEYKh&wk&EERf5sPG!d`3&V(M1xLGK&ZtnH zPJdlriEeq+r%1oYn=UEVkiL}05X|&tN4Mq^dV~`BY{KI)B6su!IR<8G4Yio1NxP6S zKZyxK$GXD3l0laoO=pR~R;oFTj*hlKx0;7m_!&V!4bxo7Ff?C7Y%YLDl;<(hc(Twe z(bi=dwHm&X%?X`Pu8_E&8#xpX1wIYbWb`Dj&Y!ScSP@6wH#VlIvel3Md?=hodrHe} z-e*E?nQ^QarlxgQbFhPDost$?-m~?RFDHz6bJ@P++1B3Ca6~b7*r=r;fk>E#?)2c# zA~qv+L#R~N-)x5pJy6M!)0)~dupH+}=_Xag1>ie0D%-*@7pG4;dFZ5v_iaD-_pNMl z{t#csuQO2;gSQly0w(Yy%_C}*|#-y6DY*QV$hb9h)}gb9lVuxrx&$un5wr?HzZ zCQQCjG%@%PZc3*j8P|GNjwJT+`W%)xjTfsWBV$8F=_Q#Ez|3q9Q-xC1cwZZJj}vD6 zqK2#5qI3Ymq$Np|@CTfnE%d3z;PK&{@yUp?XSQ?Q{6Psz1Wh$Y`OB!b@kk2DB9 zUf}5P6RBuOo{nzMvfr4~0VNS#kN_&YJ`GU@dy6R2ctx@7%qcG*SD74jgr!9h-Zu7k zl5GPf)q!N>{1YZsL_}f%(x#u)_l4e(@Q7bf3$2joa3m2X#$-EMwRf=X<|h!BD~cd^ z>g>JV+hErTf$dT5=;va+fReXFK%Hq7OUonrjlR%pv=*)2)j7$gvz07`g6Kh+T!mu! z65SW3b?=~fVuv0T3em~x(vzTY{d4Hygi~d6NaFPv0#S7Jew&0B zSC+Jj&(g243Z}-M89=WOOpryGoXyOdLoWrb?A0Pi%$2;u&11x{Eocdnc@R27ARIe* zoqqXwqQ%4`m+fquZHp0D>%+Z6E;U-F)L#9hch_HDnVjm{AucrUDyu-44n9xPA6wyk zPfw+B~puw)eol*JiGvEFq0tP(}`<56wL*};zy^joqe$7 z3H~utZ^B`Ly4M~b&c^*PF^erHMX@~G)7b>VuO)P7-j<+|Kf0{{XO^7JvD z>tv$$I$x!u0FoJ4;4T{*JYF_`?xgYgKny*`igWWsP3Z}_{nk*BaXShb=Xl}dT6Xw; z8ul?mPzz!>fv|BB@FBGv1m6iy1!#|%K@Rd`0;PL_t?RYz^XdRTADNH_G^8k~Du~IC z9P1jOdYm-?`rj~L_nOfNH2(VhECEl7749tr~qrV1k=h327ISAKP zD-`YedW>tLTrgoi0c6)oW<0rFIl1_*iYV}ky zm6vF_&yw@cS^OKTyzR>dy_PJ|zg(Ykqv4G2#o9Ks92@&5iSaeG#^Tr{>nCh-0(PL( zGIi_fGVcGrJMa3bK>CMO1nd7^{r-N+`lsr5B-T*V@wi^gBW4UQONxM%S*mDjez~IS zKJDztWTHSC59AZgElTh$qExye$8?^Mgh&Jl@dHZ3jY;Yqii57v>ASMAyfe1}fdNMn zozcYef%{-)%I;5Mi9QDUGt5SXodUd=Lwd0qh2GMHC#c=L5Oy!!rzM-BBm4wll~IZj zBF&$Dq~CnYj#5e6_!{$6rj#0LNRf(nQnPhiAX&u;2?c1#lWTRZx1HVNuN@mqNmfYJ zO43pVfQXd&XaU(Y)~(ls)9jEfU>DS-dj%iqhTp1)d5V6J#uVH^nTqpuH<~F8N9(5L z1VUg<;fCa3R9Z4kj!;fpgJQ?-!05Ry(~7S!Lyu<5M~h}v(nT^vB$f}DoXMxtjJ0xE zhU-j7r@)FaHXu$y=?IY!gZL@)I9obXkd5>YlQAA6nI8~~vG?^OzoQtZF^Vt~8Oys? zgnCv+mFIdb38@AX!|TS$Rsrq4G{+6|!#;<3)jwR+J6gKZDIryyFIW26BMT8rt;Ef} zS7zNEA7Q81YFG1KHSTf{6WL)zS-dV;bYlKL&yk!0TH!0_MSV?F{N9Eh~vT%_r`QK9<$ zeiomS0>i36kCv7LWExqBDW1W9dnWoG`Wg%CG;+2|z+VV*0J;IXpS%eB3c0OqCK#9n z2g@2*9nH+=g^{}-Ydo8{MVaWAEXc*X(%}iDQSv?NQrr)m9z+t z^nSLMdqr}t*f_(nd5blN1h6c0kg=}_4s6I2>=dGk{GedSr!HZfSfX7DFTUD@a7aDj z0n&bLvUoZsMVJ8%2dk`b)*GUIS~Ogk#4k43y;hq)DjVOv0{SOw4)LPr427D2o z8))c2$lRZF&nS1>Qy8NG$*8x;?ub=e&Ib6JF%$w#G-9~!+=aFoOL>C9HrdYx?eQ`& z8NV}u1xCiiLD6CGZF|#nKp1oP8wQrC{5o zjRIt$;q@10;d)lpx2dX15Ue{ardOPEv&5HBxNzzcQ%}^D_dG@GB-P6!DJgyb)<|hY{;_jy|ty;=&P;TWsJII zjFV>+E$%!4E^H)>FFago^t~4xFKoEKek`t|+*DfrF6~R;vr_V`1_;t!HMjUYso1

    }IWhIC!B%fWUUY9nw-SI_*Urtf#OzLE4o&@}UrX-Nw9gK832taLMnM z{O$_oU3cgD9?8@snG>-MgLiShd2hI2@-z^mnfl=Ax&)(wIZLiJUD-DJF_7E!nqAkz zBZn}Xg5Lfcy$A8}2R=?bGn8y4|I!oqsZGYI&QK^`96(rvcd~L6lFaDPzf$} zmnT+sx-&eyK8z}dz5@}xK!P0&RZ~Xd^0f?Yhli6~lXroeCXxS#f-L(o%wy3z_XNmWM zF;puOcRcV4ewz%ESwCYCTb5@<0YsCy{<`QtapGxo@6+{QVf1PH`jWLVW_8zVdsx!- zvZSTCwQ;y}ST4jmf#B+d%6o~)$MaNvmTp#UBH_46)0291&2O!ZgalZi+^Ft%kZ|;J zSbT^axjt8|hjn&P=ybWm?MuUeQk$>>As21DlH9P0tX+rY;GJ2DY9U(xj_=Fan$WM z_=Rq!!5P+ZxCn9L8iesoB{IZwOBY*E`*wc+VRdoTsAZwqJuFM$Qcn}tid37eM|z!k zTP}D-OBW7*qW^o(pu~WdUDP2S%z2UCERzzWUW?-+c-RF?1>9p{5m@BW646X=>bjZr6(^;nL1>|3UZw%8S;;mm(YSZ7;>Az*U{+Lp+ z1du&1tCY`ysfL!rE(<013qkN?Fz2@+edsZ&&J`XDm#<;`k+ZX7^C=4WDLMcwL{xKP zk>_ON81K5gtz34ftPKqpH|i}zjHAg;*qsk;55`zF)2$Bl54Lg&Ekqpro(fO*3@k(w zh}8l?6HJJ+`uwZYyFzY9q7wTv|j+lH`zalwh!)y<^sdrhjpnVMTtgTW?Fdp^mPL6enQw_v+oqS0+O8;;M zpx2Nfs>Qfa#ZL$>yIxm5Qe~_tG38}0DU+TwZBrLuiF&$&>1`lV92)KWEpK>U{E;XX zU`)~zaRVHeELDISr|wOq#S&lVu9{CVy0zb0KyxT2=<o|e^oJqn zX0KhcsDr)_8`&$=8J6hpr`>ErA1c(~Fsfp#uL{kAJxbf-eJHcYvjmgPEp`0+Lyq+= zk)u%vQUc)s@{*rrr(w_wi1{gX`gqXKFCxc1AN|rsn~ytzdM^{fnUn##{o?)pqhfzz zp~Wkd+29hd-`W7L;JBn2RjObBEP>dU4CejBt{+*=w4~cm4E)q2t-4;QNGS+2OXqXyNblojjG8QA&qe9Nx2KcrrUmzvK7`e%3V5M=B2mvEmm$ z`B1k)(iIFpsy^9VF`F3}I@Gw-E>SI+bt|F^I}h*zO=iCwPuiubp~*u1FHO9J0E{q* zy}2XWb40i47M8t9&S+cb_H*^FrLOjz&zk1WsB&@ry7UBB#*E>k6J^;G-}q%`GDz&? zYTGR36yd@Kb76iN9a>mI-EeDzI8lSe9D(p(dd}e@Zy;=z@utZ){EQ%HBC2H5N6^70 z0wIugC!fH&VBO!PskDdDcRKvF?N?7TguX7cd7WypE^92Wv{*NJy*`9oWYi%!Cx5#>oToxBc1vdY-^aW0yC67m}P%Q^ZY8Etj!cORTgJa2Bp z1ANr{nhv6`nKl+zVQ7-oJKjciM2>2PO4K2@a}^cqnwye%^N{pf_QD;Q((|v`o+3;t zTYz>vA6nJJ-~jxjf-pn)-e44`YOP^3eHixU_{$S<4mj$G^~-&rgV3fMRTCtkHF60 ztqUb`{Bf+cr|^C!Hyi8A4?P`<4l+QD7qPC;TQ{jB@sT4U0St~x?J#VCjT%;_?t?07 zy7mx_)L^sxUh6 zwlA$`!T(*|^go+Z{}U$o|Jym$N1}$j=4(#9{PBOEQ~wqXJXcY%`qH3#PFCSQO$DLS z!hKJi8}iwi?2b+mVMFTpgfT=9~-bfH0FR-zni{+UI4?LCz>UXZyp5n;HH$)j@bU5hpfoXAR12$ zS!@}P|y#yLGykCo23E`() zf_Ci|)OPX`4NdLPX=%>EIILy@2P7vWu1^jJL%6SMXCFpk_M;DvxN~+>v;sc{jH3_M z6DMhqD&OfMC?E%EL0IcT(fx_@%cyLXWH8GwzHNOxzSwxC?HCzKB+u-~YPgpu_14%$ zgE`*`ej+|zb?6+gZxN6vaa-#=oh&10lugRt6Q@KNAN-d}dgt?tO6K7&( zP6I2QCQ%!~%4tYGKEYwsmpv8Xb zmJl*hBnAr{AL;y3CY~RjvL9oJEy&5zg-sbLU|6T7`c^8Q9Ryth)h?22Q+XGl)0)o- zsW@^a&&#+U2)_?dzhtMbN;}4BCyaPyC!!mD&4RZ%33KO>h8JhfE;*~*ntx})?n+JH znZy)=_|u1l{>9}56#2IoXdkq;5n#)zZ*w8_5FV&r%Axb`+t^a;_7k4&4jo^n4Qd_e zVG1J>Efgh=Mb<|a{f59#cIN8IvC6z|A7}Bg;~O({WgO`dxRxeR%`rH3H@$)n`<|6d zPo+MYpKzr93;<=|gA57&bIvw9WY`W^}A9= zh*L~nuO%!0L(ZXLG*?k{ybTvA+>f=2&vwlByjI%4TgYsK1<3H{gtHDaPuVgs_& zU_RLTx|{e~TGUH@Sx@}d@BDecd7z2ZHR(gzOOrj=e?oRM3T}Nr3ymhfA?6%<@%}C) zMuwfCsVlnO=g+YG$*t?!eO{26L_~pj=>;L^;ndnGXQtIYC zt!PoM-tcgEe&~c{7NtR%&Hki=IBjSm_FbCn2B3j54BftQZa zLpVhxvD8NQaO4gjNgOJ{^&%r#z9D221qdrD#4X*`V7ZuGz6m_nv7CWnHS;MdE>zWqaz_j)f#?of{_Eh8Y@gHMn-6?S2z+Gz?x5iu5 zDV>A`9IAsiirJh4X6zlf5%o)%Mh1=_p}xD8paESmXQCm~MIL_>09@bOy%vs*=q7JA zV>V(Ol(QLV1566FwM!P^*OS=<|3Jiv7Fwasw9VL1uX#|)U{f=Wf?Drr(tGq!j4Lo< zCSRQwVID!qg12nqY&Wnf2fDL1t+R^i(e`+2plj3IY=Nb(jMIj*N8PTt=GonbNWb3_ zUUF`@ww(Olm0pmlg3@!_oe9y^=xT1?-i@?n%H4h9tPDMgSWo#!=H$c7}-+WDNh7^9SWM{~XCplkE16jc=$_wmngo8&kg zW9f36Xu+|&nTyV`LqTClH83R5ZG+#Im#eu+RT&ecd~j+iz%OEzOs}Vl%slj7w5PRY zl>P#Eu-iJ>&c}nesp1}{EO&c?wlS3*qay?2up?+*cMgMWRBN*08 z?pPo_v4~ZCS-LI;;u7x3oE<3_<^$$hcPgHa4^%(;=h7IA0RcQ(?_SbRdIt!*ZvzDlGX^S)_tn!kfIMcZ`;8mxcDKx5xrlq+eims(1+?kcU8Vl869B9g+wWi$o` zzrt`0&r;erFM;WR=6S-Lni5`RhTm>Gu~q=W=kfB278RSx@`ggzyesqf+sh(@gs@NXK|iMiKA=vd%dcz zoN*LD3%PY^n4&s-=^Pc5opx4-FLqo%t3#QwHZM@>Ru@?4{_gYk{J_A>{Q*=wJUtBL z_yFP{VGzwn++T}J?rjuhFcP}Yhu5XYZL>kM1&u`^^z<9q@W*Xr1E1#V-C&U41jdCk z9dj^rVXXK@;cqbS8=j#Ksw-KZtrn^z)6vB;H9DM7=8rABul+0@ksuNcO`>o;G+7L& z0^&fxC$gM=X$#LyV?I|_AQ(~LtcXv{Ly*4}xH04}G6D*$=T7p>a7W_Z<3@fXb@MoW zy!nM?QvTHmd#7(1zH{pdiISfHtuVzwDLjO$jB~A?(ctl|4lPH6T6uRrn$0n5Ypqle z1Qgj*y03h-?rVz zE`(LL<_e#J+}B0!sr=fW#THwE;g(W*^weO2Y>Y1&NI+vRq7yQ8Hl`ZtkUvr~Z zYwN;)XQ{OhRv|5zr6hELyT1Ym@bAIl0ipoBch26WL0@HXlK;kAC1mtp%j6g3qLFsDX1ptF#RU zV3;MWLrIrRu9FPDcKmaG9Mb97_7u1mp%1+pU|zNjkhEf~X${MayTp>cjKhOyCk8}1q zNoC^AY)=U5gX-BMGEuSC7{{ArwuNCD+n^)ejNK~hQYv_55qQ}@9@StcSih5W>kxRizL0} zeVrY9Caf8&=2RS3EisZIjb1F(kAhwtj*_SXLNts>ykRDde17aP<@vzmw-?g|E;tsr zB%`07-?{5DS>kX=p$3f$mI{jo!_$VceCUs377lx_VLVw2=U?QZraR30>U=0D!*dfdyrU!$*P zE@XARS(kQroDVT|Ra}oxT7*Wr>c6@Ns2WXO+G@n}S57bW>js0y<1gFO*Sdmck;1uV z8LIh_)lx)w>X>`t)azi-&9Rq|NCnO|CXDR z;m?>;DUgr^&w&RIn={f6`xBlvT3I3YQQmEJ?~c9Qj)T{2V0RGUMA!D?8joU%;*!iU zqVsG%L@7Dh&sHr|ZRwZ9u&*SGtV60y)xoPTBRB8)M{X|le{%ENzjE`@|C5^s{Y`GZxGwP+=Ow72 z@FNmbHhOcy{W{n49`av*Z`cx0ZM|O&MCRY*27l|$|7sxQkp65SmX?D!>w(+SsDw?e z;rne06$P&v=td3W&YHFC9(l7fCisipAs|o@$g_7KRKFg9C;$ZgNRo7nW53rrYI(dM z=E*ZqO}8<m=Q@4QHK{E#0E ziF53kmct%n$na0!t3zLfscF+TE-L@mux|{w1)1 z_h zxhvsImQya0Jyobh!x~elHNqN0^@Z_ol?ag!Zvoq>R{*_1)kJ+f2y2_Y=u;M}p;kbN zF5kJDGBFDd)=G$rcTDW#y2ka;F^*3o;GqtFkp605T_xNCu;_Yg`t^C0>)ns% zC3^k+sjn6H*_A$YFBp%A%7^!>^^40aU>fQw?1=OO|Z)ZiQE;7o&jQ{id75AC}KtL{+9y(ugGx!mJ;=_j_I zTp(~!IeWXD>PqlOiWZk(Re0a-968^0K6WXU2M@fpSo4s)T^ zTIcDr=FIPFPCjZ;0=9xSu9mjbglUe;iNZF<3kq|dsHSwMCPT5?)r24?k^FFVSTx3+cO;yT`man&+gqelHiLRI#H8yqXwi7=G0Eb;czTa1`u;HD1iiY9n6$&JfbrIhaDe{3`pNSEsRkf6%S2NBD6 zihf5?YJh4*;k4TS(bi6wq)>+VwaiXs7Ckfom%jl_duXZ;!jE>LwKPyajS?dI?5*O| zo@*^oW=4edhH88w+|4O?*WG5}XX#%wOL)s?>r{iG4s!#)_`rvv9$geVsms^ZNdiqE zgw0rU`q?Oo<#M^NK&!J8MXL{uGpCGVLXyuR3pW ztwyQ82U!Fk_Cn#tY5iEEkSi9MdS7GxAwel=M=@_}rs8#@FWt#)(1UJOep^VQ$SJH% zFG0&N)QzdV|9oUe>~T80i55swa3*3r<7F}Ird!s3+B!#->QW7yj!}s1CNZg6?YX4oYV=-!~85)V{aArRaKPO}FE%uZ85FqU5zb_EDE4DuV=pc6g+s*rb z|K3AIjD*;qoA-AVoeM)pa^x68w;Em^Dp@b?v5AYogD}E`hfTI`{eN^2tM2W$W20lP zb~lplvXqQqpcUra($qCgI`UVYUY%~<5>3ioF|!Fo2DK#+nUDhA@@B65zYOuK!oov< zoC1?OD$@@T;uyg>5Gm6P1D;a>*TYF2JAB(u)!<+4a=WT`sg?Pprm;B!T=hUvjoe(P z51q@y=UwtkxkpZ4#OFjc0i9QuZ@4lf#78Cqd#kFf%ylR?Gtmu;g^@T4vAM9HdG8T- zN?Qic4XzUQzcm(#vK-;uGQTP`J^h=kfya0NitDR`@cJ7*{BK`}_}aYN&Hl-U8{bU@ zIU?Sl8CrsRPvb!L%$^{ z*2Wcm1Y~N6Gy(@2in8|7Kln8y)fr7bKe)FEm36!hNc7GB!N(;W7V!KRAGi0cm)GwD z-DPDwsrmEpPd;vZ*yW3l8;1M`ALsWcAJ_ON9~b(?$H9K_aee$WME~I9+B2>lTg*vT z0M$xT|Ba8U`~F{i9PRL1(_egCANfD{xTN9if8pa6;YPpsI7sZ+RxH6gUxVa&8;C?6 zQoICC4I^YTObV3-za>%@f@B9TS*-5#9NO=R=B6&0Xg!hA;t*gpzE?9>qVn-}y9VYn zUjanKp-XTWMP zefj39i2eLq`r`hsiYq&%>2}p(u%?Z})4Z93sl3iBl#85>BDk0#)Ol-DgeP&VJVb+A z!-|pfrKaRr3pg&H8Y1UoJeBC0x>2+io-I--45{x0oDu{K5Y2!0S^sd ze4LCl-N0Xb9Lb-2TBO7dNN@8{le z=X>w`4CB{%Jolb^?z!D_&i}6`cUzrmWB7f{w2m2VTcB;N5i(`N{=5zwdQ&(opPQkd z>=I9SZg2gfInD9TLSXp)uqw;F4u$iKV&r!M4{%87AVVocbPu)iE&J~))#}~v>G1eievAQn5R0&+}ihw(1}+@C5q<0{d)K3@NQa@3!bc~JN5;UG%v4n)t-DM zDiMJVNb9Z8G_4(Wy;=OTh&)U4Le^lp?`zj-v&ra&PlvBzcv3O=2ux?Prsg-b#)}G# zcCz<((|tF2t%%p;?bMUtxvG;P%F25+9*en+#SHKqQ&zdOdSJYFpPPYx9+gFy-R|DJ z7tE!P#CZ88`S_X-t{$NmqnU~E;@0q@cVG)F6mjpbTz=*0+fi9GCYhbmIkGy^vXqhW zr=p;T(2-!Cx^t}V7`xz5WT?=PJ_YWdsPlCC3nVob8bm^D82bHeqd zzw{P=H8)H|nzp2BaI83VM%4w6NX-hNmb9zgxQofe4~+>Yjw2dS?W0`sGx@_qX=!~) z=!JCoUGK@PsfL@C{r{Y!&p`N{RV_jAJI-=1Sm28Oq{+I9B9Fgbkp^a|^<4=4B^3PR z{Ry$C5SD-(f5dLh-}Y|ff2t?yK0o&+W3x#aKabOY*0V>qtH8j63}s1JITmRCd0(GK~LtOIWUjyu90D36$^(zN>fKS zRtp{ZA~8|0;CY#G$?UA@FAek97sc-gnb%p>M5QZo+r4$WYPnDl0 zXD&C%N62XGTc1cNaTD|~&XoTBy>H@?>kN6TX~8FEIZ7T@6bEsR|F(cddAG> z_%BsfjOGu|kKy;^({s@;yaQpJE&HUe47gR0|0SCcXMhG!9^Q^pnkJ zp!fdxe|zu$pJ^pOw#k-UghqMgC)Fe0Qz+KQ@g4*l@>_2D9s99zDF@@`$p`owMvPAd zS#gCU37zAUUwHDnFPsf?XsoMym=R00n}S1zjgmIKtfhttKTtP$n@`_FPbKm0XtIuY z#LH~!+N&29vg?yhU~{7TQX6eJg%6fVl7G;9dZ9Uy=DM|J;k5Wi`<{T_2aH42QNFXt z3MKD3=E?gk7x{YHQ>E(^G57{@Ls~tvZtF~y1**4GtqChG5~BPl!EfunYgehAe=gSw zYbf`B5&87vbgYm;8@EKH-YaR;nh+_G<>z{EMc8?c`G zzw`TDEUwyN^j$pdFwP_+g+DNLNL6JH7+DpdpVb!>drRN-^i?FG_A%Hz;hx{1 z-$6Fdwd8ktgdb<(ig<+@XU22OQ@w5YheEz;8kHpuA}{u_dU$3}pIlwq&o`vpr=2BR zQ06EoC%$eqWP4X#_f<-RW08<|5RVosQmr%5_@&rDF5dPmK4Hyg$k?gmEFo*+aXeq2 zCSOg5&2Y4Y6vn9}jj<;oN6?6=y8nH1c&Q*^pQ9YvG0*$RA1y(>luBzK6C0|0`_jr% zoyCWd;zIp(4y}J?#4uPrfigmJ$j|eYKhMcTGRaK8u*9S@$A4f?ANh{hqoUwH`2F*H z9Cj?LPZEgc9{QSoEaQBw0n>SA;N@cys@RidVdyW&8RRx>cF4_%gKB#3G|dY!9W86F zjKjKX-pbQymqX6Wt&3(cdRT$cC#xWUA1oG?ySNwmQ8YQC$oT<_z+l4x3$I{`ce_N9Qfv<`s`|KSWf%v~6@H=Hi=nd! zS)I{ya>-ojLpi&w=87{#?E2tutAvXAn*CJ??D(j5rit2* zMLxuFj$RJXIx=b(qjltH)!}@F31NZf`;ABIlPi4<4|Gg7eM)gK#Rz9ma<5f~RhFFXb8Z!x-w>`Zs|s7GE_BJEQ1_A1fE|nDPf5=aJBhw*;p6CXagv#_*z@nfq3wGUIwos@&PGJYY$q zCA6Ml92EN7WRJ)`gL^Z-$B+Mz`lR&^H5Vclkv{6qmXpsJI^&g%USErKgmy?3W)7YOF6JeMTv_)0T57pALj}vaHbeWd9}qKh zA$G^L{;Wl*nYM>UXK`0chS@E?nH{&Z++8$qTA-Zegce2ms;=;|+-RZdiMEM9BO$Yo zIM&@9CA@o8-*cKZEe*Cs#-`WkyptBrBSJN+u{6~U9-WO~}U*9*T%a9qMm?Zj|%z{i$jel-m~-p=)F( zn{K#hKbCjU_P7@_&8uUTv&>sW8TN6BYQX%N$2EeH#p)ExL9H7s#g%3j?9AD^+;J}+ z7rVVMdsmyQ9P)^nJwC77UZ*I9N6UsLEHshk7}?}3vuAeX9WypBUxUB|D%DJ9M9tlY zze{v0=jrss$!2jU7Q=(^!sgurV5^4{R9S&32pVGMzT|v{aP~HgM|0UcZ>gi|lCow29V1 zFaLO(F|N)#w>1;#MA6dq;;u1Y`_E-_>`9iFu4j%!2RY62Mqid~Jj&L#P+wOg%f2A~ ztXx^^mv1;#Q*?TG(YlTX*)DnDP62_~i+J|DEMLfICF`MuSCTQMF7QmfG;2}HfUo8 zO#WBg0*i$!O&GG>BLqZdQUPX8Z0yVSHU^Z&VqJu=P8esP?O3?jINXFIsI`RW%K)N# zf%JAqwu=Kl83T_)HV9k$PRxNl7U~z@W;6js%XS=#aUk;JKRTNS1kR=QmlJIbP#m|T z_&i{@QQXZ2<4&@8_fr1&MoruUin9XWx3`sjTg5FM?CpVran9A{x`Wf^T_JIGd`sZu zp#ogrXl-Qs18+ZpV7nU%&UQA}F#iO;0)5zAJW7nS_YQe*0MOwB3M0WZgb^bQ4zw0^ z>o07tNF^rgWoP4$0yU&)L|pUDOj~4^>lk~C(B?a=8%J2+xlZ8RA#6tV0?VCd2f4we z-hrz;aIz2Ru9^a)a{oJW|KLEoy7ep4ySi)rD@GUy{&x*%UeG$h0B7tD@@AcEF*jEj z5g$3yqF;`};C6^^FIyreSB;l*QUanaK>8x6=mIYc86>(nqnj8M==Q`mVsel~2l;*AN;U_a=}=K} zAs8}9baRlL7)M%kN(2VCLv(xOotO;GhT4`PhLNM_M#m1_rl7bo*HbF&Ub76)c)83quBpZsvs~#*r2!Q-Hzk z5Zz8TNlb>OYXpl@pMxQTL^sp85#vaUt}4Occ8G50h9f3Jv#WtcDO6y{AknQ{Ys5UT zDbUVA+uv$1yd9=nRM;B{Xu2d288M;`g9fX@_I0FHd$nPBJ5@>dPSC6-VAXLH3>vKZ zuiX>$sB#;?@OG+_?w_D}1Hh_CLl`tz^)dpn+V$s%aKmXi&6CXCcrB z*j5FNU2N4Q{&^Co&n>lHrwNMBGBt*JpL)RsMg?@)YXq!T?jTt(l6O5pU zg&;seq}wlao+FqhcMn3_6oS38gia6vBQ7LE5FjDacazX*6JVNu3WT;P1bYVw9rFSs zC^8@jkPzv+M(98gm?odOMI#y(B5w51hmT+Y^%DdF=24`M1_kh+69hsQc&RZW5PrEE 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 1112/2029] 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 1113/2029] 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 1114/2029] 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 1115/2029] 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 1116/2029] 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 1117/2029] 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 1118/2029] 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 1119/2029] 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 1120/2029] 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 1121/2029] 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 1122/2029] 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 1123/2029] 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 1124/2029] 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 1125/2029] 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 1126/2029] 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 1127/2029] 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 1128/2029] 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 1129/2029] 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 1130/2029] 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 1131/2029] 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 1132/2029] 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 1133/2029] 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 1134/2029] 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 1135/2029] 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 1136/2029] 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 1137/2029] 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 1138/2029] 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 1139/2029] 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 1140/2029] 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 1141/2029] 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 1142/2029] 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 1143/2029] 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 1144/2029] 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 1145/2029] 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 1146/2029] 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 1147/2029] 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 1148/2029] 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 1149/2029] 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 1150/2029] 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 1151/2029] 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 1152/2029] 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 1153/2029] 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 1154/2029] 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 1155/2029] 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 1156/2029] 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 1157/2029] 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 1158/2029] 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 1159/2029] 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 1160/2029] 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 1161/2029] 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 1162/2029] 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 1163/2029] 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 1164/2029] 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 1165/2029] 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 1166/2029] 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 1167/2029] 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 1168/2029] 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 1169/2029] 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 1170/2029] 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 1171/2029] 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 1172/2029] 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 1173/2029] 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 1174/2029] 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 1175/2029] 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 1176/2029] 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 1177/2029] 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 1178/2029] 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 1179/2029] 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 1180/2029] 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 1181/2029] 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 1182/2029] 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 1183/2029] 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 1184/2029] 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 1185/2029] 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 1186/2029] 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 1187/2029] 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 1188/2029] 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 1189/2029] 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 1190/2029] 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 1191/2029] 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 1192/2029] 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 1193/2029] 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 1194/2029] 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 1195/2029] 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 1196/2029] 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 1197/2029] 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 1198/2029] 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 1199/2029] 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% 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 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 1200/2029] 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 1201/2029] 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 1202/2029] 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 1203/2029] 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 1204/2029] 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 1205/2029] 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 1206/2029] 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 1207/2029] 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 1208/2029] 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 1209/2029] 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 1210/2029] 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 1211/2029] 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 1212/2029] 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 1213/2029] 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 1214/2029] 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 1215/2029] 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 1216/2029] 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 1217/2029] 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 1218/2029] 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 1219/2029] 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 1220/2029] 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 1221/2029] 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 1222/2029] 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 1223/2029] 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 1224/2029] 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 1225/2029] 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 1226/2029] 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 1227/2029] 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 1228/2029] 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 1229/2029] 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 1230/2029] 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 1231/2029] 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 1232/2029] 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 1233/2029] 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 1234/2029] 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 1235/2029] 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 1236/2029] 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 1237/2029] 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 1238/2029] 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 1239/2029] 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 1240/2029] 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 1241/2029] 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 1242/2029] 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 1243/2029] 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 1244/2029] 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 1245/2029] 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 1246/2029] 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 1247/2029] 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 1248/2029] 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 1249/2029] 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 1250/2029] 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 1251/2029] 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 1252/2029] 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 1253/2029] 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 1254/2029] 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 1255/2029] 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 1256/2029] 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 1257/2029] 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 1258/2029] 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 1259/2029] 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 1260/2029] 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 1261/2029] 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 1262/2029] 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 1263/2029] 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 1264/2029] 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 1265/2029] 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 1266/2029] 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 1267/2029] 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 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 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 1268/2029] 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 1269/2029] 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 1270/2029] 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 1271/2029] 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 1272/2029] 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 1273/2029] 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 1274/2029] 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 1275/2029] 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 1276/2029] 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 1277/2029] 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 1278/2029] 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 1279/2029] 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 1280/2029] 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 1281/2029] 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 1282/2029] 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 1283/2029] 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 1284/2029] 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 1285/2029] 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 1286/2029] 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 1287/2029] 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 1288/2029] 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 1289/2029] 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 1290/2029] 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 1291/2029] 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 1292/2029] 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 1293/2029] 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 1294/2029] 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 1295/2029] 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 1296/2029] 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 1297/2029] 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 1298/2029] 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 1299/2029] 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 1300/2029] 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 1301/2029] 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 1302/2029] 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 1303/2029] 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 1304/2029] 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 1305/2029] 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 1306/2029] 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 1307/2029] 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 1308/2029] 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 1309/2029] 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 1310/2029] 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 1311/2029] 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 1312/2029] 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 1313/2029] 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 1314/2029] 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 1315/2029] 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 1316/2029] 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 1317/2029] 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 1318/2029] 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 1319/2029] 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 1320/2029] 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 1321/2029] 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 1322/2029] 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 1323/2029] 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 1324/2029] 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 1325/2029] 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 1326/2029] 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 1327/2029] 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 1328/2029] 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 1329/2029] 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 1330/2029] 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 1331/2029] 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 1332/2029] 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 1333/2029] 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 1334/2029] 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 1335/2029] 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 1336/2029] 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 1337/2029] 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 1338/2029] 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 1339/2029] 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 1340/2029] 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 1341/2029] 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 1342/2029] 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 1343/2029] 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 1344/2029] 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 1345/2029] 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 1346/2029] 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 1347/2029] 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 1348/2029] 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 1349/2029] 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 1350/2029] 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 1351/2029] 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 1352/2029] 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 1353/2029] 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 1354/2029] 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 1355/2029] 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 1356/2029] 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 1357/2029] 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 1358/2029] 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 1359/2029] 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 1360/2029] 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 1361/2029] 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 1362/2029] 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 1363/2029] 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 1364/2029] 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 1365/2029] 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 1366/2029] 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 1367/2029] 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 1368/2029] 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 1369/2029] 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 1370/2029] 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 1371/2029] 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 1372/2029] 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 1373/2029] 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 1374/2029] 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 1375/2029] 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 1376/2029] 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 1377/2029] 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 1378/2029] 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 1379/2029] 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 1380/2029] 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 1381/2029] 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 1382/2029] 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 1383/2029] 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 1384/2029] 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 1385/2029] 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 1386/2029] 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 1387/2029] 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 1388/2029] 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 1389/2029] 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 1390/2029] 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 1391/2029] 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 1392/2029] 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 1393/2029] 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 1394/2029] 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 1395/2029] 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 1396/2029] 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 1397/2029] 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 1398/2029] 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 1399/2029] 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 1400/2029] 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 1401/2029] 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 1402/2029] 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 1403/2029] 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 1404/2029] 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 1405/2029] 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 1406/2029] 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 1407/2029] 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 1408/2029] 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 1409/2029] 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 1410/2029] 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 1411/2029] 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 1412/2029] 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 1413/2029] 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 1414/2029] 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 1415/2029] 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 1416/2029] 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 1417/2029] 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 1418/2029] 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 1419/2029] 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 1420/2029] 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 1421/2029] 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 1422/2029] 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 1423/2029] 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 1424/2029] 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 1425/2029] 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 1426/2029] 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 1427/2029] 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 1428/2029] 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 1429/2029] 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 1430/2029] 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 1431/2029] 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 1432/2029] 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 1433/2029] 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 1434/2029] 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 1435/2029] 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 1436/2029] 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 1437/2029] 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 1438/2029] 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 1439/2029] 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 1440/2029] 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 1441/2029] 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 1442/2029] 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 1443/2029] 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 1444/2029] 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 1445/2029] 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 1446/2029] 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 1447/2029] 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 1448/2029] 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 1449/2029] 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 1450/2029] 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 1451/2029] 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 1452/2029] 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 1453/2029] 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 1454/2029] 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 zcmZ9Oc{r5o8^>qHHcfLZ*_o_Ea%{<-ZB)WY){Y?|yGZtvZO9TL@)9|t6p=lg4&@B6hkG!PHVNzuW1~RFzILF&nTvto3~+;G z2Y|X9Ey1$FE{wykd7!d*L2{@M=Na~$ z`{#VWHd*-vM~t-)B-vwZjAB|@YAFM2388^LhsVmK@9Lh^8?Ps#MSn-WN{gxS{D_YY z%lz1%(zMB~Q5WiV!ol6rG}h+KZJ*$vprDy&$Ez!*j&wioI4jk8{;W7RJ4-C0kgw{l zRdSg0RbMY>5h1l>0SmPmzdw~Bv((4sq?<>fI?ktk@cturHciXjCK2ha&N+7|PP%)U zgwN28EB`_u#D9IBFMzDj(J&$(&$MuvPCv>U*iJP@n=2iNz86Gz>SdoD$mPLf?!|sG zblu!=r%;;U)XXcEFrnHuTbyJ();mEMd8KtgTSbJxrK!AdouqMO#G1fQRxntQOyZ%% z6?0Cq8%I+HtKMI>buutB=*m)yE=^KSbYK3!nHO(SZ5byzXC%%3u7Nov*)7LCid+^t zE^pN3$2#}^poagnCF0vdy@+di7TsA8zuBVcbjyZNz28It+m&(Q$R&Yv>-O|{M-!zP z!Ih)ZqnY@!K<~!w&z|20$$nGYR>6*Cl}gj&S(i&+z4nRl&}#h4dc;%EB;U6-j3&cr zJ-P-}SiQU2j(VV|?N1^16yopqHjU+Qu6_=l5{K>e+0R2b#u2a}@ zcZ}>gcd=vICGR`(zw~An>1y&Npivp+{QN{orm?g$F1=?B1hT|ab@=Zz*wY^UUb`?w_SM=9o^3_ zq)|M?PRcTJ_LIfbvXPaR>SpV3%8Mt8x5l83YLc7J#**f3o#!PS^$8^j&F%)+(|KAs zXPx_bqJt(H!jfwdzli0v*I)b7%D|AKf5`lwCndjzL~_~ZiJ4nORm6!`I%x11Vowcm z_=?D2zC;Dspjjybh6g=FH5Do7``-kd=Tmhc2|S7CeaEp`HYswlyZQKXPf)S8U-q!X z#!E$fqRfb5tRrHFXcckB+IN)H%52X&$r$$9j_@Yq%VMH)Cllvj+aU+S9l1;Xr&bkQ z)86t_q}{nO%*PbMQqG%<-_|oras4ej`>>gE@_EyUFzb_8^#`HZtd-#l$Hs2mXJb!4 zpd&@fV%d4Dy%A|f<~PB+TQYN2{;Dapg6$SL*nLV$Ac}AH%rr}4_f@>469DllBY!N>}yoC_QSZ_YH8V%XPk~SRiOG{6w`iZE4L!Ug7B?HRf3KP84;8GImf) z-YA4|e1|}ytxZ=G=c+hoi+G>9E!uRH+iB}Qs#^lBAjV;PWd%KFa;qT>S zRqbzwgokoSnO<2S&tG{H?76&1!%@-cn;*Fy928%-f11h26e&`#n^@e&PG+;P*$!_} zN1lJ}&AIoH!DJ!W(`tRacq@R1rip*bb%Z^hSA{a_6&}d&ZtFUg>_2{OBR5&Aqz3UO zbZikabYL>g86_J}&4o=BhObYQT8!nVOPg*gaBlHCQ#v!$ZxQ`g?@H^=B5~YEA=ELI6({3r1*BZ%goRU>3LA;{` z;ZIMKXV#oLC0(d*!apZTpn|Uq*xC9wkuj!gj`P=L8K01?5H%gkA6(>zHb*k9?e3u@ z(n3SNP-H`o)%}~=yvfotty)qJgP5Vnz+Xktdc2d}!NGh);f4N-o$A)!SM1lQWqqnO zf6fmxxdmq<&nn9GaU~%YRFFTx6K-YhBCr4Mge!n5vv{kAQ}2Kw>Yb?yrg}k^ z4>KCJNgqg}LQyGV)jIcCLFQbpJ#aoLPyz95p(lOLhLwYXYEc13Z?$mEUNh@wJ@A07 zmS`Y@v0l)m3Qy*@O%p+B`7A8onyq0u-vSD< zS^!LK#X$_MpcA3>KLTtYe?&OQstx3!HhRVO9?@*4lfri3ncgR+9e~{GpnEpr_)8v`5MSburI7neJRID5i9@+&f^^$n`t@%5KD4oy79PZ* z*zbe1&V3AIKZu2kya#a%2Du2xA(w~Ml!!!WBYxbup(ncqMFpT>W)Lj5J%~e2K!P-| z-0lHUXUjo4tQ-S{c7lE>G#t_xDy2yX!~ZcVD=~Fu_YOabL?A?Wb^qamKGPI{=U8#w uLOc@!Q5u9maPAv+-^?JLAu-^IrM(^1Kp_y-Jpb Date: Fri, 18 Jul 2025 13:05:06 +0800 Subject: [PATCH 1455/2029] 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 1456/2029] 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 1457/2029] 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 1458/2029] 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 1459/2029] 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 1460/2029] 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 1461/2029] 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 1462/2029] 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 1463/2029] 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 1464/2029] 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 1465/2029] 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 1466/2029] 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 1467/2029] 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 1468/2029] 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 1469/2029] 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 1470/2029] 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 1471/2029] 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 1472/2029] 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 1473/2029] 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 1474/2029] 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 1475/2029] 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 1476/2029] 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 1477/2029] 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 1478/2029] 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 1479/2029] 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 1480/2029] 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 1481/2029] 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 1482/2029] 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 1483/2029] 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 1484/2029] 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 1485/2029] 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 1486/2029] 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 1487/2029] 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 1488/2029] 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 1489/2029] 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 1490/2029] 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 1491/2029] 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 1492/2029] 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 1493/2029] 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 1494/2029] 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 1495/2029] 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 1496/2029] 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 1497/2029] 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 1498/2029] 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 1499/2029] 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 1500/2029] 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 1501/2029] 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 1502/2029] 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 1503/2029] 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 1504/2029] 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 1505/2029] 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 1506/2029] 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 zcmdp;WmKh0vZitO!rk57-K}uf!rfh~pm5z-;qLD4?(XjHP&f>Iy6>7kJ@-t{toyH7 zi=AKQ{*}oWPei;Kfr1Pu7%C7D5EPJ42&8sJfF;Mu=S&a;2nZGk6-eLF#M+60{%@ba zKuDio{Q0LGFlq_P1Sj_J1e5C{9)~IoeQm4^vz!3%^{-|_#9kFvlX-q%`#ysZh-9AB z(!!ngv!PX)Hw6*Eyl-qcUuQu1gj>L>;m*fPM_{l>*TCTHtVLsz*7VCWF6^gb0!K)H zG^(xzvvNr)zl^h%1XfJCpA+bIi_N8?FH2S`(>T9IjE}~5E^p?y$jI0^@InM1bgh~> ztLaebpFCKSbb)7?Ryq@r1pr_M*m66J5g!2$&#`wtr5PDLXC>+HJuYN}-s49X0+9!i z1X!kG=+tbyjh#R3e?zVBz$*OdSip!D&{{sXjspw?g#39d#&$*uj&}A=3`Ta2CiLz$ z*8kn%*hI-$1qvdGUcSR5w>H=kf@$6-Dx-r)8B~g_P8+5p7Vu#C`I6WCl8F*)_nh-s zJJa%2Hr~~(Txn4xxSuB9}6Xg(;bzNZgLwT0>2ibHSI(%mjHLkdey1YAOuey#~cc37Rren|40^Mu1 z@bpb*Ks(n^B9Hxg632e(NlX!2Vz!Qn;tr>L^zvKa6z2d(NKdg1Kii7M86y3{6FpJRY z7XtsyF)*E1r5@EkC89S!uJKqYV}AI4M#gYZA97I6b`K|W4vxw;JDd}RC#`x=fKhB?b1Hx(0zz+%p zRDcKcxffI*dwXXFdq)!|6I*9PXA3*qzuM7xvd!03Mx?>bOJz|H9-#~Zt!d(=pkI9o zV#|>Bx`pHRX+y4W8wYP;ow4wvU+l*OOd0cG5 z8Feb08j_a+!)g$YG18Y z^JATCNJg(`Uqrju6+s%U6P#>oAO?A|F7#&ON8g(lQM_?sM>#%y+orHb2w-*AJ%SSG zt;ZzQD^r`e@UHiDz|QAs48;iIsbm{gklW|;0LVPa4!^<`xA*_h2H)Xe!THhEG%G%_ z;9tp(yxukc)dn{0a@z7~X8-37**v}G@ZL{Xk$PGi8Qt$^LAp1Pl=BS@AvQq!V&hfv z#Zj`$H9aFpXnF<~e8iIb&9>SVwU-W3H52M#1C36r$_&gNU6rcp_ZTCWnP~%h9cN=S z=0=T8bXd~`qBNX1@;nthn2XXJ?ZQ8%(vaJ`plq4ogbkcMK@k?cr85MO^6Bcqc^Cy5 zRCh~TV}e_T!f({S49~3x9x&{+WF~l;?W@XLaNw+)O5N74%)xeO3hCR-_6l7z$I_B$ zxWdm{YB!!aue%%wC)?*qoTw6rfXVO&iX!8H9S>4Ez>^tCzg~SPq4+3Qc4mV)mc*G3 zAHrOaV^Y8CRDGegDM!AOCM-g(awjvGhT3Vyq+AT-M@cp^UI(Nskx*-+Ytz2mKu1|dxf^VcB}=ppj9tS9GeuRS&MIB4wm+YtK#zO*>E zt%%${UL-8eXsAQc-s86W%*fggyVKWMf+$Ty?p@D!1{$YcE_cZ@%iGS&N z+85TPdl^w7uU`1XhTG)?8f@cSM34+IejIuGFJ;vCvr|d2udk+NPt-*OU=Sre9q#Q7 zLdRFIXX@hM3YCaorS%z#f^7Yy#L?T|b9u0@B}~0HzK5fmEfAfTs|0ZhDovZydT5L< z$q9-oR=DdLpU@kMvZ#$mJJ-CPpw5y)HBnjN8}giDSxV%JU1cWkzL@Lv^9+CMpxV+y z4Mu3{a0EXmE25wpGwF^RhH;jsS2S-y_QZ>A62--N#3Z6e4wBR*hM7)pyg+C{p8>!* zMXpL|8sxS>tVNy)uC|)Wh6=W|ZSw*oODJBuLVhXV!>VgbZCl#jK zJdLcdvAA!c)CV2>TGI>x2=CPkaSVU{>qu*KWsiQczV#o@?!O56hsXOXJf_FWg?|D+ z=<+=b&?-k=BWZCe#_P58224~yJ~bSe{CIuqrT{zI0=aDTs||6oZPvz)Q5EAWF4KKU zab$_NqkF{hTxsRxn`3T6Z_cO<`6NG@_TKJy>QFLUn@VA-=J^!eD}&~Nv$!#F(kihG z=NX9__3rLG^#O15DyCwyjE&)4PVqyxqX|L~M5w1@+a4m*42vhcl}WyLr5_*E!;E7{ zt7ZC(NO(lM8kWIVq+{z)*-VI$LM;dW>c{TF@d*(#B87eg1{&V~;{E!b9pQUFPb1@> zPQ%s0#O?on8q?jjJ&bS=TRdMC_vL4Epykkh_L5KFHb92_kRhITFoqo2oy0k};K{-x zIsCXA-N3uxRO2uRjrW{gh%6@b;2v~79zPs(c(X)!nWuMagqjVddCSOiYKP9>o6x!j zo|2No0!%=Ba~8|=t~PUxW9D3uo3*BE`8AeyXm-O2H{HwgL?cX%7-;A$Rw^B$iB2bw zYXYHoK=Gzd_G(9l7XhLuC@jO61J z=2?6>GVYOm@7wp*vF@uFZ^&M# z>J$%m-uYD+b*RPGGk|GHrKt@X1`9V(SSA62HY*iyCb=F5o~x6%ul2)G&-Pst=)n(7>A@%>;1)_JvXac-=HzkZjl*Uj14nyrk8wW1ahZ%=>u@+T0}fnwCkb}- z#||xo_0fi@bDN7;w&Rh3>&p`@G>_Lt2KUq)wS?G5UMi?fg4Li=lDNP8xGJ}z(D1Szr&GmoK_)vjd+rO%N?0Q{Bi!hNw`-R(B1e7m zj84p79|4!^!RhSmckG01Z3^RiRQ!VT_aOE!j1QsklC@Sb1+ZUFc#CiI5J&-}RW1LIM;ve>>a1ZsWh;U1WI#U?j+GU=@w*qDQ%n@0u*c9yaYOK|5= zu072t*pMT}-Cjau0)rrsg!kjQwe`4MhOix7xU3SR(_S+?t+x(9(C#$Bab4O;w3#!+ zsk7ciSgkTyy{wAVY8X0aj9MKi>TTk4EHXOk`8|~#RSmmp6wD35V2y}>g4tfh=SgWz ze!E%+BY#7ka9ZO_;Coh)OUtjUhhFTNFwc;qrYanZl`bSYzJNh1SJ4M4uK-hEz4zkdo1A%T^`udWRP|6q zvA<_Td;-m~p^fbdap+tjCpJG;?x|%{7QD&6MXsdq?|F@?M zL21z{;8A~3{TOC_*pYC_!P^TPhDEG2UBvCsOhzZ1x94^THdMyIS6>O5+f z4j7j*aylyi`*@Wu-8(Mj1?-G7X7e~h(!u+{`0T<4w5u38@<=V!|T ze|D}mUcu>@pP>ag3=k0Qf9G8Po*n$Fi~Y;&pnqY~Du5BS>)PuBX4ofmvSA_0lEFw} z$->!BaOx1TAe8i2G%6uxObBxoy$Uc?b~KGNL!4iW z1|!Y{uzYc`y=T?Epkc?>pTB*f(smkQmTuUNFQ-~gRBp&N<|?$78Fo#pNdusz)!>n> zI*q_cLr_uJe4X*X*G>hnZy>}F0WF{aC4(5)0LL%^EnovBgBqLzzd{Jn`974)BmVi+ zl?n>VNFacKMAZJb6yj`dVq?Pa$LC*1F*<)lF+P{-P@cMVEj+FYg_5b5x`gN0Qs_Q9 zQz$0I*_3orhrjR1ioHk&ZBv}J&p7>iM~Tchd2z!;y6raCP5YV#A_}?EQzvj%SsCGP zDf3U8pC0yi?&rMS?oQ~qQK2WQh^FHSa+;H&6mhlC5lxtO>~27mH8BopMTAY4SHdt` zV%v@T9BsV5nNa4N&S#v@@<;Eo_EC5=4Kt#dP{4g5%`4!Qg0;m)HF39XnGm={{@TkR zMP22ga_T8vWjUlOB)KG31X)!s<-A|ymsYM$0L4;)oSfQS{LE6G+o%Rg_$@^H=M_y!_A4kyDbrd&Erj+EsBZZxzxKW zz3>MKYX|1rHT(^`>uxCDotHvB@2MRM68B9$S5J3%X-Vly@iL>;NEd9$w7BTptNt8N zJ4Ll%K@%@(*C{FyeW!*PPQF1v?HrODc$6aLHUU%f05N>*HI`i!N-zS`3NX}DF3{=s zG1`0q{qJf8^YwrR&4y892kD`oO(c&IR{0+CGv-9FF5-$GS((TDeF~1)1R390xsMeGKuNJ&M=Wm!4mb3xhYGrvtFEm}%XBl_CCrTq zze=e&uat3%FF;@rbZSjIf4R|C0Td=D@;X_8sS!ct}_?mJ9|_oF>uBuConx zNZJ0aAms?~gHgitb^iko1> zv-6|Ys+nc(3!%;B66zG17*+n?Fk^54)A^fPFND_9tax@k73h*Xt^MhB0F@Ti3T7J= zM)6&TSx7k9H%Ud=^n`x>8yfQFIf_c9g4n$?-!h%;eFyc0lmU2U&s#r^5W`tQKc$KS zgA$6ORKxYLlGNqT%_i4&$1>@a`kglO_dY?>bja)m!zXDe{v>9TWOfFDi>Q5N2 zK!6WB(>~s|COvov|01^57;*5j#>Zcc57fm`)8RRVv)@;gTo-#1cXKmo0Ab2q(#Y(& zhIOMu&N|m2lNgPOI;yD)d20w$Vl9yb-yV#Uc>uX`KLimMI4Z)S&yEWPNW!1Q2p3u_ zO4gsGE0!rrRx1kk?`vGDSpiDO82`)~4F!(^QUm0R{6_Jvl;LalQ|{f`lww9_Q|HxTeC@Z!PH29X zn9i3!RnUMlH7R5@w&&a`{w;U*y`%zb=XtL8 zjo=nLvknKJ=__i7%p&7PQ6p|9Jzt_jUz$DZ{!NMp0OXU8uuqT+E+F27q}j1HDhFCaK6Dlyl$vn)0+4x8%%R*TLB`DQVr1@}bbpNJu>EMe`kve}#);-kGRdsPfxfcj4?bzL76Tbn z*g$LY(?$mM?t%pc<(91K_8B&O=SO_K7H{yF@hEj8R0(j)j6yx-QkYR0Y0XRDGJvjW zp?!m{N%deQt9wblcDjfQA`ko!|Fr>a+PHJO{uz>e!Pin`9d~YC(aN2ne2ms~-BN80 z?#Q&C0dz(F1*q^rp?`#vL-26u@EZ;62%V_oDTr}Lh%E~h}VK&27bND&DAi>bkhPzc|0aw8KWG5q@>Yu(h<( z#=Rwq{%X=0yS}gMJ-{AxKXquspA3&u?Q*HIu0FQ=9f6qwRPR@E|Th zc;DmqS16AJ*Gt}_0C-upu!~00l*t}VcdoEQjBZMoUiZfjg$*&NP}*I9n% zfEc8$173WcLY!z^7XITY)mN5p96aOI3r-6<3`}hKSo8AW5sspw#iO;!LYdr8OrF79 zx%v16(Y=`lf(--BHrd`Bl_O^l7lHx^n}?Sj|3V2b1Jv(jpBf|iXCm;YB;da&@lQ#> zKe6I3lYq$RKkgs{FMYzQ+~O7jLRinm0`c1+;v@^>)HAN?_BR^MI+BJpf&|0t)#R42cd()ganG*LR)JRW2TW*rQ z>xh$BEYSnKp(3sI7a`FX;f~m4nJEz*6yRg7zg!VCWRjCypY6})j0#X|XhrmtN@5vx zhZQk7WjUAI$->j2b+shg9JtP7{5dcO`8YOV1OoyxM*jD_Wd19yab82$c9$K=cT*Y3 z^C*=>@xyUZvro!RkuVk0#S=&?ha@{^2vE1UoFn*kHsGEVPYH0|w_=?}E_ebNPJD6n2+io}i! zRkoxXs3^SwFz3iOWx+?#H5-fembbaUN_F^CsI_(+_S2K7?mD|aq4Mg}m!|1mdH0*= zYEu9fL`CXK$^uW?Lkr!%0I2ParbURV4}-u0OfCbruDak$9f#5MPvX*QCqy!FuKe5S z;e05L`lfLpivfO5vhf9u2y<7ygJrx{)TZ2DvuU5&=oLgTw`{3(mG3|ecO+P8nhzEP zLvf^vE!a-KDvkBaYOT$Ck}Ile9MWw#w0@r$vk_|8=J((HEyuh;OU9y}^^^SzB$%_= zyY8$62ll>=S;y)4=qd1O+p9&_$~nQ-1>aniWdKj!uH92wxraPV1(F4fih4u|U9Z>O zm}jx*>m`|VsDw&>)Rp1*fOgm)q)h=m-Pi1b15n`bx(wdR< zfH3u2sAG_<(T-$_)!<#+ef~_jh21w$WnB$Vmi_+pYMm}L6s3=~qR_Z)#vwu7-{cV} za2$?)#?>6(rr-s%Ejr3t%<3n`1k3MqHs|M*P<~e?1h+f6AvgJi;#0+MVpukCFvO}} zw+j>PIvWLY>oD6O7m=QL=d+rz3@1;ezbW4Lc3?>8KB1fi4-4JfCmK{%>R|>KUwTxk z^3Lp$1)Dfd4@@0yG%T`RP@+0N!D7EG;axUm92X8e97u&-N-| z#y4m@jd4S+LO0I{4#^L~=0wxf3`@zJKcK}{!TqkC^D7>qa9B{oH)0qNa#VQYj2z$j zMoj?ekZ4@VW7QhU&1lt{`lk6p_mfb3FJD)&w7|b-gf<-f)9KVq9b3(%SXS4faTT2@>pr*k_C90}IhfPq$x{=+8Kn zh&-$y59`ED_cvhvezb&~=t#bZ_InE`_u8Xv6)<5HYSzFnJxr}IxShakj}Uine0!>i zUJrthGMr)9Eq-~|PpoM{7`c0|w3sG(m{BvN8BsH=zr?o(S>*xY0_k)tl2V{+_*@cA ztxjdD86Gw#mQTqcr}g_oXWNf!uFy^uwsLOdTPgr?Rke(D^?<^RdGHV6{H+AOE4%1Z zX&_B;SjgCKK6>g;cCC0mFU@;*>z#i_(EmS-{{Yc{AdI_r+wdViVLXoT?_tdHS1=w| z|CCI`k$fiAX&dx<8 zS~6LzA(*|P%96ta6*M&D9$LG(dn4%j~Ls6H)v zNmwlfnvuw{3s4eh@gv%b@v?ObOUh+TQGv`xbuT(SlP*#==;g>q5(2-vO$LgytUO{B z*EGzHa%ms+c7xVfSRM8zfOE1|zbZ)fVZfyLwJ|bONQU0;3W}1uaR1Uyu+AQ8|6ye+` z=UT7>hd(2aY7zB%bH2x3k&0RFFVh|mYsFtKdn}h&u|c$tMwl-ua}wx*4nUubx236~ zGXVxGVsq|-_`vjF~ zO{_q4V;9ZR2R? zD@-6RzUZakhObEoN98-ukB+yOds<6Y)P#u+*|g420gT_OgX+Vtkmfo_FAa_$mqvD% zGDI(=;!D(+yYdsaFy;+T+_p5J6#H8cmlngeWp)n$qFUSlb?AqQC!q%WBD(x zN=qS%a-FS7epOAmMq_IUhJGT?B7z-Nb&^E-d$6OmiAzg*#&H07TilKVMc(B^GZCVbMyNIGMtLF6jCe&jWOjs;O$4+3FV{qVM^1@GqkG|36~?z{`Ii zVo{2VEEGTWf%Z@N|4(=8{}uWFA^iV+!unT;omU%mTxCaHKcr#Qai$2!D>5T7BW@mc z9;jx^e+EW^PEOlV11O}iaP?ql-$GQ`NZ1F)p=-~D|?3d!173HkN zD~< zo?i@%9nGJF;%6&;RbwtC8SgFLJ1Q$f!tt9ruFcTg3KULpDbMgBYyzYeHil|%m**Sp zJe6d43+(7lJ!P|YTaeMPQX+{E=ayQ&3F@0@(=*n1V}zoWcZed5Trp1QNx53FmSuEX zX(Dz)b73VG$Xc6uk3IYi=qvPVHXh*EHn-X92V-3-xIuRNOTTU81?|X5|5;NC+Jo7* z+MOhp>85ocH+GkjlRf^VxW4j?_yjJo4thundi>>eor|=q0O1D}F)tAO?=aucwT;O1 zEr%0qb{t^4*3adXVe=z>WXL3J8DUw+t+y7WT&%3i3*fKe3c6b(Zra0jdS}(sWRt6l z*I7;|Mm|{WUiE&rkW4XYPgb7l^7_bxul{(GSbi=vk!iH@a@g0oF<5x0-I}DE-dX@^ zBI1wAP@ni(hStArkF-z_`jYF;9P!l#T_R2qH7L@L{LPq^pKZF4hp5jN4Pt~HQ|!y5 zbL*G&^fI2fIOY4@FtLiVv?Fc17o|P>@<&5?4w@SI?8II7Efp_+N!0@gag))poG?a8 znWJ~?^z{&~^}6bXxoVrG>vPZ44*hd`zP7lW2As2Z9MXmgI|9j`!YOM-Gu>z&%MR=5 z1zG*enLL-`fGlk-#h?rDx2ws{Nyd@~)4N^oV=KRM5?EIO;P8}U@Yef5X*~b~Cx2U3*5v#q9Q;kQmee6W; zJ4}$g6e#7Eh7y~>j1@4dC&_w1{$(D5PmCgA;w-NqX(f8u*gL0hY%u@bbHBv@G$8!L zQvU;K705mVn($d4fAx8F_U~xL_E)rOSCz5-EGJ$+L zW8P}~Z9N&-1w?n%`W5X7vz(4lF6JzU)Q>Yp=H@G8jp74v-Gky~3G&0jg!|Hylt}|{ zV_gm$FVyqt{oz8E1h95t&F|lh{BOGZHs_hR*xUm#Adc4P`PBf1`n{0`#<}gO4)j@c zaSJ26qP;E#lp?C?sX>QNN*R^QK*JUEdl@bdn0dm>7gIh7*MM=GiN{vq-c9aYHqYk8mH^I;2FZB< zGFRuFyC2f$HkosgR?d6@2q?Z~lRM;2Wv?}O%WN&8Sh-QIW?;Q{zPlGfF4)q#w{GqZ z6GzS*m2l|lM0uLMQJ(bAO09(NDso3v><&A7-hI{zPv6q7w^H&OQRb;+Da5EPS6%&fpM0iml5i_ z7P`EgrewZC{7)_ZkGK6l(BhYV!k2-5rhq2!|K8%+|H|V3mI8k2aXy=sgm+VgoGluO z#%}3iXU-VlHKB^F1cEXur16b_J36uNzH$O(`ZGjiPctsHQZaNVkY1t_aAp&@@Pn5E z)>vXzInH#CORx-}h{ze?IR}VFmxuj>dIvsDo)3CataP^5@?~%!uoV*SXQ~53v6rW9 z#BirFM9{(QN|ZtHyd{vG3htm8nD@DalHNg97xlkSxPIr*o~EsZc=tnbM1B#YWJfBm zuq@`WyW!f%BgS6iJarD{?v3Cw=%`3%%XitLk}^6a1CEkaQseABON+@#51<{V6FyDl2(ui zD;ARQ_#6jt;!>XIUiU0e&}~x2mdMz&t+Vts+5`I_I6zDfkyuq?dVzh)K3@VQKR;`< zTO3-*YSSD;EcI~l6X&S(<;*>IgM5?-UMWl2>X4;?Zt*^-qlZeVOdKGto191?tW6Io zANR@3drMH&4$r4_1$y6IdU5%QmUa2vZYmn64CeG$8mHS-n$bdw!uPOW06`{mkTT+j zF%s*t#2YI%`81VYFDo8|Pi}+F4Sc>Pg<^K6+T6ZjD{L(lEVaf8Z#IT4I)`sU zBj9=yz$3KSOL^(QnWJkkS_idjS!@OV(gp%H8H3nglw4Z`?F(0n@m!NipLV~Ua_ppU z^@Z9$e??lV@kl0w!VvZn{o+DGU_!E*+LFK!11^X10dxc-4tDYR4L>@2fqkWh&{Lo!HEmo~N&i=Eu*3%t!~x z%y_iO@tyr9m)lqn(=zbS3~V8trdPrxVvr>^lqh5X4e2r%5YF#q@ZzZ}DumQ>!w5jE zQ&;pcD8DzT{AHp8ZxW_4pl(5IN!x-{r%XkSqP8jmPVWQj51Xk^+fH+)X_hb%aA$l2yXPUN+FcBdF$_RW`E4bix-=8X$FL2%Dtj7EAM?z|BCoR+X#4glT z+x$F1>Gizd*f0*X-C`LfgKZw(lITIQ;Cr?{ro_;?N)}AHBf==iBgh(ZJS#RS2H0n%zk88A2}}M$7?;(*s^K?l zH*;y@?_8>ZVO1#sEK=P~@qH0E^B9isP<(sO`0$J^FGZ%VI1+#*Ysk@bQ8FP}_j-rxfZcB6QH#)VM z?90>yFp~r62HKDo96Y#sQj9E)yF>oIS{wT0c5EhtRAHmk^fxhfiAL-gcB$W*O1!w; zfSp@p))NAMJ-)dT%TzB0Gv=e?0w8=D-D#mT6QFk8tMUYX^E!3KJ0~|d1%vuE%JF4s zM{?(22|nO*2we;bKD^1%W-26KkjQj21_ythj_4!YO2;@OSXDwW z`P1Mw_#BPWjZ^qLElRpy)l3>{hbWxbY8>QXZ1p&DOjgD6@3bzdPj(7!c#yHiJFy?* zcwopRVI+hwe_a(S?hO_QNibG^Jtt2z`d0A!ryBe`S@%|kEoD=#X0u_smN#}((X74Y zpgeGnUKlLo_alWSdx41q_k+9Br|)jGLOfbB=(Zzo&We`$k4OscUd_2(D(*xWupkZH%|{vK2R546OgKY#J`RRKadO-S zV^h;jDIRG;lfuoBbtB0~N9|efbIjvqcls%%diptAd%G34?QXWNSs1B&s)$kwN?o)SB&yWdiFd= zOIqV$bGSBT49;H#v^2*eaQt+YkVH+K0$jVwnkJ3rqYER`_$u;>a4`9gsKUwUzX&}> zI14-(%zhB&C+z^6g78_ADs^X{$`cBaftPo>M+%JIGWV;~>VA<`1tqrs86TyFPL_m+ z?FWyIp<#)6>O)I<(@Jzao&zeB@c|bUUu*!_KVdb=6FYLuMdodU7qQ`r`o01rfqr%k z3V;b0Rla==6LXM~`4)fJLTjO9f*>aPLMNkYc$lH4-AeMLWMECIwF#AR^|K1W?OvGE z#8eSS0%$dI0ghc>&0nBNz?nG3)=_9o`__S-X)3*z?W?)7dv02tVu6>9)*3;zT)3M= znV}od8J?vETQ^_f7g4;-JZhG+CFipuEH4QgQ){D;OUx7whL%2U#6m&Gj>NFop9X=Y z3;3=GReo)}8L)Oo@&mTLGfn|RLy#U=o{C$|wlYh%625y9kag4Xu*J5FBvHuU2<=P! zr*ogxN(Sm!suhRX$$Obsu}2epSE+L>$W(J0&>CQE3C^P;_0t~!rZEZq7~@pv9RWXe zk@e`sj_?zSH7n;*OAUW4`h1`UFj$c~?}A3!C_gO9u;POEnlry@hUUZ)1YQV~#3;8H zGDEy`UO9g$eHXsNDBak}Dp9MTnaoQdbg&Z02beww)qD%OCDS6~PTID&*3gDbxtfCl z6o#vCv6aX+rs$8>+A;Ndn3WnEttOwlsh{pyG=GnDA2gq}eZGt4u2OZ1JtiF3eM6R; zi(E6hbqseMzdO`D!E-%cPbqUwYR{LrSD4e2XuVs6f6DB*)Io$2d9dP4o_tOAV}m+K z$`#ssekX(@uNA_KGBx_(P6O+n=cqC&P!?w6cyx5!_8sanMOmIx-2vTssNa`78%ohe zz_3mwUDcE@p+^&7IW5V>p39=Wkg(?_8rN{#U5{_U!@g{=wY<_r?_f~x>TiW zb6O&|Gfx}ipgOqx?o-Cal6A8|*QK(M5`N`k9w^l`n}o6sf`zh-*yk@a#D5{3kJ;41 zl5iVAp`u%CC`1<$1K0kermaydjKQLXqzMp-93?}V&`8Yi>!_@{P{Rlp)?^@SP>1;Q zUXbn}9eM8&aV&;-UuCMCSBA=h&be9<9k`UD(zonrst%d0)h? z^pLt*V#xR%XMqSGU|SZ)qEYYT_I2mrLG~nR-Gr5DcH$YAPqgv6urC+}0=AoevsU4x zMBz=;c{4Cpu)yN2+G6o^U~vBS*)X4Iin(MY6NF{j<4jPP%zc&~60cWg(hFUn7-!}& zACL4*Va@TNGA2eOV+S>TUqRdLrLXzsqmk8U!10K|?* zmkN7bzFdF(3@~}xJ|D7JX9**J{;tT?U@^h8FN$=h&8o+7<3CO!wxT-gS23HsK3^Q< zPouMovZnHwY3C=9t0d>ZU(4<{Jo@ex))RX6C6{+@bZdnnFk&_C zT6}m6chir`xGf_>KziU>*z8$p>5(thAWd#hd|JlvOPYI51r?1FlViqj%B-;liDl$B zFn=%VE*`Y451g$&p6y4&w0N65LcKOlv%)cS_K>ik0i+#jeercl?fAe^~v0Ao+OTa*w<|$>;r95<&dW?K=O>eH|0yU!m_@UB>aVp!ZV( zr@Sz^q6k$IlNWOYXg=m*dmsP>WDUbyV}0J&*w-qS{h)=j!zR) z)}uQ?q0vK&o&1398Pn?~6I=04h-OSW8aB>hi|Dlnp(@dsy4k1l)efTXAkM&1Y-fKoiKW+A@_P|jWjs~QE0E>-G97jxjm3fA-H4)3Lv%UDH| zsI@>1Do2!Jmy4tHIer>5NNhv$?wu@EEz6NH} zalA$UM(2Z8KZDa=85*9-U1O?9TDjh>Ld)?r5mxbSh|nd7%*pE} zH(o4fZ}j}*)Lk=Y-ebJ4ka*F6;@Jn&r)Ju(UZaD(iDnLo?V7&gqk}o&(eEOkUWy%N zd_DANR3zH8dqt5~5tqeZYMC7q@&G#Uu|9CGKJZQ*Y>5NA>U7~f*DTeAZ?&Mp5yZCf z?)#8>y_G2~6YU4oTeH{<>yXVP`bUcZk2=GBna>Y~i4I1(mV_6+)Uw25=5}m3b%MBQ zTG?4e_H{VisRi=shG2fgN>?NB!of`9&?Jd~wb!n_@sf(G#SU%$h}fjd_kU?^ z|K}u z+MZ>_Vn;oB-H$ORJS~)rgMHHz-;Q=%(u|q#v|}{>t8!N$#S-X@mgI$RKVpcn zOf=FRgk&BY4giMmBF#d@eQpM!XrHna@;6R~b!>*O-M9DL6n8)3=yLNbA|$m8;5SNW zF-oe*<*Ug_RSgDmUUa@qxKXxP<>8QM^Uh#Ct=_ z(q*(zO@k|aQnQ#q2e4#YVOrW3okpBQM-aH@4wZ7g=;1~NJQ~J>_~E`}sLw_ROhp5( zgpjU8CG!Q8CU8k)b*0XkccC|QsdS6ksTXKeUyO$eAagC;fxUD95xpDQs{E+Z4ENbt zY8z-B&`7;EBNgI$1u;8neflLj!D;h>$R{2W$tn`#<3Y_0CIO|GW{Rx%bkVLm4TY`(k(l=Ez7D<2Tp%|hD0wYw=##Tyx<^}RvxLfubQiZ^ zlDTmSCyT#nnE+$ZHwPG?K88Nj3bWt`IqbYua4WxRQhOae8y#7-fG*>eaR->8lR`Rv zpjRe71i2W4T=hnp4Sj5+L&|Gl;LqoOab4XV^ZZ^Wmr|yS?jfCiN~bL}!AEA4eGI8$ zH}THRr%#=PzX$$I?`vi555H+QY|amBw%t#d;fIMZpofV7aA(CK9kxgRnKVop#qjPL zJw`}MW-lTTMQ^!kuHv%7?)=$K(my`oXxu=Sxk_c&@+4ia3Y?3QM9m?yvZgBEP6XvE zk-yd4Zi>qQ{kM8okb!&4Hf$%K45a$} ze}Dg$fq&V4aIU`kS&sELDb4O^bV9>5&UGMhe&h`(1WZmI8U$QWQ@W7lJ?1wX z!2!cC2&ouXwh>ocnWC+DW9iVPPd63zf25lE5rGOmr15{vW@cGlBH zUf>`WQ!F;{hh^6=v3q%jbB}+`)leBMASw(n{CB^J4k;lMB6%=4N-zvmd(*7AQ4rp= zlXj2i!ueu;meS-)u%a*|5t9;X`e$MUZ!Kw}+YVlh#jDT4gSNNw@#%K>&ZPGS7}zK! z2~cMCG~}0((VGf%T|Neim7#*RZljTxZn$rm_a|!Tp{5Zsk4S)QZGiV?08s=bVskUu9u8F5|+@Dv&}3rtOAZ=8y#%I?C{h=#sFRdDS{#%MnuO` zuo6l*@|JOhIwZ%V84cZYt~vs1w(14RZh>#;wP;}E>w{a4@*f3=#&h5SOa4H;0WRp1 z85sL&c?;Bp)5LMrjp3$ML#T)qT^r;@6bY?m-<85rj=^K%ypLe1pSJs7w)hU!Ae&=b zznQtovxX}BKK!Ul(6 zm;R_is%8#{aZ!;rKbTfNp9-a>XVEkJ>D{+*?glLCynPkSbh^M*6nN~H$eDTq6JH1} zCud!pp{88$eC|^3YT+rK^Q%&3Ur%EPrXu_loqNseMJnTa(Fl9Y2U-N1>=t1~A>#?L z7Glst5@JN&6y%#yuGU$ArTHg81Xo_;RG33a`w@|6GC{_aXRs>(m~6(7<#6O9Szx7b z`6He%>Dgdq(~6F2!H~)p7=|(nImXO%U}W#_9hUT^7(H(#?OwfZv)OkrzetRBL>94Z zcK9Ps$?VJ5ZgQVI5LaNIk693+hTD=Z8=!Zet}PRwpVYzHpCE%jpd;T;xYs@#vk}Y5 z&5r_Kwm&{&DnGZ(c&;wYTBB_I{a)q3FMq>+*uhet>*RL$sVW)-MhNmROc8bFyZHP- zY!g~NJ8VtJno(8J9>xiB5u1ON#>||2Z}y@MnV4)7)qVW{S;=}Ph-`P+>Wu0oX?a>) zQwEElb32cyF@y0-nTNGZZ3)%Jb!?wzMC9DgI3+9y?ETKhgF_-*PogNl64fyXn;yRL zYr?p=aN&K76b)J2+7O*&HC@@@WpRrA!sug`IqSc_nf%{+bKoe^B~k9Hkm`TMTK{b! z{mZKZ`%3Covoy$_hsr9RT8B;J^|}0~U=Sgr`8{yfNQEI)dV1{b-cOg9hcym)=omW@ zNqt<*S+^b?=}DCja@my34NBucv$p{F8+#>1Y2!d%&u@mYJIbikS|`mY{cesj<@{UI zORVZ!BdnaneFrE>W0~aR7*h!&A_qFAO!+kC;4%3)vpB&a`VM~JUbo0ziir*rm5Li; z8%-%K{HL!PX=)}SYD(-6n`8O?5io*z z{BU8MrrdqjvGCQ4*TD^cGLw@;U_n`yj20wnIRn=1k;`TWie9xA$IBc08XkpR*eiK4 zrN7G7dYIjbZ6;6b?>-DWs<35u1<7;gA zU=o{1;|t{xz{X~S`++gQ`hs5(Zc{+jlm!uv^iW96xNTK6GcC05i{Wvr==9nJwWnKb zsxPKR5@{+q4h^3tm9RLEGQI)wUsqH^rOT=yKIk$-=K1&ZVVW%nqhGEUjV=_|U@e^Z zxdc>M?!)>zfgWGXUKUvjUC`m+mqyuOtnW7DAulDA@Up&+_zXs#W=@nO)YKobYA8v> zy!4z~g()k|UQraYG$(>~HS4!H0j zRR%X_TN6xquWaF-UJ^;)txp1uACTH1En7!=$%u4R`J3t&uUn-JY17wxSr-ui<(g6x@W+K+fjW`V9AKs+SxxZsl+C}uIaq89p_|O=B zEw$^?Hn4|FP&G!)sT3qdt1T%~+^oi;O1Z!oh$i9*5>j?q#fX!)&lI7KC$A>V`zeXn zPi;IDs~Pvn!>PRL%wRGY<~!bC+@!s>tj`=%%?7CBqSS@aGK_C{gv?fF2#S_Vz^)K@ zas5i$!kghpWyRJXK?H<^&j_qnyJi`DS%S}?PV zG)~DSNE%VebZ4woz`Wj4N?=Zq<>g&|-SR(0-BZg&UDrJS2OR6JbC!6%tw5CWrPS}Ey z(-3nd5)CB%VrcSTxaDKO48l3O7%s8fX%ly8t)|-@*JMm)haaFi*P_Xay~%2cY7>A( zh;B%J>URBsI+{Nk zzNw67ej%dz(7f>jQgp)(w=H|Iw0Wv17jNM4W3i5BFdTDD6g(bNd!ZO8!;pp)vyq!9 z@0lW1(5e0U&2g#~I=6`VN0edvus#ij&|}=Rv-=}b=hrMYscRP_fgmV`|0HH_l;93u zaWY}D>Z;c4LUAObedSIEC_6PVuyuP4_Wm(aj<8XJeE6NiGowI=w+2+4HrIp^^=cqZ z3pc~7_Ow>}zg;~3x5nZfp8~D$zlulyS5Wrf7LUKo#b+ptexZ6L<%VtU8dY5+&A??D%ro9&4ea_FaNG(cWQlnp0T0qt!|PWqwShLO*n%7a=q` zpX|^!E%)*=$`53n+VbLVP3f7QwJ0MD0QWpSzsO!{lD45v-*+izMxsY6CmaVh(J;)8 z|DlV3jN?Z{feJj8Y!LI}mZGfnh*IbUNL&RWZ5bYHNj>3WgVF3_l}Rtf6v*B0*uKw1 zkTe5nzJY6Q24DHSGP1R3vT5484S-(fxrA-l)ZaslBsITRI^j=~m%Zz*U34_LM5x@Y z0T=n06|qF|0Fo31JOi`mF9T`0`j_L10X-3I?fCA zH;{#%5b^~iL$gg_Kf*l18L4tDqBC>r+*_l?N3Bq6Y`g%t*yl=3!&-5OGw*zvP$pIH zT9B~EF#BBu_EIGnwO(ZNupO40Vc%g$XkLs$Jj7KhtvEO%j1prC$otxEwqo!@_m6^v3$ z?9A&lxHtWD|Ji?ylOkEm8@pzxy)&rKmR9bWmq%A6;M-6UEyL?YXX(*jSkP@D4|+;= z%Xg>#lOc4uaykXI}p}_J8{q_`fx#4)U@^5B$|{VEscN!P3g!!0ta3wg2$tFK5^L%9>xEdt{G4 z+Kr5^XVWwV5P~`wB0zrfSHOy02858^^%|3?{k&)xVP)Eitic^~a zUs`%5-rf^gavysQb@!{G13Msd@j7`RZfO-COVW_{w9&tZM1;dC>3fFw?{P*eQ~d~J z@(Jh$7R^o5*?^Yl2I6%meI{kehWZ$B6?H9pEt6WB)zC(`n)l;}N)J5#?>6WkqQm;y z!+S7dE0#1f)TAHR5-4kS(DP*qUX+$Q!m^bX$UU1KO-R%tK*W|H>Ik3OJF(jjG247K zV(YRYiR9e<2|lYvOgaYAI+V&j{Xk)$-+{yEz;*%gTzheS__g%-g8X4aFcDexccMf1 z3t&@p6%>9u`{wAOhTjyl90M3Rv~EUTDFrLVJM8;Glk7g@Yf@>gr3?;9Dcg`&%*C~j zT9m1X7{X941JfHzlDh>MipJi(KA;2cckn8@g#)RVOE!Y8$|uT$5ufu@N|DcILAD%j z)nSvnPIlWLPOZA`HE++Srp3zIPiDDnN-hd4stDH_VX6%L9^zqI)#j*okJ9$hk-@dcWlHF_zJxQ|f{_-Bs41Bcb_8e)U3W{e~z34r$1a=uiKdG1jw; z!`p@rc;!XhOM^uq;z$te_mm;gE6@_PJS~i{{LK8gv-c+%OUkv=PSKZ^2I(KPH2?5J zvZMan>DWIk{TBzrT!KrjqN`t8nqxtKt>0WcB8?_h&$uDER#w@lP*`mgV-sVI=Bw>z ze3@u**OB~^4c{;e?EN2_Y}u6)bU4 zN(Xp(hP)-Mb3>^mY*kO=0M)-@J@?>WtHJ2nfIoU4X7!OX+g(-cp9dim#ZjSTgd$Ra zf1es=z)*7NxmgK+*J5n2j>%pmpD!6s73~;7 z5XMDi98xnU6R(s%OQ7A!e}Xj}l18-togEhb)^_LzEL_lz%vD+=Gbw$A32tmSwZ!Xv z9|H+o4b661!1Ln%&HR|V+ubULEs0*L9PpF|W^BL@@f2*eM2PI<;6+s_);U4d7(~cr zUA+L%=Wp%#W41(b#R;+gX^OA9Sr4kngn*pGz7}H56zrrV_=pTBHnC8%TLizMW~)Cv zg#{4ZBauYM^VAmQg%tU7z5yv|fVcv*rur*4ydd@)zGtEgF#dwF%jGU`xEnA9kbt!j ze=oL1!D+JvWBF8gXMATh@Zw(!sr*R&VDJV3gf^5I)GPeEF!JHj2ZZN|OCe|5=1w8L^CWA7n=?$PYEPw*QB}1Ra0uPQFXRpl z$1Tc{6Zj(Y$$fl#vEigL6`-#zjddc%4O1ZkB*2GHjTu>-H(J(FBALxzbgVFdk2Ac^ zdRz+8+aUSWNL`E443juEy=pv-Bd*mCP9!yxm}&wIzMP4phH-&?S_1N7&b0y@HVfpG zxAdVWJR(+++Is(pqLvK^{7I0h-nHdMM|{Yn`H}LUfY~8$$pHq{s}Asz%xsMan!FV! zI@-T3x*s8H#kVqN%)K;HKeHK1^(0jYz+_hgI32{M10f*ta%$X`c{wSmSp*;Q>4j+_ zk40>Z+#BeFCTrDaKZyu42Z!Q(V#>Eob=$J&JE+E*FP{n!qTPQ9ZQ=hqJq+^*l{~F z@0T#K;0XINp`>^%;Zt@~tvu7CBdSK(DLVPf>1X`R01P>Ag4QWTnn2 z#$z}{Gajfcvb>SOGx1xP3fPOj;t0b|SrZ1ivNOvCU%81pW&FlY7A0wsNfmdKj6BUO z(%d-m`dCZa_UfI-KpkFohLqB)G;YcSU+fjYUczc*^>~;*(x~Cjy+L)zhZ1*tR$UA2 zX||haA@VAIu~7PTT!IM)ylq?wJJS5+WoU2h*!%vU6u9SPb#&1T78l8o=*yKS$RWpsw z+r~IA@m%LF>{D^zvd#DlxfW^Hjs4+$g6|>r((Q{_PKm0MS;w&$FDwmEelNeuqiLgYU!3?V?z;|qHp$ao;-Br!(?oLsNJXT7X@ z4B8o0u=gfCW}T5?UK(f$UOob6KHYp=l6v*;4XwVE_{PR8-YN>>V0mF_JvQr&**}>gJzxI>+p*Sf>o;EwqWs+v z`Ip<)b5(UK3_)bi%Sx5=)>_oc$`biz(&A`{h?6T|qFOz-{xd;(y+J@lu~IVsIx%%T z0mULjo_3M!lDiyK#H~)A1<}kG)a22M_8h5d95_WiZs$YWi4?mD_s!+?<=R76u7#Fh z8ER~(enmcjla}ZVO%wtbj1h_D1=HCK6b#cdG8g)`aFzS9%jRTIrn_PL9 zoprglVmWu9r5~&UU@W01qf^5B3y>da5y;}F65GD)UT{ovD6c?xN13)*5+H>n=fvyx zJ_WgwTlkt*in`nEbD6cLPS{jae8A8Kx=Q$&!ov#xdYyq#UHZ`RuZyA5(f^JjOL{2e zFOLQ?x9N$p>55QU{*ZMJ?TdttewqR2hIhvszJp%R*nnvxI5gxtNHa4#)ZZ4P85Ie; zQ8S(^PdZwao*Tz}D}1Y?o)Bx08u@LC$)!{GCnS;rKHst+@=L1moV_p3Y(LA9r$7p# zq+q^0gNJZOh#4eWhXTYz9&iiTe-7hfl-1U6ch?pG7b1KogPK89Js# z2DhKKVO|}Ah@@ag+gdPoe2#C7j`w0;Tx_;taX;5|Ue9Nd!%0WyN&UuSHB}bdud#^C zFDfTd8%BjnM?i|qgcr`>8!pMOQ}~ICbTvrJ+gUJJXNXn>27(4-X`I@Yq$y+xPWQ}` zMsy|_i>_Km#L$0>Q%0x zxZXRy3D@EE=K6Th9cKg{DomGtV+v^Llx1+!!ATJKirKjVoi^SL;r}{l; zSgjbnan8ZRn88#I`y(A3HCZwIJL_s0O!@*%vOqv5A*geAPypRqtUkBiRN{rnGM<_3+!Z3^+t0DMF(CYc%#Z>fe=*}>JBWe`0> zZV@)ia6F|A16OQ%bxdz^Y$wh4`QX~{IhVR;`X-vu_{r>)q!U8M8a>ral_ff!v*i49 zR{w@dZ~M|guO&;gFH5HUXgJe*k&X===f?g?Vth57u>>Z``U$(dpdBcUZ0)*+toxr% zonIC9ct^gt@rnAMbK|f36P17B#$|uQiGpP)IRRfD+ne{WvqfccyRqXAOEzAkF9{_j zvn~X z5X@Ui*?4iy-V=>+i)SlYXRQWx{GRwNDpg!HkZ@nNq0ywiV zk6MFXvHY!Ol*7cVfj7*Yz5z0o-rz6BPB)aG2y4jO?Z#Gd72CA6Ksb&ev^G`x3hGFo%cADy~9d0ur|Ed{oDZ{h^)-4AvPjHlNs(ctOJS zQOH4tS#PjSt}t%SaAsyOY0sbFgA4>St(bQzN4sdMKO6~au;c_qu4=@i@e5;WZ3x-5 zx5OGNr|?+hXkn3krE1GE7vP*$td6a7qg_5d1BJ zl=2>-azA|>W8HQsoleeYfUlNpa!qt+kzr>cXJT95&`(5;B)M~+%M#I^2v)n62gDix z-IpL~HaYZp^H<0qPb___tK89v0ZnJ+QAVHlB+v#~ln%Zl;t9Ycw zsb*=bKiQ}U-&ld=R`ldHI+))qyqey7k92mUJ}!R9&5|UsGTzr{k{z2;(K~dH*-q1u zA{fqb;G3cslqbkDg@VOhA1kBjX^s-gkza`d1MP)R(uQFFTFf{gBX}cc0zD&OPB0H8 zIurQhcO)9lxS{4x!2FiUFCg?PEfm$E45Lma(%Zgzz5TKEvFm&bSUxogF8T(h&K+^F zhW?Yo>v>(dH|VuLN&S8LV*H2q4**I(AQ6NxuMQM$cdn%qxW-4JAn<2^RC)ku0Ao|+ zE>vMB(!j3_B{+MUpZ0~g9GB-p)_Yp6;bgQsis<-4oWk1yZ<`0h+VLO;cK_?7A({a# znG{V+BNDd^+l*% z!q1l60#R%NMz<32QaYCyMWU!W_-#RWt<#%f&X3gAuGXb@@ih^8yg3pu&%GLPiI*nM zb3qE|1x!pZDzBu>HnO0*i8EG7RiN<;AlvQM;S81S%ja9vk3XGi|JQi%?~*tFV|gH^ zr9_nl`t`I4`hU)Yzf9YF^%2r*Ldc$zl~r%iNuf_Q8)h{E7;?E{l72OJ;Lx=jnx!2k z92C(dh$fZH?YZF7n`o(L z335!-)hAtP*`%dEz8=MhdW=QeYe?Lz|E``iq{B%EgnUj(p9mPU%c|%O#HM77+Y_iF zvo{4(c@drtjY-f$T03%P6xS19OEKoxnwJrrb1 z)rX011M)gg=z6?Re}*^&aYhu-H>{2;qs&*NMZZCejIASRz^F_cA(NvFwBz}5DCaRk zBwQgsFeV4u(DX?0>sOcIZt{}!=^NJXiHXy4wx-0eC9#uaHD%WTiYa%uBat+`-GW$L zh3ttu7=j4L@L>wD=vi*br9xz5q}28y0}4O#Qu+5rlwgo0;F7MBi)$Tw6^yS?+Swoi zN0LHyr6datQdF7GYoJVe?Y05>_<)lMFjGDPJ{%Z^-opCE;MGZTCo20i7SXn&#;eMJ zM6Nh4mjKvsk#(W~kIregB2+{0<@UZgMF|hCRu^eLAoX-FKtB#3`JL!7g-tsAC_+e< zi#NR#X$r?AO#gH*Zl_yT>wK49COYTNASqzTKxT}SlS`4%j6B#COvjpWG#l~-aWACgyuKc z6Nm$&2H_jk3E3-~Hou*W9B1&QstX(?4gsnB85+lz2zWh97iuY>S|LY80-`v2eaw9o zGNciXK?bt-K$9BS5}5mxV0_}iB$J?(povjfFIew*u^FnV%+3?9M{&1@m$d8Oz3nt%9+yS+p43O4K2EaaWirV1JjgT0(}XcT2i2J2kPVF<@=@GBRvmK zZJXu|Or9tk5@V};r}OVhb{P~RuNMk#@At2op;3h5^P0(!gOctwLxA|I7;iL^I{0km z%9X25N^0ZR4>$JKc62HpC)8RVmyqw(*~u#rxz=rg(iZ`_+_m-~`gGCgpvBE1)y=l! zoga1c=>&*g4jWm{3#L-9weofGbX~sK+E3I*EJYs&8Z?jQZWke)EI;4g$~!yi>YIOX zwAmE#a)v%eM;pFQOP{-yj%4j7xrm?F$z^;eOzdRp9YreUU5(;Hmwn!`6~-FlzP4K5 ztv?Iq3}Q~3u@`o0gJ0_$W+qj0R7EKOb=pOLekAtHdq!m6kIgAxd~En$;5e_#mPEpl z%qdpXnLKych;o{HmmV(s2|-#0Iwp1#{5c-vMz)i{N2@NKLOx z)<*)=U^I2Oc?3M{nYFEHBp_U&S7n86JrhUkBtp*6aUQ z)AR4rTK{7q_tTI`&Fl+u`hPJj`^$vZx$3zUvLM>$gf{K60C#d-tJ|fMEuru=M2JXl zg0xWF@!7_C;BwNK#HFB~97OjGQ8HgHL_z8lnl4X>zg)=&^-6nQ))T6`p=0Cvh)=`~ z@BYj7!Fh^N<{|Us<#Nh#H@`-D)-C*QKy z9YZ__aKbXr!&D$^Nx$n5JFP_*uJpVcL#2%KMx=615L{lSg7`_5fTRT+&N);40)$)9 zO$E`)#q9_ClBer}Ir(nbj0KFVZAGV?C)=TSoDNU?SOS~LO{8#PnKV~lc)O7O-q6EZ z5V(0dLA$3W78J$VT4Cb))%F};6DUr9GPK7j*_3Y@W>Rz;&Q+ShqXIvdj&ik9!-udB zTTV*;e|j7(YdY2Zb)>c8oWPqb#J>hoFG9dLD^TzQ5eE_ZfDsWGhJo~=R4Dx@OGSE z+a;<92oKA1+`?5YHX9@2i+gW+r9!PXCd&=q2@#zkHp3xA%~og)G>Z>QM3YgUZ=H*u zP>HbxU;zgNeNLBWb;#gjpmw;qi43h`h^r1>N$QkB5~-LZi@aZCX8 zat|=TKYF z2Q~dxkQul#3RDpdrg3L%aku`vJYw>bY~}7fD6UT-FfN6Bf84#8fhl{8C3}R%@-5Ff zb~W79w%)cTDHEy~R5nHBn_Dk#HE>=2cS^d(3J(r-ibM2$U5Ao6l2m!n*&+!>bRo+V zk=kEhe-FC`HI_HXqX!(g1y|@G+`T53WH=H=(hGv>#yH!@3@T2E2X`q6da2av?kXNN zvN&zNp8`?Om^;fwB3FV9-8B&b=D@FgkjY|LY7+Saxe%$AzBXmgg6VyAz}kuh5yVD4 zEW_3Aq{q8}4&?>n#imsgJroACwnC0+55e!NF3r7J$~+^wVk75PooF5olW!I#=O{Hb zGUa4S2POMrght_n22?}_jM`*C;6!Eaf@KuQqlS!xx@*yNT$o)1+bb13=Uu3jzQygg zko+g74l@nkLuA00kgE<&ijDH>(R~rhDTGgx@^0aT zoF*mUV?LrX-G8jNHrIdQ!PDt=pmKU(W#J`|yT!%Qc{gY}&MvvyC@m={YyE4N!O-Sm zci+qpQfkHvsa>>x)nV_m!+t>gPJze~1>i2xk2 z$;e(HuAiD#1OyPplB6_pRIm%|FcG=>o z)8qP$*^o{oFXE4n#dnVn1D;KfhXp6?9!P^h8|U28 zo4mrzF(bvKw&MY(&u|D5gQdfYv58|Z_y@Or7{AQ%o-W0x&sOP2+t}$&b%!HyP~5Hhd;?5+%qUPpyLp8hzEPBFe^PQ|O&0C@=6Fzx>JTRV z&mk}K%6oIwFVbzG{O9f5U&aZ~Rn()9zmA0tl@(rmP-|C{GT6srfBk|8846U*geIz= z=bX(bzc4K^HF9Jm(h2s#$;Cz6L-g^FptTK|t^zvonoiMjzM*z5X>n^%23sS66Eeao zIJKQ9w(DTizCT{^(xJ>Ry0k&4Dl%EBP4sCCreO|tmE7Hvb1N{!Ox~>JwuCsri;fTg zW`@xoY5JAw`=k}zPZ8D*anKSTq{5f(mi==cled z;~icK`ZiWS;v2FjeAt>=8-^L}BS`Y}N}R^G&kAvx<3ph;P1j)wH24XS(-GC4o-w{i z7?rB>F_`VzZd!``L3a3PO-z+Lby@h5ZkI34em;Sy z?qFx)SR6nl2M8)E6x$*76f4|%$F6?e&*a9+_+)v$IA&q_?X$PS+fcxVJy?`k9ku5Q z9V&41n@4VP2w(Zu(1w$i)p@m=?6<3AkYY*vL0NMK3yWjBsk#y=%v5!@cB7Mj2nH?c zP4FOJKDwlzn*h2g=HupfI+St2I(a-h(f+*(@?it#6U|;2GJW9+dFjU2Ii>DaEhk87 zrwuD~#zKt-3X2S(jO3!g;9N8y+ zXDmGgA__mCPF>$%Wr^T>>z(kF*4UOLp`->V*})fTKmN; z(@OCswM^^0K@4?mZA`A`x5}FFH4ipY2}QPLDT9g3QUxNS_zWTil!J1wcxltLX`XVW z@drBSEn{AVpA^3{j-#Iem29JwT&5VfR7jLFlB|%M$1qJB%Muk$ zsprJOxj|NO)BPd<2W_B@))0??#VkVIR4*c;)-nkxiTA@=7aJ@&tUWnvufbGROBNZ)GhFMH z?8-v&?d9Ya4#^C*y5bY8f)jq*&Q}}?NU)0$`2tBGRA7kA8N{5yOSE5;LmxLTLQZND z%Ar=V>QK+lP#78sNvIJJl^wr<2d5A^3AKk4A_YHkgWxy67@r(%N&xb86igT}ZrrEo~)+L&h!Y4+GQwA}1Q7>U|`a@MBCJQ-~P<;*udyDQDZ0TN=36v*zG zxTJDYHy2v=K(k^c{_?fy%y{p;Lq zd5ol04-ItS$J@cv!OFAw zmosyR+<3_=M08nxL9L*PC*GdHkNs_gg>&+ng$0l6J|-35Hs1i|3F z=GmY42Hv;?jqA8V~eD2YaBW8yK>MNyH~3LjIikULbzBey&gq`T=DY9}R~hJrk0 z2gt!5l>{&{ME|C8X@Q6>6z|83@z2@ip?v)a?zfkh0mFlv^N?SuHB;TcB(`T`M-?h? zsj?EA+F?7YHF_R2NL=pqu!uWNjsA3fpc!~@sQim-9%%nL*Zxu_{lzsaB;h}}7XFX} zSH9E!bg_ejWa_UV=HDwnFP64k-#&5{kP?znSAtAZo;@}5eHsds5eGprm`DbNkSF`| z_xQ@N{3qY!*u~1JuJPQBO#Or3SK=X^^)T&r{A{e7U!02fXByq$V@YV{G_t?7RBEgTXlK~ zOL9y==NW%WhYZfXhd-uCg0Bj@w;iouMTN_xC1bwnTM+An)a!6B0GZO$;0s6D4ZpWi z`BY_~(cZ7o8)|^dXFW@1c6VT?i&OzZwR~^wUh#Zv8g7!rfRE0+NVZty7(~gKt%7di zrI4-BiCk$Ya>>YJFb1hr2;DpxliO372{dYPRFs`lfiEqd#!;31WN1rJ7$1>~Ysm%4 znwC@aX;b6jPtZYFA4Tl{Ey5-F7!$;H8>5t9owO`F1hF)Uq!*8-mc#wOnEeUlDVTRh2XT{y~3Q& zTiABA*+AiJ2<}}oCQ1YhK@nuKX{;%=7z@5=leJy>XK#Oou=bl`L-DILu}`rG@j8kA zy?G7|Q_dYpPAJaehb&i!fsiJxI<1!YqE9&}LUr|?&@Ao)a2Wv>rCec28+RNvdcAH3 zhhowGeQ|n4LV+pccru$@r3oXYau(?!tQSCo<`Ou$rYRWUnT;I{mP`p!Ez04B&glB1 z<8i9<9?SH-@oYF|AY`mu%Nx)Mj_sIU^rV`o_v9>0s^wTAMnTXjS3+74B0_P)(0dD# z9;T`%7O~`vuY3a8?(h$KDQgP#;MZhn%+d>ZJd8RX?LPTh*Ew5>#S4*Fa7!RnMkd7twe&g3zPk8X?9S0B4}?ck_R%oQIU9>t9| zE>mmlw>a*u#BXnMRt~jZ=W7=)v)1n`ARH+QQJtU^06iJy>~6|lkl5wt=A1VG1Vi*) zllcld&&%f-3tU zGVW>ZwYPh0I;)*-%A2jvSB(kuHK^@@_GTn>LV`kK@u0FqaVY>4JHo}-G(WR_;$f5< zrb|gm9veG-N0IZ5>)0uHE;oXtU%0LOv&t^Gmi#roAG>XfJsr0f+0|qWOr0E|^k`S& zQBygbufKt$Fwhn5&Ul-rWz#R+=H@+&$g@!DOd?@#LwEGFu3H9Dyp#)G-)D4ZqRV(? zE`8}o7DofMvb>qW+7M)7JB@kLST=f~ZLWZFQEZCy2Pv9nS+V+#R0>HzzBPV4apmA_ z>^Puv=Hp$w`m_5KHT)d#XrZW-vM2-Vo%yFJ!dtcJ^ZLSB{7 zD%oK)V8W)TRMDvKs3fmtbB9w3lI}~M+BLM!#W!-?SHB5ALsafMl1rBZ%$vJQ#@~_3 zTzGUtg?_7$1m29P-05XL2LQ0PfSRgfqh)Y?dl>2J2lfK^=U%4FY-H&0iaifZ^bJ{4L;ut_6FGRZJJ%OQ$vO{c#q|0Oqc$*Yd^r{zy=* zeA2Rni_`$44T#jVXeez;m7Bzw+Z-F~*E*Gw6~l2)EXPVRdFHihw~Cm%(3l}XVJ$=q zhto@RI#qfBU>=h&Cp?owd!PNNx8p#WV}@_tDS<+ecz$OU|E4;BnvPVYdvh(&tv>t8 zsW=PDzzKtlEKZ+=2T`oAGQft@!dqc&jHpS?$J6O4Mq0{fBXQu5ksgpB+JLAKjRIR3 zSuRGz#>HXf1#)LrR57j3rorXfmHt0v1E)?2y=lH+N&gp3;9r`-|A6J+vVmylz;FuJ zTJFpaWXyyph`(ijX3E46?bf&JKIATkPz#EXDnv&&Al%`(hQ#AB;($m7@JQO_e1f)} z9u#}|(ATyO2eJ|Ra^awJJ6j(9jg?~)A#t2(xsk)}qYi&#C0n0`id5-W<>O>kl9P(W zX5UtHU*W+yeL~StTuFCBQM?yjt*g$m;hgoUE*Lc*%NbTP_1mUeswy@$R^zR&-Y2Q% zVh`_FHCOB7IFD6bwRhI{PeHc3nzd5T%u>09)f?9$^8&)Pf)P=y{O+n(rq+XN*0akaa|e8 zRXd0f!Zxf$ZIXq7E52eC6|EEpIX9P&S2EO$u#J2x%CkKZr*mvW^Xc+*dthnJ2YkIj z+DOc|86g|5g>l^h9_n9f5+*M%iif&u>dNJ1f7OzMV!Iy;O|Cp-P=Dr$3Ei$S$4H3^ zYHU13b^6-VhZ6Pt7Jj@UqEPaU9#UC=`=agiR)hf|M(X(smIXrEA`?8M$}q}Blc#Oc zlB$<7njo7rX|v7+p4BDs;qF?q`3@&@oOom%!UYh*KP7N6CEs*E9SM0pIg(Ripg?zI zArBtH0lhFo43NI&on@ywI|DLXz+k~%UEZ6G!jVNG&) zE>!h+n$o_h-o-@44>kVe1dym4T0cEIS(ctoE^8z?-Ps@|1lf*-a7&G#0%9P43qvaU z+nj6f$Eg_3q12-6*4I%ksllUQh+BHG^?7nF_1-Qy|=9fU#n+fi=#_-h!#vwQEtgWuw!nJFzB%iTM*>kQi z;0OKk&5x(*^k)n1*nRpBSSDJIyE>VN1ba#MpKq z90_yu`wrLUZza8%Tm>c-Geh4R2v*8=iPyf5)3&w!Npc(mTHO7K#!cu;uCaHn#+PrZ zDdb6njNjP3VlopVup->ynD zigk4JO)ft9zRJPj{Wn^t;mA`kSES>Wpl5u4{f_sRC-d`ziTh0*BY$%wWkT!=v2{yk zexvn;vL<|k;5^r{jGTgUsr_2D=lZ~l?68iO$I#ywoaP846S|ig!aWwFs8x{5gj5yN zid=+1LO&ec#n(P!!Ml4mbT}K$=qBs;)HgQ7)4?}?G%R~lcM2K#s_o@H>G364W$zAt zfc!JB{%c8+f2WoIAA87V{faF+^+lbazepDTrAz+*wP4zbIha>q3p~!=@L}mirU}Irq-YjsOr2tH=rUT;YD_fRj~6HMM5jyEcbrK1t(D7B1Qkos699f?sv zIVHy17bqmKQn|o&1F0OLkSy3m6JLvQ==$A zk7OVcB4Z_9@!pv5R%8FryIW)UZOz7XI?SKbq`P#rgHix#3Gsz%f%e;(uZ~S9bL@^< z(}zN8gs<(~0LxQs$=)6+d`m8r!*M=T#~CJ-DWS9V9VNYFyHe;Cgk+ zs9ain%|we0o6)96@I#HX@W!5z<@yq_WO*R#s0FI~^76UWRMCO+s#To$_T$91!Ktmo zd5`4mf=3x`Ke6@FKCY0kE;T9glck`IX=E*x`HV2t@|Kp;6O=GzBfmN z3rU~4KKS#}z-h%o_XB@*kwVN*7CRMuzCRFjD=LW4t@ol17KPtft;cM&g=Zz%7$Vkk zq_&WWrf%o?7ux$)*?I^FG-s@~ta=6YDM&@zosy?73`mvLyVuw4-EhH3e^9Ynw%JnF zG1F{{#ua#t`Q@sUoQS}q#fhNediT6~FpMyTb@!0$! zZH;*494>Eyqxv?fwuaSSB~Oz@wbZSevO1YGQyLmkZPAhY%6Q{E!$A+)JJ}EtDQ7Bf zk@BA4Kk4)Ha&$dBjyiypNgC&NYf=rA?ECoN(3+J`%2tu%mHSpL5`$@wu2_)JSvN?% zb`Xevwu{JEn^|YkGctfKsKR0NBLv%vvM-S2_8D)O#3ya?>{p*ijcArq#d*=Yz<4#H z`h2%@8ok4eZY!2ulVxQz)1GXJ|Fp&+H!o5Z?w&Agt5mj?hSz8&&02EnLm+$H$Xs9X z%R}8#8qqu-rUwq#8EvJpHS9h&7a^T@h&Z2Ub-%I=8K&F2>nxLPAW*%kzv1t_4Tc1( zI!d9;eAh<}!hbD!ys(%jerYE!zbx5m2AIVS{Oc_4-$Ne&J9*02X@2eGp>ungt#^=U zG=TW*@LJWbFm!Z*UA>6 zqjS$2JU=9?u}Qurp{upl{U{&gg@lbg>?(b{*LNs$@0&K_ zV)Nv&cz>bnhq-r4RS-}E@0KD;Wz4;_IWc6K7pJ|gPaXH;ik=94aaO4jRA@iGG=?z2 zX6hmbZVwxi!(ZpTGCabsYhAzBIRPVT&l*3wKg*8IZ5Q)YKGMazRNs!L<)D(=cX(q$ zSziksl$86_E#?{`iw{k%JX#>}y9 z^30m*p`l0{VNW$pSu3?6$7S0>Bi1KOjD2)My9*PquRC>grX$og=%_~J-z_nCN{@51 z`GwE(*s|#%ZE(a3^;_}j1$gyn!fb2|mcVh$QoAU%fZB|6<$8PCGYgcl+p~pv`1uw| zL0Q>m&Bo>ZvoZWBYm~*G+ECJfLfoA^ znV;3ho(q>emXddV7ot|H6r~m0!JCUduKT4aK^mer;6%>o^e&6K^{DRs4Lrq|uhm)# z98dBI`J~O&Cn9YM+QC)t^y)b^7>E@*tj!8pjS*I&ASG%RUQNuco(<3>V&HGRikXkDnkfx8-+a)FU_Ct6|Q2nCE5oy8A)OPZ^gTq30HDfgQ`t+e8Oop<=F7 zb#nVEj7Cjzm-B?NO<#Fuf!Y1 zYpm=7M}Y)#r-Q)NL-eIz-;xTTogu#9)_$P20ZyJV;z&t;a@;^5g9hp!G9{r_ZtAVd zi+vn7LD^N8X|XUmcWwQ);y$q^*-h+EQQ;)`C7MOblhK^meCFSJnKI`wuudGGW2-OLxtTJEGl zcWuURlZNaxIP_Mu^j3G$?q5d9z=l>k)_8L3lHndjjl7dnunH zIHg05+Rrwc+h31NWj=5`udVw&6VN<03oV?qRHRO^`wL6lbE773;HPL&Z^EC+5D@)^QlPfp)WaYSVrNg?jHw@c0mG# zq4~KRApDci<+Wl8HgV*&Ab0nUes|1&>dQKC_M{q9f65aY;1=X$m`Edu$P*p)eaB^_ z)QTgXI!y7bJjL_#lDmbvfxFznTs-LzyV$HzRyR6$tCk@}P($}s!LA#B%1tVB0fd%2 zs*CN_!GTJ?KI9p;`qW6Cg-mk1g6bLkKWy!pPzBMcjD}sYUysyVf36{Gd&7`ph53WoB~xC0iYO)`p@k<>Pq%h?9C=@4D~r@&xU;rR zCy0DM#5%LeQSs@vAflNqv}3pV2kfcy;j5fmB%$9%$av{XgB%ssVKKT&gIRlq1Vsjm zg+-dV_k1*>%`bISka3jJsL+S+TiaQzZiIT{1W`=S`^-$WvV2E7Nf|thdeyM7e3a4d z+28(f(8SQ*ITQQy*7>VtKLI9Z)FsO8sJ=M8h4WUD8DS(7o$k3;foL3`b##NW(oF-Z z%S5E<+KiUgX64ryYpR*-)(unHK?M*Qa~e)0xK9v+|OGH@u0ioTV~ z6GuV!Roxhwo|bOB9D(~go;wO83Xv)idU4B|#5D1%%2e?hp`*N}n#aY+Zyy?QaL#h) zW^tDJGtq1US6w?9MocF1wqpucb5$;uRqOaD+KPWItCsSrKKr$-N^5_k3ZZq|;XG$R zmXYDX=`I8!z|WK7tb#e37>bQ;flihDYgu*IwdqYicqeHEzhPCfw~T5}@JLJK<7BiM= ze7s9sE{&#L;NvIMd5iH93Fn|?Bc_W9Zp+sRQ(H}SG@?}+kremerujWjIJQb^m?|Wq zY+Bn`)4cYUEpdZFvsQ1ENgOtgWmjh~3bv3CjM zA`(=f^AD>U-U{P~E=!Xgz0{tlr=Wz5_O7XyXe92*fEnzd?87c zArgepWhx4z_n6G>u#4_lKiUZh7{-pZL-kmU5bKb1?(TW5td*O9eal>47Hn^8PAK#> zMY!AD7p1D$jpbSYPBngsv|+5*QZCEnOWM9jY6-0{AMJH?f)(<`5sP$3^zx^m$gq;0 zDYY|&6y*G8s9qnijLf-`7}J(X{Eo`=GCz&bX7TbGSCXM)ye>$R8`j;;XiZg1xUctl z9II^2RNI9@G^j*X4mpIbu6?Mz;l^6d4IT@>dy%m*ST9365>zIRZg4#-Uf#!8} z>!lKUm)yY*{^nM+Y1*}Tc){oiH46yuQFX>kR2y#Vcl8WS8Kl1Ps!Gr=31b$2Bm1~b zS)qhSM9Q2rt1E?a~u=Q4H)sI~xQ_l^XoKF1?_Cw2iy(W!yT>578Cs_rR5xYy@r z?Ys~8AOX|ouFZUHyAUdOgrq~4VN%u8jCKd-8sY#?^pIe$@|vHo+^Ud2fn!eod*9dRP#-O_!R4;dz?mUrz>i7IkGl)E;bh4TIE zxV=4K?S6LTP33@n@OFv%uytQ3U>!O0=+*XIQ0Dh>ey;)J9Vd=!-b+=B)5tHI?zH>c zkG6=-H~Um&P37T!H8`3J;N9%c+GU@^IhH7j6Y2Ipcp}iw&%TVblAB9OxLA|AV&XgX ztW%-xe1uRDfv~l%uiEc>;L;m0p;v9q)$Ue(;sJ6!Xd59bZ}G~8ZM&k=jY?{sYhfD1 zOKosT@w~`0lZmy7JLvGm@SZ@%$}sI;K^esr)_Lwocr$Dy9LrpM&MP|Q40U7*k1m=o zim}PCzOaT&W$w;XHG-W4h8^PJ*#if4G-r&M^rq?Zg2hPh8-~1HCp}`$pSh=vj*@Tr zvE0xSeD;Q))z5Nh@LLd4S^KNqmrakf*6b`Y#Uid z9%kkaRvI1;9jx5140n}f;GA)f@bUZ!EAF-iJI@>3v69A^+7Tz6FV-iqySQ|&H3&=< z+GpE+?_8_D6nOeZxQfbhcUdn4zggw6LH@C``yg5Vu(dp%Hm7&WS1Z|@k|>J4J)`&M z9JlmJ9Ax`Wh|a#~SB#TY~^zx)@*_KcQR?A;60m% zMQk5-^7OQmS(;1J<%t=aTA58K)n7*}(Jwy2tKi9ooJq=Ohk-i{ZYO9lC}2L zC@!=T?BQc0!_&Zes^o`tQyKyu?E1Kqwf$}1RH2~M|EI+;AtU91hsG%GZu#e!hsgPb zqilEUjB-joGNzvyZDIJK^V~_GN?D#`-u$Pt_TJH^=;oamr}hKZ)WPL2ljQhEGmmb9 z9-gIjtJnSzPN<{j_^`E9+M3~O$2=RpuBhFTGQ*}jN$mZwaFgX^ABS;PW>UF8w6evO zU5xjq^{o99d9}v$Ue`Jf-w;|QVz&FEDLVB$)1~G1;^oO_ezQ7muf%H$KEFt0oK$4& z9I=~=;}^7YdzFa~NiJg7CU`qF^f9WLy%x<>QM?jI42$=c4I+X3Q zSTHF7gd~e-!d=Xh?9wEVBm~}mdJ$5P0yC`ucFGXXIb(89H!}21)J@EnJgQ1I)Oi$Y zXTCCJz_VdB$~Kp;rFjgxnwy6YOG90 zYj?hXL>@#k=l5nyeT<%sG2pP{@YtFRLz%uoy7;gb7aZIgsH%dhhPwMb@-|*XmOnKk zx4~Nxjc)^?mJQNpDleDNHe1s@J?~E4G4YGSm&F@=P;p%uGCA)$6Hu9!s2dj&Cxcz_ zk|Kc_Bk0Wt^8xMwiEP(5G3nbzQWN=iToq@>_Av$$)n>3qc^E`N5zL=zOcl`vk!<9> z`6V=Bk-V_exZBk%5HgsjExKMmF<@%a3^3Rgj3(`z+xeaixlbsc^CMj$U{|Jg;5g>f zC$l}7F`7MQ70e=Tw%uv7pfIgzGoLV|?rYp^f}mWpj!9}P5&W6EHEYh#?OmuhrBn#KzVuj=ib@ zTb6@uAp)}CelKQodKWy`h%oYgFs^lW=QRuq(i@COgapzvhRMHwShcMBK(zNaoQP%Yi zR zgTDtky^DiN{kg0W&kG(L?Kg-p`k?1D6J z>k!dh*&3f)NDhus^dSu#w*|6(W&FbA&Hj|$$enQVBsM<*qSxUCGR-2&#Ht+-#-HK% zM-PPyO*4M$bcyMQ;EGbW%1$^>bk2eoC^Kha65))OcxL!ftz$pegrHEpb&6^NJ`SD< z4;~lalUofp)vIvQx{9H7aOwMBZ(?}%RPP6?)N_{I^2^Vvlp37Asg^nG@y%? zIwJ)IMN6?~gSf_`LI>OV9eg&aoywRrSv6U+rD?VZd=6@sdc`oFv;CN7pkdg}M5lRC z7g4*Q@@UsPQ=wU;1H*`4aUSDQdroHU-q7S%ub-Fv8itO{PYDBFi|dGgcjg9C&Q2ay zP97$j4_&O>jjrm<0Z-pfi=2cq^Cv`V#;o{~2J&(eeCY$C{V&u-s1_KRIo?G8}#$Ck4)kr=yR;^w{4Z(U#q~f`TTxE&K67}GFki5Tf z&JG*R^!?nAb5nI6?djunSU3FY7bAP+L$j*1EqN<6CywkxOVm>JLlsBDrl!X1DG17t zDJs>A)hbEj?!I$+!ux`Yp4ON<@kVjG#&YO5u}{|5eKjxi3veCWBv@BVo)}|qm zv1`gUkr+*GHKo7$AF9@yd45!>`J_fq3Ew;3@E$M`rtubVqKiPPJFZfw!~L>MLNzTuvNSH%&@?nYyJEJ+JC#&IY7F{d6 z>(nOR$LscV{q5aC1(dW(a!XQ?9*<4x(XP9NWGHFE_MhY=n9X_k& z%(i~#77^a;bI?6S5feYbQB^>^b_Wb_4VrPHX5fF50XqM^55iUE-vs=UlTNKxC6KvE~G%Xc$PoO7lG6+E*=~%ZdUF*)(?pJb8J1eg%laKFLEd45pcpy2@jX=FffXFYul3O@CIs%z-7wlo{>~=9i zyj&a`$&|F{K-h)XO25L_L%&FYTJeiTkf;g6%J%VhP!!g4yGgru}Dm;5HdZ?cE2m7^8M#V1^CWRXF4M}fLid*P-U zTAVg1ls0&=WZ@Mabo5HtNA;tGgM)h1-@oDNN4@rQ-HH=%DrE^YFW52(18VGl%LI7!e;IeRPzPo> zxW9z{xp04(j9*f0rv?;#8&EA_g?h5UAwvnhxD$C9cePMbb~w1dg#Ni`d6^u-KXN?@ z=*f0~nhq@Tg<^8U!Tlxl&&`?3Jo8F#f%S_wF~zl8odLU5UEVvpLL1qj9d zs~=^%3x^CP^kNs}GVW@jVl|9Z0~&|Ak>Iz(GSxg=_1smU^TNhxfPCtF04km`-S^H&o%Ep{4#$^8}l# zlA3UMe@ngEKEVdUgO;kK1qTf+^?w>DSgCuuaCm=9z1l*-hQNZBdaeft4K4M5nkZPQ zoJMeXe@ngEM!^Q$ftD&_3ESgEz9aCm=9z1m8_Mkaxl+Gh3}4HZ7YodfC% z+*Sn}k^ve=UB40jzI6XhA*RFtiIna65pj z1yw$RK|l$*y3ND-QGym!5dcHG5CpfG!#ehWMwo=cAfNXP z%V-aFCl6W@ea&y&rG352JvHp=F*IPe0RaKdTC%DF5-_7gK#&C9=fBoVntpxzf0ijG 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 1507/2029] 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 1508/2029] 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 1509/2029] 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 1510/2029] 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 1511/2029] 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 1512/2029] 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 1513/2029] 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 1514/2029] 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 1515/2029] 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 1516/2029] 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 1517/2029] 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 1518/2029] 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 1519/2029] 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 1520/2029] 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 1521/2029] 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 1522/2029] 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 1523/2029] 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 1524/2029] 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 1525/2029] 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 1526/2029] 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 1527/2029] 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 1528/2029] 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 1529/2029] 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 1530/2029] 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 1531/2029] 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 1532/2029] 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 1533/2029] 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 1534/2029] 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 1535/2029] 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 1536/2029] 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 1537/2029] 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 1538/2029] 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 1539/2029] 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 1540/2029] 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 1541/2029] 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 1542/2029] 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 1543/2029] 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 1544/2029] 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 1545/2029] 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 1546/2029] 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 1547/2029] 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 1548/2029] 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 1549/2029] 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 1550/2029] 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 1551/2029] 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 1552/2029] 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 1553/2029] 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 1554/2029] 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 1555/2029] 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 1556/2029] 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 1557/2029] 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 1558/2029] 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 1559/2029] 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 1560/2029] 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 1561/2029] 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 1562/2029] 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 1563/2029] 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 1564/2029] 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 1565/2029] 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 1566/2029] 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 1567/2029] 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 1568/2029] 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 1569/2029] 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 1570/2029] 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 1571/2029] 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 1572/2029] 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 1573/2029] 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 1574/2029] 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 1575/2029] 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 1576/2029] 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 1577/2029] 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 1578/2029] 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 1579/2029] 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 1580/2029] 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 1581/2029] 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 1582/2029] 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 1583/2029] 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 1584/2029] 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 1585/2029] 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 1586/2029] 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 1587/2029] 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 1588/2029] 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 1589/2029] 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 1590/2029] 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 1591/2029] 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 1592/2029] 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 1593/2029] 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 1594/2029] 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 1595/2029] 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 1596/2029] 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 1597/2029] 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 1598/2029] 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 1599/2029] 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 1600/2029] 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 1601/2029] 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 1602/2029] 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 1603/2029] 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 1604/2029] 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 1605/2029] 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 1606/2029] 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 1607/2029] 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 1608/2029] 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 1609/2029] 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 1610/2029] 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 1611/2029] 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 1612/2029] 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 1613/2029] 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 1614/2029] 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 1615/2029] 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 1616/2029] 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 1617/2029] 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 1618/2029] 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 1619/2029] 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 1620/2029] 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 1621/2029] 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 1622/2029] 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 1623/2029] 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 1624/2029] 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 1625/2029] 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 1626/2029] 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 1627/2029] 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 1628/2029] 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 1629/2029] 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 1630/2029] 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 1631/2029] 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 1632/2029] 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 1633/2029] 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 1634/2029] 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 1635/2029] 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 1636/2029] 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 1637/2029] 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 1638/2029] 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 1639/2029] 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 1640/2029] 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 1641/2029] 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 1642/2029] 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 1643/2029] 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 1644/2029] 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 1645/2029] 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 1646/2029] 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 1647/2029] 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 1648/2029] 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 1649/2029] 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 1650/2029] 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 1651/2029] 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 1652/2029] 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 1653/2029] 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 1654/2029] 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 1655/2029] 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 1656/2029] 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 1657/2029] 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 1658/2029] 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 1659/2029] 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 1660/2029] 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 1661/2029] 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 1662/2029] 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 1663/2029] 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 1664/2029] 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 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 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 1665/2029] 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 1666/2029] 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 1667/2029] 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 1668/2029] 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 1669/2029] 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 1670/2029] 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 1671/2029] 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 1672/2029] 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 1673/2029] 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 1674/2029] 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 1675/2029] 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 1676/2029] 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 1677/2029] 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 1678/2029] 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 1679/2029] 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 1680/2029] 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 1681/2029] 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 1682/2029] 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 1683/2029] 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 1684/2029] 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 1685/2029] 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 1686/2029] 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 1687/2029] 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 1688/2029] 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 1689/2029] 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 1690/2029] 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 1691/2029] 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 1692/2029] 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 1693/2029] 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 1694/2029] 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 1695/2029] 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 1696/2029] 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 1697/2029] 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 1698/2029] 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 1699/2029] 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 1700/2029] 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 1701/2029] 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 1702/2029] 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 1703/2029] 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 1704/2029] 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 1705/2029] 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 1706/2029] 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 1707/2029] 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 1708/2029] 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 1709/2029] 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 1710/2029] 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 1711/2029] 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 1712/2029] 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 1713/2029] 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 1714/2029] 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 1715/2029] 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 1716/2029] 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 1717/2029] 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 1718/2029] 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 1719/2029] 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 1720/2029] 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 1721/2029] 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 1722/2029] 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 1723/2029] 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 1724/2029] 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 1725/2029] 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 1726/2029] 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 1727/2029] 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 1728/2029] 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 1729/2029] 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 1730/2029] 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 1731/2029] 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 1732/2029] 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 1733/2029] 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 1734/2029] 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 1735/2029] 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 1736/2029] 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 1737/2029] 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 1738/2029] 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 1739/2029] 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 1740/2029] 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 1741/2029] 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 1742/2029] 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 1743/2029] 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 1744/2029] 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 1745/2029] 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 1746/2029] 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 1747/2029] 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 1748/2029] 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 1749/2029] 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 1750/2029] 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 1751/2029] 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 1752/2029] 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 1753/2029] 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 1754/2029] 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 1755/2029] 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 1756/2029] 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 1757/2029] 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 1758/2029] 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 1759/2029] 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 1760/2029] 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 1761/2029] 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 1762/2029] 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 1763/2029] 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 1764/2029] 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 1765/2029] 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 1766/2029] 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 1767/2029] 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 1768/2029] 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 1769/2029] 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 1770/2029] 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 1771/2029] 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 1772/2029] 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 1773/2029] 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 1774/2029] 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 1775/2029] 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 1776/2029] 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 1777/2029] 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 1778/2029] 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 1779/2029] 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 1780/2029] 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 1781/2029] 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 1782/2029] 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 1783/2029] 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 1784/2029] 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 1785/2029] 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 1786/2029] 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 1787/2029] 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 1788/2029] 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 1789/2029] 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 1790/2029] 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 1791/2029] 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 1792/2029] 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 1793/2029] 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 1794/2029] 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 1795/2029] 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 1796/2029] 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 1797/2029] 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 1798/2029] 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 1799/2029] 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 1800/2029] 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 1801/2029] 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 1802/2029] 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 1803/2029] 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 1804/2029] 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 1805/2029] 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 1806/2029] 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 1807/2029] 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 1808/2029] 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 1809/2029] 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 1810/2029] 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 1811/2029] 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 1812/2029] 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 1813/2029] 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 1814/2029] 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 1815/2029] 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 1816/2029] 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 1817/2029] 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 1818/2029] 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 1819/2029] 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 1820/2029] 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 1821/2029] 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 1822/2029] 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 1823/2029] 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 1824/2029] 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 1825/2029] 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 1826/2029] 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 1827/2029] 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 1828/2029] 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 1829/2029] 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 1830/2029] 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 1831/2029] 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 1832/2029] 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 1833/2029] 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 1834/2029] 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 1835/2029] 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 1836/2029] 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 1837/2029] 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 1838/2029] 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 1839/2029] 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 1840/2029] 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 1841/2029] 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 1842/2029] 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 1843/2029] 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 1844/2029] 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 1845/2029] 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 1846/2029] 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 1847/2029] 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 1848/2029] 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 1849/2029] 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 1850/2029] 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 1851/2029] 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 1852/2029] 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 1853/2029] 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 1854/2029] 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 1855/2029] 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 1856/2029] 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 1857/2029] 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 1858/2029] 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 1859/2029] 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 1860/2029] 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 1861/2029] 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 1862/2029] 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 1863/2029] 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 1864/2029] 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 1865/2029] 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 1866/2029] 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 1867/2029] 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 1868/2029] 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 1869/2029] 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 1870/2029] 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 1871/2029] 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 1872/2029] 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 1873/2029] 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 1874/2029] 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 1875/2029] 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 1876/2029] 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 1877/2029] 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 1878/2029] 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 1879/2029] 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 1880/2029] 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 1881/2029] 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 1882/2029] 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 1883/2029] 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 1884/2029] 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 1885/2029] 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 1886/2029] 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 1887/2029] 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 1888/2029] 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 1889/2029] 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 1890/2029] 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 1891/2029] 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 1892/2029] 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 1893/2029] 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 1894/2029] 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 1895/2029] 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 1896/2029] 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 1897/2029] 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 1898/2029] 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 1899/2029] 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 1900/2029] 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 1901/2029] 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 1902/2029] 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 1903/2029] 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 1904/2029] 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 1905/2029] 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 1906/2029] 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 1907/2029] 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 1908/2029] 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 1909/2029] 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 1910/2029] 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 1911/2029] 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 1912/2029] 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 1913/2029] 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 1914/2029] 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 1915/2029] 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 1916/2029] 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 1917/2029] 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 1918/2029] 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 1919/2029] 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 1920/2029] 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 1921/2029] 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 1922/2029] 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 1923/2029] 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 1924/2029] 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 1925/2029] 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 1926/2029] 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 1927/2029] 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 1928/2029] 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 1929/2029] 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 1930/2029] 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 1931/2029] 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 1932/2029] 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 1933/2029] 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 1934/2029] 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 1935/2029] 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 1936/2029] 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 1937/2029] 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 1938/2029] 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 1939/2029] 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 1940/2029] 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 1941/2029] 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 1942/2029] 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 1943/2029] 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 1944/2029] 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 1945/2029] 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 1946/2029] 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 1947/2029] 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 1948/2029] 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 1949/2029] 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 1950/2029] 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 1951/2029] 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 1952/2029] 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 1953/2029] 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 1954/2029] 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 1955/2029] 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 1956/2029] 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 1957/2029] 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 1958/2029] 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 1959/2029] 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 1960/2029] 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 1961/2029] 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 1962/2029] 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 1963/2029] 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 1964/2029] 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 1965/2029] 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 1966/2029] 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 1967/2029] 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 1968/2029] 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 1969/2029] 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 1970/2029] 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 1971/2029] 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 1972/2029] 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 1973/2029] 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 1974/2029] 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 1975/2029] 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 1976/2029] 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 1977/2029] 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 1978/2029] 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 1979/2029] 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 1980/2029] 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 1981/2029] 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 1982/2029] 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 1983/2029] 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 1984/2029] 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 1985/2029] 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 1986/2029] 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 1987/2029] 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 1988/2029] 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 z*6V~-+aeeY=5BP}l-6?6dS@J?5WNoBGq-Ks0-Jh^$vB)AlM$@R^8ouWB%j1huEhLL zGHNIyH@JbxH~ePC@~7t!wXrzd8@P4^B*NG$1$Qs#XG{1EBtOM&oo>**o`tSEDk4r)!K z0efkf(OT0U8;hXb+8fQ@eN{X>S=^2)Vsok{n_sL}ER)PlpQ;oW!}|EO7RuSD3q0*F z_NeY6`Yc|>VHlBe9ehJQo^rA#h!2q2D{#aa0|Zj;$R3r;FeD8!KDlF%IG*Td6eowF zy8fw^EH~$E52imxGy0pT84<|_bYe#Wz}}A&rG#K@GcFl2s=}3v5&!{M%uh(sa6^F= zWkn*oB~N99%h;<)m7j~vM<}|) zBNjxgg&CS6Y0TFI*RU z;V-6A77N|?HvLYwew?Tp`$kW-a;Ci|Qo9f(W#1bdfk~d3`I`UI3q_*hr(f;7f9uwZ zXPMZ&?E!VCPa3{{Hs0rn7`ymfYC{W`9=|1#b4th&EOPNZ{O8NGz76#Y;kfKreVFR@ z!w%!7_=^YGbTHX3+h%5(Z{ISV547Wr_80f{V`RHQYssT2>O+eKE-^YT6^}QRo_$64vprxeX4B+_$4#y<32YGC^&_d z3tCTT{ffTq4ojOAMLw%}R_DCfUOTKo?UZUQ-SN;d`Q&6aLG0yin4Z??0X}M;e(uco zfwEqxEqfnt;-=yczsr+MyrmLDZ3cVlRQ|H9_IyI)qRXC|_1&vDxTo1ZuOxyhwVMfsGXL>TbGpUE@%#c6DhB<8SO@9dd$SE%P?u>#~YeGq|^COE^tP%0^lRF|L;f4|~ z37SGql%$Y{XPhU9_*naO#0Y-bT|I|pPYQWdM^q!<@ryM9kn3VBeOXsPS<6>azoIS% zoBP&gV@qf9B=bn+>15I;2P97?P43HUfFg4a_BEbSW8YIq*xdM%N7s6HZpSp(Gse$QCZ`OkcvTC<`XYnQ{RD)dwBMm83cE4S5c7w+(L!`3)`>c(P?`yiB8d!8_c~kKmak-1G zzZW*ne%4%pLAmKIvpLP?=C7v}D{QD`7v(=tTvg#?Ri49KF29CJj=@4*gO^Zj3a_OV zew0^WL+xRQ`PenUM1$zz*`PF8Ca72!&Al^Bo=;;6H8b3xg5hkN>MWpc)9ibC{9KN* zw_WJWP3L`Hw|Oe1DtN>i0xr>;yz0K0ii_>;$Ozf*k$7BGGY$*}f4p-%6yElYe2ho> z++-t?G=J4owIE>*1Pe>NN*=8e+nlqJ6>iyqZWhUdmYQxKO|nB~ElI0m;qrB7m`1}u zaW?NwU1dcDJzQiu0c(HM3E{D}o@|OyvUkDF+!Q0N$E`Z}7nvJ%z6PDnj1+kV& zw_Al}^%NQ3^)cY9^$sf|mx`fn9Go4OwKsU4bT0jnALX3OSg4BbCVE`ZrOU6O8Vvm(xUKFD{DaO${s?qzejJkhQwva_U1pNFq&nf@4*$c|UCmV&*mh23|2 z@kHC~MM`ygRXVVTrc166t7hmULmkZl9H@xmMTWlC2mLpMLwelC!+5sdw8^|*)JwF- zhX!kWl%H)jokd6U1G(NWL&8Uv~O_uCc?; z4P|!@;}@5LnDFVFo$UAf4Y7!SIGH=0vQRa(xHlo*+52Gpq2(2M)dIQQ4+O7ggIM?n zq;DUFwySAvP@eO1mXn@|ej^s42@sdGkWEF&&ZqJG>6>;Ucq`CvN6pO}jz|zz;f#<~ zsHd0}wWpUAr80t+QPi|Ea-{9NZ^dW}!98-bQbQ?e$xY-~LqUAM8w_Js~(y3lw&wiw`K;iEWOR z5=c`HQY`gic7#cGG=KZ~?b2|_Ml^aOF#V^JFHWiNqtX!(|^y zk4RE0zjX>=85eEz9X_e`SzO?|N~Y{AY9{WUXw!Nxqj&a7 z2VO~(5aA=n^ta>qUrgJ-p9l2IbKJuP1SfyTqxMX02&bvtG}6?$houWdK#lX+0Smdd zp1&4y^{2ripbr0xfD&7rA6s}n(-xduEO%&O&fv~yAz7-vLcXr6yku!bME$-$qJKbr zz{2av78Ck@wT%zpId;>5^c=?(YB|N*o`89dIsS@(N;}uOjDVUNYQErm%EBy68rN=Q zJZ;c4P|GD)n2{khqPfJq+yXaZeAf0k@NlH8@@;qdZIr{gjAurCb`n=S?%WkE+Yx|G z1bG0b$o@5(bTc)xv(#|&wzG7-Ha}{%zT?w7c#l4OXT{pn;Nb1Rnka9KtsQf?zh(73 z?f{F{xdw)@O8b0opx62NR*{EqgtM3&Pmk47NXI&_HNw~ZgNLaKr>&qQn%w?bU#(Ox z3jAog_NV<9i##%);-~f`Lhm1ootOShJ-k(^XZ!Z!gqBcpn)|C}^(QQPhisrlLe?C? z552M(kKK=~y-V5N?&s@jr?NCxWGWCaG_^7tQ>eE^tkSInU{~?xOr1+9$4|o z(JP`-jC{O6dsj1PC>y1!QGR`JhXP8?)$dGw%xQptC!Yh$Xnf7s!dFOq1?VWEsVmlJC4(%tb=_4P* zj8l^W<^zZcz0WgVtJi)NNv@;ge7n0^(fZWahIt`;Q%SoeZJteMhQQ0aWQXPZF($); z?2Jm0SapjthdAGb)q-u5f?8u{zjGa@Zzzp20o&d2wEHi3=PE$9w?L`qehc?qUf!xL zS}T6SFr&oKJ!Z2QFCb*;@-ho&Dz%hD8@Frr-C%SxM=i3mI4r$)3ftGA&}jsj^N(r$ zo&GafEl*wf7TNeXXM2Hkce}inPU@^JwHe{xq}snpipJuK?$n!G=HfkBCdvKq1qM;> zcHsP%^>;Z=D@8McKn~l8CajfwsUA&SDLmlqryC(XRb;9a$Uzb6v1ml*;X;bCgS3NI z&wEeVnkt`M?c7&(C(9sQO0+cELu86cwI5`Sqo4Dsg2dfWM(edys4jtvatd{Pvq)cC z1-BfhV2!28cFELqXQhRSW7Od%YV#Q5y!2v(5zNaq zCQ8U7@YV`m0=G5d;5{)ic-qy>VV*M2nfJ6s=`%KI2I?OO#gKF_?tjUdx{Iff`!!QB z@Ibb9_$+pL+4M+ug8GPA6|Izq?O@I{I81BK)F%x7^$i|2A;LV<&KW9nQJi_nnhgvj zOAOQS@4MugD>Arz#PI8lQ{&+$>5PP<&s^3G9_&%dDZPTF4pIm_m|#ewEJrjjqMD4%5>DXhqu7fY%!;23F+9767i=*J`N0(L$-R1TGlnyi|vIWp9{xIQN}tNr4rg=}9x z&{NYNWT8+O*G1GWsRkT)Whpj`cA^>zD1AT;XwS{6J$g6u+4JJcrc|^dG+8kq&4mDP zD%`KmTwmJJ!Ohaa%~;dh$CA^j2%HI#e zHTEkzG5$=nXKFn+2yakOlgfLvjsC`CSUC4tY!z3VVJ(l&qcP3>yXi9LTrfFNF^6V2 zKmC7}Tg|vUNc4?9&Rqmf&W(=FiLC#zS&xYZehuB`E%n=C8>ivU zERC=ZK7Br+;|Js)EsQdkzT>n^H8Ej^IDTHYdrwEFp2|m$5N<9?BDjV3#3$ORvktv^ zkySVJ?G~|kp?dC1MlnSu0UV|}4c}DRXqiK+$2*SNV%#%j&(DXVg4beE=01S9*iptS z5_H>&8$9ZDU-y_rW5_etGZE^)lsXvZwFo@NYBZmzmS7+nKWZ}*WG2S`b z#U{&%y49~R7+WowI6twl-($WGA*gtPs+mVaI=Kxro@H%=!P zOIP4YGIg_Ybbv;v+Qyhs2ZYi9`Sd9NDGvN(2dvBgBK*Ggs~o6xp`g=|KL8YM`J*l{ zk^Yf$Ss~E0^qje%cLT+9{wPk4{JXe^jiu+c#V3!eR)5`zB%nC3y&LRB3tZf0xr&!1WcQfskfuM+h0dT|Na6M2cGa8@>0Wr{e%CjxxaB>mkI`j z+Ny3`Y+7;w36Ly+#|!eFBmyn=5Ax+b`OUmMneJ-MT`v@m4hrrMq5m9rca_|^+Dd@{ z2pz(>DwKjA3K>l3<@rBXan}p=WQKzKL+B+GYK`KQm)WQRxBeB-EFo(&hy@B6Oz7po z5dZf=={ca_{t)`lX%kn;p#o!YDL_xQ543bhp`4sh$Y4S*xAR`bU0oY| z@Ky5kV{{N4aO*A6uL`B+g+c}sdbzpjD(-rro`O(te+d0&$JAA_iu+@(b)ZJ8fKCpw zMuUW)kimpr29saKT`#mn6bkMSq5njvUnL`;J$r%=w9zxbazG006@x+s6M7kDcNKTN zQ1;tUaDNE>CwA{D+1M88bv7UrS#ehgG>ES0|hDdrw$a}pHi>4P>@+u!KEVWK|zB{{ZA7GDOJ=E3hz&;*V`z_9F5>o z<&2=9!KMDEk%E-^$^;7UPpQ{iDad4Y;8Ne1{zijk+;Zgv`vUc;g3RItj-#-Ig8QxX zDirGT51APYoJ?o+n+!I(h58slCOrWsMB9PYB6tdvtNk1JvNIJp0fxv00s(dluJ0!x zPre7o5xPRqE*l8cYr0-guNMRYOwjec0p#h%;DUO*A!wI^pmqS)3qpDXfdCV9{WA}F zRwTF}#2^UTr68z}`SpU*!yph~g06qEArA`!7nBwbLAw+L^c|pu$2~ZLAq4^fCg}RnB;-DHaGFsn1np7~)Da})PDXHqaTWvu zOwjeCM#%kr;Iy=C2->9}s3S$ly&T|(-9iWin4s%NhmboQz-bJ{5VT7{P)CH20jJ=I z*-8imn4s%NfskRC;53{n2->9}=p#Sy#|(08u2cuX08{iYqdmy@7H~;Q^$@t Date: Thu, 20 Nov 2025 10:43:15 +0800 Subject: [PATCH 1989/2029] 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 1990/2029] 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 1991/2029] 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 1992/2029] 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 1993/2029] 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 1994/2029] 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 1995/2029] 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 1996/2029] 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 1997/2029] 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 1998/2029] 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 1999/2029] 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 2000/2029] 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 2001/2029] 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 2002/2029] 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 2003/2029] 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 2004/2029] 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 2005/2029] 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 2006/2029] 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 2007/2029] 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 2008/2029] 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 2009/2029] 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 2010/2029] 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 2011/2029] 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 2012/2029] 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 2013/2029] 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 2014/2029] 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 2015/2029] 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 2016/2029] 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 2017/2029] 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 2018/2029] 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 2019/2029] 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 2020/2029] 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 2021/2029] 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 2022/2029] 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 2023/2029] 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 2024/2029] 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 2025/2029] 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 2026/2029] 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 2027/2029] 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 2028/2029] 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 2029/2029] 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版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例

    6;`!=yhr28pyVPH% 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ⅆ4{a6EAauJO~P8~Eeb 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 Date: Mon, 30 Dec 2024 23:01:52 +0800 Subject: [PATCH 0548/2029] modify code --- src/class156/Code01_WrongAnswers.java | 76 +++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 src/class156/Code01_WrongAnswers.java diff --git a/src/class156/Code01_WrongAnswers.java b/src/class156/Code01_WrongAnswers.java new file mode 100644 index 000000000..6b6176009 --- /dev/null +++ b/src/class156/Code01_WrongAnswers.java @@ -0,0 +1,76 @@ +package class156; + +// 错误答案数量 +// 测试链接 : https://acm.hdu.edu.cn/showproblem.php?pid=3038 +// 测试链接 : https://vjudge.net/problem/HDU-3038 +// 提交以下的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 Code01_WrongAnswers { + + public static int MAXN = 200005; + + public static int n, m, ans; + + public static int[] father = new int[MAXN]; + + public static int[] weight = new int[MAXN]; + + public static void prepare() { + ans = 0; + for (int i = 0; i <= n; i++) { + father[i] = i; + weight[i] = 0; + } + } + + public static int find(int i) { + if (i != father[i]) { + int tmp = father[i]; + father[i] = find(father[i]); + weight[i] += weight[tmp]; + } + return father[i]; + } + + public static void union(int l, int r, int v) { + int lf = find(l), rf = find(r); + if (lf == rf) { + if ((weight[l] - weight[r]) != v) { + ans++; + } + } else { + father[lf] = rf; + weight[lf] = v + weight[r] - weight[l]; + } + } + + 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; + in.nextToken(); + m = (int) in.nval; + prepare(); + for (int i = 1, l, r, v; i <= m; i++) { + in.nextToken(); l = (int) in.nval - 1; + in.nextToken(); r = (int) in.nval; + in.nextToken(); v = (int) in.nval; + union(l, r, v); + } + out.println(ans); + out.flush(); + } + out.close(); + br.close(); + } + +} From c78b5fcafe46ad9d05dc60cfb4caba25f426016b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 30 Dec 2024 23:03:22 +0800 Subject: [PATCH 0549/2029] modify code --- src/class156/Code01_WrongAnswers.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class156/Code01_WrongAnswers.java b/src/class156/Code01_WrongAnswers.java index 6b6176009..899762cb8 100644 --- a/src/class156/Code01_WrongAnswers.java +++ b/src/class156/Code01_WrongAnswers.java @@ -67,8 +67,8 @@ public static void main(String[] args) throws IOException { union(l, r, v); } out.println(ans); - out.flush(); } + out.flush(); out.close(); br.close(); } From c260d077cc0d7df87180d0d4907e8e3e18d05aa5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 30 Dec 2024 23:04:31 +0800 Subject: [PATCH 0550/2029] modify code --- src/class156/Code01_WrongAnswers.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class156/Code01_WrongAnswers.java b/src/class156/Code01_WrongAnswers.java index 899762cb8..708f8a6ce 100644 --- a/src/class156/Code01_WrongAnswers.java +++ b/src/class156/Code01_WrongAnswers.java @@ -14,7 +14,7 @@ public class Code01_WrongAnswers { - public static int MAXN = 200005; + public static int MAXN = 200001; public static int n, m, ans; From b7b32f9c294c970b510c36df59cc01d7422d570b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 31 Dec 2024 16:24:45 +0800 Subject: [PATCH 0551/2029] modify code --- src/class156/Code01_WrongAnswers.java | 19 ++-- src/class156/Code02_LegendOfHeroes.java | 132 ++++++++++++++++++++++++ 2 files changed, 143 insertions(+), 8 deletions(-) create mode 100644 src/class156/Code02_LegendOfHeroes.java diff --git a/src/class156/Code01_WrongAnswers.java b/src/class156/Code01_WrongAnswers.java index 708f8a6ce..80baf4504 100644 --- a/src/class156/Code01_WrongAnswers.java +++ b/src/class156/Code01_WrongAnswers.java @@ -20,13 +20,13 @@ public class Code01_WrongAnswers { public static int[] father = new int[MAXN]; - public static int[] weight = new int[MAXN]; + public static int[] dist = new int[MAXN]; public static void prepare() { ans = 0; for (int i = 0; i <= n; i++) { father[i] = i; - weight[i] = 0; + dist[i] = 0; } } @@ -34,7 +34,7 @@ public static int find(int i) { if (i != father[i]) { int tmp = father[i]; father[i] = find(father[i]); - weight[i] += weight[tmp]; + dist[i] += dist[tmp]; } return father[i]; } @@ -42,12 +42,12 @@ public static int find(int i) { public static void union(int l, int r, int v) { int lf = find(l), rf = find(r); if (lf == rf) { - if ((weight[l] - weight[r]) != v) { + if ((dist[l] - dist[r]) != v) { ans++; } } else { father[lf] = rf; - weight[lf] = v + weight[r] - weight[l]; + dist[lf] = v + dist[r] - dist[l]; } } @@ -61,9 +61,12 @@ public static void main(String[] args) throws IOException { m = (int) in.nval; prepare(); for (int i = 1, l, r, v; i <= m; i++) { - in.nextToken(); l = (int) in.nval - 1; - in.nextToken(); r = (int) in.nval; - in.nextToken(); v = (int) in.nval; + in.nextToken(); + l = (int) in.nval - 1; + in.nextToken(); + r = (int) in.nval; + in.nextToken(); + v = (int) in.nval; union(l, r, v); } out.println(ans); diff --git a/src/class156/Code02_LegendOfHeroes.java b/src/class156/Code02_LegendOfHeroes.java new file mode 100644 index 000000000..841e46501 --- /dev/null +++ b/src/class156/Code02_LegendOfHeroes.java @@ -0,0 +1,132 @@ +package class156; + +// 银河英雄传说 +// 测试链接 : https://www.luogu.com.cn/problem/P1196 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.util.StringTokenizer; + +public class Code02_LegendOfHeroes { + + public static int MAXN = 30001; + + public static int n = 30000; + + public static int[] father = new int[MAXN]; + + public static int[] dist = new int[MAXN]; + + public static int[] size = new int[MAXN]; + + // 递归会爆栈,所以用迭代来寻找并查集代表节点 + public static int[] stack = new int[MAXN]; + + public static void prepare() { + for (int i = 1; i <= n; i++) { + father[i] = i; + dist[i] = 0; + size[i] = 1; + } + } + + // 迭代的方式实现find + public static int find(int i) { + int si = 0; + while (i != father[i]) { + stack[++si] = i; + i = father[i]; + } + stack[si + 1] = i; + for (int j = si; j >= 1; j--) { + father[stack[j]] = i; + dist[stack[j]] += dist[stack[j + 1]]; + } + return i; + } + + public static void union(int l, int r) { + int lf = find(l), rf = find(r); + if (lf == rf) { + return; + } + father[lf] = rf; + dist[lf] += size[rf]; + size[rf] += size[lf]; + } + + public static int watch(int l, int r) { + if (find(l) != find(r)) { + return -1; + } + return Math.abs(dist[l] - dist[r]) - 1; + } + + public static void main(String[] args) { + prepare(); + Kattio io = new Kattio(); + int m = io.nextInt(); + String op; + for (int i = 1, l, r; i <= m; i++) { + op = io.next(); + l = io.nextInt(); + r = io.nextInt(); + if (op.equals("M")) { + union(l, r); + } else { + io.println(watch(l, r)); + } + } + io.flush(); + io.close(); + } + + // 读写工具类 + public static class Kattio extends PrintWriter { + private BufferedReader r; + private StringTokenizer st; + + public Kattio() { + this(System.in, System.out); + } + + public Kattio(InputStream i, OutputStream o) { + super(o); + r = new BufferedReader(new InputStreamReader(i)); + } + + public Kattio(String intput, String output) throws IOException { + super(output); + r = new BufferedReader(new FileReader(intput)); + } + + public String next() { + try { + while (st == null || !st.hasMoreTokens()) + st = new StringTokenizer(r.readLine()); + return st.nextToken(); + } catch (Exception e) { + } + return null; + } + + public int nextInt() { + return Integer.parseInt(next()); + } + + public double nextDouble() { + return Double.parseDouble(next()); + } + + public long nextLong() { + return Long.parseLong(next()); + } + } + +} From abe3ab6f020472b042f4f97c4850817bcbdd35c9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 31 Dec 2024 16:25:25 +0800 Subject: [PATCH 0552/2029] modify code --- src/class156/Code02_LegendOfHeroes.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class156/Code02_LegendOfHeroes.java b/src/class156/Code02_LegendOfHeroes.java index 841e46501..586d2836f 100644 --- a/src/class156/Code02_LegendOfHeroes.java +++ b/src/class156/Code02_LegendOfHeroes.java @@ -36,7 +36,7 @@ public static void prepare() { } } - // 迭代的方式实现find + // 迭代的方式实现find,递归方式实现会爆栈 public static int find(int i) { int si = 0; while (i != father[i]) { From 616ca2dc9c538b0044c7ca6c40aa07b4fab4ef48 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 31 Dec 2024 20:56:23 +0800 Subject: [PATCH 0553/2029] modify code --- src/class156/Code01_DerivePartialSums.java | 96 +++++++++++++++++++ ...gAnswers.java => Code02_WrongAnswers.java} | 2 +- ...Heroes.java => Code03_LegendOfHeroes.java} | 11 +-- 3 files changed, 102 insertions(+), 7 deletions(-) create mode 100644 src/class156/Code01_DerivePartialSums.java rename src/class156/{Code01_WrongAnswers.java => Code02_WrongAnswers.java} (98%) rename src/class156/{Code02_LegendOfHeroes.java => Code03_LegendOfHeroes.java} (95%) diff --git a/src/class156/Code01_DerivePartialSums.java b/src/class156/Code01_DerivePartialSums.java new file mode 100644 index 000000000..8e354c019 --- /dev/null +++ b/src/class156/Code01_DerivePartialSums.java @@ -0,0 +1,96 @@ +package class156; + +// 推导部分和 +// 测试链接 : https://www.luogu.com.cn/problem/P8779 +// 提交以下的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 Code01_DerivePartialSums { + + public static int MAXN = 200001; + + public static long INF = Long.MAX_VALUE; + + public static int n, m, q; + + public static int[] father = new int[MAXN]; + + public static long[] dist = new long[MAXN]; + + public static void prepare() { + for (int i = 0; i <= n; i++) { + father[i] = i; + dist[i] = 0; + } + } + + public static int find(int i) { + if (i != father[i]) { + int tmp = father[i]; + father[i] = find(father[i]); + dist[i] += dist[tmp]; + } + return father[i]; + } + + public static void union(int l, int r, long v) { + int lf = find(l), rf = find(r); + if (lf != rf) { + father[lf] = rf; + dist[lf] = v + dist[r] - dist[l]; + } + } + + public static long query(int l, int r) { + if (find(l) != find(r)) { + return INF; + } + return dist[l] - dist[r]; + } + + 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; + in.nextToken(); + q = (int) in.nval; + prepare(); + int l, r; + long v; + for (int i = 1; i <= m; i++) { + in.nextToken(); + l = (int) in.nval - 1; + in.nextToken(); + r = (int) in.nval; + in.nextToken(); + v = (long) in.nval; + union(l, r, v); + } + for (int i = 1; i <= q; i++) { + in.nextToken(); + l = (int) in.nval - 1; + in.nextToken(); + r = (int) in.nval; + v = query(l, r); + if (v == INF) { + out.println("UNKNOWN"); + } else { + out.println(v); + } + } + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class156/Code01_WrongAnswers.java b/src/class156/Code02_WrongAnswers.java similarity index 98% rename from src/class156/Code01_WrongAnswers.java rename to src/class156/Code02_WrongAnswers.java index 80baf4504..4c54d6d9f 100644 --- a/src/class156/Code01_WrongAnswers.java +++ b/src/class156/Code02_WrongAnswers.java @@ -12,7 +12,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code01_WrongAnswers { +public class Code02_WrongAnswers { public static int MAXN = 200001; diff --git a/src/class156/Code02_LegendOfHeroes.java b/src/class156/Code03_LegendOfHeroes.java similarity index 95% rename from src/class156/Code02_LegendOfHeroes.java rename to src/class156/Code03_LegendOfHeroes.java index 586d2836f..2e007d964 100644 --- a/src/class156/Code02_LegendOfHeroes.java +++ b/src/class156/Code03_LegendOfHeroes.java @@ -13,7 +13,7 @@ import java.io.PrintWriter; import java.util.StringTokenizer; -public class Code02_LegendOfHeroes { +public class Code03_LegendOfHeroes { public static int MAXN = 30001; @@ -53,12 +53,11 @@ public static int find(int i) { public static void union(int l, int r) { int lf = find(l), rf = find(r); - if (lf == rf) { - return; + if (lf != rf) { + father[lf] = rf; + dist[lf] += size[rf]; + size[rf] += size[lf]; } - father[lf] = rf; - dist[lf] += size[rf]; - size[rf] += size[lf]; } public static int watch(int l, int r) { From 59738758d7d75f94de167c94a5f533cb28a25464 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 31 Dec 2024 23:48:15 +0800 Subject: [PATCH 0554/2029] modify code --- src/class156/Code01_DerivePartialSums.java | 2 +- src/class156/Code02_WrongAnswers.java | 2 +- src/class156/Code04_EvaluateDivision.java | 67 ++++++++++++++++++++++ 3 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 src/class156/Code04_EvaluateDivision.java diff --git a/src/class156/Code01_DerivePartialSums.java b/src/class156/Code01_DerivePartialSums.java index 8e354c019..57c70fafd 100644 --- a/src/class156/Code01_DerivePartialSums.java +++ b/src/class156/Code01_DerivePartialSums.java @@ -33,7 +33,7 @@ public static void prepare() { public static int find(int i) { if (i != father[i]) { int tmp = father[i]; - father[i] = find(father[i]); + father[i] = find(tmp); dist[i] += dist[tmp]; } return father[i]; diff --git a/src/class156/Code02_WrongAnswers.java b/src/class156/Code02_WrongAnswers.java index 4c54d6d9f..70dab9a5a 100644 --- a/src/class156/Code02_WrongAnswers.java +++ b/src/class156/Code02_WrongAnswers.java @@ -33,7 +33,7 @@ public static void prepare() { public static int find(int i) { if (i != father[i]) { int tmp = father[i]; - father[i] = find(father[i]); + father[i] = find(tmp); dist[i] += dist[tmp]; } return father[i]; diff --git a/src/class156/Code04_EvaluateDivision.java b/src/class156/Code04_EvaluateDivision.java new file mode 100644 index 000000000..445acdd6b --- /dev/null +++ b/src/class156/Code04_EvaluateDivision.java @@ -0,0 +1,67 @@ +package class156; + +import java.util.HashMap; +import java.util.List; + +// 除法求值 +// 测试链接 : https://leetcode.cn/problems/evaluate-division/ +public class Code04_EvaluateDivision { + + public static double[] calcEquation(List> equations, double[] values, List> queries) { + build(equations); + for (int i = 0; i < values.length; i++) { + union(equations.get(i).get(0), equations.get(i).get(1), values[i]); + } + double[] ans = new double[queries.size()]; + for (int i = 0; i < queries.size(); i++) { + ans[i] = compute(queries.get(i).get(0), queries.get(i).get(1)); + } + return ans; + } + + public static HashMap father = new HashMap<>(); + + public static HashMap dist = new HashMap<>(); + + public static void build(List> equations) { + father.clear(); + dist.clear(); + for (List list : equations) { + for (String key : list) { + father.put(key, key); + dist.put(key, 1.0); + } + } + } + + public static String find(String x) { + if (!father.containsKey(x)) { + return null; + } + String tmp, fa = x; + if (!x.equals(father.get(x))) { + tmp = father.get(x); + fa = find(tmp); + dist.put(x, dist.get(x) * dist.get(tmp)); + father.put(x, fa); + } + return fa; + } + + public static void union(String l, String r, double v) { + String lf = find(l), rf = find(r); + if (!lf.equals(rf)) { + father.put(lf, rf); + dist.put(lf, dist.get(r) / dist.get(l) * v); + } + } + + public static double compute(String l, String r) { + String lf = find(l), rf = find(r); + if (lf == null || rf == null || !lf.equals(rf)) { + return -1.0; + } + return dist.get(l) / dist.get(r); + } + +} From 146e9c7df164482f3bd21035a171d640137d59ee Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 31 Dec 2024 23:56:20 +0800 Subject: [PATCH 0555/2029] modify code --- src/class156/Code04_EvaluateDivision.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class156/Code04_EvaluateDivision.java b/src/class156/Code04_EvaluateDivision.java index 445acdd6b..c1e3639b7 100644 --- a/src/class156/Code04_EvaluateDivision.java +++ b/src/class156/Code04_EvaluateDivision.java @@ -8,7 +8,7 @@ public class Code04_EvaluateDivision { public static double[] calcEquation(List> equations, double[] values, List> queries) { - build(equations); + prepare(equations); for (int i = 0; i < values.length; i++) { union(equations.get(i).get(0), equations.get(i).get(1), values[i]); } @@ -23,7 +23,7 @@ public static double[] calcEquation(List> equations, double[] value public static HashMap dist = new HashMap<>(); - public static void build(List> equations) { + public static void prepare(List> equations) { father.clear(); dist.clear(); for (List list : equations) { From 3b7b3eed6565cdd73e72d034d6705ece0c727702 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 1 Jan 2025 22:31:04 +0800 Subject: [PATCH 0556/2029] modify code --- src/class156/Code02_WrongAnswers.java | 21 ++-- src/class156/Code05_FoodChainTrueOrFalse.java | 95 +++++++++++++++++++ 2 files changed, 110 insertions(+), 6 deletions(-) create mode 100644 src/class156/Code05_FoodChainTrueOrFalse.java diff --git a/src/class156/Code02_WrongAnswers.java b/src/class156/Code02_WrongAnswers.java index 70dab9a5a..704d58eea 100644 --- a/src/class156/Code02_WrongAnswers.java +++ b/src/class156/Code02_WrongAnswers.java @@ -41,16 +41,21 @@ public static int find(int i) { public static void union(int l, int r, int v) { int lf = find(l), rf = find(r); - if (lf == rf) { - if ((dist[l] - dist[r]) != v) { - ans++; - } - } else { + if (lf != rf) { father[lf] = rf; dist[lf] = v + dist[r] - dist[l]; } } + public static boolean check(int l, int r, int v) { + if (find(l) == find(r)) { + if ((dist[l] - dist[r]) != v) { + return false; + } + } + return true; + } + public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StreamTokenizer in = new StreamTokenizer(br); @@ -67,7 +72,11 @@ public static void main(String[] args) throws IOException { r = (int) in.nval; in.nextToken(); v = (int) in.nval; - union(l, r, v); + if (!check(l, r, v)) { + ans++; + } else { + union(l, r, v); + } } out.println(ans); } diff --git a/src/class156/Code05_FoodChainTrueOrFalse.java b/src/class156/Code05_FoodChainTrueOrFalse.java new file mode 100644 index 000000000..34a7ff006 --- /dev/null +++ b/src/class156/Code05_FoodChainTrueOrFalse.java @@ -0,0 +1,95 @@ +package class156; + +// 食物链真假判断 +// 测试链接 : https://www.luogu.com.cn/problem/P2024 +// 提交以下的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 Code05_FoodChainTrueOrFalse { + + public static int MAXN = 50001; + + public static int n, k, ans; + + public static int[] father = new int[MAXN]; + + public static int[] relation = new int[MAXN]; + + public static void prepare() { + ans = 0; + for (int i = 1; i <= n; i++) { + father[i] = i; + relation[i] = 0; + } + } + + public static int find(int i) { + if (i != father[i]) { + int tmp = father[i]; + father[i] = find(tmp); + relation[i] = (relation[i] + relation[tmp]) % 3; + } + return father[i]; + } + + public static void union(int op, int l, int r) { + int lf = find(l), rf = find(r), v = op == 1 ? 0 : 1; + if (lf != rf) { + father[lf] = rf; + relation[lf] = (relation[r] - relation[l] + v + 3) % 3; + } + } + + public static boolean check(int op, int l, int r) { + if (l > n || r > n || (op == 2 && l == r)) { + return false; + } + if (find(l) == find(r)) { + if (op == 1) { + if (relation[l] != relation[r]) { + return false; + } + } else { + if ((relation[l] - relation[r] + 3) % 3 != 1) { + return false; + } + } + } + return true; + } + + 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(); + k = (int) in.nval; + prepare(); + for (int i = 1, op, x, y; i <= k; i++) { + in.nextToken(); + op = (int) in.nval; + in.nextToken(); + x = (int) in.nval; + in.nextToken(); + y = (int) in.nval; + if (!check(op, x, y)) { + ans++; + } else { + union(op, x, y); + } + } + out.println(ans); + out.flush(); + out.close(); + br.close(); + } + +} From 943377ebea7b0a185ecff4a258686fe1e0396226 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 2 Jan 2025 12:33:55 +0800 Subject: [PATCH 0557/2029] modify code --- src/class156/Code01_DerivePartialSums.java | 10 +++++----- src/class156/Code02_WrongAnswers.java | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/class156/Code01_DerivePartialSums.java b/src/class156/Code01_DerivePartialSums.java index 57c70fafd..4225032aa 100644 --- a/src/class156/Code01_DerivePartialSums.java +++ b/src/class156/Code01_DerivePartialSums.java @@ -13,7 +13,7 @@ public class Code01_DerivePartialSums { - public static int MAXN = 200001; + public static int MAXN = 100002; public static long INF = Long.MAX_VALUE; @@ -69,18 +69,18 @@ public static void main(String[] args) throws IOException { long v; for (int i = 1; i <= m; i++) { in.nextToken(); - l = (int) in.nval - 1; + l = (int) in.nval; in.nextToken(); - r = (int) in.nval; + r = (int) in.nval + 1; in.nextToken(); v = (long) in.nval; union(l, r, v); } for (int i = 1; i <= q; i++) { in.nextToken(); - l = (int) in.nval - 1; + l = (int) in.nval; in.nextToken(); - r = (int) in.nval; + r = (int) in.nval + 1; v = query(l, r); if (v == INF) { out.println("UNKNOWN"); diff --git a/src/class156/Code02_WrongAnswers.java b/src/class156/Code02_WrongAnswers.java index 704d58eea..a640895e1 100644 --- a/src/class156/Code02_WrongAnswers.java +++ b/src/class156/Code02_WrongAnswers.java @@ -14,7 +14,7 @@ public class Code02_WrongAnswers { - public static int MAXN = 200001; + public static int MAXN = 200002; public static int n, m, ans; @@ -67,9 +67,9 @@ public static void main(String[] args) throws IOException { prepare(); for (int i = 1, l, r, v; i <= m; i++) { in.nextToken(); - l = (int) in.nval - 1; + l = (int) in.nval; in.nextToken(); - r = (int) in.nval; + r = (int) in.nval + 1; in.nextToken(); v = (int) in.nval; if (!check(l, r, v)) { From 044890fb825ba40c33e7019566b69bdae503a93f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 2 Jan 2025 12:36:24 +0800 Subject: [PATCH 0558/2029] modify code --- src/class156/Code03_LegendOfHeroes.java | 4 ++-- src/class156/Code04_EvaluateDivision.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class156/Code03_LegendOfHeroes.java b/src/class156/Code03_LegendOfHeroes.java index 2e007d964..f6df38952 100644 --- a/src/class156/Code03_LegendOfHeroes.java +++ b/src/class156/Code03_LegendOfHeroes.java @@ -60,7 +60,7 @@ public static void union(int l, int r) { } } - public static int watch(int l, int r) { + public static int query(int l, int r) { if (find(l) != find(r)) { return -1; } @@ -79,7 +79,7 @@ public static void main(String[] args) { if (op.equals("M")) { union(l, r); } else { - io.println(watch(l, r)); + io.println(query(l, r)); } } io.flush(); diff --git a/src/class156/Code04_EvaluateDivision.java b/src/class156/Code04_EvaluateDivision.java index c1e3639b7..8a92b3ee8 100644 --- a/src/class156/Code04_EvaluateDivision.java +++ b/src/class156/Code04_EvaluateDivision.java @@ -14,7 +14,7 @@ public static double[] calcEquation(List> equations, double[] value } double[] ans = new double[queries.size()]; for (int i = 0; i < queries.size(); i++) { - ans[i] = compute(queries.get(i).get(0), queries.get(i).get(1)); + ans[i] = query(queries.get(i).get(0), queries.get(i).get(1)); } return ans; } @@ -56,7 +56,7 @@ public static void union(String l, String r, double v) { } } - public static double compute(String l, String r) { + public static double query(String l, String r) { String lf = find(l), rf = find(r); if (lf == null || rf == null || !lf.equals(rf)) { return -1.0; From 9866ca4a3ecdedb16e3428548b0437b8a0eb0f5d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 2 Jan 2025 21:15:53 +0800 Subject: [PATCH 0559/2029] modify code --- src/class156/Code01_DerivePartialSums.java | 2 +- src/class156/Code02_CunningMerchant.java | 92 ++++++ ...gAnswers.java => Code03_WrongAnswers.java} | 4 +- ...Heroes.java => Code04_LegendOfHeroes.java} | 2 +- ...sion.java => Code05_EvaluateDivision.java} | 2 +- src/class156/Code06_ExclusiveOR.java | 288 ++++++++++++++++++ ....java => Code07_FoodChainTrueOrFalse.java} | 12 +- src/class156/Code08_DetainCriminals.java | 98 ++++++ 8 files changed, 489 insertions(+), 11 deletions(-) create mode 100644 src/class156/Code02_CunningMerchant.java rename src/class156/{Code02_WrongAnswers.java => Code03_WrongAnswers.java} (96%) rename src/class156/{Code03_LegendOfHeroes.java => Code04_LegendOfHeroes.java} (98%) rename src/class156/{Code04_EvaluateDivision.java => Code05_EvaluateDivision.java} (97%) create mode 100644 src/class156/Code06_ExclusiveOR.java rename src/class156/{Code05_FoodChainTrueOrFalse.java => Code07_FoodChainTrueOrFalse.java} (91%) create mode 100644 src/class156/Code08_DetainCriminals.java diff --git a/src/class156/Code01_DerivePartialSums.java b/src/class156/Code01_DerivePartialSums.java index 4225032aa..7cc8ba7e2 100644 --- a/src/class156/Code01_DerivePartialSums.java +++ b/src/class156/Code01_DerivePartialSums.java @@ -59,7 +59,7 @@ public static void main(String[] args) throws IOException { StreamTokenizer in = new StreamTokenizer(br); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); in.nextToken(); - n = (int) in.nval; + n = (int) in.nval + 1; in.nextToken(); m = (int) in.nval; in.nextToken(); diff --git a/src/class156/Code02_CunningMerchant.java b/src/class156/Code02_CunningMerchant.java new file mode 100644 index 000000000..1f4037bf1 --- /dev/null +++ b/src/class156/Code02_CunningMerchant.java @@ -0,0 +1,92 @@ +package class156; + +// 狡猾的商人 +// 测试链接 : https://www.luogu.com.cn/problem/P2294 +// 提交以下的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 Code02_CunningMerchant { + + public static int MAXN = 102; + + public static int t, n, m; + + public static boolean ans; + + public static int[] father = new int[MAXN]; + + public static int[] dist = new int[MAXN]; + + public static void prepare() { + ans = true; + for (int i = 1; i <= n; i++) { + father[i] = i; + dist[i] = 0; + } + } + + public static int find(int i) { + if (i != father[i]) { + int tmp = father[i]; + father[i] = find(tmp); + dist[i] += dist[tmp]; + } + return father[i]; + } + + public static void union(int l, int r, int v) { + int lf = find(l), rf = find(r); + if (lf != rf) { + father[lf] = rf; + dist[lf] = v + dist[r] - dist[l]; + } + } + + public static boolean check(int l, int r, int v) { + if (find(l) == find(r)) { + if ((dist[l] - dist[r]) != v) { + return false; + } + } + return true; + } + + 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(); + t = (int) in.nval; + for (int c = 1; c <= t; c++) { + in.nextToken(); + n = (int) in.nval + 1; + in.nextToken(); + m = (int) in.nval; + prepare(); + for (int i = 1, l, r, v; i <= m; i++) { + in.nextToken(); + l = (int) in.nval; + in.nextToken(); + r = (int) in.nval + 1; + in.nextToken(); + v = (int) in.nval; + if (!check(l, r, v)) { + ans = false; + } else { + union(l, r, v); + } + } + out.println(ans); + } + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class156/Code02_WrongAnswers.java b/src/class156/Code03_WrongAnswers.java similarity index 96% rename from src/class156/Code02_WrongAnswers.java rename to src/class156/Code03_WrongAnswers.java index a640895e1..3da2a3637 100644 --- a/src/class156/Code02_WrongAnswers.java +++ b/src/class156/Code03_WrongAnswers.java @@ -12,7 +12,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code02_WrongAnswers { +public class Code03_WrongAnswers { public static int MAXN = 200002; @@ -61,7 +61,7 @@ public static void main(String[] args) throws IOException { StreamTokenizer in = new StreamTokenizer(br); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); while (in.nextToken() != StreamTokenizer.TT_EOF) { - n = (int) in.nval; + n = (int) in.nval + 1; in.nextToken(); m = (int) in.nval; prepare(); diff --git a/src/class156/Code03_LegendOfHeroes.java b/src/class156/Code04_LegendOfHeroes.java similarity index 98% rename from src/class156/Code03_LegendOfHeroes.java rename to src/class156/Code04_LegendOfHeroes.java index f6df38952..3c96f73ab 100644 --- a/src/class156/Code03_LegendOfHeroes.java +++ b/src/class156/Code04_LegendOfHeroes.java @@ -13,7 +13,7 @@ import java.io.PrintWriter; import java.util.StringTokenizer; -public class Code03_LegendOfHeroes { +public class Code04_LegendOfHeroes { public static int MAXN = 30001; diff --git a/src/class156/Code04_EvaluateDivision.java b/src/class156/Code05_EvaluateDivision.java similarity index 97% rename from src/class156/Code04_EvaluateDivision.java rename to src/class156/Code05_EvaluateDivision.java index 8a92b3ee8..d5365e2f2 100644 --- a/src/class156/Code04_EvaluateDivision.java +++ b/src/class156/Code05_EvaluateDivision.java @@ -5,7 +5,7 @@ // 除法求值 // 测试链接 : https://leetcode.cn/problems/evaluate-division/ -public class Code04_EvaluateDivision { +public class Code05_EvaluateDivision { public static double[] calcEquation(List> equations, double[] values, List> queries) { prepare(equations); diff --git a/src/class156/Code06_ExclusiveOR.java b/src/class156/Code06_ExclusiveOR.java new file mode 100644 index 000000000..88799afce --- /dev/null +++ b/src/class156/Code06_ExclusiveOR.java @@ -0,0 +1,288 @@ +package class156; + +// 异或关系 +// 测试链接 : https://acm.hdu.edu.cn/showproblem.php?pid=3234 +// 测试链接 : https://www.luogu.com.cn/problem/UVA12232 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; + +public class Code06_ExclusiveOR { + + public static int MAXN = 20002; + + public static int MAXK = 21; + + public static int t, n, m; + + public static boolean conflict; + + public static int cnti; + + public static int[] father = new int[MAXN]; + + public static int[] exclu = new int[MAXN]; + + public static int[] nums = new int[MAXK]; + + public static int[] collect = new int[MAXK]; + + public static void prepare() { + conflict = false; + cnti = 0; + for (int i = 0; i <= n; i++) { + father[i] = i; + exclu[i] = 0; + } + } + + public static int find(int i) { + if (i != father[i]) { + int tmp = father[i]; + father[i] = find(tmp); + exclu[i] ^= exclu[tmp]; + } + return father[i]; + } + + public static void union(int l, int r, int v) { + int lf = find(l), rf = find(r); + if (lf == n) { + lf = rf; + rf = n; + } + if (lf != rf) { + father[lf] = rf; + exclu[lf] = exclu[r] ^ exclu[l] ^ v; + } + } + + public static boolean check(int l, int r, int v) { + if (find(l) == find(r)) { + if ((exclu[l] ^ exclu[r]) != v) { + return false; + } + } + return true; + } + + public static boolean opi(int l, int r, int v) { + cnti++; + if (!check(l, r, v)) { + conflict = true; + return false; + } + union(l, r, v); + return true; + } + + public static int opq(int k) { + int ans = 0, ci = 0, fa; + for (int i = 1; i <= k; i++) { + fa = find(nums[i]); + ans ^= exclu[nums[i]]; + collect[++ci] = fa; + } + Arrays.sort(collect, 1, ci + 1); + for (int l = 1, r = 1; l <= ci; l = ++r) { + while (r + 1 <= ci && collect[r + 1] == collect[l]) { + r++; + } + if ((r - l + 1) % 2 != 0) { + if (collect[l] == n) { + ans ^= exclu[n]; + } else { + return -1; + } + } + } + return ans; + } + + public static void main(String[] args) throws IOException { + FastReader in = new FastReader(); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + t = 0; + n = in.nextInt(); + m = in.nextInt(); + while (n != 0 || m != 0) { + prepare(); + out.println("Case " + (++t) + ":"); + for (int i = 1; i <= m; i++) { + String op = in.next(); + if (op.equals("I")) { + int l, r, v; + in.numbers(); + if (in.size == 2) { + l = in.a; + r = n; + v = in.b; + } else { + l = in.a; + r = in.b; + v = in.c; + } + if (!conflict) { + if (!opi(l, r, v)) { + out.println("The first " + cnti + " facts are conflicting."); + } + } + } else { + int k = in.nextInt(); + for (int j = 1; j <= k; j++) { + nums[j] = in.nextInt(); + } + if (!conflict) { + int ans = opq(k); + if (ans == -1) { + out.println("I don't know."); + } else { + out.println(ans); + } + } + } + } + out.println(); + n = in.nextInt(); + m = in.nextInt(); + } + 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 pointer, bytesRead; + + public int a; + public int b; + public int c; + public int size; + + public FastReader() { + in = System.in; + buffer = new byte[BUFFER_SIZE]; + pointer = bytesRead = 0; + } + + private byte read() throws IOException { + if (pointer >= bytesRead) { + fillBuffer(); + if (bytesRead == -1) { + return -1; + } + } + return buffer[pointer++]; + } + + private void fillBuffer() throws IOException { + bytesRead = in.read(buffer, 0, BUFFER_SIZE); + pointer = 0; + } + + private void skipWhiteSpace() throws IOException { + byte c; + while ((c = read()) != -1) { + if (c > ' ') { + pointer--; + break; + } + } + } + + private String readLine() throws IOException { + StringBuilder sb = new StringBuilder(); + while (true) { + byte c = read(); + if (c == -1 || c == '\n') { + break; + } + if (c == '\r') { + byte nextc = read(); + if (nextc != '\n') { + pointer--; + } + break; + } + sb.append((char) c); + } + if (sb.length() == 0 && bytesRead == -1) { + return null; + } + return sb.toString(); + } + + public String next() throws IOException { + skipWhiteSpace(); + if (bytesRead == -1) { + return null; + } + StringBuilder sb = new StringBuilder(); + byte c = read(); + while (c != -1 && c > ' ') { + sb.append((char) c); + c = read(); + } + return sb.toString(); + } + + public int nextInt() throws IOException { + skipWhiteSpace(); + if (bytesRead == -1) { + throw new IOException("No more data to read (EOF)"); + } + boolean negative = false; + int result = 0; + byte c = read(); + if (c == '-') { + negative = true; + c = read(); + } + while (c >= '0' && c <= '9') { + result = result * 10 + (c - '0'); + c = read(); + } + if (c != -1 && c > ' ') { + pointer--; + } + return negative ? -result : result; + } + + public void numbers() throws IOException { + a = b = c = size = 0; + String line = readLine(); + if (line == null) { + return; + } + String[] parts = line.trim().split("\\s+"); + if (parts.length == 0) { + return; + } + size = Math.min(parts.length, 3); + if (size >= 1) { + a = Integer.parseInt(parts[0]); + } + if (size >= 2) { + b = Integer.parseInt(parts[1]); + } + if (size >= 3) { + c = Integer.parseInt(parts[2]); + } + } + + public void close() throws IOException { + if (in != null) { + in.close(); + } + } + } + +} diff --git a/src/class156/Code05_FoodChainTrueOrFalse.java b/src/class156/Code07_FoodChainTrueOrFalse.java similarity index 91% rename from src/class156/Code05_FoodChainTrueOrFalse.java rename to src/class156/Code07_FoodChainTrueOrFalse.java index 34a7ff006..7ef305e59 100644 --- a/src/class156/Code05_FoodChainTrueOrFalse.java +++ b/src/class156/Code07_FoodChainTrueOrFalse.java @@ -11,7 +11,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code05_FoodChainTrueOrFalse { +public class Code07_FoodChainTrueOrFalse { public static int MAXN = 50001; @@ -73,17 +73,17 @@ public static void main(String[] args) throws IOException { in.nextToken(); k = (int) in.nval; prepare(); - for (int i = 1, op, x, y; i <= k; i++) { + for (int i = 1, op, l, r; i <= k; i++) { in.nextToken(); op = (int) in.nval; in.nextToken(); - x = (int) in.nval; + l = (int) in.nval; in.nextToken(); - y = (int) in.nval; - if (!check(op, x, y)) { + r = (int) in.nval; + if (!check(op, l, r)) { ans++; } else { - union(op, x, y); + union(op, l, r); } } out.println(ans); diff --git a/src/class156/Code08_DetainCriminals.java b/src/class156/Code08_DetainCriminals.java new file mode 100644 index 000000000..587050384 --- /dev/null +++ b/src/class156/Code08_DetainCriminals.java @@ -0,0 +1,98 @@ +package class156; + +// 关押罪犯 +// 测试链接 : https://www.luogu.com.cn/problem/P1525 +// 提交以下的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 Code08_DetainCriminals { + + public static int MAXN = 20002; + + public static int MAXM = 100001; + + public static int n, m; + + public static int[] father = new int[MAXN]; + + public static int[] enemy = new int[MAXN]; + + public static int[][] arr = new int[MAXM][3]; + + public static void prepare() { + for (int i = 1; i <= n; i++) { + father[i] = i; + enemy[i] = 0; + } + } + + public static int find(int i) { + father[i] = father[i] == i ? i : find(father[i]); + return father[i]; + } + + public static void union(int l, int r) { + father[find(l)] = find(r); + } + + public static boolean same(int l, int r) { + return find(l) == find(r); + } + + public static int compute() { + Arrays.sort(arr, 1, m + 1, (a, b) -> b[2] - a[2]); + int ans = 0; + for (int i = 1, l, r, v; i <= m; i++) { + l = arr[i][0]; + r = arr[i][1]; + v = arr[i][2]; + if (same(l, r)) { + ans = v; + break; + } else { + if (enemy[l] == 0) { + enemy[l] = r; + } else { + union(enemy[l], r); + } + if (enemy[r] == 0) { + enemy[r] = l; + } else { + union(l, enemy[r]); + } + } + } + return ans; + } + + 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; + prepare(); + for (int i = 1; i <= m; i++) { + in.nextToken(); + arr[i][0] = (int) in.nval; + in.nextToken(); + arr[i][1] = (int) in.nval; + in.nextToken(); + arr[i][2] = (int) in.nval; + } + out.println(compute()); + out.flush(); + out.close(); + br.close(); + } + +} From 1c30bf0e74940f71a5cbd67ec6d7f31e029061bf Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 2 Jan 2025 21:19:37 +0800 Subject: [PATCH 0560/2029] modify code --- ...odChainTrueOrFalse.java => Code06_FoodChainTrueOrFalse.java} | 2 +- ...{Code08_DetainCriminals.java => Code07_DetainCriminals.java} | 2 +- .../{Code06_ExclusiveOR.java => Code08_ExclusiveOR.java} | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename src/class156/{Code07_FoodChainTrueOrFalse.java => Code06_FoodChainTrueOrFalse.java} (97%) rename src/class156/{Code08_DetainCriminals.java => Code07_DetainCriminals.java} (98%) rename src/class156/{Code06_ExclusiveOR.java => Code08_ExclusiveOR.java} (99%) diff --git a/src/class156/Code07_FoodChainTrueOrFalse.java b/src/class156/Code06_FoodChainTrueOrFalse.java similarity index 97% rename from src/class156/Code07_FoodChainTrueOrFalse.java rename to src/class156/Code06_FoodChainTrueOrFalse.java index 7ef305e59..026ba3e60 100644 --- a/src/class156/Code07_FoodChainTrueOrFalse.java +++ b/src/class156/Code06_FoodChainTrueOrFalse.java @@ -11,7 +11,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code07_FoodChainTrueOrFalse { +public class Code06_FoodChainTrueOrFalse { public static int MAXN = 50001; diff --git a/src/class156/Code08_DetainCriminals.java b/src/class156/Code07_DetainCriminals.java similarity index 98% rename from src/class156/Code08_DetainCriminals.java rename to src/class156/Code07_DetainCriminals.java index 587050384..a7c5031bb 100644 --- a/src/class156/Code08_DetainCriminals.java +++ b/src/class156/Code07_DetainCriminals.java @@ -12,7 +12,7 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class Code08_DetainCriminals { +public class Code07_DetainCriminals { public static int MAXN = 20002; diff --git a/src/class156/Code06_ExclusiveOR.java b/src/class156/Code08_ExclusiveOR.java similarity index 99% rename from src/class156/Code06_ExclusiveOR.java rename to src/class156/Code08_ExclusiveOR.java index 88799afce..5d86f21bd 100644 --- a/src/class156/Code06_ExclusiveOR.java +++ b/src/class156/Code08_ExclusiveOR.java @@ -11,7 +11,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code06_ExclusiveOR { +public class Code08_ExclusiveOR { public static int MAXN = 20002; From 74ffec87365a35646d9c1a2cbc3dde703f9fa4e0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 2 Jan 2025 21:22:18 +0800 Subject: [PATCH 0561/2029] modify code --- ...6_FoodChainTrueOrFalse.java => Code06_JudgeFoodChain.java} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename src/class156/{Code06_FoodChainTrueOrFalse.java => Code06_JudgeFoodChain.java} (96%) diff --git a/src/class156/Code06_FoodChainTrueOrFalse.java b/src/class156/Code06_JudgeFoodChain.java similarity index 96% rename from src/class156/Code06_FoodChainTrueOrFalse.java rename to src/class156/Code06_JudgeFoodChain.java index 026ba3e60..a53101674 100644 --- a/src/class156/Code06_FoodChainTrueOrFalse.java +++ b/src/class156/Code06_JudgeFoodChain.java @@ -1,6 +1,6 @@ package class156; -// 食物链真假判断 +// 甄别食物链 // 测试链接 : https://www.luogu.com.cn/problem/P2024 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -11,7 +11,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code06_FoodChainTrueOrFalse { +public class Code06_JudgeFoodChain { public static int MAXN = 50001; From 6299637770d500854df13da203a08bc309f6292d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 2 Jan 2025 21:33:03 +0800 Subject: [PATCH 0562/2029] modify code --- src/class156/Code08_ExclusiveOR.java | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/class156/Code08_ExclusiveOR.java b/src/class156/Code08_ExclusiveOR.java index 5d86f21bd..4ebc0fe72 100644 --- a/src/class156/Code08_ExclusiveOR.java +++ b/src/class156/Code08_ExclusiveOR.java @@ -3,6 +3,7 @@ // 异或关系 // 测试链接 : https://acm.hdu.edu.cn/showproblem.php?pid=3234 // 测试链接 : https://www.luogu.com.cn/problem/UVA12232 +// 测试链接 : https://vjudge.net/problem/UVA-12232 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.IOException; @@ -117,16 +118,12 @@ public static void main(String[] args) throws IOException { if (op.equals("I")) { int l, r, v; in.numbers(); - if (in.size == 2) { - l = in.a; - r = n; - v = in.b; - } else { - l = in.a; - r = in.b; - v = in.c; - } if (!conflict) { + if (in.size == 2) { + l = in.a; r = n; v = in.b; + } else { + l = in.a; r = in.b; v = in.c; + } if (!opi(l, r, v)) { out.println("The first " + cnti + " facts are conflicting."); } From 72b87bf1485e3e8a4f5c084a4dfc06d3380833de Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 2 Jan 2025 21:44:49 +0800 Subject: [PATCH 0563/2029] modify code --- src/class156/Code08_ExclusiveOR.java | 34 +++++++++------------------- 1 file changed, 11 insertions(+), 23 deletions(-) diff --git a/src/class156/Code08_ExclusiveOR.java b/src/class156/Code08_ExclusiveOR.java index 4ebc0fe72..d740f1756 100644 --- a/src/class156/Code08_ExclusiveOR.java +++ b/src/class156/Code08_ExclusiveOR.java @@ -50,37 +50,25 @@ public static int find(int i) { return father[i]; } - public static void union(int l, int r, int v) { + public static boolean opi(int l, int r, int v) { + cnti++; int lf = find(l), rf = find(r); - if (lf == n) { - lf = rf; - rf = n; - } - if (lf != rf) { - father[lf] = rf; - exclu[lf] = exclu[r] ^ exclu[l] ^ v; - } - } - - public static boolean check(int l, int r, int v) { - if (find(l) == find(r)) { + if (lf == rf) { if ((exclu[l] ^ exclu[r]) != v) { + conflict = true; return false; } + } else { + if (lf == n) { + lf = rf; + rf = n; + } + father[lf] = rf; + exclu[lf] = exclu[r] ^ exclu[l] ^ v; } return true; } - public static boolean opi(int l, int r, int v) { - cnti++; - if (!check(l, r, v)) { - conflict = true; - return false; - } - union(l, r, v); - return true; - } - public static int opq(int k) { int ans = 0, ci = 0, fa; for (int i = 1; i <= k; i++) { From 6564ad31dac7f7366330dbc765d5f0a88e900456 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 3 Jan 2025 12:34:13 +0800 Subject: [PATCH 0564/2029] modify code --- src/class156/Code01_DerivePartialSums.java | 7 +++++++ src/class156/Code02_CunningMerchant.java | 7 +++++++ src/class156/Code03_WrongAnswers.java | 7 +++++++ src/class156/Code04_LegendOfHeroes.java | 13 +++++++++++-- src/class156/Code05_EvaluateDivision.java | 9 +++++++++ src/class156/Code06_JudgeFoodChain.java | 12 ++++++++++++ 6 files changed, 53 insertions(+), 2 deletions(-) diff --git a/src/class156/Code01_DerivePartialSums.java b/src/class156/Code01_DerivePartialSums.java index 7cc8ba7e2..121de8b3d 100644 --- a/src/class156/Code01_DerivePartialSums.java +++ b/src/class156/Code01_DerivePartialSums.java @@ -1,6 +1,13 @@ package class156; // 推导部分和 +// 有n个数字,下标1 ~ n,但是并不知道每个数字是多少 +// 先给出m个数字段的累加和,再查询q个数字段的累加和 +// 给出数字段累加和的操作 l r v,代表l~r范围上的数字,累加和为v +// 查询数字段累加和的操作 l r,代表查询l~r范围上的数字累加和 +// 请根据m个给定,完成q个查询,如果某个查询无法给出答案,打印"UNKNOWN" +// 1 <= n, m, q <= 10^5 +// 累加和不会超过long类型范围 // 测试链接 : https://www.luogu.com.cn/problem/P8779 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class156/Code02_CunningMerchant.java b/src/class156/Code02_CunningMerchant.java index 1f4037bf1..25f64058f 100644 --- a/src/class156/Code02_CunningMerchant.java +++ b/src/class156/Code02_CunningMerchant.java @@ -1,6 +1,13 @@ package class156; // 狡猾的商人 +// 有n个月的收入,下标1 ~ n,但是并不知道每个月收入是多少 +// 操作 l r v,代表从第l个月到第r个月,总收入为v +// 一共给你m个操作,请判断给定的数据是自洽还是自相矛盾 +// 自洽打印true,自相矛盾打印false +// 1 <= n <= 100 +// 1 <= m <= 1000 +// 总收入不会超过int类型范围 // 测试链接 : https://www.luogu.com.cn/problem/P2294 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class156/Code03_WrongAnswers.java b/src/class156/Code03_WrongAnswers.java index 3da2a3637..a7c0c2637 100644 --- a/src/class156/Code03_WrongAnswers.java +++ b/src/class156/Code03_WrongAnswers.java @@ -1,6 +1,13 @@ package class156; // 错误答案数量 +// 有n个数字,下标1 ~ n,但是并不知道每个数字是多少 +// 操作 l r v,代表l~r范围上累加和为v +// 一共m个操作,如果某个操作和之前的操作信息自相矛盾,认为当前操作是错误的,不进行这个操作 +// 最后打印错误操作的数量 +// 1 <= n <= 200000 +// 1 <= m <= 40000 +// 累加和不会超过int类型范围 // 测试链接 : https://acm.hdu.edu.cn/showproblem.php?pid=3038 // 测试链接 : https://vjudge.net/problem/HDU-3038 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class156/Code04_LegendOfHeroes.java b/src/class156/Code04_LegendOfHeroes.java index 3c96f73ab..117f2c31e 100644 --- a/src/class156/Code04_LegendOfHeroes.java +++ b/src/class156/Code04_LegendOfHeroes.java @@ -1,6 +1,15 @@ package class156; // 银河英雄传说 +// 一共有30000搜战舰,编号1~30000,一开始每艘战舰各自成一队 +// 如果若干战舰变成一队,那么队伍里的所有战舰竖直地排成一列 +// 实现如下两种操作,操作一共调用t次 +// M l r : 合并l号战舰所在队伍和r号战舰所在队伍 +// l号战舰的队伍,整体移动到,r号战舰所在队伍的最末尾战舰的后面 +// 如果l号战舰和r号战舰已经是一队,不进行任何操作 +// C l r : 如果l号战舰和r号战舰不在一个队伍,打印-1 +// 如果l号战舰和r号战舰在一个队伍,打印它俩中间隔着几艘战舰 +// 1 <= t <= 5 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P1196 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -70,9 +79,9 @@ public static int query(int l, int r) { public static void main(String[] args) { prepare(); Kattio io = new Kattio(); - int m = io.nextInt(); + int t = io.nextInt(); String op; - for (int i = 1, l, r; i <= m; i++) { + for (int i = 1, l, r; i <= t; i++) { op = io.next(); l = io.nextInt(); r = io.nextInt(); diff --git a/src/class156/Code05_EvaluateDivision.java b/src/class156/Code05_EvaluateDivision.java index d5365e2f2..7e3f0d7c0 100644 --- a/src/class156/Code05_EvaluateDivision.java +++ b/src/class156/Code05_EvaluateDivision.java @@ -4,6 +4,15 @@ import java.util.List; // 除法求值 +// 所有变量都用字符串表示,并且给定若干组等式 +// 比如等式 +// ["ab", "ef"] = 8,代表ab / ef = 8 +// ["ct", "ef"] = 2,代表ct / ef = 2 +// 所有等式都是正确的并且可以进行推断,给定所有等式之后,会给你若干条查询 +// 比如查询,["ab", "ct"],根据上面的等式推断,ab / ct = 4 +// 如果某条查询中的变量,从来没在等式中出现过,认为答案是-1.0 +// 如果某条查询的答案根本推断不出来,认为答案是-1.0 +// 返回所有查询的答案 // 测试链接 : https://leetcode.cn/problems/evaluate-division/ public class Code05_EvaluateDivision { diff --git a/src/class156/Code06_JudgeFoodChain.java b/src/class156/Code06_JudgeFoodChain.java index a53101674..998c792eb 100644 --- a/src/class156/Code06_JudgeFoodChain.java +++ b/src/class156/Code06_JudgeFoodChain.java @@ -1,6 +1,18 @@ package class156; // 甄别食物链 +// 一共有n只动物,编号1 ~ n,每只动物的类别未知,但一定是A、B、C中的一种 +// 这三种类别是轮流捕食的关系,A吃B、B吃C、C吃A +// 一共有k句话,希望你判断哪些话是假话,每句话是如下两类句子中的一类 +// 1 X Y : 第X只动物和第Y只动物是同类 +// 2 X Y : 第X只动物吃第Y只动物 +// 假话的标准如下 +// 当前的话与前面的某些真话冲突,视为假话 +// 当前的话提到的X和Y,有任何一个大于n,视为假话 +// 当前的话如果关于吃,又有X==Y,视为假话 +// 返回k句话中,假话的数量 +// 1 <= n <= 5 * 10^4 +// 1 <= k <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P2024 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 From 905758749fe69161b1ec16afc375a1c6024b17c5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 3 Jan 2025 14:51:28 +0800 Subject: [PATCH 0565/2029] modify code --- src/class156/Code02_CunningMerchant.java | 3 +- src/class156/Code03_WrongAnswers.java | 3 +- src/class156/Code06_JudgeFoodChain.java | 3 +- src/class156/Code07_DetainCriminals.java | 6 + src/class156/Code08_Gangster.java | 133 ++++++++++++++++++ ...clusiveOR.java => Code09_ExclusiveOR.java} | 41 +++--- 6 files changed, 167 insertions(+), 22 deletions(-) create mode 100644 src/class156/Code08_Gangster.java rename src/class156/{Code08_ExclusiveOR.java => Code09_ExclusiveOR.java} (81%) diff --git a/src/class156/Code02_CunningMerchant.java b/src/class156/Code02_CunningMerchant.java index 25f64058f..171592321 100644 --- a/src/class156/Code02_CunningMerchant.java +++ b/src/class156/Code02_CunningMerchant.java @@ -5,8 +5,7 @@ // 操作 l r v,代表从第l个月到第r个月,总收入为v // 一共给你m个操作,请判断给定的数据是自洽还是自相矛盾 // 自洽打印true,自相矛盾打印false -// 1 <= n <= 100 -// 1 <= m <= 1000 +// 1 <= n <= 100 1 <= m <= 1000 // 总收入不会超过int类型范围 // 测试链接 : https://www.luogu.com.cn/problem/P2294 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class156/Code03_WrongAnswers.java b/src/class156/Code03_WrongAnswers.java index a7c0c2637..d1026aa49 100644 --- a/src/class156/Code03_WrongAnswers.java +++ b/src/class156/Code03_WrongAnswers.java @@ -5,8 +5,7 @@ // 操作 l r v,代表l~r范围上累加和为v // 一共m个操作,如果某个操作和之前的操作信息自相矛盾,认为当前操作是错误的,不进行这个操作 // 最后打印错误操作的数量 -// 1 <= n <= 200000 -// 1 <= m <= 40000 +// 1 <= n <= 200000 1 <= m <= 40000 // 累加和不会超过int类型范围 // 测试链接 : https://acm.hdu.edu.cn/showproblem.php?pid=3038 // 测试链接 : https://vjudge.net/problem/HDU-3038 diff --git a/src/class156/Code06_JudgeFoodChain.java b/src/class156/Code06_JudgeFoodChain.java index 998c792eb..c83586afa 100644 --- a/src/class156/Code06_JudgeFoodChain.java +++ b/src/class156/Code06_JudgeFoodChain.java @@ -11,8 +11,7 @@ // 当前的话提到的X和Y,有任何一个大于n,视为假话 // 当前的话如果关于吃,又有X==Y,视为假话 // 返回k句话中,假话的数量 -// 1 <= n <= 5 * 10^4 -// 1 <= k <= 10^5 +// 1 <= n <= 5 * 10^4 1 <= k <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P2024 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class156/Code07_DetainCriminals.java b/src/class156/Code07_DetainCriminals.java index a7c5031bb..a34e9616e 100644 --- a/src/class156/Code07_DetainCriminals.java +++ b/src/class156/Code07_DetainCriminals.java @@ -1,6 +1,12 @@ package class156; // 关押罪犯 +// 一共有n个犯人,编号1 ~ n,一共有两个监狱,你可以决定每个犯人去哪个监狱 +// 给定m条记录,每条记录 l r v,表示l号犯人和r号犯人的仇恨值 +// 每个监狱的暴力值 = 该监狱中仇恨最深的犯人之间的仇恨值 +// 冲突值 = max(第一座监狱的暴力值,第二座监狱的暴力值) +// 犯人的分配方案需要让这个冲突值最小,返回最小能是多少 +// 1 <= n <= 20000 1 <= m <= 100000 1 <= 仇恨值 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P1525 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class156/Code08_Gangster.java b/src/class156/Code08_Gangster.java new file mode 100644 index 000000000..99a42b6ca --- /dev/null +++ b/src/class156/Code08_Gangster.java @@ -0,0 +1,133 @@ +package class156; + +// 团伙 +// 注意洛谷关于本题的描述有问题,请按照如下的描述来理解题意 +// 一共有n个黑帮成员,编号1 ~ n,发现了m条事实,每条事实一定属于如下两种类型中的一种 +// F l r : l号成员和r号成员是朋友 +// E l r : l号成员和r号成员是敌人 +// 黑帮遵守如下的约定 +// 我的敌人的敌人一定是我的朋友 +// 彼此是朋友的成员一定来自一个黑帮 +// 彼此是敌人的成员一定不来自一个黑帮 +// 如果根据事实无法推断出一个成员有哪些朋友,那么该成员自己是一个黑帮 +// 输入数据不存在矛盾,也就是任何两人不会推出既是朋友又是敌人的结论 +// 遵守上面的约定,根据m条事实,计算黑帮有多少个 +// 1 <= n <= 1000 1 <= m <= 5000 +// 测试链接 : https://www.luogu.com.cn/problem/P1892 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.util.StringTokenizer; + +public class Code08_Gangster { + + public static int MAXN = 1001; + + public static int n, m; + + public static int[] father = new int[MAXN]; + + public static int[] enemy = new int[MAXN]; + + public static void prepare() { + for (int i = 1; i <= n; i++) { + father[i] = i; + enemy[i] = 0; + } + } + + public static int find(int i) { + father[i] = father[i] == i ? i : find(father[i]); + return father[i]; + } + + public static void union(int l, int r) { + father[find(l)] = find(r); + } + + public static void main(String[] args) throws IOException { + Kattio io = new Kattio(); + n = io.nextInt(); + m = io.nextInt(); + prepare(); + String op; + int l, r; + for (int i = 1; i <= m; i++) { + op = io.next(); + l = io.nextInt(); + r = io.nextInt(); + if (op.equals("F")) { + union(l, r); + } else { + if (enemy[l] == 0) { + enemy[l] = r; + } else { + union(enemy[l], r); + } + if (enemy[r] == 0) { + enemy[r] = l; + } else { + union(l, enemy[r]); + } + } + } + int ans = 0; + for (int i = 1; i <= n; i++) { + if (i == father[i]) { + ans++; + } + } + io.println(ans); + io.flush(); + io.close(); + } + + // 读写工具类 + public static class Kattio extends PrintWriter { + private BufferedReader r; + private StringTokenizer st; + + public Kattio() { + this(System.in, System.out); + } + + public Kattio(InputStream i, OutputStream o) { + super(o); + r = new BufferedReader(new InputStreamReader(i)); + } + + public Kattio(String intput, String output) throws IOException { + super(output); + r = new BufferedReader(new FileReader(intput)); + } + + public String next() { + try { + while (st == null || !st.hasMoreTokens()) + st = new StringTokenizer(r.readLine()); + return st.nextToken(); + } catch (Exception e) { + } + return null; + } + + public int nextInt() { + return Integer.parseInt(next()); + } + + public double nextDouble() { + return Double.parseDouble(next()); + } + + public long nextLong() { + return Long.parseLong(next()); + } + } + +} diff --git a/src/class156/Code08_ExclusiveOR.java b/src/class156/Code09_ExclusiveOR.java similarity index 81% rename from src/class156/Code08_ExclusiveOR.java rename to src/class156/Code09_ExclusiveOR.java index d740f1756..0e79be3c1 100644 --- a/src/class156/Code08_ExclusiveOR.java +++ b/src/class156/Code09_ExclusiveOR.java @@ -1,6 +1,15 @@ package class156; // 异或关系 +// 一共n个数,编号0 ~ n-1,实现如下三种类型的操作,一共调用m次 +// I x v : 声明 第x个数 = v +// I x y v : 声明 第x个数 ^ 第y个数 = v +// Q k a1 .. ak : 查询 一共k个数,编号为a1 .. ak,这些数字异或起来的值是多少 +// 对每个Q的操作打印答案,如果根据之前的声明无法推出答案,打印"I don't know." +// 如果处理到第s条声明,发现了矛盾,打印"The first s facts are conflicting." +// 注意只有声明操作出现,s才会增加,查询操作不占用声明操作的计数 +// 发现矛盾之后,所有的操作都不再处理,更多的细节可以打开测试链接查看题目 +// 1 <= n <= 20000 1 <= m <= 40000 1 <= k <= 15 // 测试链接 : https://acm.hdu.edu.cn/showproblem.php?pid=3234 // 测试链接 : https://www.luogu.com.cn/problem/UVA12232 // 测试链接 : https://vjudge.net/problem/UVA-12232 @@ -12,7 +21,7 @@ import java.io.PrintWriter; import java.util.Arrays; -public class Code08_ExclusiveOR { +public class Code09_ExclusiveOR { public static int MAXN = 20002; @@ -30,7 +39,7 @@ public class Code08_ExclusiveOR { public static int[] nums = new int[MAXK]; - public static int[] collect = new int[MAXK]; + public static int[] fas = new int[MAXK]; public static void prepare() { conflict = false; @@ -70,23 +79,19 @@ public static boolean opi(int l, int r, int v) { } public static int opq(int k) { - int ans = 0, ci = 0, fa; - for (int i = 1; i <= k; i++) { + int ans = 0; + for (int i = 1, fa; i <= k; i++) { fa = find(nums[i]); ans ^= exclu[nums[i]]; - collect[++ci] = fa; + fas[i] = fa; } - Arrays.sort(collect, 1, ci + 1); - for (int l = 1, r = 1; l <= ci; l = ++r) { - while (r + 1 <= ci && collect[r + 1] == collect[l]) { + Arrays.sort(fas, 1, k + 1); + for (int l = 1, r = 1; l <= k; l = ++r) { + while (r + 1 <= k && fas[r + 1] == fas[l]) { r++; } - if ((r - l + 1) % 2 != 0) { - if (collect[l] == n) { - ans ^= exclu[n]; - } else { - return -1; - } + if ((r - l + 1) % 2 != 0 && fas[l] != n) { + return -1; } } return ans; @@ -108,9 +113,13 @@ public static void main(String[] args) throws IOException { in.numbers(); if (!conflict) { if (in.size == 2) { - l = in.a; r = n; v = in.b; + l = in.a; + r = n; + v = in.b; } else { - l = in.a; r = in.b; v = in.c; + l = in.a; + r = in.b; + v = in.c; } if (!opi(l, r, v)) { out.println("The first " + cnti + " facts are conflicting."); From f2bc94a040132e63c01914d30e048e57ecce7932 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 3 Jan 2025 15:16:22 +0800 Subject: [PATCH 0566/2029] modify code --- src/class156/Code01_DerivePartialSums.java | 2 +- src/class156/Code02_CunningMerchant.java | 2 +- src/class156/Code03_WrongAnswers.java | 2 +- src/class156/Code06_JudgeFoodChain.java | 4 +--- src/class156/Code08_Gangster.java | 5 +---- 5 files changed, 5 insertions(+), 10 deletions(-) diff --git a/src/class156/Code01_DerivePartialSums.java b/src/class156/Code01_DerivePartialSums.java index 121de8b3d..db34f2966 100644 --- a/src/class156/Code01_DerivePartialSums.java +++ b/src/class156/Code01_DerivePartialSums.java @@ -1,6 +1,6 @@ package class156; -// 推导部分和 +// 推导部分和,带权并查集模版题1 // 有n个数字,下标1 ~ n,但是并不知道每个数字是多少 // 先给出m个数字段的累加和,再查询q个数字段的累加和 // 给出数字段累加和的操作 l r v,代表l~r范围上的数字,累加和为v diff --git a/src/class156/Code02_CunningMerchant.java b/src/class156/Code02_CunningMerchant.java index 171592321..17b13643d 100644 --- a/src/class156/Code02_CunningMerchant.java +++ b/src/class156/Code02_CunningMerchant.java @@ -1,6 +1,6 @@ package class156; -// 狡猾的商人 +// 狡猾的商人,带权并查集模版题2 // 有n个月的收入,下标1 ~ n,但是并不知道每个月收入是多少 // 操作 l r v,代表从第l个月到第r个月,总收入为v // 一共给你m个操作,请判断给定的数据是自洽还是自相矛盾 diff --git a/src/class156/Code03_WrongAnswers.java b/src/class156/Code03_WrongAnswers.java index d1026aa49..c6d1c0957 100644 --- a/src/class156/Code03_WrongAnswers.java +++ b/src/class156/Code03_WrongAnswers.java @@ -1,6 +1,6 @@ package class156; -// 错误答案数量 +// 错误答案数量,带权并查集模版题3 // 有n个数字,下标1 ~ n,但是并不知道每个数字是多少 // 操作 l r v,代表l~r范围上累加和为v // 一共m个操作,如果某个操作和之前的操作信息自相矛盾,认为当前操作是错误的,不进行这个操作 diff --git a/src/class156/Code06_JudgeFoodChain.java b/src/class156/Code06_JudgeFoodChain.java index c83586afa..866c9eeb7 100644 --- a/src/class156/Code06_JudgeFoodChain.java +++ b/src/class156/Code06_JudgeFoodChain.java @@ -1,12 +1,10 @@ package class156; // 甄别食物链 -// 一共有n只动物,编号1 ~ n,每只动物的类别未知,但一定是A、B、C中的一种 -// 这三种类别是轮流捕食的关系,A吃B、B吃C、C吃A +// 一共有n只动物,编号1 ~ n,每只动物都是A、B、C中的一种,A吃B、B吃C、C吃A // 一共有k句话,希望你判断哪些话是假话,每句话是如下两类句子中的一类 // 1 X Y : 第X只动物和第Y只动物是同类 // 2 X Y : 第X只动物吃第Y只动物 -// 假话的标准如下 // 当前的话与前面的某些真话冲突,视为假话 // 当前的话提到的X和Y,有任何一个大于n,视为假话 // 当前的话如果关于吃,又有X==Y,视为假话 diff --git a/src/class156/Code08_Gangster.java b/src/class156/Code08_Gangster.java index 99a42b6ca..5bbf71528 100644 --- a/src/class156/Code08_Gangster.java +++ b/src/class156/Code08_Gangster.java @@ -5,10 +5,7 @@ // 一共有n个黑帮成员,编号1 ~ n,发现了m条事实,每条事实一定属于如下两种类型中的一种 // F l r : l号成员和r号成员是朋友 // E l r : l号成员和r号成员是敌人 -// 黑帮遵守如下的约定 -// 我的敌人的敌人一定是我的朋友 -// 彼此是朋友的成员一定来自一个黑帮 -// 彼此是敌人的成员一定不来自一个黑帮 +// 黑帮遵守如下的约定,敌人的敌人一定是朋友,朋友都来自同一个黑帮,敌人一定不是同一个黑帮 // 如果根据事实无法推断出一个成员有哪些朋友,那么该成员自己是一个黑帮 // 输入数据不存在矛盾,也就是任何两人不会推出既是朋友又是敌人的结论 // 遵守上面的约定,根据m条事实,计算黑帮有多少个 From eaf4011eaff933639945f6f5001b0bcc51cb3f5d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 3 Jan 2025 21:22:46 +0800 Subject: [PATCH 0567/2029] modify code --- src/class156/Code06_JudgeFoodChain.java | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/class156/Code06_JudgeFoodChain.java b/src/class156/Code06_JudgeFoodChain.java index 866c9eeb7..f9685b8d7 100644 --- a/src/class156/Code06_JudgeFoodChain.java +++ b/src/class156/Code06_JudgeFoodChain.java @@ -28,13 +28,16 @@ public class Code06_JudgeFoodChain { public static int[] father = new int[MAXN]; - public static int[] relation = new int[MAXN]; + // dist[i] = 0,代表i和头是同类 + // dist[i] = 1,代表i吃头 + // dist[i] = 2,代表i被头吃 + public static int[] dist = new int[MAXN]; public static void prepare() { ans = 0; for (int i = 1; i <= n; i++) { father[i] = i; - relation[i] = 0; + dist[i] = 0; } } @@ -42,16 +45,18 @@ public static int find(int i) { if (i != father[i]) { int tmp = father[i]; father[i] = find(tmp); - relation[i] = (relation[i] + relation[tmp]) % 3; + dist[i] = (dist[i] + dist[tmp]) % 3; } return father[i]; } + // op == 1, 1 l r,l和r是同类 + // op == 2, 2 l r,l吃r public static void union(int op, int l, int r) { int lf = find(l), rf = find(r), v = op == 1 ? 0 : 1; if (lf != rf) { father[lf] = rf; - relation[lf] = (relation[r] - relation[l] + v + 3) % 3; + dist[lf] = (dist[r] - dist[l] + v + 3) % 3; } } @@ -61,11 +66,11 @@ public static boolean check(int op, int l, int r) { } if (find(l) == find(r)) { if (op == 1) { - if (relation[l] != relation[r]) { + if (dist[l] != dist[r]) { return false; } } else { - if ((relation[l] - relation[r] + 3) % 3 != 1) { + if ((dist[l] - dist[r] + 3) % 3 != 1) { return false; } } From 9d77b9b7beb27beece9cccc5b2dd05dde77085f2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 3 Jan 2025 23:24:52 +0800 Subject: [PATCH 0568/2029] modify code --- ...51\345\261\225\351\242\230\347\233\256.pptx" | Bin 0 -> 56553 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "ppt/\347\256\227\346\263\225\350\256\262\350\247\243156\343\200\220\346\214\272\351\232\276\343\200\221\345\270\246\346\235\203\345\271\266\346\237\245\351\233\206\347\232\204\345\216\237\347\220\206\345\222\214\346\211\251\345\261\225\351\242\230\347\233\256.pptx" diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243156\343\200\220\346\214\272\351\232\276\343\200\221\345\270\246\346\235\203\345\271\266\346\237\245\351\233\206\347\232\204\345\216\237\347\220\206\345\222\214\346\211\251\345\261\225\351\242\230\347\233\256.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243156\343\200\220\346\214\272\351\232\276\343\200\221\345\270\246\346\235\203\345\271\266\346\237\245\351\233\206\347\232\204\345\216\237\347\220\206\345\222\214\346\211\251\345\261\225\351\242\230\347\233\256.pptx" new file mode 100644 index 0000000000000000000000000000000000000000..85e5b81674a1e2e479f46b210e1eff0e3ab55dd4 GIT binary patch literal 56553 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%0ABoXk#4(_JV1&VcZFkDg%*Ou zybKESmwRs!F)ZiL9=1h*g<;edlT71q*cC${ERsXyo-3F4P}X>aSd>} zw;X52B5-e8h87qBfuWR|OHt-Af0v3UHbKERR_??7-F5pumy3HjDDn3nXGQr&J zb%65jVg{GALXbo_&yLe-$_sBRd*FrAwnwBja-=n)`lsyIbO%;Wvu}7m#6!cIab&Pa z;x$R0cbsi-L(BGV1gS?r&-EgZ#d-0}5{;f$%GN(AGJTdu`7)x`QnHR@QQC?3FoHD6 z3UX4c<*s}nFxTS=s0TzlP&XvhX=ZO7+A^H&U;?L^Z2|=MKoaS`o-*A1~Lya zr@j7wdj?cS1Khm(Y*9{63gF1mM0})X3hBwu7Ct=K=n^L`kws|pqo)?7rg9UI`wLH? zvhHgcfw5)hOUDXxLu3D9!z;@GlDIViudSt3lW6%wZu$h`gx2G6X@U>$;lR7Nuh>zXOtDtTfEnl#8uN zqtxR|UKlkzzpJi&mmfy65S&!qUzwAu;LuFn(;rPzfs~N+j1g#PIG*m@di;Gi53hP_ z@LFH3*gqdjB*2IJ(>}qrCL?5s@I0>87Zcc58TC3)8Q!<(C;fssf#;_zp;@# zfHdVUX=L_P!?xZbXPxWtlN5uQHoB<`b#n+?Vl|13&>jN7GJsmS7mADz8Xf7-XUByG zBH>SFgb%9~E$dI#6~`Pcs}+s^_cJbYE*8jW5QzZ*iwzeG_}`!Cj-9EP#!euz4*(o9 zhYc+D9%q+TW#}A&(yW{&%OHuF;~!b0q2OU)TA+N9-zdSQGGgss>YZDgQtaq#+PpfP zul?rOG2QnP)A{np3OY#UCWWl#7KPBCC&HjFWADS0f<=VXVA-CVFhR%P$WTh4qdyJ+ ze>wn>AXY)fe@qm)lMB*YJ%^j`ZGG;%ZGEn|kmIw1W4sVpQf+!0Z3$n$fabm0dlg`L zN)3%`yiB_h)63t5BDdG10DJqMQ{Zb8QXcF1oJ@y`dK(SpuIfNL+Y z`_ilq_7~NkPsx7KdOrVBL%|CR5Sslczt2_=zW9CI3?}qy73rJ3iN-Xv5tiKwVhRyYWE5)xX$2-*30_mMzlax6ll~dnr^C4kK zDa|dhlxo6uLd&|?(aaJI!MyNBtjM>LHn_PY+zg5<@Hbq@3dJd^@p%2;Y|;-%?t}02t0>lPp@Cn9Ga) zkdrp6vCzSV4fH18ZDi1I&sovXZYZj5p5P<40}|@BctggFM`;^jN7L%dyfIWI4ps7s6-nWe}i;19hOYvoAb` z0dl18gQ1UlxLy@_KNLiT5(bWtuLM60e18eDu%R)ubV`@fF3(*{j1{j}oz@E*pc3N~ zpqA@L`>OaV-8Y9cSe-0c%$lx>#vo)U-RqC+w2q? z5tp}&n~TeB+?%2(E-_4cc+G>sM-dg?Y}2p_2lpdVLU~ZQfLUf+qmw#{C&ur`jo(`i z>&ZsjnhWPFXDRgx=yRE(oHd_z0J6$3jDBF zhmgJFjV8VHfJ6n`od;azH)X^N80%XjEhG;=JKuccl5T+n!@r7Sd;~6)+?eh%rTDC4 z*3@NQ-yApaIEFNIdC!8!sAYm&eu0E21nc<;D$lFg^V?Wc%_O?~#HKyi zXe&VkGMGyc(f8=>1;!)M^@6u35K)#r{JfDob+Sj(oh$qRtDD-T*FK?d+B$)}+Zx|j zHV4r0GRw~r7>lyG&r7INh!=y;%6~Ma`oj8^lV`ko!D&HsM(os~jc(gV} z=qL9hvu6lbZayJVOz%$v!G?imn{02+%8}Fib3p;5jf0Dhf1!kz0s6PHj~XN8MKe6I3lYpq0KdvK#E_}kP+~OAkL)p&6f(Y9ref(psXAN#d(8M;@@wG2E z9n8!+442<*u&#T4M7rVQYJm$;wX?`OHN_;ap*~eu+BJph&|7ej!~q?`defZ%%t^bE zYUIb@E!QdDb)?CxmY6}_Fj3a}zo0RHAslkZvQQ&AC?LjOeYzxS_(@52b-Fj3Gb%u< zp%vLvDv4v%9bUxjl;vD*CyU5{(bbY)tlI5>zjq@71 zwmTdsz8lIYo`-2%lChJbaymU0BY%m&_(6DR@C`j)NJ zDFu(ABS;VM#yM}|(C^-QgXhiV@=M%V9WKKTh?jTUic(j?ZcfGr6_33EKKFW&s=7Kr zo{kw9lqlTzFl9@Ifr`>=AWM#XQx;+*L$k4HZ+V*wyi|ujm0D}ZLH}nm)g5Q|M|58O z&!y>lm)`y6x!P2~1yPZ@lCq%V_OL?tPe59GqiGS6>Vsg2K$DB0&C4#tQpaHo{p0xb z+6j@Lc$fa|pAmeh4*RC@po@WikFp5`j!1KtzJq1FRMGxY z8*WRm(KYWc2!`QF6-xuG`sgb~st zY+zY7a5BcJUbPF8>^K_*aqF$!M=su#Ih71ec*(VuP zR_bAg6km8$s`Ae4QiPZ|P7h2StT+5(Kc_}_euT%SiwoR+0RfhDfPGR>BU)ToY`-wB z^fk8jIhyTN!cJ(=cpT$~UV&|%5gd{qgwKhgs~MJ(IlIS*t3vo)JLgwCLglcaMrg!1 zAmpg<2#6Zr{z^*(?T}<#$z#8u1G`@%ZMwUL@b{x924JH2BHQmSpxtSYwpGA|SEyNoKKC%U!r^y< zvOhrGzVhv=CVAZpLdyWcaa;WIt{&OagRydVU+A$-^su96$TOp7*nWs_4YJ7tBLp%S zSS6*vR|&Z!np&O8Rx&+ojx8TkLQm@VhEBI0R$XD8Ds1K4C^uDr;;L$yYwCf8ne&kE z!ugwte3y1HC(EFYc^{-$&uKrOn5l8WvRHuKKDjaHyNWkT)+NGr4Tolgt?F!dP5p7C7|Lh{An57?& zJeusxm`6=fXN1GPiRH-1TI;k=Zw9znzp#ho2#o*&!*=xDkp#(eJ*3X5CVq}02hMr; zJ?<0WMbLJB^U{*ZVhhFY4O5mJ9;l$J0W+ljOf4dMR!%dhP(st`=7iKZf>yEGbrbwK zn8E?q=MCMbMK2krr9d+ZHEsb$0wZBWTQNblZedZmj5#`p#i;ICr)Sbd$_BF>^-x0K zN4Lp9ah8=woZ_m6xlu0tgWgW?Dl41A?gVH~*2)(J$v!N&RKGSR#tO->yY2iO3T+iG zVidY|6B;@Q-)}!&;r1aD(REa3U|<_|VUAFjymzg;_g4?sZTImLnz_1`?N?26QJu^>VHSJ4nP+%IFqRuUF?g+-0fQrT#MQ@$go{rLu=|iDesP`xvD8qB19e z9@s$4$pl-vDh3l!h%zP$;=rGA?xki-e(=P@LW)K@5#X1f=AOpGgR#_1qgg7`;k^r^ zLXsR}+EHFfuG$sR@-oGEVA>RP(`O$Zz7dI8{Lt9+-3_U}$k+}s`iNdbsi8cX8~`J1 zz4i#4oWfeuYJCqBxRtxM(l_l%I>n7}%6B}dpUie8wj|ehSi`pa)Ia&Q)p9RSF9+$( z11m=N>8)h#RD?h8b_heEu_Aj}jE$Y~+G}qUW;0qJX{(q-`!_FAL4exG4UQcZO5-9b z2r`#`&vT!kF|COch-vJ?8$h)2jdfqYuZsd2=V2jQIix}fp>?2J#2Q1YhB=w&x>N7l zTgMKK=3X9&0YX)a8=wybn0OLv za7>afc1fE7f1|Y&qAAzen&em2lxsA$mSE{8@%%!vqp41o$ao8Jv^J56a_niE!Z&QU z1%YS>Q3;rOJax&1;YK%PgiE~1QI8=#RS<2beqp)_sU#Gi>kfT3%o9rO@WihEww397 zfLypO)(%8A-jPS7Zk0RdDH0GO0jQJks*^mW^rT==@H5;rvg;K)+RHO5%7x7w(@}Lh zNrxOrA=-=e%=awipcsIB7HmP+*90Dr{WMKg)1R$=fg<{zkNf{p z^!|TG>>qgf4@4|lagl}MM}46Eqx}D;yY>Hy{QoHY|9!*uSBRZg8+BaaKwmqcW72V^ z3d}1qBQqmy9(Eq6X3u{DMS)F8-&O_5$#>?Stvm|ZlW_zEq9sz7?-|FrlYnjVLEr1( z_uTK55||a`EGH<91su{MpkSno$y_nP`|7tJMFpz=V$>@sHhg4Q8Z8&|M=_N)6*4SO z{c2qk;P|y7F9&ShCU3v5M@3*$Ctku}8)488(3hS-YJT}dv%ACdm42Q^GNJ{3bi1CqS-UORXjmzUObD>4mT!XoD%$jfGu{}fXyqNMNGDf} z7j|5(R;*glp6)x~S9$5bQlY<4etzgx(rn6)P>Pjq>GWFl4qUL}^E3Qc4ht-Kuebgm5+ z?rS$E8KyTEK$=MSqchbfzLa6~Z`q?P6oftJy0b)nvB8vxS40nv@}qn;X5(j{ZsZ~9 z^TmJ~;lLLA^x)k3X)U9SCq7>JZYNxnMm{@f$9+@9%U@D; zA4=S0bSx*FiCX6H4L4&glxwZ7dSR~GX7TFGGp$4a%$~0;KBoci^bL=^p~8+xvZrv$ zTG325hR3qQdU`=t|6(T3r8qE4TT3zc9P;&YvU8HD$gyGuSP=Kev~e4=3Sb*SkB_edU!s^OyZ$ zIlDUdwF|i(@}nq;UJpCo^GWF8v@3hImPZ}{bs!LCD!5Ze$J-j&eogjahWRzR=y}9y zx8p?PfnpCgiTf5CEH4#Cxuv1RW-xOZg62`O9+-cThvXBhNSrjwD@b06SvK|t@Qn-M zzkTYL_}>PEe^}~&AgzKpX226aTIDZ4uFn1)t=RvHR_&@XwjZ6vYX|5M_eigCHvOUa zqVn-_{7~tH{@I6;)P58+Vz!FJg-6|B`-p1~f*&=l~kx!y83mV|3>Fe3ED2EU!kXW|8~I;#_iWC7;^T4;#DY0mW9C-_8S8gP z8kpv`raCZZF~u#6?22}~7}1Jos;34WJ}6~WE(42D(C=lqG+^e5C|^wdC|m=lvVH$yL~ z|CR)3ZVXt?J&3tF@7&#xKDWu7i?s63XP|)MYc{1r?o{?_gSX7)FElGR>Xl5Kx6U{B zLg)osdiU0iong|bnZpuJU7cu8vsdcl{#mKzh#f`l=!%_TXU{uu+l*#l(}30FX7_f^ znzPXO3v9m86H;jit^2N_0)w#RBhIh9b0z%ZfgW^UG`CMLi_OKm@bl7`h7Yz9g^CmO zg*Xs^Qp_@9eb+*l=abZ*FHrwmi~r+o{|~hI#qWq^;2$ZV3F5!Ec#gla_`juqAN4q& zjY{I%sX{=DMv}2xhS;ey7GzDBVk?oLj0$-|Bk-0%?3=HgK$-pw3B}`#ORZEa!!fj% z=mdh<1U};6g@84Vm{pE5!^0vxBRDc@W<<_DveCss|DfK!Pm|}pUNjqn?Uj5P0vLRS zg!`%Lz);-9NgFA`i3|yBNV^hsFd}aWbfWNIHro9fTF7eC978VkaPbr8tn>xsp1DCkNQ5kxrEYe}Qo*)(@7H~XNv%v8 zAg!C6NF}b#2rVD?`I+~csHz>2PwfiwwzK%`@*N}V;+x%63`iN=$&oZ(x2ZIfg%*|X zLB9Z!%+EpU$N*y$wk3&IHeAYS8ogdN0w|$~-YTNPB^qpZ@6MqlDq-CYSP z?dmO5crdWyZOLlFuy{%>oFK>#V{~HL-D87A47RTVxqUSV`I;1pIh<;9`-ZJ>wN!A_ z8Y{fn88;amz6y;%>P>)-(Bm%VWq|%1U4_%yuU*YzFYuQ(5U|M{#Qmh?+9GIQxKd2u znq2z0^Yw&tJ7cpi%>L;M%3_U23NZ|pu$Sm37cwFfvbE$~KEmeflv3r-n(#ZPxK>BR z=UI0=p8P^HuQFzGQw*A)!q2%LPhtf0hiBntYbcIZoYmo< zXpQZpWjdeOxw>kbpC|ZdJ?~d`tbJ{_I3~#uoBP+~&tO@IJ)7@SVwiTb`#ZDJtL2Mm zreVnmVEcAe+&mH9?bz?Ajuc}#9BUgj#@u04S8|LQdiP$v#L-@wsj{A$3qKLIV>E#U zoSk0JV<2cq&3r;m?@XOf<5MSDxyP(Y_g2YdPP12Y3{pHAoF&j0_9aZe>IvRkI}s-d z7V;NSD8$Yv-(K4)D9A@8w@7r#3hO5PxY}@^-(}P<-u~Bo{evz4fqa#B`Ob9k5mA+Y z^jH78h>G*C_*$>J;<(I&^3j!Kek;F=H^9W4BA9whf>n@5lr`jdT5M7bw9m?T^P+eZ zmi&PPx< zPsel@lO=mE4SgLZYY;jOb?>^7Eim@4&U8#c4fLe;2DO>&i?l=tlYQw1`p_0U0)%>UtSrvk1OC2Ro6jljxXcD=!bWKsuVNe$ zjkvKKQol8oc=5Y|+c&6e$3*^md~+q1XNf&@Q)w-ZP z-Y&T2LB$#G#C?e8fuoRwlMurGaapLiJ6Iqj!BqL>j55jSYr*gDYKZd`-J6-V)J?gX z&4w9T-nh|4v-XyQ@}N0-;qcJk4i%d01t#|0_is-gzq!#1@o33l+K#+BD_#tAy0c*O zY9``9-sAli-4oE9q1WxTjM*H7lDT;jQC{IbBrCXmG3R!vxD{cJ8xNZ!v?*f&eiYEt9f=_DGgLy8Gyw#-c9bXbi1U-TK~2HP!7CcyPW#KqFE#6Iz%C%(A0PY>LndFHbI_9GCHX@4H za7BMx29dx#y#fcqMTjcjJcWxnNXdLnIB21_P%=Rh6MbfoQ8hfsRMT!HdsH&8CfC}4 z$-Mkth2(Z83@|ZO#FGG7iCRG5kXQ2;XcBNHO|^9t8q>aU;9#E0sAd0R?(CkMUZ+^# zWuvu9R4o_bCQ)YS269SZslndOSNKVk;Ab8!>*=ENX%UW>gpH}SQRoGBDko!0pEh!# zpkqf;c-(h`pwb0GSEMSxHr`BlyF>W_+uj+cz@Z^%4;)X$&1PGf#TyCVT?y#A=>+&< zTPCt-)UU+$CH~X7PiiFtb*$Bj!yJ^oEGxL9iM}heITjSEISm*M@U}!}(NX#t_dwIw z#D1)C8qAKs@4BdZpT!OdlSnly=h8|I1Ah6uqX#ltkvs2zN7*Rf|B_+DhwL?HdC?5Z zi6aU+7buBUZZBkkdIMZKe=2#ssBp2D$Tp_xkJj2T_j;I>8XK*ooVlr=>{>K`i*g?{pS69ujp43R zb&5M89@u$Bm79xNHM(((a2>xr&^;z_Jz7gGb53s0m$*}y)01eu{e}4Wv*SVs8AjyZ z3Xn4SlH$h>v!9$RwEOf%j6hi{gdJ^a^v<0Q(LK*uWmKRn%+C4X=(y!O)MbjcG^e@^ zzI|W6CwV%Qs*S-pTfw}RX0Gt9h<;r5-1O0kirOqj!(MHfxeYG|XjKDY)+MCLS2=Qf z^X9qu8pb8?i1fcD&L7tHA4nX1OPIlo58@#GUv#x`{S|TkPgfgE2hUTZajrBf&q|J9 zDt6*MNS&xePdKT}O!(SIk47!@N_;{dxs1h}b^2OPC{Y;+*M@yZ3Tm;(tLYbM1*6Y! zTK!X8wIp4t(zQ7)QCmMx8slL)xcu%?$Hh`~v%%M-vQQF#Bqew!+r+p?gR2zEa{%gR5`B{pY ztxGi7C;0L{iCyZUbhX4%@H@_e5Z}YM{2Gfvzl-0~okIlMm85qQR;t-fU|KrXCg{RF zXB-IJYWmGqg_jylFj42t$W*}!Pq1Q(!_$EU`0cZ9KG76=!9*bl&%6srRG7?tk{%MT zS7z1=Tc8?e;V~bN@=RsR@t`p#MW)~YH+@^i*y-dY5|>L$G6i3^Hac~4E&q%dLvHk2 zgax=Jo|%q()hvMrYbat*V zRR}mgzBN>!mj}C}E;n}>#1-8Q2Zm|^5;d8rd#iYwXg`Z1`1mqNNl?BP3cYSV+Fa4x zU5OvVWcC1<9gi*z?wWkL{@N*U@}zw}^jDoFoc!6FB3FaO1oNIK%B?n=9_O|HIGNb8 z>a1VIY|7evaj-v~&JNnD%EM1PKY?5&IS2k)4!_~iH?Q!Xu+vW`!o~geXb=LGh-59f zymOihi5T=f6@ecc~c{~t&`-q+kiuMhHhf3!r9{`0ube{)~Q z%=B02J5!f&{AlR?D1lR-n_N&bb`V73@dgV0N*pF*G(a|?420HlzcdBoWma3YY#?KqA_*7 zN8_!BjzOu8Z%1ReOcj?WzN}I@B3<-34M33=E1JR<&8LF)+DVZzULzBbb1R0cWjKt% zcni5-H$LTI#3E{_9lQ=-19STsq-6ICr=$fbr?{4LTh(WQn(*a*87KOWp#^^uOLx57 z$iwk}`P`_iU1ysqu*SrA-TPJao``Vwyk#=Wr``AOh`m%SXWQXr4`+uP$W zp)3>7cJ1qoM87Eu0kNf)cZ0=&bGv;MMO_HWM({wi;(0X-`CmZg>=lTrQIMEYrCv-i z2LMipo;PSBb6kExK{bz8@4{Wb_Vjd?L{^*QT1OG5QA$&~fUBKQJL5Cbfpy*GVqrvKtKI@p_J=8)8` z=_@`um=h86Ci3B>IN-+D!VX78VobZ26?ql$S^cG!IIyAjVS^s(gLdnKZq*?cIdQ8_ z7T$8r(p>mf3Mw4IY#VRC4XM{#nbI@Uzr(yXi_NeN*-T=-w+Qg4Gv1Z?1Tao?Ffp_w zKJ%rOB^|M}_vBMU0mQK+D60$oqh;ZH4o8+ZXfdT;adEKeYg zBz*Ho*zMTt0J{hq?Hjc{ONzygdh)vOV@?EGXqo$arpLY=?fB&9&o`VGeWDmg82p#z zt{{pfu$e6>3tt0bNpVaxG8}|t9vb$6hKM4~LdAV<24NT(!~oE9HPRyZgOR^8J9iOke_8v#qc#?Tbz#k7FW<+;fLY0nd8)QGpMJ z31EKs&zb78F@aMtz)K;NOHs*u0i_9iGFe@zGnO6LbzK_WVh-8`I@M?6p#tb!3wKa2 z9bjbdy0$7mx-{cmc9z;YMh7fP@AXK9xL!f*wpw35R5Wx>{;QSZXGrD%G-IK<+TQ*- zIo{sv>-iZ^kyyrt zYUVHU06jEAbm(;}1GGBX;C9&oU+fMz%HAZY#nC>Zfwx0d1z2rbMS(*OX%?K>Ru`pG`eoy`-!MtyUj0s2GOeXTGnVX(vYYX!IRizcnt;giv! zRSWnMK^b?T874Wj<2z<$(tWUtG1z5ql-bbxdIq$-1{UFb{wLR!oiWdEWpb%yx|kl) z87B5BJ?1s(x;mx-Ci8KAMkp}dzk$~=O zc;v(OnBS9!siPU+Tw}(F$tmnb1foA%u9&O1EOR)2jFa?_PdFMkQ2bn>F>HC1u2%)k zMN6jTlv!R?m2W43@s-HmY;HHjXN3J*zpL^h_>ryN?yiiN20o+3f!*8x5ZwJ=GVl-c z{|{u~?vf4r@dpEGKK}LJzh&TGjvt(na}r-EE^|1vs*3@L5`GQud&a z15u}tjqYS6_(ee<33o$Fbm=A9fKw~3O137WZB7WshK4avDFsv;wWiA1wN2!v9k zeN5|PWF#WJL|qN^kr%k|C6r5z{9)O(%p6{x;oK8nxf%+i1w^GGhW{Rv=&%wZ5rPM! zqXgq%jW_M88zs?A2U*WVE}SpsXBln21RD}#5(ycRrhg_z@bmqDY(8f5;WTkP^=%eV+<8J8LJm1E!4vZ!zk%08?r(KpHFR%1@BQ6Yx}8 zB?@YI6L$IDTiM}$*rh+Jkg1u&VO&(EEexeqETlrK>09*9eR}sVp1T2yI`3QsGoLR0 zEDk*OOXNyDfr&2ymy@$D$xu@+d_H$+aJBFh&(W=tIndYGg{cfbMdx1kdXdUNE*|BG z`9O_em)$0+EMht#(Si?pNP>^Zn}&Q-%GEjxur&W9jQE+?G#%zp+VPv%Gnp`B+B4V{ z08BPx*m5NDkvy%dSCNQ$EV3#$0IY!@GNxM(K z$87E$%r6q71D;hZo8$X$F3If6*B%O=JP=o4pN}~Z;>O$3ZX2L?pYClFAS{|-?N5*) zv~Q8`C*13wP1*1j6z0DJUv@q|W2!#4&3LXZ%-W)C{QX|#z%L76KkQ&>&UJD-{ZthV z10w|a7pIB4@?Ct;;M;}P&W_p=vSw9Pv`27*T*MY$r7<(7-dnurLMEr$MfF}kKvuJ! z2_rjPw!5PGNL!zl)|J8H=iSaDYRzE$QWjt>Q(Hr|@f$PEJ&%-CJhhIRCmM43Pr)EU#`1gNtPzSrs`d3b zI=r7QF^_5;^3XAMBa-@mvSi(Qbfza&J;-HKu{0`80L|S35Nz(37N<=Bc|E@w#qKJj z&}f~sAPu-V%2e=g&n&a4Z;!HZk@O!TC5>lNOkhkWjEWrUm@?r54Xw+5DNi=iB?%e7fa*VU)kIr6 z8Btqmf7BAo@BafMn8yzf#%bE!X9Jr+y<`L22#bY+Gy)sivUIF4QOg;yexE`%J5cnh ztt4Llm#@+9unT)7FXr@D**XuiJF%_g$%DOz!R*%GyAPGg-$HxB@1!=oIjy(C`I)zp zgkHE6{2!pdxgBkH^^ZMm=Cq?6I?cAf*!MD5X=POt?*Z-qlGRqsS`V=;+)? zs+Fh)IyY6$nVoOv0n6s*H&cX8zM2@!#9Krpt%`4~oa|avC%xF&{%l2un00{lch}yw zqGITV2wcE>BpV>m*!009F_9(^$|Ho0%?9@aV}$huzarY9gsv?QA{y^Km^=T_0_vkU4-x7bo&N{b}cRB{|1IZrBObsl4S1LVK1tbtCKRe^udV}Z=`@9oDl zTNFmW+$bJfEUCp_Jn?f0sJ1+S^>qS0zL>i#wiLRc$0aC>vccHcYs^DjPAKJNdmZ%| ziagDnEKR6w_|2xFBoR*#Gk1i*76!yR#1&IVDOx0IpCy70;H*n)Zp~gG%On5dC5Oh% zS(s`vA<+}CP1_iG|K>Xm<;iop*h9y`FZ7J@{kP#(%P%z+OfB^qDv=&F+c6z(1x)If zqS!6@pKiIH5mNw7T1Ys(#X}I(p ztUNC12vy>+tS@Z~JZjXeK@Ux6?+!*c(L+{rb0m1N!TQ#(#10``_BbZ*Hak z-2Ccc0Dtu`{^f=Bmqq*vMGLF1BF4w2w(hfC2?7L-pkx`}lIiSf?#w$t9BY3nf?FeG zwaKT4F$tM2za~=zT+OBXPzqX-pNYhSNxF>9{)@MKjF>^Vzb{5g?RMM6UD|5s_a-!%k~zK) zQlD$lX2srQwMMlI!2XDCOtez8Uskdwa~_?ZD^#KLP$1a9a;!{|R)!`TP?CI+_cti#?vM#>R2Nl=Wub9!bJ z3h~y0iqqwqFri!xrfK12c-5WOY5%t`kN>T;c*mzeD}t}fW8kYO`!6q#zwE_lD2#oz zxc+#HhjZ1>yLp?QE(JB!{6;764j55&FjXZ=tT);5<+3BzLPrf*f+f-3VQPj;Sh=&! zN&snLT&2<=bg=J7XmURJk!@P;Czd3t`az0?$4W4(dz za?Y$ouU1YtE^MMvm>vH^Hz7GET127BcWT)nmZfb)S?f`y&qg`Mh%S^=R@Ly1Pw)KIi#_9oW=@VJ6brg4M3? zr^zec_17*snmA2(W<7O~AnDHJPw9&n0hl9i;x!ChZ-5kmIkSv2%p9_%w~Nmhj!(mk0^kE64;yysO44lUTyNPDg29xM_x zG}g}zDL|+5`wy|gG0Mr^1)WCsW-NECfot3p$vWQHbtCQFAp`cb3eUVe`f35+#>!|J zUN3q}kAb4X9t(NUQ}SEBJ9R9^&}omc@3WmYYxD9@(dhV8k5gq{iAz7hDjvpv4fKVv zcY>Gkmg}&EifGYLNO8Bl_8EWX4NUwe4XFR3eE)B)se`<1GXQ`24eY-wBv@M68`}K` zqW158`OED3Kw0w(d5`Gvhuz5Nel|^003oc0AqM29cm=H7WBd`aw^C^KeBUOe7wfpt z|G3N}jH5c>-0@GHXa6cb4UXYSWWij#!51<@M%{zBd*YXUB#TvGWpX z+K1$enRCQA5I|=u6>J1rRr1q}5M_G|Ls1?$%2beE(2K9472oGbQdCmh=hgi_@r`&& ze2|;@tmUxRUJ$XW*vHdBR_wfVq)8zz)Qoh_2*!ihmztaRxt4esKK4wSgF|sKnAI! zKQd?nrfN6cT8^QzDsElE_p-7x@s8fe()-wJ=sVrUPMmD({Bl|F7tCqC0G-Myw5=iTI-xkUhyr?X9g=MQO5PP>en-OS4 zfJiJs)PHB>1cuGwT>i>rg5C3;>0JA_IrfgY5z0yY}Jv z@N4Pw1^L5_&(17s96KDJT>;`{wAQgx?gl9s?LVv~5LRDFrLVI~@3ZBi(x@ z(4^K{PZ=7PQnsO}oR8}mvnW>)F@m950cQ9mN#Pb?BpQ47`hX62(8;Ul77nCdA=w1F zCZ8w|Msm(iB}Flp1=)JEU5`WII@M!;G`;4!-?FoinieZ-Kb7UOCAlQ9q#|5rjHxnM zFwDcerp?*l9;NN0BZG@cvHgVI1+E*<^?u3Y^GimDUa1@AbWd4_o|G1g;_8LU z`VC$J9MXsb-k;$!W4w0-m$#h&@XCv%j~1Iy#E~%A?Q?c8kBTGzfo(rTM!D$&TjVw_|^I^j{2ye+n+QiLQNNX^sW`wF-Xnh%}j0KjVeu zT3KbIKx4O4j!%v^nXh%6@nxdMT}SduQsDlM$BCH3wCpqV@|QYWrJ$xy5=oU5$+y?o zr9Hxw3MXR9O9*-Ku4IjiQaZ%XGvY06n;%XsWv_mk0I1Q8_1ypdS_4Mk4*b#gFlT_6 z+2N{U|2zblD2@UxBNUMWTyScX0Yk;9lWUl^)qn91aGnDuokYC9W<~yW4E#4%?sEz>Ez*6HmcW zON7Wy4qj4~Vw)FKje&<;(bEqAeTM4DAGalrD@lm;Pg8u=%X&~nBm(3b@wE_Zq2wSV zC4gr{vWbPB+a@f4o~!xv6c&JYk3hPmhmB*2GHtr>Zo zH)_`JL~@(`=vZL@ALs8n8*wSbZ$lK*qxG#yv&`Z+465<8j(ApRTnK6=F*Sr5d^wZ9 z8z%$~=m;rFxYi4C*)0%L-qMGk@QK+(>Kgnbid#1!2&O=$`_@;Q90?$k7Dg+u0JB5h zk^>BD)*QY|vamP((B!Q=(b3ku=y`;!6W`99HTTj;{mf=8)0b2s1e0A0;BpX~350;i z%c*r+;pL*DVHJGHXAq`?JQlGrc5h?|nyOQu`y?jH92$=EiK*Bz)oagU=%gNRxqK@8 z5$&!kw2hCOayXr}jWLI74m<_yLka%$q}I-|`^;K)7Sc3!!u7)iZy)l9&5D@v!Wy2{ zy_382%8m<|4woXdlhJ38n#yBQqRb#z97Pt3>XaxyQ`Vhy4tJHXp+wTJS+-5#@~ypGn@rRKQ*g6h|3%%bPJMl$}{G_$o}? zsp2L1qMvXa)<#@1$tZa!KUg9qR$EyDg3Jo;S8-pwC?Mmkk;k5w zGMWR4T1Bk*Ock~tTG|So;R{cjeM)+3aZ0Sb#wc1xV<=wfOF-F@hoh!`|9k7o{qf}_ zfZVnEV|BT7*K`;z3p*l;QKIoU?+;R>&lf3@#B%O$q)5dtQsm0Br-0EHDbiwUEoqQ> z_KOth_V7iD?2tUm{TnHgb@<2r7b!A5k$~D3gzbwI*>n&bgvt8{DbkE>mq0lBixhdS z9w`w+F#HE8QautA_utO`AVu;=;{HL3G-IO|{`a4zPQOTzlqVp2M~w8bSA~C&BCWgr zAVvD7q|sY=i%lICR=3dVylqbKlFWDQ!9JA)uGmbxP-u~L-`F4BC-@%WEZ@F}<&>&A znROnE@xoFgIu}wS<{q`m@NnOH-7uh*3Ww?xW3&0@xb8y)p2QG*9Yp@=VED(k1p;Bu zLm3Z*oFta0fRpQu_pFx5K9PR$04d}er;UD1_1j4kfQJ6iyf7*il{Q+;Jjy(?BjoF__k)E&rAhr;_ zJ8;8a22vgk008Olt0;eCME>R2dak-=i6MyEc`0B1u({&56x48{U>Qn5$d|{?*=^ux zQI*W~%V?JsH(%yge0*S>0#7{o?sUBfsRd+i0HQNWx7Jap^6&98yfk~Pa%PlZR+JUC zx7+hiuUjt$j=fuy7wTA7X5z@p1w#v=1fn&+&I9L+*0({uI++BT@k|b!d5BseJ*Up?H&RrXh*&ZW7 zW0mJK5Fl$1GKVC`?0}-vzM|7W<_KT}LPst8oyFqib!pxJ6V9-M4!92?TZIhMPWt}- z7=hU(H5mD)RpY>X7VCO|CM$sfmVI^_o2+AnfQ``uS%fP6jT7Qpm-Mh|JwV7CRgcKk z`zkdy0QxH}+m6 zV5%>B5Dlq`YGoT}jpl`>k3km2gE2bSGPK`rZYO00tvSJ2Rt0Hyaz9yfyg7SZ9Z&2W zKKcna!FE35w|ArsPV^A2cKv>2qcC}TL$fDpMW>Yzxz6Q}p(4q@@+3Ni8aWc2Td37l z66_aRAuS!qLp)AZol#f_)>~3kVrd}w=B?%p*{6X%g3U4<&o=4)x0ir*91CnF`fR=UJ37(B34>)MgLtp4u-rB+?wkx); zg{Y}8DS#F1MTey~`TNYDtuLn-AY2Ey$Emk2mhiWzNokSEi!(|4XU|rb=Z#fJu|%dx zx@D$Gsus2BfGr!#Qa$MsdAYVniNYQlZpBrT;;xA!RwJ%xFpcowj6}%04rz$+*mB93 z)l>qxYn~iE^ns8l1!}4q6(f47R`a}hG0eiR$&|qXC)CCiRQTHy!o8-sfLHx!9`%)10brtATFz~x~q3Bh?Dp+D{I zFdk3sUs(70oO~?p91e0zTL~GHQ&An8l(25d+=#4ynmF&Z&FpdPOnz*?Xf-!w!5c|H zVu&y6SeQAV?$Gs$$@dPzBX6!j;b2Ww-^9~mdo_Q~Y`?_C(>_G7sBB@FmoxOj{@gND zDDYQYR@PA{l`6rYnJiig#K^)LW3tO7=&*GjtH9K9=l4J2wJsphItj(NVVmifE}C)S z((mP=y9(}$avp&Li^G-&_8J)UxeRXm=u3O)E*-117=f>LwHx-a8e{3xf&2}nTA#Q;nkUC5CdawF%IiUJe3XO&)D>un7-uLE?VS;;JWa6 zm-=UhX4~^C5>Zaotd4l&T6jT0a982Z5QeqAI=l z#z@M8h|q^=brl5>&Lx}m`1ymi)EBzqR0yqwr(~^yG*gR~av#esY=~%rF`=FUy7$Nz%#Yls*Trfhxuwl@L$Ku!tr&B=R zsVh>C{@o1C>>vgv84AM&5)eUAQR#ecGlOr6pD1-5tRJGH5MdcWnp+T;S~@6j_5> zrO7wBu|t)^7+B{_NAr9RK*Zlzz^#vwfL80K9J&6L5RU@(xf}2eV_rb4PpLDRnzn%{ zx$D`qr?&0<=?T%6qzS;yG6&3z@1}xRY)t3A~ZA{ zoJ1JkFO4;<)OOX&c`+%cX_ry2KVC|8WF&9(aYh!*aYhjw8;~Q(t`*t{iN`uhMhpexP_uPWCWrT9Lde8ljW60$ zvwr9mEF)WlpHX21p>iK^gh&V!uRnTs$d;sA4H~QHXW)=j#9q9ld8+cdCow)z zp7fjUdi#dDt=)CTt%eM*0u&@aNEuCQd6|X#*xfjpNLt{=S-haB%`p>CXc%f} zFuP|-x+%=?178E!r1TAxIq{y_jRH_28X6ZB#4w%Vbr--F&Y#7L)?=N7|9svUJy{TY zmMwTwpcH_3wL)DC3@#{+R~DCm9qSKF9mNV)eS?3agT?L-@*V_0o&;9Y;7j)R-|)^q zZ330HD-@pE!BYX>#OKFi#jwU#qa9{T$BCtfA93=A^!bs#Qw@?I(+ac`ZLdP^5UqDD zjJG3^7Fy1z+Hjk+SQ>|6IBy)~#l-$8t@J!jN9BdW8Oo*tpb*SRHV$-e99zX;-LX{Yd>h zbLf@(gXMuPy0)`kmP~u4ow4sDFJ+_n^ZKf*VClo(ZELYTw6V}l3 zw)ga8eeb29DC_NhWU@`8;Mqmq#PfQdjxA!Hf#?G}%nSYe0N-(r^g>Hrp_`Pq(YW@s z^-BEOvI|0b$^Lb~3Pnm}DhDp96#K1}lcbo)Vh2WQ9)_6_F$N00wipXqoMRwrp#~7hi#B`W8RtEXJxwglHc#O}j{F(88I3V_ z#_jpDlG=Gr-yAZCB9=>`{t<|a3cR;vS)|eGLAteTEp0q9Y}5tEz7bb3pq`nVDiH}P zYMZL;odSOoqSdmEL)u*erU6;9f~@L%v>X8{GNOKLJR;RVeSkIR>X>tp0=?pUah?+8 z#vmrhu}n|D^c1Zo4WHek?;-vM0j;?`cT&063H&i5{&&I1El?JX`xbM#5qSpa^Z4_>7wkx4D(7M~xdPX7Ieb(eogIJx z<@He;^^VzizxPE>OYHlp@VZ+#vyqdp9K+ZCPI&rOXa_VBhW0`;%j|&;oWN3=p|rrd zGNi=x^F*IYh~;~mrC8qXNYmx{da^~O=c#t*MmznfR~PE| z=LxsQN{d^Ei+&vz3n;MjOE80^s!5P^RVCn6xHzq1II-k62R!_Mhp>%G=XaMFeL4C} z(YoNhk*8qBS#ep3$$SIR(A#Bw_!8rNY_Rz9Fiv*~CrTb@Ho#+Y%a@BMx2jP$xv zE;-_i#1?^SQZW>1GDOf^8vP71#s}o_CReFisS1UmSx5f%lrhnSfw1SfWwX9Vr3mC; zilDL9gfGzVX6n(`MG)hNY5aPVRUnnXLivUa)Z(FHPn^Xpc|Y4XBZL8%_dQ!!I*#3`ATaqSzxu zlU5<;DZnf=bj#Vi#Wy1}o#Gcse3l!-B4!D$96x9(hU(sH6qeHzlfSWX0(DR>Y^4aT zK!?>k4ee%1tkNmc3B5rqTVf_}jt$`*sj-n&%--~D1$@xqC@@1ps$1F&u4XYLb2K(4l~|^du$@}| zV~$P zK;eEt$x_D(WX6eWS~|>Y^)jK77+N8U4X$|EsB1%m8P319Bjx}RJo{egdr&YqmIeR> z4>mD_!rgRX-fdUh;Jn#&U0mZ3vMTVrj=j9>s)Z#pMmTkIi8bFCaO`$1@o2(Axt*1-yHunpixG2<)vIslM)pim6dq zU7EW7qZtCLZQcE;x2vK1fHOO^A~*^~?LHynK)L6@4Hw!~B;?}>066s_h3;3WF~I2T zIXQb}%to$B9IE6wBfbw552O=0P`9B5&s!gLcO-Dl@ocWH>oPBcxx7)bA&?p~Ex#eo zsl7VIs+w^T!X`%4tYn(7qeX+71*%fIZNSB1prX2c3dwKa$sRwr9H(opiiL;|pUmWM23b_(7 zu%OH!^=qBX*a_rlRT|ajoOyBnzB%iMtB0=L*Vljh*Mp4=pt$6HhWsyKIlWY?l$^Mq zjpr2)b`)?ypU=mQX-<%{{yb-RX=3*@dtZtl3WiByL&5qX}kNI@l*s(Tv;K(s(lccH-ISXnaQh78X907}k7>Dr7XD5~{GwE%1C%e79v~R6vW9* z^jl>M<{O+l$1p?okjlQ2`9G=|s?E7Y>Ywv|-PWLaqcgiDi%xDaL4s8XgcRm$%kM3- zKLAw;5j#wUFcB_$g9%1XKu}gWs6hvZlx;`TFVpEKXs+dC$XCO-BB9lPds8(}tv_Uz z*6TW%(qVp+wF850?6Gf7)lU?V4F%Vu3z61CI!-vg&o4zfGF#3eTBaON5(o|heW988 zX_pDXemVcz(du9nTyE(>E1)KZ91VtCpk=cc*c>NG1naQo)OSha=;a2#*?enjMz{Kw z>vkY?x1jfUx?uf$bdeX4#H|(9h>iUunE+|<(aa((%VwRG*hv%(ierBQGPMelq6Y+p zl>{aU8Mv2QY|E@U%n&uVVlO6z6)2(z#U_|Ix9+4E=*Y|F@2zxa!y}cNNiZ!Y+FvLo zuv*2${S5*|QXpBD*Bt(SL?t`cPNo)SA(RwXvDRBc$qGM!-72|3)uQsnMs&O^C7hDs ze7NF;y#l23XC6XM37)lZVb^jeFl4e9^89!W7l@6PZ)+!gcH&rdxe5EW%c>pIMp(}D zCT%vj6)FUBdJch{9u!NI+t4Yn*6SHfpx-%K3Ob!pF?lbdZNtw#jviGppgRlQ)SnP@ zMNWBc6d4<3UP!^Szhi`U3S$b3SK?zwje-VKd-bWn_inhMn9u?F!YUKPnpSFdc;LTt zMa~8h5H$kV6CyKJYr=DS?+AuB=tj>q6B9&>^E ziDtgtGq|q9Z|5-9cc$@!ZD6yf@2*55!z`Bk76zWNWVaB_~5pbGd`Z2#1JoG z0swrl++Da_!q`>}4-el;1`VasBHo%Q4T5QkNKupjuxCk92dA;FaAq2^?Sa_4LrUC) zmR(;jmshVh^~B3N*~WTkK1`L~-}#fDHa9_i=ETlbe_7@1?Be6v{61k!!1+?Cz8xev z0#M&OU@2)s>ebWP1Cj^2%VoC19-Qa2Ub#0d32BF+r=a3};A)kbXW67m(0ljjbmt+- z9X^X!*viV$sWOtzFuAhI;h_pz1VEk4-HrR+a^v(&GX$HH2ea{F7M79L%3H))H;Q1z zm78k6^_MZ+49Wa3=R*%E$K2S z>d}p+^4hh2A=1)ZP(reU&fVlz&>10~5KNg(Q>mAm{-iN>)BJ1Ry`gxqm`c3u{osU@3 z?^FE!4<-w>z`Hx3iJ&TuSn-Qgz4f(Acymmpl`~yxLuPSgsYD>r#Pwozev2ymin2XKFlp^M>? z&NHL(ZaqXPH`&isEmmzCl*DkZCW~%Bs!rF$J5RYN5jdxy2|+l}>)h1N)1zS*u!{h< zo26o8PNLOo(~d|%r#iM473C$T23rO1|3gIik^Ya(a*R64F$}js%s9 z-kNm3&h@;9{Ih1lUXOcwd}-zf@;}$izpR}8Su?NyT{B@y6~z4KaA?u0_7sh2QZraZ z%kW8)zQvO1sU- zNbw6oro>->IZ27sjBoHK7Y~fc2sN2PKAEvlqTqboGB;1_JW+{LV7Zc!tM_#Kf|xKKI;~4E zMmkyx4Nqdm|j6f_2GIBzh##wU}%nm=XP@@ck4ga_As_FDVUu$g6_t zek_AbD2yQJZVkOUVPNr6$Y4el>VgTQ{6{J2(Ve}TVt}JwlIA!?W>^tz+)1!E2l=Pq z!#$zS2c!%G!Nd3dKKS`_GGNmcpfU1Z?<2Y)q2-Wlo=ep3O%AYjL9^{(_%!%b6jzkR z*LKGNZIGa42Iijz8xD&SvwKL4>#Ds()SN8F%IAk$c*+h-MB2xvQPebgL zXbk6`Yb3}jA_^FpSd_?1UY27tt0P z;P0nJ7x|pGghl3h6)@1hLH8HXK691F4i`0o=TsiDK9zUzzG5)E!x-$P@(XIk@JA*b zCNr1_p$4UH2`UR1?Wju}^t49|4<9Fu3wUJmkB{by2LGB~NrB|!-=F`mSS9&GF~_su zct+hNMxzf$wxlh*c$5lnTzbT~vL+7f9dOC+qvM|qh+!~MYi@vR=o2PQpOb@i{l=E9 z&G-DvQYA{+nJM%I!Z(*B;c*%fgbZOBY|bJ8-O>`pyzGVg3E%tuneIOU=<>EBi&1I} z0IolxbTrylESNdqszB9Id{3jClBhqgP46Ra1+2Zw>f8Z!Fm#D&p)IM_&KH5b$Go1n zx)&@fK%5d8kMj*~7f)|{B8a`0EGrxUy5>%KZ*8U1;Wjp|aI~>_$+9)H&AK{?en6TZ zEO)$>v^iv@=Wi@9c^J=1V99;sJ78WI0|5KG1q7J)?msGYUY+S2@_YPOdq z7kNv*=wZXsrI0NfC)!3$?{4hH!PGn%|K2Co%=8!y%~F(~Iu7ITD))d*n9#u@Ch?nY zAG->ggYr6=4X^dd0>54RKEzut)O>1R_~yyNY1u5`bR1*eLE@US?Xmcz_h5>i+#0KD zo+LP=E8NmK)Oiw{`-)8IAwamJBmz_~noZ_U?DHw- zvh*PT$u~8A_9BOA+Tg-7@P9RIV)9_WgpU6xl-!naOyX9qY1po`L`8LCyy!WM|6LRE zLt!f9E4H1f!yHbP5|g?G4L^^^WfkLPGALTBRYX{|MW#3SCK!)WD}oJ*6-ezbKu3&P zYjor3H815wku-;RA6^iSS{jl9pMOFR#*yJ`#Nor-hGoGlhb6=B)%1iF1gB~BANmQZ_ zho?xyR_Bbog68&p=8z`LFL?(VS-KTo8RAbXJSq@i2pB*3s$?6g^^he@+sDO@28xT*q|J_@ zg#@z$4&{v&w}Sw)iwHEUlaN>Uk{9ci_FBc;G}67RWfQaTY&pBEd`F+YJ?7sEwCJ418TNLj-&En$dEj5*Dv&-^+Jfi8dh3uX z?Vl?vo4@M7pie=#w>+Bd+mc)E$ASO+{IEcn{Rt|=AaV4)Ulr=)WYk-Ycz~XS!u!bE za5VIQ9}j0Hn^l;Rbx&vv8ILv~WvE^M8LZ0U<*1MM=-XpG8iN2*AykT5+Ah{MB?#b4 zCoRlE@7;o{i(Tv8Yt$!VFyCv8&^B=lae$sK8D>~RI8(@g8s_T2C!#4KP_rz(+Ip4| zzaMDG+=wlrNhIPH>@>Uzqi;Rqr=&I`_DO_roMz2t@jOyYzksq;73vB5+!n<{Xv{~a z!Tw!S_L}zs15>EMT3~_=#0#+4du#e*Uu~mIQ^zoR?d;u;Si;76dOuxn+ydgRAjNdg zNqgM+0T4hO7GxQH-R2tHG_f8&d(9oRAy?t*g{o&%h6&*r#l_nzDj|2X%@+g0JLsV| z_MzDZ^RB|vdheS)4|cubkchc?!iOGt=ItrEXnM@(*cr~7q5c=TTKZTCIiG(f^^EPMrhkN40xh0h1*LI8&MH_`=5anUqb<4RRi-9H!8 zQoY%9dJl}7Mk(4ZP9j;H{O)Z@tem0?hAlU!rp^I63p$QxH}h@=%bQr$*)>2VR09L- z43ET~4~ZW`db ze?00qIA8TuTTQEI*DT>oCOf}Of=yaho92yw+Cs7Z^auv>{GJD3Y;tMBRa}I;v64Yu z;-~)_;{pY6w zIF0w=)+MRjm{b~O)!s7HeMl_h%e|PBZFX4jQ&XPWhE$MRYP!Wd_=pj~eZCgu2kWR^ zt(VauTl&y@Fc+Qma;<&&3ZeQmrg@HyE0@glO*W%;w*o~6v(kk5;P~Ry`p0r}kOmGb z880dp*7>4v`5QzF%Wox#9-+nRO7z}rLLz;f`*iHKuKiM>3KvR>P}5z~1d8zDeWsvA zCnCNdWXI|hd#)bzvgz!GbOHQX&vOo4 z^8dA${m-%XfA+G4L4SDJ2ASeN@?Rt4x*SnrLe(Y@w>(_O9B?>n@!k_xZlK8cAU z84whVkAI^mG$A06XuKHV&TLp5&ofPe)A=8ZR_eA!VAzON&TKtyXQQtG_}}d8Mhcsw z`#PgPx>2bX~nS;8%ZV(R%HIbo*xdTU2SC!q`;zW9WIFytz&KMeksx~ zAg6A}Y{3^XW_m#4sA5VJi0~g+g?NI7Y-A}sP5nBY?BmXD3bTsNvr1*e^|Z>q*?_b) za}~cMF-+~g{4DP@k?HbpE#j2VMZ#HC$OHhQk3e*J<(TtTBF^kpqinqXz+W=^-QSw@ zqA~!f1B-bu$X&!)O!jb9!5Vaa)!S#tg5XuCHpmZ?u@VG3cqw7<`c~3mA=Bzg zAr@p4e2;s=Rf^HV(1I<)<@`}mDwXKoBRR7P6zy;WB0C4-_3qY(3|CKsnD9N2en@i`8 zF|(j|Q0r=@KEI%Fv{ERB0F8>iD_EPvUH}jEWa2g5msd4AkJg&o4Q|j}`zMh+>p2nm z+>vB>abmZBi+}}R4!%YKMj(GWc6D+UBY6@?QQBYZp_ftd-LSbt^~Irg=}!wX_(&69 zt5y;EEE#+oK`G%I7dCV@w)CW1TX$zt1nz658H?Dn6fFL38xbQ+qCH5lJ}^>n-4&_% zAgNknna2))#DF3-OWG7%%9If+-2|QVMh*BA+f?7EHXNBp{+d@n71IGB%BtXW{b%yV zpnHI?3>dc+C{JQ@K;&#<&HF0@t}&QCTn(&*ISuT=mT6%%z>Q2_?~r)y-*g!bd}9NW zE98^2O(pqA*Wln&8e~8l9Q{R{ASHZ|nICQ|XQVd*vcr>=AlyIdj9*~DhkpZ3t{*eS zEY=(w84zo+;|uj|*|QDuY`_uLR1v9eYV&(FiwT*7urZHBURtujPm zAFeij?xsv9b`u*Mn}-{Vcco45)B&`C`Vw}-Tb$-C1!RW83DK+yMVUVW-Q{}Rv6DsA#pE-7 zJ|uqaSzFpgSwbn}TjkbW?bG3gk2Bs zmBWy1H>;U0ud@Hs+F5`_y|#ZIq@=q9>F)0C?nWdBq`Sc&q`N^%QfZJb2|>DBQjkUv zX@Q-C@4IIP;hf$7?#$)jc=>$z{_44(xZ|-$#5pXo`SGZ^r%{)o-ccr_ci6V*#w2%> zHUB^gb&2*=u!yyDp6a5dUH@6%A_kvCJY+qpt^G4y0k$_X(M&?$RA&koDI74uFLa2) z0oxOAY8|4eho{PSpgJ+u%En4c&YFp@_ARsmi_1~t_oGk?@futmKMzlYJ?I@(M|IH) z3-z-@CwAQxAd3ur@Q|zN?aMw7yn_o!$hn$Vu0dM#4Pmw%ZO6yh%?j~}^vRY0iM2zq7~J^!fD7mMH_HrZOTO_tH9t%aWvCut8SomU?y0Hvdnzp<^RZji^IX0ZAz>k6IO>yvN)m4}C zhQGGy7giNtT!owr9DX~T7k^A5m(I`m&UqmJ(FT&k;N-LhRbv!^iQ-R@aAI_~5VX99 zI;BdoI8T*{j?MZjx=EaD(&ri6_Fx{jb75KqH0UudWn(;1tMBYYy2AIfpw? z_~p)9GKF$?_jVZ4XaSf_FB7>xelE(2AcpnbYMQl@+nEoL4{7wnGOJtV86Qg&o&e z^Y<-#0J*xevN(Fy>}lIY``xEnc@Hv%0%MaFmmLp^?2cf-&3iay(2+gRyqDc$-tVnX z0W|N*1VF#$p)#G4aUl)A=F`0{iP!NoYGYZ+GW%+lx@FDu$N4iA$R&D#v1l?6hp8ki zNwXDSQE<>^*Vdt>UXOYKdkNqMZ&hOpg_55h(c3N=5A(tP8~Z-6(@!YOYP_MKDjI2? zLaVj0rYpq?pf5@}!}5OaQBFOWvBB^51?Zie_^Kv9E?%uTv?6_#M_LP8+{uekpEaAw zf>gX+MZ%LQEEi*g#YJiLjK)GHwdeeD#Q0pl{tXp9HDkRI4b^cxiDVMX^k!k|F7)h9 z$Fr)Km6wlZ8{=fVS~=nACPYFg0t{75pRrXE(g%41`t~`YfqT5KP6iw_id>|e%Kg}u zqKE15)W-77(Ts@|{NIdJQMm3H=h9GE;3$*w11J4@m#U5rS@jaPSSZD1D;U`Gf^xijC%= zm%Y@Vzd~XuT7RKQ0&b)q`{zN5xkD|%tBUsSz# z0weZ{Xc~|9;>NY`1uXrQ@NMSK@6M2w7T z-)H*JU^V*<+ALahESJ+h?I$+8SlJ4h7*_dJwF7ZDZ$*Eqahh)Kkkj~d3dU}dJWM)D zS2&CP+|pqmRovi1T}p0-2!N1mg(EA*vgdmPZuS}lwn#?Qo@81%zPgS$;l&my#Elmy zWxRhWpc&Pu6Kyrw+rs z9lk&d{}w?#5SY3ZIN9%qfjkdoi8zd4@vYQtd{JF_v9|pnhTkU_y-qe4-h_i9;O$6c z1(inyj=$HHaNwg5hU3UlAl8nPOvOAj%Ywg~6#Ho~?egTcqitZ$|} zme27GC*pn0Ct1%gqnKzqujS7Cye$hF_$(U2^!E}jUJfiOuUjkIH-sree{=2% zP;>RJP}R*`C|j6Sx^^{wPkaSOwbqSx z@Vg`Pz=apb6c~0dx;kK+V7cnu_S4EKu zKln*VDL=pU1YloQ*^0ESo7c2fx>&Tslx#p~=uf_bFu`B6mzN32NWwUyjbj1X7o%bI z0r4r^K1#;CgZAF(9Lr7?G%Et?^1+X<=WCysloqtkOCuMRS@Sccl27nnUGwyRG*sc< zD1^UgL4TKFlP=2ZUyq(NLaemun#!G?>L8U6q?arKTT zbYx}tYNm}Y?D_%8526QnHoAP1HnG4$6#CC%iB>cjQRNQl^7S^?N=?k!&1*c_j=Q^j zSEIjwq;1upJKBPwHzX;zcsjFcV-~R)+J+p`g!jB?{paUPN?ba*4pZ4gY)t8A{MA{} z+_-e#L&A(nm-XqF^99h+e@VkP8*zLR+l(S|P6Nk7z5 zq-5J6_e&|5@Y!+e>%dc$slX?PFcH>5?|b<8$Y(6VT#Wo%T98%H>#u$=LF=c!RHI0V zluE`CkRm!J>aUSQsAP<2A?GrLw9R^xZT6~l=B=_++lyGIkDaF1w-z|OmWl-7_dESHHuBg z;n;PN?^z~XX0{=OEn0${SpBav*V7C~I&Av5S7bD%Ntcp^fFtO&sey)T4gz{wUV_Nh zr-su{>JJ6jxwBJ}#fCJNSeF~2h723>^{-bmRkahk)n8$)*0LKm6&m{9N-!sN&56to zwDxlMcun718|J^0`M;u=vaN`Juj;b_SM~EGc$&0kcS@V-&6!gl8;-u$B$Gj)pnQT5 z2rc(677I;LCYy3q?Mi;FI=$d3Fe9aT+7c-O0kv=%HDfM?eci{orHa2QC~91>Q<*CZ*swOla*9PIWgpTj?sJ zVlz{9s^Lz6=qD#+mt>jX5ED5TK*x&z*(u54u3C@E2h$ogR?e_fx$@U$58N6Wmg};) z)=6dwi|eyq59|SA&kPm)L{J@?9jtWK{@21qktTyGDJb$>)dE9^Z6YL8 zr*S%xr`2d|yBg#k7nm?7jWDu7hh)um6 zr(Xn4<;_;I#TUBd4)=J!fBHV)-Pah#UJ`h?u;yJt&%RJy|Ls%I!g<7erd>6THhJqi zw#f0QS=UgxRUyX5>ExIw8yXLZ*dLCbqG9ndxumTecS(kZyp!PS5Kzj+aAa-4eVZJw zDE~Hj-#02`cu>w8E!r8yt;cbIi&wAbP)Gft^2OR#0n>q`IJ$W}L9&Fe8g=0+PrQxz z8ljVHi~>o-M3Kzf!6H3N1tR9>G3)FVW@=a|Zf4kz1GSz=<7+Gq<}nB z_D^-J2_o4`$|}u4Dg>}H$X7n_$oRmhTLDG0s*OamM-Tf2zG^)fEp;Vr-FtnivB_=P z5CU$Foz3NAa`yX&>KjF_cnhS1Vt83)h+`61`9s=zsOAJ|+SiO|f&S8u0@I{YvE)DH zdC*O;Pf`d^jQkITF50 z6xO}H89~t$XYVGt@o*l>oBy!Z`IL>Bh?vb}PIH>u_^OfM>pb#|nhQZyQ~L!Wy+*L0 z2{hhCs-dJde!{YD_}M}e@@JV%TxA&F(g-BiPLW_v2Tvb7V`AP4@3iCK=EHd8vqK!2 z6eQWrF@ekV)n0uw09hKKI2|z~Et< z6F`q2KtF>+OUE|)wt%3U$fkg^`Yqb=EWv}C%tSGF7uZgTdEn->DR506w(YSBvym+7 zN^_8r$Cz?jQjI=;lwQ*0d9cbg0YTitPp`v4$)XBTRZAPYt7^fi*_O=#;iS4UUPQeZ z1yj=yImV~91EphE>BP-v)m@X7+=t`(2G2?dr1_fq^cRk#V;qRBw_aFpbA2@9`o3Ua zCUoFt2NCd6cYGBMPD#Y#;>v$=l*;e%!;ei|K{>EZdt5awmP&&ARJ9l7YS;dCrmtW( zIB+vOlW-s(GYwTwC0<^2bukNB4e-YetZVd3R~?wRom^P>Dx6UErWoo+<@=y1)?XQK zADE`XaJ^VSWmm*yY2cl5{+T0`5q?hU-i*lJIJU@T-|}pswcOjHvYBn-sqgf2PXaQY zc0!YJZ#HGjw!ZI8pNM~%UwlzIoJ_6#uq0SN+Z}(->_|-V!!e`Ek4;K(Z3!18S#-0N z&Miv9CW=C6=vWlc^Rss5cs62w`vnIxvoo(9D$R1Hu&DHFS2sNTUR{*+jS-|wm1Q$C zou!=YjJ743H|hShPCPbAJr9qWS$R$7g7HvFwqDEI2(+P)G^oPn0n%AYc1+}|#^2_- zEo}K$_n--8)j5d0o3QdPG)bcWX~tHlc+t`bW*g7MD;dIu9b>w^Xxj{ql-j{=O@lK3R?=ImxLAo3bUa^->5eICVxV*{!!+$qMHNz5d-||8te1 zTNYbP5@@mCtEl{6TWlix|Cz;Z23l;_zb&>=kkt>g-ULhm{-R~s|B1z(b*;VX5zZ;4 zLoIkf``O;2#Y46A92$Inp1ZMKGyIpu2JXY-fQMZ>+gO?b{-LJPe*&Gpmkn=Z+lNqe zyV>9d!9%k5$H$T`!_idQSP$E3S@T;KJkElr82FT%f|g1TjiHv$)1wmXO#3S-lHw-t zxG~nI0Pph$PovOFqumTaZ*O&jeHVvdDfp4^e#Ub$hTu-w0_#eHnS#g z1y`(lxA0g{F>nsNEVZNTq)6+SR&aPjxn`#Lfe%@I(wM=NM6q*NQkN;BlWclegQ@dS zRS6S2{b)UBte=|=Uow{Yk=oNZ*ByM(N;;GMv0mDIY#nxG(*cP}81s!CEhfwBNlLta z7%2(TUy=BVG112O_+M!8Q|(DV!ZJK;`u;kBJycr~vF{l$4kH!jvi_;TNN_n^qUa-) zu~n-Sf0;yCdFCfl-(Jo{ZR~RgKJTQlv=YbV?<-lr=`$Xp9Q2@^Wu}&G3JFru1xDZmJxs7uT$t&Nh=@Y+ z=k_FkxTy?z51DQ|Lrhp;8RO17Sh{iAKKGE$cp}nNafduaIw}oB)FpJy{9Qk~=%q0y za}~lzr(8WM0Cr1%wz@d%uqT}^NrUAeNbOH84SH`6Cu<3U+% zV)cd7KxSwo8^j|KBOC}q#U5oqT1!~-w!@Tq?0JrO?&cRN{>?U%_5jq0olu3 zG1UDfJ1)gW&?twN@>ui0)?}_P%SDC6s#2yUv|X&F7|krDi)0R?v*Nx}2|?G{b-Wb? zR5Dq;er;=i>I0Y%Rasty%zmsz)N%}ucxk!V%Tngi$6LFRo&0Z`(X+`J_A4S6o(hdS zvQG4!{8-j76!2O0E-w*1QoxFNmZ}0Qlq-}KulA`pGx12wcZ;kjWHclwn#3b-(izVV z?a8}7Vk7LFrz4Cqu0m2Dy9XYRf5Erf3vP&KM=PN(?ygu6;8F{Xs<1fob-|us5C}t` zORW{chreui+tSabL7A?mk>IA{R;VmVWVt#5jVZ^7%5=j+1Vgj_ z%EffUf4AYypnP)6@9p?fUVdMb_XC{)-mkBKQ}no-DLPK)1yY+s;^c0Q;jB*d>3ov@ z-m{)d-*+`t>*38GP|d%rEy~m|L^kB9?e0c43OF{Y!1fqQt5@#|x?8>FJMN!pGS#Lc z;G-wl|EB4E3_bo)k3bir)u4VYeD{G*gMsIBAD(TE-n~;_i$n-rL9eCwW9V;iQb8H& zsU?Fu({S#b?rRmkESvG#qFZ)JTLvaYO&dFJ~I( z{N!!%>^3lPBi?Ns1C%K>AVz&jI^63|yjTi!j`|2!JvFql25+%f?^~{681j{0dFS$A z_V{&yNTRVl?#pBI>Q{CU2Hx!J;kI>${LmY{9}ZWttC}nfFoJi~`%r|-L7YSxA*K$G__@^*V1Fcdb3sT|FVVY8lZHI`5 znjI~;mL!*;Y1%TmNek%C2ZS_Z?AU-I!zRNCF2Mk-$0i!1+-T6fY;Uiz2ibVS)Ialo zFe*1L)M1rnFVLA5A$RE@Eih|)#ufBVvjLrPdlOP{{xtODdxZDr*8vGjbtV$$m zQQhY4deLwn@Z~ca()oM`wb%J4435rw@TWwP;{s~FYf^F+$bA0kvRK~irFrh)<6Q3+FsjREY^vbNSdJJx>tlts!Qo1OmN6VcX?>A?wDJ9!W(B9~Lg2P9K(1Wx zG~&_JWC-y&XX=JIgv&5fbpJKPxB_tV#8K6+0SX|(7-g#4@mEyW zN%>xZ%F;U0#D&(Y|*+Bgt4s{9t?AM&l)xK zmmrx3J<__QzseXac^ts+`Dy?{Zv5&<5L zTv|cdckpV7hk0ZUSwp?JoxNg?DvTBqSjbdg+pG!5pA6&|e)D!w=#HG3nMYfk7GjB@ zP5&{qfKLdKQvKdevck{hA=LXGb~+dVZLH5L%qov$AERTI7n8ZXAiA z^wuA7%mJbQsKkOeDuO-FNX&fZcP9t($R4n18M`p7qz zE!UjA*o*WCbuxLk!ws+IWQ3xfu6GSB1A2PNy0F<14xUYkh}6Z}ni?~(<#@=j)@{;A z;QWd{24hZGAfjy1G*ivl`ye4=V{hWwp&GGyi-nC%Hv!Oh^dkKYu);=UYFf{UVQ1}7 z6=A&)@nRj$;%sCZs{Wk(h)En|PY%!3mewy1&ZjNJm)-^B%=xY7L$sMKZV31-C)}Y_ zf-m@}8_vs}r+EuU=AC!?u6|Kbyku#4uAkM*VptD-p=NDCT3?@7EXeP-RR?&Rid;5B zBeAdYh)h8t_u}b5#j@Z?(Mk56AK!ByVWC=#5+7VceT9z1Al|SUK%#iNN5#x+a{ zbc4E2S>N7CJ*=)t1=bDR`8Cf@dNqe?FYdPq)o+>tR}`#~NFt>F?SK!?!`-R(Y96QS;CRQo9IvN3Z#~1aIl!T4 zLo=vFOY*6nRlmluT?}%ar7jO2OG=_uMHIyll7S;^8D5Y`&+|^`zKZ4^^v|Vn!5Y(| z$h?4O7?pziBV0lhON9Xr=MhY#dIdQWPb^8cE>NnWw5oTa&&?8vrGH1Q^;Z8dwHjmZ z68O4AAneN}*cM6O9?D=kKcL&CF&OY-K5pidyvQ&3ZWrfQ*l&EzzmEf3_rSnp&!<|260s;9emv?1(f=`9Kc-SS+oAt zlGe4e746HdTONk2?;Cf5fzfisZotge|5@U2F*dOQsJnRD0G#iw*_^I#pC*I#a`A#5 z?YlY?`$x2icXbh!qjuU`<`5UBPLw-oDvl+~?3wk}O!Oea4x?yI>$zTFlUR$I`YsfpeI#&MaFzH&xJb{ccXdLO zCoajgxj`+SPVWap@d7S=2KVA8$&^6XLkrIWhTi>bU9CjAhWDv*I8^mbw1z}#Ex}(Y zR-U7muxCtNipgcXcJ0t-jMJo)M-u<6EA({wVi5(D|5f)#Z%2FP<4!2E<|zh0Gw*yU`!&rSIumO>6XlP< z*9t_DZ5i$@5ZT4+mniC)@ zQPfBjo>Zc_`Zv8&QGTfU@Ze_%BYJSUF9{W!emlSVkHJ8*8i`Bg4`1PTn^N7}L}!Hz zeZnxL(1)x`pp>R&79GF5C{2mii3*64L@D|3IF1(4@8c-#G1@VnROb&t2}T3)>9<0T z3iA_3h=cK}Ur@%_DFtwYX_qUE6yS$oEaW`6MARc;+)+~4T2)OU(rD*QJ6l5asp~af z=pXQeKk8W6|Cuo*izSzNnkxU|K(cc1JYsp-_)v0!^pI8=sep~)V9wa@wdS0$*K3&W z2W$*HxLL++GbG6T7+*vyHc%b{P>h2v_SBqQ-k!`TJG)%G=fDhqu>8VGLOFUfe^a8^ zm8$|r09U3MChF)|5OxT5qoQIdGO}7>qPD`-tl0J06t|S?fIF=Tg#)@{@N2>WS2XjC zjt7XQkDzhC91U<1cBB}M!SUcKD5E+sWMvR7J$b1}ykrxtNKD@LxJ2X|3w=4N_R{B+ zR$ooL(cQkaRC|2@OExU&WqVKwXX5K!L)&6>PjONw;QL1vHm~cvZx7@~Q#RTH0P*|h z7QX@GO@)fFNVJ7K$xSD8u3xw~QwA>UL|EWZE0>MeE{R*+>E|R1Gu=EZWFkQ%Bow>fay`2ld&c#r}(*fXYa9?LWkUU_w!h#ie z;u}gc7aA~}IEt1VQAqcD;t2+29=ZCVdTS~p$k9S5H>B zK-d##(rKiQT|u!atR^C`aT4T6R|je5)#Vj1cJO%B>}l%K1xDjkJq@bA{r0-eI0c1T zA_paGkSYHo?k%i%uP}$UD&&R*dfkBDEquWowai*-0eKoO44Nu+??lNki67>HyY^ZF ztTTn>mjj`G-y#s^7K>RJ5ysv}>$c?8xP8#=?lcKQk*57XgR5UF+F=zcP(W)&md+k8 zQP`@!8d!tlrMtBz3a>{;l9B<5rzJH}8*%R6N+QYra4&?d6<&N1kMl%MCgQ?S^urf- zD|>>8_ud#0BKQd3^dRr8+H%Mh1^6Fso9k?$E`+PJAS!4^ zs7Gsb89>(!87hhG+kKIYMle4zTsNm0A7K@0aIe7oq0#QIo8aIQo$87k$W(ENI|6Ip z-kVP!g9vqAf>7NxQlxUYU$X80S-FFe#T=X>ac8KJ^Ga{Upd+)CnA$5#wvAI0+#QB#-%%^H40TW*k! zRR<}Mqo&vinDLD;I+4UjQG2d@Rn0i{NTe1b`WDhR)^sc+$g_9h^5ha(NbmwxMIQ2j z5b#!mfOrUj)kv;a>Tkt83;ZSmybTe7KfzzWlhxiV3Egf8O*)C)0Q}zsKsQo!uvWOh ze=)N+RdKR+aAr2OcLMx%AKz|%5*g1N4s13B`~$344D!MPD*4~djU62BYCYM~C?)}{ zn9~Jx#Qf`6{(h|hTRS+oFgrK_oPkf0v5Td>-Ccx|9h4b0pinYkjZa{fT9B6wa0BTt z!tZ0h&AIbj$mx8{?gJtk|2P+@5C4{Pb3*RY(s}NL+yQK!@kjH=@V}e8SpwYeZ9aKa z^7XGP5esY%%%K4CA_pGaUx#99Z)*!Y8KSN(&+MIU#)!8s$4(*<83J&jt3?q4f)s=R z0YM48EB<2KED`>EGoUM0IIv!9C6;J>J7|svl4jf2Mp4n`%p-;*1}GXj3ruw0Cv+Px|`b zU+%36Pz&rL2 z^365*&AdrudHc-WFBFU74%{C?|IUtio80!bi3k=bbO7bHP$J4Z$RI**GKk&A-7nOg z_72=1LT{jVo>7c;P}ec+uAE|i)14l;<)n;84sxckp2F54ZrKZO1rxPO~G9f({E1-$eCCBRM&{EWWhxq}QM^d=JGHtv3*jr@1u z{t)_ic*SipEK*rKHt-%j2U-qrp`QfqAcF|K@!-6TyI&}y$Q`&pg#PUodYf!$^{_h~ zC=}(7ew17E4l;<)8^@K~xch}tOWuL|L+Ib$Ft^D9mpL2WK%qXs?uiVvzlUIzx`PZN z^tZprZ62snMlc?P+#S3>l>VmP*+HSfji%%QrOpB$Cvd5V@^_#?rT(jN0+$M{dggS5P^tfF zq`;*%8{NVCQ|kRz3cSE3sMOEKztJF70G*jZzTEj#fmap;#SsDS!2MQw8+zyS4_>Vg zluTj%n+!6#z4I{wFT?~&2(tk>i=bthZuf8C$$UT&sg7U>kV|lXKLK6~1eBKI1V+2L zLGC=J`vuW?f+0Wz-QOF4CqoAnMC%1cyAgC}2LPTP7ZjoQ5)1(%=>BIOJZUT_E%p@{ z?MBd@k2!emK~O|w5EueP(EU#~ct$=@T30X_?MBd@5A*$(EHn}f0V3%B=NCM`5~!e% zC@|WMpgTvF;2AAI5qgPW2oOQ{k0!zMJb=<-lfY;=-_Ansb=R*{DRPI4h2B!KT2;98#8=fA%F EFF=7@r~m)} literal 0 HcmV?d00001 From 5f60924a2993587c0063e27870f1576f22f2a0f5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 7 Jan 2025 16:29:08 +0800 Subject: [PATCH 0569/2029] modify code --- .../Code01_PersistentSegmentTree.java | 135 +++++++++++++ .../Code02_SmallestMissingNaturalNumber.java | 101 +++++++++ src/class157/Code03_LargestMedian.java | 191 ++++++++++++++++++ 3 files changed, 427 insertions(+) create mode 100644 src/class157/Code01_PersistentSegmentTree.java create mode 100644 src/class157/Code02_SmallestMissingNaturalNumber.java create mode 100644 src/class157/Code03_LargestMedian.java diff --git a/src/class157/Code01_PersistentSegmentTree.java b/src/class157/Code01_PersistentSegmentTree.java new file mode 100644 index 000000000..3e1e0ab45 --- /dev/null +++ b/src/class157/Code01_PersistentSegmentTree.java @@ -0,0 +1,135 @@ +package class157; + +// 可持久化线段树模版题 +// 测试链接 : https://www.luogu.com.cn/problem/P3834 +// 提交以下的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 Code01_PersistentSegmentTree { + + public static int MAXN = 200001; + + public static int MAXM = MAXN * 22; + + public static int n, m; + + public static int[] arr = new int[MAXN]; + + public static int[] sort = new int[MAXN]; + + public static int[] root = new int[MAXN]; + + public static int[] left = new int[MAXM]; + + public static int[] right = new int[MAXM]; + + public static int[] count = new int[MAXM]; + + public static int cnt; + + public static void prepare() { + cnt = 0; + for (int i = 1; i <= n; i++) { + sort[i] = arr[i]; + } + Arrays.sort(sort, 1, n + 1); + root[0] = build(1, n); + } + + public static int build(int l, int r) { + int rt = ++cnt; + count[rt] = 0; + if (l < r) { + int mid = (l + r) / 2; + left[rt] = build(l, mid); + right[rt] = build(mid + 1, r); + } + return rt; + } + + public static int rank(int v) { + int l = 1; + int r = n; + int m = 0; + int ans = 0; + while (l <= r) { + m = (l + r) / 2; + if (sort[m] <= v) { + ans = m; + l = m + 1; + } else { + r = m - 1; + } + } + return ans; + } + + public static int insert(int p, int l, int r, int x) { + int rt = ++cnt; + left[rt] = left[p]; + right[rt] = right[p]; + count[rt] = count[p] + 1; + if (l < r) { + int mid = (l + r) / 2; + if (x <= mid) { + left[rt] = insert(left[p], l, mid, x); + } else { + right[rt] = insert(right[p], mid + 1, r, x); + } + } + return rt; + } + + public static int query(int u, int v, int k, int l, int r) { + if (l == r) { + return l; + } + int lcount = count[left[v]] - count[left[u]]; + int mid = (l + r) / 2; + if (lcount >= k) { + return query(left[u], left[v], k, l, mid); + } else { + return query(right[u], right[v], k - lcount, mid + 1, r); + } + } + + 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; i <= n; i++) { + in.nextToken(); + arr[i] = (int) in.nval; + } + prepare(); + for (int i = 1, x; i <= n; i++) { + x = rank(arr[i]); + root[i] = insert(root[i - 1], 1, n, x); + } + for (int i = 1, l, r, k; i <= m; i++) { + in.nextToken(); + l = (int) in.nval; + in.nextToken(); + r = (int) in.nval; + in.nextToken(); + k = (int) in.nval; + int ans = query(root[l - 1], root[r], k, 1, n); + out.println(sort[ans]); + } + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class157/Code02_SmallestMissingNaturalNumber.java b/src/class157/Code02_SmallestMissingNaturalNumber.java new file mode 100644 index 000000000..de34b2be3 --- /dev/null +++ b/src/class157/Code02_SmallestMissingNaturalNumber.java @@ -0,0 +1,101 @@ +package class157; + +// 区间内没有出现的最小自然数 +// 给定一个长度为n的数组arr,一共有m次询问 +// 每次查询一个区间[l, r]内没有出现过的最小自然数 +// 注意0是自然数 +// 测试链接 : https://www.luogu.com.cn/problem/P4137 +// 提交以下的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 Code02_SmallestMissingNaturalNumber { + + public static int MAXN = 200001; + + public static int MAXM = MAXN * 22; + + public static int[] root = new int[MAXN]; + + public static int[] left = new int[MAXM]; + + public static int[] right = new int[MAXM]; + + // last[i] : l~r的信息存在last[i] + // 表示该范围每个数字最后出现的位置中,最左在哪 + public static int[] lateLeft = new int[MAXM]; + + public static int n, m, cnt; + + public static int update(int pre, int l, int r, int v, int pos) { + int rt = ++cnt; + left[rt] = left[pre]; + right[rt] = right[pre]; + lateLeft[rt] = lateLeft[pre]; + if (l == r) { + lateLeft[rt] = pos; + } else { + int mid = (l + r) / 2; + if (v <= mid) { + left[rt] = update(left[pre], l, mid, v, pos); + } else { + right[rt] = update(right[pre], mid + 1, r, v, pos); + } + lateLeft[rt] = Math.min(lateLeft[left[rt]], lateLeft[right[rt]]); + } + return rt; + } + + public static int query(int rt, int l, int r, int pos) { + if (l == r) { + return l; + } + int mid = (l + r) / 2; + if (lateLeft[left[rt]] < pos) { + // l...mid范围上,每个数字最晚出现的位置中 + // 最左的位置如果在pos以左,说明l...mid范围上,一定有缺失的数字 + return query(left[rt], l, mid, pos); + } else { + // 缺失的数字一定在mid+1....r范围 + // 因为l...r一定有缺失的数字才会来到这个范围的 + // 如果左侧不缺失,那缺失的数字一定在右侧范围上 + return query(right[rt], mid + 1, r, pos); + } + } + + 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; + cnt = 0; + for (int i = 1, v; i <= n; i++) { + in.nextToken(); + v = (int) in.nval; + if (v >= n) { + root[i] = root[i - 1]; + } else { + root[i] = update(root[i - 1], 0, n, v, i); + } + } + for (int i = 1, l, r; i <= m; i++) { + in.nextToken(); + l = (int) in.nval; + in.nextToken(); + r = (int) in.nval; + out.println(query(root[r], 0, n, l)); + } + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class157/Code03_LargestMedian.java b/src/class157/Code03_LargestMedian.java new file mode 100644 index 000000000..4a26cf930 --- /dev/null +++ b/src/class157/Code03_LargestMedian.java @@ -0,0 +1,191 @@ +package class157; + +// 最大的中位数 +// 测试链接 : https://www.luogu.com.cn/problem/P2839 +// 提交以下的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_LargestMedian { + + public static int MAXN = 20001; + + public static int MAXM = MAXN * 20; + + public static int INF = 10000001; + + public static int n, m; + + // 原始位置、数值 + public static int[][] arr = new int[MAXN][2]; + + public static int[] root = new int[MAXN]; + + public static int[] left = new int[MAXM]; + + public static int[] right = new int[MAXM]; + + // 区间内最大前缀和,前缀不能为空 + public static int[] pre = new int[MAXM]; + + // 区间内最大后缀和,后缀不能为空 + public static int[] suf = new int[MAXM]; + + // 区间内累加和,区间为空认为累加和是0 + public static int[] sum = new int[MAXM]; + + public static int cnt; + + // 查询的问题,a、b、c、d + public static int[] ques = new int[4]; + + // 收集区间信息,pre、suf、sum + public static int[] info = new int[3]; + + public static int build(int l, int r) { + int rt = ++cnt; + pre[rt] = suf[rt] = sum[rt] = r - l + 1; + if (l < r) { + int mid = (l + r) / 2; + left[rt] = build(l, mid); + right[rt] = build(mid + 1, r); + } + return rt; + } + + public static int clone(int i) { + int rt = ++cnt; + left[rt] = left[i]; + right[rt] = right[i]; + pre[rt] = pre[i]; + suf[rt] = suf[i]; + sum[rt] = sum[i]; + return rt; + } + + public static void up(int i) { + pre[i] = Math.max(pre[left[i]], sum[left[i]] + pre[right[i]]); + suf[i] = Math.max(suf[right[i]], suf[left[i]] + sum[right[i]]); + sum[i] = sum[left[i]] + sum[right[i]]; + } + + public static int update(int p, int l, int r, int x) { + int rt = clone(p); + if (l == r) { + pre[rt] = suf[rt] = sum[rt] = -1; + } else { + int mid = (l + r) / 2; + if (x <= mid) { + left[rt] = update(left[rt], l, mid, x); + } else { + right[rt] = update(right[rt], mid + 1, r, x); + } + up(rt); + } + return rt; + } + + public static void prepare() { + Arrays.sort(arr, 1, n + 1, (a, b) -> a[1] - b[1]); + cnt = 0; + root[1] = build(1, n); + for (int i = 2; i <= n; i++) { + root[i] = update(root[i - 1], 1, n, arr[i - 1][0]); + } + } + + public static void initInfo() { + info[0] = info[1] = -INF; + info[2] = 0; + } + + public static void mergeRight(int r) { + info[0] = Math.max(info[0], info[2] + pre[r]); + info[1] = Math.max(suf[r], info[1] + sum[r]); + info[2] += sum[r]; + } + + public static void query(int jobl, int jobr, int l, int r, int i) { + if (jobl <= l && r <= jobr) { + mergeRight(i); + } else { + int mid = (l + r) / 2; + if (jobl <= mid) { + query(jobl, jobr, l, mid, left[i]); + } + if (jobr > mid) { + query(jobl, jobr, mid + 1, r, right[i]); + } + } + } + + public static boolean check(int i) { + int a = ques[0] + 1, b = ques[1] + 1, c = ques[2] + 1, d = ques[3] + 1, best; + initInfo(); + query(a, b, 1, n, root[i]); + best = info[1]; + initInfo(); + query(c, d, 1, n, root[i]); + best += info[0]; + if (b + 1 <= c - 1) { + initInfo(); + query(b + 1, c - 1, 1, n, root[i]); + best += info[2]; + } + return best >= 0; + } + + public static int compute() { + int left = 1, right = n, mid; + int ans = 0; + while (left <= right) { + mid = (left + right) / 2; + if (check(mid)) { + ans = arr[mid][1]; + left = mid + 1; + } else { + right = mid - 1; + } + } + return ans; + } + + 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; + for (int i = 1; i <= n; i++) { + arr[i][0] = i; + in.nextToken(); + arr[i][1] = (int) in.nval; + } + prepare(); + in.nextToken(); + m = (int) in.nval; + for (int i = 1, lastAns = 0; i <= m; i++) { + in.nextToken(); + ques[0] = ((int) in.nval + lastAns) % n; + in.nextToken(); + ques[1] = ((int) in.nval + lastAns) % n; + in.nextToken(); + ques[2] = ((int) in.nval + lastAns) % n; + in.nextToken(); + ques[3] = ((int) in.nval + lastAns) % n; + Arrays.sort(ques); + lastAns = compute(); + out.println(lastAns); + } + out.flush(); + out.close(); + br.close(); + } + +} From 7ecd690012235f9f976ab26064d65797759af7b7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 7 Jan 2025 20:52:33 +0800 Subject: [PATCH 0570/2029] modify code --- src/class157/Code04_CountOnTree.java | 256 +++++++++++++++++++++++++++ 1 file changed, 256 insertions(+) create mode 100644 src/class157/Code04_CountOnTree.java diff --git a/src/class157/Code04_CountOnTree.java b/src/class157/Code04_CountOnTree.java new file mode 100644 index 000000000..94e13bb61 --- /dev/null +++ b/src/class157/Code04_CountOnTree.java @@ -0,0 +1,256 @@ +package class157; + +// 两节点间第k小值 +// 测试链接 : https://www.luogu.com.cn/problem/P2633 +// 提交以下的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 Code04_CountOnTree { + + public static int MAXN = 100001; + + public static int MAXH = 20; + + public static int MAXM = MAXN * MAXH; + + public static int n, s, m; + + // 各个节点权值 + public static int[] arr = new int[MAXN]; + + // 收集权值排序做离散化 + public static int[] sort = 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 = 0; + + // 可持久化线段树 + public static int[] root = new int[MAXN]; + + public static int[] left = new int[MAXM]; + + public static int[] right = new int[MAXM]; + + public static int[] count = new int[MAXM]; + + public static int cntt = 0; + + // 树上倍增找lca需要 + public static int[] deep = new int[MAXN]; + + public static int[][] stjump = new int[MAXN][MAXH]; + + public static int rank(int num) { + int left = 1, right = s, mid; + while (left <= right) { + mid = (left + right) / 2; + if (sort[mid] == num) { + return mid; + } else if (sort[mid] < num) { + left = mid + 1; + } else { + right = mid - 1; + } + } + return -1; + } + + public static int build(int l, int r) { + int rt = ++cntt; + count[rt] = 0; + if (l < r) { + int mid = (l + r) / 2; + left[rt] = build(l, mid); + right[rt] = build(mid + 1, r); + } + return rt; + } + + public static void prepare() { + for (int i = 1; i <= n; i++) { + sort[i] = arr[i]; + } + Arrays.sort(sort, 1, n + 1); + s = 1; + for (int i = 2; i <= n; i++) { + if (sort[s] != sort[i]) { + sort[++s] = sort[i]; + } + } + root[0] = build(1, s); + } + + public static void addEdge(int u, int v) { + next[++cntg] = head[u]; + to[cntg] = v; + head[u] = cntg; + } + + public static int insert(int p, int l, int r, int x) { + int rt = ++cntt; + left[rt] = left[p]; + right[rt] = right[p]; + count[rt] = count[p] + 1; + if (l < r) { + int mid = (l + r) / 2; + if (x <= mid) { + left[rt] = insert(left[rt], l, mid, x); + } else { + right[rt] = insert(right[rt], mid + 1, r, x); + } + } + return rt; + } + + public static int query(int u, int v, int fa, int fafa, int l, int r, int k) { + if (l == r) { + return l; + } + int leftCnt = count[left[u]] + count[left[v]] - count[left[fa]] - count[left[fafa]]; + int mid = (l + r) / 2; + if (leftCnt >= k) { + return query(left[u], left[v], left[fa], left[fafa], l, mid, k); + } else { + return query(right[u], right[v], right[fa], right[fafa], mid + 1, r, k - leftCnt); + } + } + + // dfs递归版,C++可以通过,java无法通过,递归会爆栈 + public static void dfs1(int u, int f) { + root[u] = insert(root[f], 1, s, rank(arr[u])); + deep[u] = deep[f] + 1; + 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); + } + } + } + + // dfs迭代版,都可以通过,讲解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 dfs2() { + stackSize = 0; + push(1, 0, -1); + while (stackSize > 0) { + pop(); + if (e == -1) { + root[u] = insert(root[f], 1, s, rank(arr[u])); + deep[u] = deep[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 = next[e]; + } + if (e != 0) { + push(u, f, e); + if (to[e] != f) { + push(to[e], u, -1); + } + } + } + } + + public static int lca(int a, int b) { + if (deep[a] < deep[b]) { + int tmp = a; + a = b; + b = tmp; + } + for (int p = MAXH - 1; p >= 0; p--) { + if (deep[stjump[a][p]] >= deep[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 kth(int u, int v, int k) { + int lca = lca(u, v); + int i = query(root[u], root[v], root[lca], root[stjump[lca][0]], 1, s, k); + return sort[i]; + } + + 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; i <= n; i++) { + in.nextToken(); + arr[i] = (int) in.nval; + } + prepare(); + 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); + } + dfs2(); // 用迭代版dfs,防止爆栈 + for (int i = 1, u, v, k, lastAns = 0; i <= m; i++) { + in.nextToken(); + u = (int) in.nval; + in.nextToken(); + v = (int) in.nval; + in.nextToken(); + k = (int) in.nval; + lastAns = kth(u ^ lastAns, v, k); + out.println(lastAns); + } + out.flush(); + out.close(); + br.close(); + } + +} From 08dfdc66f80256a4b901a99617ecd2e8dcbc504a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 7 Jan 2025 21:05:13 +0800 Subject: [PATCH 0571/2029] modify code --- src/class157/Code04_CountOnTree.java | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/class157/Code04_CountOnTree.java b/src/class157/Code04_CountOnTree.java index 94e13bb61..4a016cb16 100644 --- a/src/class157/Code04_CountOnTree.java +++ b/src/class157/Code04_CountOnTree.java @@ -20,7 +20,7 @@ public class Code04_CountOnTree { public static int MAXM = MAXN * MAXH; - public static int n, s, m; + public static int n, s, q; // 各个节点权值 public static int[] arr = new int[MAXN]; @@ -54,15 +54,15 @@ public class Code04_CountOnTree { public static int[][] stjump = new int[MAXN][MAXH]; public static int rank(int num) { - int left = 1, right = s, mid; - while (left <= right) { - mid = (left + right) / 2; - if (sort[mid] == num) { - return mid; - } else if (sort[mid] < num) { - left = mid + 1; + int l = 1, r = s, m; + while (l <= r) { + m = (l + r) / 2; + if (sort[m] == num) { + return m; + } else if (sort[m] < num) { + l = m + 1; } else { - right = mid - 1; + r = m - 1; } } return -1; @@ -223,7 +223,7 @@ public static void main(String[] args) throws IOException { in.nextToken(); n = (int) in.nval; in.nextToken(); - m = (int) in.nval; + q = (int) in.nval; for (int i = 1; i <= n; i++) { in.nextToken(); arr[i] = (int) in.nval; @@ -238,7 +238,7 @@ public static void main(String[] args) throws IOException { addEdge(v, u); } dfs2(); // 用迭代版dfs,防止爆栈 - for (int i = 1, u, v, k, lastAns = 0; i <= m; i++) { + for (int i = 1, u, v, k, lastAns = 0; i <= q; i++) { in.nextToken(); u = (int) in.nval; in.nextToken(); From b2cf6a7eaa5fc6feb89fcc65d83b581ff638b788 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 7 Jan 2025 21:11:52 +0800 Subject: [PATCH 0572/2029] modify code --- .../Code01_PersistentSegmentTree.java | 11 ++---- .../Code02_SmallestMissingNaturalNumber.java | 6 +-- src/class157/Code03_LargestMedian.java | 38 ++++++++----------- 3 files changed, 23 insertions(+), 32 deletions(-) diff --git a/src/class157/Code01_PersistentSegmentTree.java b/src/class157/Code01_PersistentSegmentTree.java index 3e1e0ab45..95d177626 100644 --- a/src/class157/Code01_PersistentSegmentTree.java +++ b/src/class157/Code01_PersistentSegmentTree.java @@ -18,7 +18,7 @@ public class Code01_PersistentSegmentTree { public static int MAXM = MAXN * 22; - public static int n, m; + public static int n, q; public static int[] arr = new int[MAXN]; @@ -55,10 +55,7 @@ public static int build(int l, int r) { } public static int rank(int v) { - int l = 1; - int r = n; - int m = 0; - int ans = 0; + int l = 1, r = n, m, ans = 0; while (l <= r) { m = (l + r) / 2; if (sort[m] <= v) { @@ -107,7 +104,7 @@ public static void main(String[] args) throws IOException { in.nextToken(); n = (int) in.nval; in.nextToken(); - m = (int) in.nval; + q = (int) in.nval; for (int i = 1; i <= n; i++) { in.nextToken(); arr[i] = (int) in.nval; @@ -117,7 +114,7 @@ public static void main(String[] args) throws IOException { x = rank(arr[i]); root[i] = insert(root[i - 1], 1, n, x); } - for (int i = 1, l, r, k; i <= m; i++) { + for (int i = 1, l, r, k; i <= q; i++) { in.nextToken(); l = (int) in.nval; in.nextToken(); diff --git a/src/class157/Code02_SmallestMissingNaturalNumber.java b/src/class157/Code02_SmallestMissingNaturalNumber.java index de34b2be3..a1850c8ef 100644 --- a/src/class157/Code02_SmallestMissingNaturalNumber.java +++ b/src/class157/Code02_SmallestMissingNaturalNumber.java @@ -30,7 +30,7 @@ public class Code02_SmallestMissingNaturalNumber { // 表示该范围每个数字最后出现的位置中,最左在哪 public static int[] lateLeft = new int[MAXM]; - public static int n, m, cnt; + public static int n, q, cnt; public static int update(int pre, int l, int r, int v, int pos) { int rt = ++cnt; @@ -75,7 +75,7 @@ public static void main(String[] args) throws IOException { in.nextToken(); n = (int) in.nval; in.nextToken(); - m = (int) in.nval; + q = (int) in.nval; cnt = 0; for (int i = 1, v; i <= n; i++) { in.nextToken(); @@ -86,7 +86,7 @@ public static void main(String[] args) throws IOException { root[i] = update(root[i - 1], 0, n, v, i); } } - for (int i = 1, l, r; i <= m; i++) { + for (int i = 1, l, r; i <= q; i++) { in.nextToken(); l = (int) in.nval; in.nextToken(); diff --git a/src/class157/Code03_LargestMedian.java b/src/class157/Code03_LargestMedian.java index 4a26cf930..f4742ad66 100644 --- a/src/class157/Code03_LargestMedian.java +++ b/src/class157/Code03_LargestMedian.java @@ -20,7 +20,7 @@ public class Code03_LargestMedian { public static int INF = 10000001; - public static int n, m; + public static int n, q; // 原始位置、数值 public static int[][] arr = new int[MAXN][2]; @@ -59,16 +59,6 @@ public static int build(int l, int r) { return rt; } - public static int clone(int i) { - int rt = ++cnt; - left[rt] = left[i]; - right[rt] = right[i]; - pre[rt] = pre[i]; - suf[rt] = suf[i]; - sum[rt] = sum[i]; - return rt; - } - public static void up(int i) { pre[i] = Math.max(pre[left[i]], sum[left[i]] + pre[right[i]]); suf[i] = Math.max(suf[right[i]], suf[left[i]] + sum[right[i]]); @@ -76,7 +66,12 @@ public static void up(int i) { } public static int update(int p, int l, int r, int x) { - int rt = clone(p); + int rt = ++cnt; + left[rt] = left[p]; + right[rt] = right[p]; + pre[rt] = pre[p]; + suf[rt] = suf[p]; + sum[rt] = sum[p]; if (l == r) { pre[rt] = suf[rt] = sum[rt] = -1; } else { @@ -142,15 +137,14 @@ public static boolean check(int i) { } public static int compute() { - int left = 1, right = n, mid; - int ans = 0; - while (left <= right) { - mid = (left + right) / 2; - if (check(mid)) { - ans = arr[mid][1]; - left = mid + 1; + int l = 1, r = n, m, ans = 0; + while (l <= r) { + m = (l + r) / 2; + if (check(m)) { + ans = arr[m][1]; + l = m + 1; } else { - right = mid - 1; + r = m - 1; } } return ans; @@ -169,8 +163,8 @@ public static void main(String[] args) throws IOException { } prepare(); in.nextToken(); - m = (int) in.nval; - for (int i = 1, lastAns = 0; i <= m; i++) { + q = (int) in.nval; + for (int i = 1, lastAns = 0; i <= q; i++) { in.nextToken(); ques[0] = ((int) in.nval + lastAns) % n; in.nextToken(); From d7ef40b46bfd004b1dfaad4ed2b32b475fc11124 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 7 Jan 2025 21:13:27 +0800 Subject: [PATCH 0573/2029] modify code --- src/class157/Code02_SmallestMissingNaturalNumber.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/class157/Code02_SmallestMissingNaturalNumber.java b/src/class157/Code02_SmallestMissingNaturalNumber.java index a1850c8ef..abf512604 100644 --- a/src/class157/Code02_SmallestMissingNaturalNumber.java +++ b/src/class157/Code02_SmallestMissingNaturalNumber.java @@ -20,6 +20,8 @@ public class Code02_SmallestMissingNaturalNumber { public static int MAXM = MAXN * 22; + public static int n, q; + public static int[] root = new int[MAXN]; public static int[] left = new int[MAXM]; @@ -30,7 +32,7 @@ public class Code02_SmallestMissingNaturalNumber { // 表示该范围每个数字最后出现的位置中,最左在哪 public static int[] lateLeft = new int[MAXM]; - public static int n, q, cnt; + public static int cnt; public static int update(int pre, int l, int r, int v, int pos) { int rt = ++cnt; From bfc843a5146ee039ff204774114420fcc0862705 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 7 Jan 2025 21:15:32 +0800 Subject: [PATCH 0574/2029] modify code --- src/class157/Code04_CountOnTree.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/class157/Code04_CountOnTree.java b/src/class157/Code04_CountOnTree.java index 4a016cb16..037e09160 100644 --- a/src/class157/Code04_CountOnTree.java +++ b/src/class157/Code04_CountOnTree.java @@ -1,6 +1,6 @@ package class157; -// 两节点间第k小值 +// 节点路径第k小值 // 测试链接 : https://www.luogu.com.cn/problem/P2633 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -143,7 +143,8 @@ public static void dfs1(int u, int f) { } } - // dfs迭代版,都可以通过,讲解118,详解了从递归版改迭代版 + // dfs迭代版,都可以通过 + // 讲解118,详解了从递归版改迭代版 public static int[][] ufe = new int[MAXN][3]; public static int stackSize, u, f, e; From 48495b53bc9d2bd81657a680fc24aaf3aa09b27c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 7 Jan 2025 21:18:16 +0800 Subject: [PATCH 0575/2029] modify code --- src/class157/Code04_CountOnTree.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class157/Code04_CountOnTree.java b/src/class157/Code04_CountOnTree.java index 037e09160..a6d17caff 100644 --- a/src/class157/Code04_CountOnTree.java +++ b/src/class157/Code04_CountOnTree.java @@ -241,12 +241,12 @@ public static void main(String[] args) throws IOException { dfs2(); // 用迭代版dfs,防止爆栈 for (int i = 1, u, v, k, lastAns = 0; i <= q; i++) { in.nextToken(); - u = (int) in.nval; + u = (int) in.nval ^ lastAns; // 题目要求 in.nextToken(); v = (int) in.nval; in.nextToken(); k = (int) in.nval; - lastAns = kth(u ^ lastAns, v, k); + lastAns = kth(u, v, k); out.println(lastAns); } out.flush(); From 60bafb0bc0aaff72ad5cacf9233ec3d761b61653 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 8 Jan 2025 19:57:36 +0800 Subject: [PATCH 0576/2029] modify code --- .../Code01_PersistentSegmentTree.java | 26 +- .../Code02_SmallestMissingNaturalNumber.java | 28 +-- src/class157/Code03_LargestMedian.java | 20 +- src/class157/Code04_CountOnTree.java | 45 ++-- src/class157/Code05_MoreImpressive1.java | 233 ++++++++++++++++++ src/class157/Code05_MoreImpressive2.java | 130 ++++++++++ 6 files changed, 423 insertions(+), 59 deletions(-) create mode 100644 src/class157/Code05_MoreImpressive1.java create mode 100644 src/class157/Code05_MoreImpressive2.java diff --git a/src/class157/Code01_PersistentSegmentTree.java b/src/class157/Code01_PersistentSegmentTree.java index 95d177626..e571c4637 100644 --- a/src/class157/Code01_PersistentSegmentTree.java +++ b/src/class157/Code01_PersistentSegmentTree.java @@ -68,32 +68,32 @@ public static int rank(int v) { return ans; } - public static int insert(int p, int l, int r, int x) { + public static int insert(int jobi, int l, int r, int i) { int rt = ++cnt; - left[rt] = left[p]; - right[rt] = right[p]; - count[rt] = count[p] + 1; + left[rt] = left[i]; + right[rt] = right[i]; + count[rt] = count[i] + 1; if (l < r) { int mid = (l + r) / 2; - if (x <= mid) { - left[rt] = insert(left[p], l, mid, x); + if (jobi <= mid) { + left[rt] = insert(jobi, l, mid, left[rt]); } else { - right[rt] = insert(right[p], mid + 1, r, x); + right[rt] = insert(jobi, mid + 1, r, right[rt]); } } return rt; } - public static int query(int u, int v, int k, int l, int r) { + public static int query(int jobk, int l, int r, int u, int v) { if (l == r) { return l; } int lcount = count[left[v]] - count[left[u]]; int mid = (l + r) / 2; - if (lcount >= k) { - return query(left[u], left[v], k, l, mid); + if (lcount >= jobk) { + return query(jobk, l, mid, left[u], left[v]); } else { - return query(right[u], right[v], k - lcount, mid + 1, r); + return query(jobk - lcount, mid + 1, r, right[u], right[v]); } } @@ -112,7 +112,7 @@ public static void main(String[] args) throws IOException { prepare(); for (int i = 1, x; i <= n; i++) { x = rank(arr[i]); - root[i] = insert(root[i - 1], 1, n, x); + root[i] = insert(x, 1, n, root[i - 1]); } for (int i = 1, l, r, k; i <= q; i++) { in.nextToken(); @@ -121,7 +121,7 @@ public static void main(String[] args) throws IOException { r = (int) in.nval; in.nextToken(); k = (int) in.nval; - int ans = query(root[l - 1], root[r], k, 1, n); + int ans = query(k, 1, n, root[l - 1], root[r]); out.println(sort[ans]); } out.flush(); diff --git a/src/class157/Code02_SmallestMissingNaturalNumber.java b/src/class157/Code02_SmallestMissingNaturalNumber.java index abf512604..26bf085fb 100644 --- a/src/class157/Code02_SmallestMissingNaturalNumber.java +++ b/src/class157/Code02_SmallestMissingNaturalNumber.java @@ -34,39 +34,39 @@ public class Code02_SmallestMissingNaturalNumber { public static int cnt; - public static int update(int pre, int l, int r, int v, int pos) { + public static int update(int jobi, int jobv, int l, int r, int i) { int rt = ++cnt; - left[rt] = left[pre]; - right[rt] = right[pre]; - lateLeft[rt] = lateLeft[pre]; + left[rt] = left[i]; + right[rt] = right[i]; + lateLeft[rt] = lateLeft[i]; if (l == r) { - lateLeft[rt] = pos; + lateLeft[rt] = jobv; } else { int mid = (l + r) / 2; - if (v <= mid) { - left[rt] = update(left[pre], l, mid, v, pos); + if (jobi <= mid) { + left[rt] = update(jobi, jobv, l, mid, left[rt]); } else { - right[rt] = update(right[pre], mid + 1, r, v, pos); + right[rt] = update(jobi, jobv, mid + 1, r, right[rt]); } lateLeft[rt] = Math.min(lateLeft[left[rt]], lateLeft[right[rt]]); } return rt; } - public static int query(int rt, int l, int r, int pos) { + public static int query(int pos, int l, int r, int i) { if (l == r) { return l; } int mid = (l + r) / 2; - if (lateLeft[left[rt]] < pos) { + if (lateLeft[left[i]] < pos) { // l...mid范围上,每个数字最晚出现的位置中 // 最左的位置如果在pos以左,说明l...mid范围上,一定有缺失的数字 - return query(left[rt], l, mid, pos); + return query(pos, l, mid, left[i]); } else { // 缺失的数字一定在mid+1....r范围 // 因为l...r一定有缺失的数字才会来到这个范围的 // 如果左侧不缺失,那缺失的数字一定在右侧范围上 - return query(right[rt], mid + 1, r, pos); + return query(pos, mid + 1, r, right[i]); } } @@ -85,7 +85,7 @@ public static void main(String[] args) throws IOException { if (v >= n) { root[i] = root[i - 1]; } else { - root[i] = update(root[i - 1], 0, n, v, i); + root[i] = update(v, i, 0, n, root[i - 1]); } } for (int i = 1, l, r; i <= q; i++) { @@ -93,7 +93,7 @@ public static void main(String[] args) throws IOException { l = (int) in.nval; in.nextToken(); r = (int) in.nval; - out.println(query(root[r], 0, n, l)); + out.println(query(l, 0, n, root[r])); } out.flush(); out.close(); diff --git a/src/class157/Code03_LargestMedian.java b/src/class157/Code03_LargestMedian.java index f4742ad66..0a4993edd 100644 --- a/src/class157/Code03_LargestMedian.java +++ b/src/class157/Code03_LargestMedian.java @@ -65,21 +65,21 @@ public static void up(int i) { sum[i] = sum[left[i]] + sum[right[i]]; } - public static int update(int p, int l, int r, int x) { + public static int update(int jobi, int l, int r, int i) { int rt = ++cnt; - left[rt] = left[p]; - right[rt] = right[p]; - pre[rt] = pre[p]; - suf[rt] = suf[p]; - sum[rt] = sum[p]; + left[rt] = left[i]; + right[rt] = right[i]; + pre[rt] = pre[i]; + suf[rt] = suf[i]; + sum[rt] = sum[i]; if (l == r) { pre[rt] = suf[rt] = sum[rt] = -1; } else { int mid = (l + r) / 2; - if (x <= mid) { - left[rt] = update(left[rt], l, mid, x); + if (jobi <= mid) { + left[rt] = update(jobi, l, mid, left[rt]); } else { - right[rt] = update(right[rt], mid + 1, r, x); + right[rt] = update(jobi, mid + 1, r, right[rt]); } up(rt); } @@ -91,7 +91,7 @@ public static void prepare() { cnt = 0; root[1] = build(1, n); for (int i = 2; i <= n; i++) { - root[i] = update(root[i - 1], 1, n, arr[i - 1][0]); + root[i] = update(arr[i - 1][0], 1, n, root[i - 1]); } } diff --git a/src/class157/Code04_CountOnTree.java b/src/class157/Code04_CountOnTree.java index a6d17caff..52d720c3d 100644 --- a/src/class157/Code04_CountOnTree.java +++ b/src/class157/Code04_CountOnTree.java @@ -37,7 +37,7 @@ public class Code04_CountOnTree { public static int cntg = 0; - // 可持久化线段树 + // 可持久化线段树需要 public static int[] root = new int[MAXN]; public static int[] left = new int[MAXM]; @@ -99,51 +99,51 @@ public static void addEdge(int u, int v) { head[u] = cntg; } - public static int insert(int p, int l, int r, int x) { + public static int insert(int jobi, int l, int r, int i) { int rt = ++cntt; - left[rt] = left[p]; - right[rt] = right[p]; - count[rt] = count[p] + 1; + left[rt] = left[i]; + right[rt] = right[i]; + count[rt] = count[i] + 1; if (l < r) { int mid = (l + r) / 2; - if (x <= mid) { - left[rt] = insert(left[rt], l, mid, x); + if (jobi <= mid) { + left[rt] = insert(jobi, l, mid, left[rt]); } else { - right[rt] = insert(right[rt], mid + 1, r, x); + right[rt] = insert(jobi, mid + 1, r, right[rt]); } } return rt; } - public static int query(int u, int v, int fa, int fafa, int l, int r, int k) { + public static int query(int jobk, int l, int r, int u, int v, int lca, int lcafa) { if (l == r) { return l; } - int leftCnt = count[left[u]] + count[left[v]] - count[left[fa]] - count[left[fafa]]; + int leftCnt = count[left[u]] + count[left[v]] - count[left[lca]] - count[left[lcafa]]; int mid = (l + r) / 2; - if (leftCnt >= k) { - return query(left[u], left[v], left[fa], left[fafa], l, mid, k); + if (leftCnt >= jobk) { + return query(jobk, l, mid, left[u], left[v], left[lca], left[lcafa]); } else { - return query(right[u], right[v], right[fa], right[fafa], mid + 1, r, k - leftCnt); + return query(jobk - leftCnt, mid + 1, r, right[u], right[v], right[lca], right[lcafa]); } } - // dfs递归版,C++可以通过,java无法通过,递归会爆栈 + // 递归版,C++可以通过,java无法通过,递归会爆栈 public static void dfs1(int u, int f) { - root[u] = insert(root[f], 1, s, rank(arr[u])); + root[u] = insert(rank(arr[u]), 1, s, root[f]); deep[u] = deep[f] + 1; 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 ei = head[u]; ei > 0; ei = next[ei]) { + if (to[ei] != f) { + dfs1(to[ei], u); } } } - // dfs迭代版,都可以通过 + // 迭代版,都可以通过 // 讲解118,详解了从递归版改迭代版 public static int[][] ufe = new int[MAXN][3]; @@ -163,13 +163,14 @@ public static void pop() { e = ufe[stackSize][2]; } + // dfs1的迭代版 public static void dfs2() { stackSize = 0; push(1, 0, -1); while (stackSize > 0) { pop(); if (e == -1) { - root[u] = insert(root[f], 1, s, rank(arr[u])); + root[u] = insert(rank(arr[u]), 1, s, root[f]); deep[u] = deep[f] + 1; stjump[u][0] = f; for (int p = 1; p < MAXH; p++) { @@ -213,7 +214,7 @@ public static int lca(int a, int b) { public static int kth(int u, int v, int k) { int lca = lca(u, v); - int i = query(root[u], root[v], root[lca], root[stjump[lca][0]], 1, s, k); + int i = query(k, 1, s, root[u], root[v], root[lca], root[stjump[lca][0]]); return sort[i]; } @@ -238,7 +239,7 @@ public static void main(String[] args) throws IOException { addEdge(u, v); addEdge(v, u); } - dfs2(); // 用迭代版dfs,防止爆栈 + dfs2(); // 使用迭代版防止爆栈 for (int i = 1, u, v, k, lastAns = 0; i <= q; i++) { in.nextToken(); u = (int) in.nval ^ lastAns; // 题目要求 diff --git a/src/class157/Code05_MoreImpressive1.java b/src/class157/Code05_MoreImpressive1.java new file mode 100644 index 000000000..4f4fe1a7c --- /dev/null +++ b/src/class157/Code05_MoreImpressive1.java @@ -0,0 +1,233 @@ +package class157; + +// 更为厉害,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P3899 +// 提交以下的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 Code05_MoreImpressive1 { + + public static int MAXN = 300001; + + public static int MAXM = MAXN * 22; + + public static int n, q; + + // 链式前向星需要 + 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 = 0; + + // 可持久化线段树需要 + public static int[] root = new int[MAXN]; + + public static int[] left = new int[MAXM]; + + public static int[] right = new int[MAXM]; + + public static long[] sum = new long[MAXM]; + + public static int cntt = 0; + + // dfs需要 + public static int[] deep = new int[MAXN]; + + public static int[] size = new int[MAXN]; + + public static int[] dfn = new int[MAXN]; + + public static int cntd = 0; + + public static void addEdge(int u, int v) { + next[++cntg] = head[u]; + to[cntg] = v; + head[u] = cntg; + } + + public static int build(int l, int r) { + int rt = ++cntt; + sum[rt] = 0; + if (l < r) { + int mid = (l + r) / 2; + left[rt] = build(l, mid); + right[rt] = build(mid + 1, r); + } + return rt; + } + + public static int add(int jobi, long jobv, int l, int r, int i) { + int rt = ++cntt; + left[rt] = left[i]; + right[rt] = right[i]; + sum[rt] = sum[i] + jobv; + if (l < r) { + int mid = (l + r) / 2; + if (jobi <= mid) { + left[rt] = add(jobi, jobv, l, mid, left[rt]); + } else { + right[rt] = add(jobi, jobv, mid + 1, r, right[rt]); + } + } + return rt; + } + + public static long query(int jobl, int jobr, int l, int r, int u, int v) { + if (jobl <= l && r <= jobr) { + return sum[u] - sum[v]; + } + long ans = 0; + int mid = (l + r) / 2; + if (jobl <= mid) { + ans += query(jobl, jobr, l, mid, left[u], left[v]); + } + if (jobr > mid) { + ans += query(jobl, jobr, mid + 1, r, right[u], right[v]); + } + return ans; + } + + // 递归版,C++可以通过,java无法通过,递归会爆栈 + public static void dfs1(int u, int f) { + deep[u] = deep[f] + 1; + size[u] = 1; + dfn[u] = ++cntd; + for (int ei = head[u]; ei > 0; ei = next[ei]) { + if (to[ei] != f) { + dfs1(to[ei], u); + } + } + for (int ei = head[u]; ei > 0; ei = next[ei]) { + if (to[ei] != f) { + size[u] += size[to[ei]]; + } + } + } + + // 递归版,C++可以通过,java无法通过,递归会爆栈 + public static void dfs2(int u, int f) { + root[dfn[u]] = add(deep[u], size[u] - 1, 1, n, root[dfn[u] - 1]); + for (int ei = head[u]; ei > 0; ei = next[ei]) { + if (to[ei] != f) { + dfs2(to[ei], u); + } + } + } + + // dfs1、dfs2,分别改成迭代版,dfs3、dfs4 + // 讲解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 dfs3() { + stackSize = 0; + push(1, 0, -1); + while (stackSize > 0) { + pop(); + if (e == -1) { + deep[u] = deep[f] + 1; + size[u] = 1; + dfn[u] = ++cntd; + 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 ei = head[u]; ei > 0; ei = next[ei]) { + if (to[ei] != f) { + size[u] += size[to[ei]]; + } + } + } + } + } + + // dfs2的迭代版 + public static void dfs4() { + stackSize = 0; + push(1, 0, -1); + while (stackSize > 0) { + pop(); + if (e == -1) { + root[dfn[u]] = add(deep[u], size[u] - 1, 1, n, root[dfn[u] - 1]); + e = head[u]; + } else { + e = next[e]; + } + if (e != 0) { + push(u, f, e); + if (to[e] != f) { + push(to[e], u, -1); + } + } + } + } + + public static long compute(int p, int k) { + long ans = query(deep[p] + 1, deep[p] + k, 1, n, root[dfn[p] + size[p] - 1], root[dfn[p] - 1]); + ans += (long) (size[p] - 1) * Math.min(k, deep[p] - 1); + return ans; + } + + 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(); + q = (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); + } + root[0] = build(1, n); + dfs3(); // 使用迭代版防止爆栈 + dfs4(); // 使用迭代版防止爆栈 + for (int i = 1, p, k; i <= q; i++) { + in.nextToken(); + p = (int) in.nval; + in.nextToken(); + k = (int) in.nval; + out.println(compute(p, k)); + } + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class157/Code05_MoreImpressive2.java b/src/class157/Code05_MoreImpressive2.java new file mode 100644 index 000000000..0d43ab40b --- /dev/null +++ b/src/class157/Code05_MoreImpressive2.java @@ -0,0 +1,130 @@ +package class157; + +// 更为厉害,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P3899 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//static const int MAXN = 300001; +//static const int MAXM = MAXN * 22; +//int n, q; +// +//int head[MAXN]; +//int to[MAXN << 1]; +//int nxt[MAXN << 1]; +//int cntg = 0; +// +//int root[MAXN]; +//int ls[MAXM]; +//int rs[MAXM]; +//long long sum[MAXM]; +//int cntt = 0; +// +//int dep[MAXN]; +//int siz[MAXN]; +//int dfn[MAXN]; +//int cntd = 0; +// +//void addEdge(int u, int v) { +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// head[u] = cntg; +//} +// +//int build(int l, int r) { +// int rt = ++cntt; +// sum[rt] = 0LL; +// if (l < r) { +// int mid = (l + r) >> 1; +// ls[rt] = build(l, mid); +// rs[rt] = build(mid + 1, r); +// } +// return rt; +//} +// +//int add(int jobi, long long jobv, int l, int r, int i) { +// int rt = ++cntt; +// ls[rt] = ls[i]; +// rs[rt] = rs[i]; +// sum[rt] = sum[i] + 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 u, int v) { +// if (jobl <= l && r <= jobr) { +// return sum[u] - sum[v]; +// } +// long long ans = 0; +// int mid = (l + r) >> 1; +// if (jobl <= mid) { +// ans += query(jobl, jobr, l, mid, ls[u], ls[v]); +// } +// if (jobr > mid) { +// ans += query(jobl, jobr, mid + 1, r, rs[u], rs[v]); +// } +// return ans; +//} +// +//void dfs1(int u, int f) { +// dep[u] = dep[f] + 1; +// siz[u] = 1; +// dfn[u] = ++cntd; +// for (int ei = head[u]; ei > 0; ei = nxt[ei]) { +// if (to[ei] != f) { +// dfs1(to[ei], u); +// } +// } +// for (int ei = head[u]; ei > 0; ei = nxt[ei]) { +// if (to[ei] != f) { +// siz[u] += siz[to[ei]]; +// } +// } +//} +// +//void dfs2(int u, int f) { +// root[dfn[u]] = add(dep[u], (long long)siz[u] - 1, 1, n, root[dfn[u] - 1]); +// for (int ei = head[u]; ei > 0; ei = nxt[ei]) { +// if (to[ei] != f) { +// dfs2(to[ei], u); +// } +// } +//} +// +//long long compute(int p, int k) { +// long long ans = query(dep[p] + 1, dep[p] + k, 1, n, root[dfn[p] + siz[p] - 1], root[dfn[p] - 1]); +// ans += (long long)(siz[p] - 1) * min(k, dep[p] - 1); +// return ans; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> q; +// for (int i = 1; i < n; i++) { +// int u, v; +// cin >> u >> v; +// addEdge(u, v); +// addEdge(v, u); +// } +// root[0] = build(1, n); +// dfs1(1, 0); +// dfs2(1, 0); +// for(int i = 1; i <= q; i++) { +// int p, k; +// cin >> p >> k; +// cout << compute(p, k) << "\n"; +// } +// return 0; +//} \ No newline at end of file From 89ad6dbd1386609774118f94678bb8017130fedc Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 8 Jan 2025 20:10:08 +0800 Subject: [PATCH 0577/2029] modify code --- src/class157/Code05_MoreImpressive1.java | 4 ++-- src/class157/Code05_MoreImpressive2.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class157/Code05_MoreImpressive1.java b/src/class157/Code05_MoreImpressive1.java index 4f4fe1a7c..6d8c80d9d 100644 --- a/src/class157/Code05_MoreImpressive1.java +++ b/src/class157/Code05_MoreImpressive1.java @@ -83,7 +83,7 @@ public static int add(int jobi, long jobv, int l, int r, int i) { public static long query(int jobl, int jobr, int l, int r, int u, int v) { if (jobl <= l && r <= jobr) { - return sum[u] - sum[v]; + return sum[v] - sum[u]; } long ans = 0; int mid = (l + r) / 2; @@ -194,7 +194,7 @@ public static void dfs4() { } public static long compute(int p, int k) { - long ans = query(deep[p] + 1, deep[p] + k, 1, n, root[dfn[p] + size[p] - 1], root[dfn[p] - 1]); + long ans = query(deep[p] + 1, deep[p] + k, 1, n, root[dfn[p] - 1], root[dfn[p] + size[p] - 1]); ans += (long) (size[p] - 1) * Math.min(k, deep[p] - 1); return ans; } diff --git a/src/class157/Code05_MoreImpressive2.java b/src/class157/Code05_MoreImpressive2.java index 0d43ab40b..e33ed5d16 100644 --- a/src/class157/Code05_MoreImpressive2.java +++ b/src/class157/Code05_MoreImpressive2.java @@ -64,7 +64,7 @@ // //long long query(int jobl, int jobr, int l, int r, int u, int v) { // if (jobl <= l && r <= jobr) { -// return sum[u] - sum[v]; +// return sum[v] - sum[u]; // } // long long ans = 0; // int mid = (l + r) >> 1; @@ -103,7 +103,7 @@ //} // //long long compute(int p, int k) { -// long long ans = query(dep[p] + 1, dep[p] + k, 1, n, root[dfn[p] + siz[p] - 1], root[dfn[p] - 1]); +// long long ans = query(dep[p] + 1, dep[p] + k, 1, n, root[dfn[p] - 1], root[dfn[p] + siz[p] - 1]); // ans += (long long)(siz[p] - 1) * min(k, dep[p] - 1); // return ans; //} From 67201db30e85bd6a90ff2ed133e5d64487f78256 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 10 Jan 2025 00:57:51 +0800 Subject: [PATCH 0578/2029] modify code --- .../Code01_PersistentSegmentTree.java | 18 +- ... Code02_MissingSmallestNaturalNumber.java} | 2 +- .../Code03_RangeDifferentNumbers1.java | 219 +++++++++++++++++ .../Code03_RangeDifferentNumbers2.java | 123 ++++++++++ ...tMedian.java => Code04_LargestMedian.java} | 20 +- ...untOnTree.java => Code05_CountOnTree.java} | 2 +- ...sive1.java => Code06_MoreImpressive1.java} | 2 +- ...sive2.java => Code06_MoreImpressive2.java} | 0 src/class157/Code07_ToTheMoon1.java | 225 ++++++++++++++++++ src/class157/Code07_ToTheMoon2.java | 103 ++++++++ 10 files changed, 692 insertions(+), 22 deletions(-) rename src/class157/{Code02_SmallestMissingNaturalNumber.java => Code02_MissingSmallestNaturalNumber.java} (98%) create mode 100644 src/class157/Code03_RangeDifferentNumbers1.java create mode 100644 src/class157/Code03_RangeDifferentNumbers2.java rename src/class157/{Code03_LargestMedian.java => Code04_LargestMedian.java} (99%) rename src/class157/{Code04_CountOnTree.java => Code05_CountOnTree.java} (99%) rename src/class157/{Code05_MoreImpressive1.java => Code06_MoreImpressive1.java} (99%) rename src/class157/{Code05_MoreImpressive2.java => Code06_MoreImpressive2.java} (100%) create mode 100644 src/class157/Code07_ToTheMoon1.java create mode 100644 src/class157/Code07_ToTheMoon2.java diff --git a/src/class157/Code01_PersistentSegmentTree.java b/src/class157/Code01_PersistentSegmentTree.java index e571c4637..e6c59d1f9 100644 --- a/src/class157/Code01_PersistentSegmentTree.java +++ b/src/class157/Code01_PersistentSegmentTree.java @@ -34,15 +34,6 @@ public class Code01_PersistentSegmentTree { public static int cnt; - public static void prepare() { - cnt = 0; - for (int i = 1; i <= n; i++) { - sort[i] = arr[i]; - } - Arrays.sort(sort, 1, n + 1); - root[0] = build(1, n); - } - public static int build(int l, int r) { int rt = ++cnt; count[rt] = 0; @@ -54,6 +45,15 @@ public static int build(int l, int r) { return rt; } + public static void prepare() { + cnt = 0; + for (int i = 1; i <= n; i++) { + sort[i] = arr[i]; + } + Arrays.sort(sort, 1, n + 1); + root[0] = build(1, n); + } + public static int rank(int v) { int l = 1, r = n, m, ans = 0; while (l <= r) { diff --git a/src/class157/Code02_SmallestMissingNaturalNumber.java b/src/class157/Code02_MissingSmallestNaturalNumber.java similarity index 98% rename from src/class157/Code02_SmallestMissingNaturalNumber.java rename to src/class157/Code02_MissingSmallestNaturalNumber.java index 26bf085fb..bb0d4be29 100644 --- a/src/class157/Code02_SmallestMissingNaturalNumber.java +++ b/src/class157/Code02_MissingSmallestNaturalNumber.java @@ -14,7 +14,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code02_SmallestMissingNaturalNumber { +public class Code02_MissingSmallestNaturalNumber { public static int MAXN = 200001; diff --git a/src/class157/Code03_RangeDifferentNumbers1.java b/src/class157/Code03_RangeDifferentNumbers1.java new file mode 100644 index 000000000..ae7cb3c07 --- /dev/null +++ b/src/class157/Code03_RangeDifferentNumbers1.java @@ -0,0 +1,219 @@ +package class157; + +// 区间内的不同数字,java版 +// 测试链接 : https://acm.hdu.edu.cn/showproblem.php?pid=5919 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.util.Arrays; + +public class Code03_RangeDifferentNumbers1 { + + public static int MAXN = 200002; + + public static int MAXM = MAXN * 37; + + public static int cases, n, q; + + public static int[] arr = new int[MAXN]; + + public static int[] pos = new int[MAXN]; + + public static int[] root = new int[MAXN]; + + public static int[] left = new int[MAXM]; + + public static int[] right = new int[MAXM]; + + public static int[] diff = new int[MAXM]; + + public static int cnt; + + public static int build(int l, int r) { + int rt = ++cnt; + if (l == r) { + return rt; + } + int mid = (l + r) / 2; + left[rt] = build(l, mid); + right[rt] = build(mid + 1, r); + return rt; + } + + public static int update(int jobi, int jobv, int l, int r, int i) { + int rt = ++cnt; + left[rt] = left[i]; + right[rt] = right[i]; + diff[rt] = diff[i] + jobv; + if (l == r) { + return rt; + } + int mid = (l + r) / 2; + if (jobi <= mid) { + left[rt] = update(jobi, jobv, l, mid, left[rt]); + } else { + right[rt] = update(jobi, jobv, mid + 1, r, right[rt]); + } + return rt; + } + + public static int query(int jobl, int jobr, int l, int r, int i) { + if (jobl <= l && r <= jobr) { + return diff[i]; + } + int mid = (l + r) / 2; + int ans = 0; + if (jobl <= mid) { + ans += query(jobl, jobr, l, mid, left[i]); + } + if (jobr > mid) { + ans += query(jobl, jobr, mid + 1, r, right[i]); + } + return ans; + } + + public static int find(int jobk, int l, int r, int i) { + if (l == r) { + return l; + } + int mid = (l + r) / 2; + int leftDiff = diff[left[i]]; + if (leftDiff >= jobk) { + return find(jobk, l, mid, left[i]); + } else { + return find(jobk - leftDiff, mid + 1, r, right[i]); + } + } + + public static void prepare() { + cnt = 0; + Arrays.fill(pos, 0); + root[n + 1] = build(1, n); + for (int i = n; i >= 1; i--) { + if (pos[arr[i]] == 0) { + root[i] = update(i, 1, 1, n, root[i + 1]); + } else { + root[i] = update(pos[arr[i]], -1, 1, n, root[i + 1]); + root[i] = update(i, 1, 1, n, root[i]); + } + pos[arr[i]] = i; + } + } + + public static void main(String[] args) throws IOException { + ReaderWriter io = new ReaderWriter(); + cases = io.nextInt(); + for (int t = 1; t <= cases; t++) { + n = io.nextInt(); + q = io.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = io.nextInt(); + } + prepare(); + io.write("Case #"); + io.writeInt(t); + io.write(":"); + for (int i = 1, l, r, tmp, k, lastAns = 0; i <= q; i++) { + l = (io.nextInt() + lastAns) % n + 1; + r = (io.nextInt() + lastAns) % n + 1; + if (l > r) { + tmp = l; + l = r; + r = tmp; + } + k = (query(l, r, 1, n, root[l]) + 1) >> 1; + lastAns = find(k, 1, n, root[l]); + io.write(" "); + io.writeInt(lastAns); + } + io.write("\n"); + } + io.flush(); + } + + // 读写工具类 + static class ReaderWriter { + private static final int BUFFER_SIZE = 1 << 9; + private byte[] inBuf = new byte[BUFFER_SIZE]; + private int bId, bSize; + private final java.io.InputStream in; + + private byte[] outBuf = new byte[BUFFER_SIZE]; + private int oId; + private final java.io.OutputStream out; + + ReaderWriter() { + in = System.in; + out = System.out; + } + + private byte read() throws IOException { + if (bId == bSize) { + bSize = in.read(inBuf); + bId = 0; + if (bSize == -1) + return -1; + } + return inBuf[bId++]; + } + + public int nextInt() throws IOException { + int s = 0; + byte c = read(); + while (c <= ' ') { + if (c == -1) + return -1; + c = read(); + } + boolean neg = (c == '-'); + if (neg) + c = read(); + while (c >= '0' && c <= '9') { + s = s * 10 + (c - '0'); + c = read(); + } + return neg ? -s : s; + } + + public void write(String s) throws IOException { + for (int i = 0; i < s.length(); i++) { + writeByte((byte) s.charAt(i)); + } + } + + public void writeInt(int x) throws IOException { + if (x == 0) { + writeByte((byte) '0'); + return; + } + if (x < 0) { + writeByte((byte) '-'); + x = -x; + } + int len = 0; + byte[] tmp = new byte[12]; + while (x > 0) { + tmp[len++] = (byte) ((x % 10) + '0'); + x /= 10; + } + while (len-- > 0) { + writeByte(tmp[len]); + } + } + + private void writeByte(byte b) throws IOException { + if (oId == BUFFER_SIZE) { + flush(); + } + outBuf[oId++] = b; + } + + public void flush() throws IOException { + if (oId > 0) { + out.write(outBuf, 0, oId); + oId = 0; + } + } + } + +} \ No newline at end of file diff --git a/src/class157/Code03_RangeDifferentNumbers2.java b/src/class157/Code03_RangeDifferentNumbers2.java new file mode 100644 index 000000000..5bfa3c95a --- /dev/null +++ b/src/class157/Code03_RangeDifferentNumbers2.java @@ -0,0 +1,123 @@ +package class157; + +// 区间内的不同数字,C++版 +// 测试链接 : https://acm.hdu.edu.cn/showproblem.php?pid=5919 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//static const int MAXN = 200002; +//static const int MAXM = MAXN * 37; +//int cases, n, q; +//int arr[MAXN]; +//int pos[MAXN]; +//int root[MAXN]; +//int ls[MAXM]; +//int rs[MAXM]; +//int diff[MAXM]; +//int cnt; +// +//int build(int l, int r) { +// int rt = ++cnt; +// if (l == r) { +// return rt; +// } +// int mid = (l + r) / 2; +// ls[rt] = build(l, mid); +// rs[rt] = build(mid + 1, r); +// return rt; +//} +// +//int update(int jobi, int jobv, int l, int r, int i) { +// int rt = ++cnt; +// ls[rt] = ls[i]; +// rs[rt] = rs[i]; +// diff[rt] = diff[i] + jobv; +// if (l == r) { +// return rt; +// } +// int mid = (l + r) / 2; +// if (jobi <= mid) { +// ls[rt] = update(jobi, jobv, l, mid, ls[rt]); +// } else { +// rs[rt] = update(jobi, jobv, mid + 1, r, rs[rt]); +// } +// return rt; +//} +// +//int query(int jobl, int jobr, int l, int r, int i) { +// if (jobl <= l && r <= jobr) { +// return diff[i]; +// } +// int mid = (l + r) / 2; +// 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; +//} +// +//int find(int jobk, int l, int r, int i) { +// if (l == r) { +// return l; +// } +// int mid = (l + r) / 2; +// int leftDiff = diff[ls[i]]; +// if (leftDiff >= jobk) { +// return find(jobk, l, mid, ls[i]); +// } else { +// return find(jobk - leftDiff, mid + 1, r, rs[i]); +// } +//} +// +//void prepare() { +// cnt = 0; +// memset(pos, 0, sizeof(pos)); +// root[n + 1] = build(1, n); +// for (int i = n; i >= 1; i--) { +// if (pos[arr[i]] == 0) { +// root[i] = update(i, 1, 1, n, root[i + 1]); +// } else { +// root[i] = update(pos[arr[i]], -1, 1, n, root[i + 1]); +// root[i] = update(i, 1, 1, n, root[i]); +// } +// pos[arr[i]] = i; +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> cases; +// for (int t = 1; t <= cases; t++) { +// cin >> n >> q; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// prepare(); +// cout << "Case #" << t << ":"; +// int lastAns = 0; +// for (int i = 1; i <= q; i++) { +// int l, r; +// cin >> l >> r; +// l = (l + lastAns) % n + 1; +// r = (r + lastAns) % n + 1; +// if (l > r) { +// int tmp = l; +// l = r; +// r = tmp; +// } +// int k = (query(l, r, 1, n, root[l]) + 1) >> 1; +// lastAns = find(k, 1, n, root[l]); +// cout << " " << lastAns; +// } +// cout << "\n"; +// } +// return 0; +//} \ No newline at end of file diff --git a/src/class157/Code03_LargestMedian.java b/src/class157/Code04_LargestMedian.java similarity index 99% rename from src/class157/Code03_LargestMedian.java rename to src/class157/Code04_LargestMedian.java index 0a4993edd..8b7bf8075 100644 --- a/src/class157/Code03_LargestMedian.java +++ b/src/class157/Code04_LargestMedian.java @@ -12,7 +12,7 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class Code03_LargestMedian { +public class Code04_LargestMedian { public static int MAXN = 20001; @@ -86,15 +86,6 @@ public static int update(int jobi, int l, int r, int i) { return rt; } - public static void prepare() { - Arrays.sort(arr, 1, n + 1, (a, b) -> a[1] - b[1]); - cnt = 0; - root[1] = build(1, n); - for (int i = 2; i <= n; i++) { - root[i] = update(arr[i - 1][0], 1, n, root[i - 1]); - } - } - public static void initInfo() { info[0] = info[1] = -INF; info[2] = 0; @@ -120,6 +111,15 @@ public static void query(int jobl, int jobr, int l, int r, int i) { } } + public static void prepare() { + Arrays.sort(arr, 1, n + 1, (a, b) -> a[1] - b[1]); + cnt = 0; + root[1] = build(1, n); + for (int i = 2; i <= n; i++) { + root[i] = update(arr[i - 1][0], 1, n, root[i - 1]); + } + } + public static boolean check(int i) { int a = ques[0] + 1, b = ques[1] + 1, c = ques[2] + 1, d = ques[3] + 1, best; initInfo(); diff --git a/src/class157/Code04_CountOnTree.java b/src/class157/Code05_CountOnTree.java similarity index 99% rename from src/class157/Code04_CountOnTree.java rename to src/class157/Code05_CountOnTree.java index 52d720c3d..479480e85 100644 --- a/src/class157/Code04_CountOnTree.java +++ b/src/class157/Code05_CountOnTree.java @@ -12,7 +12,7 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class Code04_CountOnTree { +public class Code05_CountOnTree { public static int MAXN = 100001; diff --git a/src/class157/Code05_MoreImpressive1.java b/src/class157/Code06_MoreImpressive1.java similarity index 99% rename from src/class157/Code05_MoreImpressive1.java rename to src/class157/Code06_MoreImpressive1.java index 6d8c80d9d..d470737c7 100644 --- a/src/class157/Code05_MoreImpressive1.java +++ b/src/class157/Code06_MoreImpressive1.java @@ -11,7 +11,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code05_MoreImpressive1 { +public class Code06_MoreImpressive1 { public static int MAXN = 300001; diff --git a/src/class157/Code05_MoreImpressive2.java b/src/class157/Code06_MoreImpressive2.java similarity index 100% rename from src/class157/Code05_MoreImpressive2.java rename to src/class157/Code06_MoreImpressive2.java diff --git a/src/class157/Code07_ToTheMoon1.java b/src/class157/Code07_ToTheMoon1.java new file mode 100644 index 000000000..036a89655 --- /dev/null +++ b/src/class157/Code07_ToTheMoon1.java @@ -0,0 +1,225 @@ +package class157; + +// 去月球,java版 +// 测试链接 : https://acm.hdu.edu.cn/showproblem.php?pid=4348 +// 测试链接 : https://www.spoj.com/problems/TTM/s +// java版的实现就是通过不了,怎么优化也通过不了,这是语言歧视 +// C++版的实现就能通过,两个版本的逻辑是完全一样的 +// 想通过就用C++写吧,本节课Code07_ToTheMoon2文件就是C++的实现 + +import java.io.BufferedWriter; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; + +public class Code07_ToTheMoon1 { + + public static int MAXN = 100001; + + public static int MAXM = MAXN * 30; + + public static int n, q, t = 0; + + public static int[] arr = new int[MAXN]; + + public static int[] root = new int[MAXN]; + + public static int[] left = new int[MAXM]; + + public static int[] right = new int[MAXM]; + + public static long[] sum = new long[MAXM]; + + public static long[] addTag = new long[MAXM]; + + public static int cnt = 0; + + public static int build(int l, int r) { + int rt = ++cnt; + addTag[rt] = 0; + if (l == r) { + sum[rt] = arr[l]; + } else { + int mid = (l + r) / 2; + left[rt] = build(l, mid); + right[rt] = build(mid + 1, r); + sum[rt] = sum[left[rt]] + sum[right[rt]]; + } + return rt; + } + + public static void prepare() { + t = 0; + cnt = 0; + root[0] = build(1, n); + } + + public static int add(int jobl, int jobr, long jobv, int l, int r, int i) { + int rt = ++cnt, a = Math.max(jobl, l), b = Math.min(jobr, r); + left[rt] = left[i]; + right[rt] = right[i]; + sum[rt] = sum[i] + jobv * (b - a + 1); + addTag[rt] = addTag[i]; + if (jobl <= l && r <= jobr) { + addTag[rt] += jobv; + } else { + int mid = (l + r) / 2; + if (jobl <= mid) { + left[rt] = add(jobl, jobr, jobv, l, mid, left[rt]); + } + if (jobr > mid) { + right[rt] = add(jobl, jobr, jobv, mid + 1, r, right[rt]); + } + } + return rt; + } + + public static long query(int jobl, int jobr, long historyAdd, int l, int r, int i) { + if (jobl <= l && r <= jobr) { + return sum[i] + historyAdd * (r - l + 1); + } + int mid = (l + r) / 2; + long ans = 0; + if (jobl <= mid) { + ans += query(jobl, jobr, historyAdd + addTag[i], l, mid, left[i]); + } + if (jobr > mid) { + ans += query(jobl, jobr, historyAdd + addTag[i], mid + 1, r, right[i]); + } + return ans; + } + + public static void main(String[] args) throws IOException { + FastReader in = new FastReader(); + BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + q = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + root[0] = build(1, n); + String op; + for (int i = 1, x, y, z; i <= q; i++) { + op = in.next(); + if (op.equals("C")) { + x = in.nextInt(); + y = in.nextInt(); + z = in.nextInt(); + root[t + 1] = add(x, y, z, 1, n, root[t]); + t++; + } else if (op.equals("Q")) { + x = in.nextInt(); + y = in.nextInt(); + out.write(query(x, y, 0, 1, n, root[t]) + "\n"); + } else if (op.equals("H")) { + x = in.nextInt(); + y = in.nextInt(); + z = in.nextInt(); + out.write(query(x, y, 0, 1, n, root[z]) + "\n"); + } else { + t = in.nextInt(); + } + } + 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 boolean hasNext() throws IOException { + while (hasNextByte()) { + byte b = buffer[ptr]; + if (!isWhitespace(b)) + return true; + ptr++; + } + return false; + } + + public String next() throws IOException { + byte c; + do { + c = readByte(); + if (c == -1) + return null; + } while (c <= ' '); + StringBuilder sb = new StringBuilder(); + while (c > ' ') { + sb.append((char) c); + c = 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; + } + + public double nextDouble() throws IOException { + double num = 0, div = 1; + byte b = readByte(); + while (isWhitespace(b)) + b = readByte(); + boolean minus = false; + if (b == '-') { + minus = true; + b = readByte(); + } + while (!isWhitespace(b) && b != '.' && b != -1) { + num = num * 10 + (b - '0'); + b = readByte(); + } + if (b == '.') { + b = readByte(); + while (!isWhitespace(b) && b != -1) { + num += (b - '0') / (div *= 10); + b = readByte(); + } + } + return minus ? -num : num; + } + + private boolean isWhitespace(byte b) { + return b == ' ' || b == '\n' || b == '\r' || b == '\t'; + } + } + +} diff --git a/src/class157/Code07_ToTheMoon2.java b/src/class157/Code07_ToTheMoon2.java new file mode 100644 index 000000000..a0f04a79d --- /dev/null +++ b/src/class157/Code07_ToTheMoon2.java @@ -0,0 +1,103 @@ +package class157; + +// 去月球,C++版 +// 测试链接 : https://acm.hdu.edu.cn/showproblem.php?pid=4348 +// 测试链接 : https://www.spoj.com/problems/TTM/ +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//static const int MAXN = 100001; +//static const int MAXM = MAXN * 30; +//int n, q, t = 0; +//long long arr[MAXN]; +//int root[MAXN]; +//int ls[MAXM]; +//int rs[MAXM]; +//long long sum[MAXM]; +//long long addTag[MAXM]; +//int cnt = 0; +// +//int build(int l, int r) { +// int rt = ++cnt; +// addTag[rt] = 0; +// if (l == r) { +// sum[rt] = arr[l]; +// } else { +// int mid = (l + r) / 2; +// ls[rt] = build(l, mid); +// rs[rt] = build(mid + 1, r); +// sum[rt] = sum[ls[rt]] + sum[rs[rt]]; +// } +// return rt; +//} +// +//int add(int jobl, int jobr, long long jobv, int l, int r, int i) { +// int rt = ++cnt, a = max(jobl, l), b = min(jobr, r); +// ls[rt] = ls[i]; +// rs[rt] = rs[i]; +// sum[rt] = sum[i] + jobv * (b - a + 1); +// addTag[rt] = addTag[i]; +// if (jobl <= l && r <= jobr) { +// addTag[rt] += jobv; +// } else { +// int mid = (l + r) / 2; +// if (jobl <= mid) { +// ls[rt] = add(jobl, jobr, jobv, l, mid, ls[rt]); +// } +// if (jobr > mid) { +// rs[rt] = add(jobl, jobr, jobv, mid + 1, r, rs[rt]); +// } +// } +// return rt; +//} +// +//long long query(int jobl, int jobr, long long historyAdd, int l, int r, int i) { +// if (jobl <= l && r <= jobr) { +// return sum[i] + historyAdd * (r - l + 1); +// } +// int mid = (l + r) / 2; +// long long ans = 0; +// if (jobl <= mid) { +// ans += query(jobl, jobr, historyAdd + addTag[i], l, mid, ls[i]); +// } +// if (jobr > mid) { +// ans += query(jobl, jobr, historyAdd + addTag[i], mid + 1, r, rs[i]); +// } +// return ans; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> q; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// root[0] = build(1, n); +// for (int i = 1; i <= q; i++) { +// char op; +// cin >> op; +// if (op == 'C') { +// int x, y; +// long long z; +// cin >> x >> y >> z; +// root[t + 1] = add(x, y, z, 1, n, root[t]); +// t++; +// } else if (op == 'Q') { +// int x, y; +// cin >> x >> y; +// cout << query(x, y, 0, 1, n, root[t]) << "\n"; +// } else if (op == 'H') { +// int x, y, z; +// cin >> x >> y >> z; +// cout << query(x, y, 0, 1, n, root[z]) << "\n"; +// } else { +// cin >> t; +// } +// } +// return 0; +//} \ No newline at end of file From d123ef1495378a3e18604ab2f8e5768736be4aa1 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 10 Jan 2025 01:04:10 +0800 Subject: [PATCH 0579/2029] modify code --- src/class157/Code01_PersistentSegmentTree.java | 12 ++++++------ src/class157/Code05_CountOnTree.java | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/class157/Code01_PersistentSegmentTree.java b/src/class157/Code01_PersistentSegmentTree.java index e6c59d1f9..2e6c3119e 100644 --- a/src/class157/Code01_PersistentSegmentTree.java +++ b/src/class157/Code01_PersistentSegmentTree.java @@ -30,13 +30,13 @@ public class Code01_PersistentSegmentTree { public static int[] right = new int[MAXM]; - public static int[] count = new int[MAXM]; + public static int[] size = new int[MAXM]; public static int cnt; public static int build(int l, int r) { int rt = ++cnt; - count[rt] = 0; + size[rt] = 0; if (l < r) { int mid = (l + r) / 2; left[rt] = build(l, mid); @@ -72,7 +72,7 @@ public static int insert(int jobi, int l, int r, int i) { int rt = ++cnt; left[rt] = left[i]; right[rt] = right[i]; - count[rt] = count[i] + 1; + size[rt] = size[i] + 1; if (l < r) { int mid = (l + r) / 2; if (jobi <= mid) { @@ -88,12 +88,12 @@ public static int query(int jobk, int l, int r, int u, int v) { if (l == r) { return l; } - int lcount = count[left[v]] - count[left[u]]; + int lsize = size[left[v]] - size[left[u]]; int mid = (l + r) / 2; - if (lcount >= jobk) { + if (lsize >= jobk) { return query(jobk, l, mid, left[u], left[v]); } else { - return query(jobk - lcount, mid + 1, r, right[u], right[v]); + return query(jobk - lsize, mid + 1, r, right[u], right[v]); } } diff --git a/src/class157/Code05_CountOnTree.java b/src/class157/Code05_CountOnTree.java index 479480e85..4b138446c 100644 --- a/src/class157/Code05_CountOnTree.java +++ b/src/class157/Code05_CountOnTree.java @@ -44,7 +44,7 @@ public class Code05_CountOnTree { public static int[] right = new int[MAXM]; - public static int[] count = new int[MAXM]; + public static int[] size = new int[MAXM]; public static int cntt = 0; @@ -70,7 +70,7 @@ public static int rank(int num) { public static int build(int l, int r) { int rt = ++cntt; - count[rt] = 0; + size[rt] = 0; if (l < r) { int mid = (l + r) / 2; left[rt] = build(l, mid); @@ -103,7 +103,7 @@ public static int insert(int jobi, int l, int r, int i) { int rt = ++cntt; left[rt] = left[i]; right[rt] = right[i]; - count[rt] = count[i] + 1; + size[rt] = size[i] + 1; if (l < r) { int mid = (l + r) / 2; if (jobi <= mid) { @@ -119,12 +119,12 @@ public static int query(int jobk, int l, int r, int u, int v, int lca, int lcafa if (l == r) { return l; } - int leftCnt = count[left[u]] + count[left[v]] - count[left[lca]] - count[left[lcafa]]; + int lsize = size[left[u]] + size[left[v]] - size[left[lca]] - size[left[lcafa]]; int mid = (l + r) / 2; - if (leftCnt >= jobk) { + if (lsize >= jobk) { return query(jobk, l, mid, left[u], left[v], left[lca], left[lcafa]); } else { - return query(jobk - leftCnt, mid + 1, r, right[u], right[v], right[lca], right[lcafa]); + return query(jobk - lsize, mid + 1, r, right[u], right[v], right[lca], right[lcafa]); } } From 3de2a1e2b390e8b7cf00943594979fd996c798f0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 10 Jan 2025 01:07:08 +0800 Subject: [PATCH 0580/2029] modify code --- ...de04_LargestMedian.java => Code04_RangeLargestMedian.java} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename src/class157/{Code04_LargestMedian.java => Code04_RangeLargestMedian.java} (98%) diff --git a/src/class157/Code04_LargestMedian.java b/src/class157/Code04_RangeLargestMedian.java similarity index 98% rename from src/class157/Code04_LargestMedian.java rename to src/class157/Code04_RangeLargestMedian.java index 8b7bf8075..d97d4ba6f 100644 --- a/src/class157/Code04_LargestMedian.java +++ b/src/class157/Code04_RangeLargestMedian.java @@ -1,6 +1,6 @@ package class157; -// 最大的中位数 +// 区间内最大中位数 // 测试链接 : https://www.luogu.com.cn/problem/P2839 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -12,7 +12,7 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class Code04_LargestMedian { +public class Code04_RangeLargestMedian { public static int MAXN = 20001; From 5fbf84fa9526a2cfdf84bf7876f7d89fbbc88160 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 10 Jan 2025 01:08:42 +0800 Subject: [PATCH 0581/2029] modify code --- ...ngSmallestNaturalNumber.java => Code02_MissingSmallest.java} | 2 +- ...angeDifferentNumbers1.java => Code03_DifferentNumbers1.java} | 2 +- ...angeDifferentNumbers2.java => Code03_DifferentNumbers2.java} | 0 ...Code04_RangeLargestMedian.java => Code04_LargestMedian.java} | 2 +- 4 files changed, 3 insertions(+), 3 deletions(-) rename src/class157/{Code02_MissingSmallestNaturalNumber.java => Code02_MissingSmallest.java} (98%) rename src/class157/{Code03_RangeDifferentNumbers1.java => Code03_DifferentNumbers1.java} (99%) rename src/class157/{Code03_RangeDifferentNumbers2.java => Code03_DifferentNumbers2.java} (100%) rename src/class157/{Code04_RangeLargestMedian.java => Code04_LargestMedian.java} (99%) diff --git a/src/class157/Code02_MissingSmallestNaturalNumber.java b/src/class157/Code02_MissingSmallest.java similarity index 98% rename from src/class157/Code02_MissingSmallestNaturalNumber.java rename to src/class157/Code02_MissingSmallest.java index bb0d4be29..a3c71451d 100644 --- a/src/class157/Code02_MissingSmallestNaturalNumber.java +++ b/src/class157/Code02_MissingSmallest.java @@ -14,7 +14,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code02_MissingSmallestNaturalNumber { +public class Code02_MissingSmallest { public static int MAXN = 200001; diff --git a/src/class157/Code03_RangeDifferentNumbers1.java b/src/class157/Code03_DifferentNumbers1.java similarity index 99% rename from src/class157/Code03_RangeDifferentNumbers1.java rename to src/class157/Code03_DifferentNumbers1.java index ae7cb3c07..f2d64f0a0 100644 --- a/src/class157/Code03_RangeDifferentNumbers1.java +++ b/src/class157/Code03_DifferentNumbers1.java @@ -7,7 +7,7 @@ import java.io.IOException; import java.util.Arrays; -public class Code03_RangeDifferentNumbers1 { +public class Code03_DifferentNumbers1 { public static int MAXN = 200002; diff --git a/src/class157/Code03_RangeDifferentNumbers2.java b/src/class157/Code03_DifferentNumbers2.java similarity index 100% rename from src/class157/Code03_RangeDifferentNumbers2.java rename to src/class157/Code03_DifferentNumbers2.java diff --git a/src/class157/Code04_RangeLargestMedian.java b/src/class157/Code04_LargestMedian.java similarity index 99% rename from src/class157/Code04_RangeLargestMedian.java rename to src/class157/Code04_LargestMedian.java index d97d4ba6f..ac09b95c0 100644 --- a/src/class157/Code04_RangeLargestMedian.java +++ b/src/class157/Code04_LargestMedian.java @@ -12,7 +12,7 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class Code04_RangeLargestMedian { +public class Code04_LargestMedian { public static int MAXN = 20001; From 7e170aeccc4230a74f3297a44a76e6a4a37a86e0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 10 Jan 2025 01:19:02 +0800 Subject: [PATCH 0582/2029] modify code --- src/class157/Code07_ToTheMoon1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class157/Code07_ToTheMoon1.java b/src/class157/Code07_ToTheMoon1.java index 036a89655..3a55006fd 100644 --- a/src/class157/Code07_ToTheMoon1.java +++ b/src/class157/Code07_ToTheMoon1.java @@ -2,7 +2,7 @@ // 去月球,java版 // 测试链接 : https://acm.hdu.edu.cn/showproblem.php?pid=4348 -// 测试链接 : https://www.spoj.com/problems/TTM/s +// 测试链接 : https://www.spoj.com/problems/TTM/ // java版的实现就是通过不了,怎么优化也通过不了,这是语言歧视 // C++版的实现就能通过,两个版本的逻辑是完全一样的 // 想通过就用C++写吧,本节课Code07_ToTheMoon2文件就是C++的实现 From 9bd6d250e87e096b7310651b80387797bc4948f7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 10 Jan 2025 02:13:30 +0800 Subject: [PATCH 0583/2029] modify code --- src/class157/Code07_ToTheMoon1.java | 8 ++++---- src/class157/Code07_ToTheMoon2.java | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/class157/Code07_ToTheMoon1.java b/src/class157/Code07_ToTheMoon1.java index 3a55006fd..544e4c38e 100644 --- a/src/class157/Code07_ToTheMoon1.java +++ b/src/class157/Code07_ToTheMoon1.java @@ -3,9 +3,9 @@ // 去月球,java版 // 测试链接 : https://acm.hdu.edu.cn/showproblem.php?pid=4348 // 测试链接 : https://www.spoj.com/problems/TTM/ -// java版的实现就是通过不了,怎么优化也通过不了,这是语言歧视 -// C++版的实现就能通过,两个版本的逻辑是完全一样的 -// 想通过就用C++写吧,本节课Code07_ToTheMoon2文件就是C++的实现 +// 这道题两个测试链接都严重卡常,java版很难通过,这是语言歧视 +// 想通过用C++写吧,本节课Code07_ToTheMoon2文件就是C++的实现 +// 两个版本的逻辑完全一样,C++版本可以通过所有测试 import java.io.BufferedWriter; import java.io.IOException; @@ -16,7 +16,7 @@ public class Code07_ToTheMoon1 { public static int MAXN = 100001; - public static int MAXM = MAXN * 30; + public static int MAXM = MAXN * 25; public static int n, q, t = 0; diff --git a/src/class157/Code07_ToTheMoon2.java b/src/class157/Code07_ToTheMoon2.java index a0f04a79d..a9ae682e4 100644 --- a/src/class157/Code07_ToTheMoon2.java +++ b/src/class157/Code07_ToTheMoon2.java @@ -11,7 +11,7 @@ //using namespace std; // //static const int MAXN = 100001; -//static const int MAXM = MAXN * 30; +//static const int MAXM = MAXN * 25; //int n, q, t = 0; //long long arr[MAXN]; //int root[MAXN]; From 2a3e266a5ede5d76de3ca02959d3e4cc99d68dab Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 10 Jan 2025 02:14:25 +0800 Subject: [PATCH 0584/2029] modify code --- src/class157/Code07_ToTheMoon1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class157/Code07_ToTheMoon1.java b/src/class157/Code07_ToTheMoon1.java index 544e4c38e..2c83a452a 100644 --- a/src/class157/Code07_ToTheMoon1.java +++ b/src/class157/Code07_ToTheMoon1.java @@ -3,7 +3,7 @@ // 去月球,java版 // 测试链接 : https://acm.hdu.edu.cn/showproblem.php?pid=4348 // 测试链接 : https://www.spoj.com/problems/TTM/ -// 这道题两个测试链接都严重卡常,java版很难通过,这是语言歧视 +// 这道题的两个测试,都严重卡常,java版很难通过,这是语言歧视 // 想通过用C++写吧,本节课Code07_ToTheMoon2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 From 65479469e595b67a90246b18672827c942885f95 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 10 Jan 2025 12:09:17 +0800 Subject: [PATCH 0585/2029] modify code --- src/class157/Code03_DifferentNumbers1.java | 20 +++++++++--------- src/class157/Code03_DifferentNumbers2.java | 24 +++++++++------------- 2 files changed, 20 insertions(+), 24 deletions(-) diff --git a/src/class157/Code03_DifferentNumbers1.java b/src/class157/Code03_DifferentNumbers1.java index f2d64f0a0..ace768bdf 100644 --- a/src/class157/Code03_DifferentNumbers1.java +++ b/src/class157/Code03_DifferentNumbers1.java @@ -57,31 +57,31 @@ 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) { + public static int queryDiff(int jobl, int jobr, int l, int r, int i) { if (jobl <= l && r <= jobr) { return diff[i]; } int mid = (l + r) / 2; int ans = 0; if (jobl <= mid) { - ans += query(jobl, jobr, l, mid, left[i]); + ans += queryDiff(jobl, jobr, l, mid, left[i]); } if (jobr > mid) { - ans += query(jobl, jobr, mid + 1, r, right[i]); + ans += queryDiff(jobl, jobr, mid + 1, r, right[i]); } return ans; } - public static int find(int jobk, int l, int r, int i) { + public static int queryKth(int jobk, int l, int r, int i) { if (l == r) { return l; } int mid = (l + r) / 2; int leftDiff = diff[left[i]]; if (leftDiff >= jobk) { - return find(jobk, l, mid, left[i]); + return queryKth(jobk, l, mid, left[i]); } else { - return find(jobk - leftDiff, mid + 1, r, right[i]); + return queryKth(jobk - leftDiff, mid + 1, r, right[i]); } } @@ -113,16 +113,16 @@ public static void main(String[] args) throws IOException { io.write("Case #"); io.writeInt(t); io.write(":"); - for (int i = 1, l, r, tmp, k, lastAns = 0; i <= q; i++) { + for (int i = 1, l, r, k, lastAns = 0; i <= q; i++) { l = (io.nextInt() + lastAns) % n + 1; r = (io.nextInt() + lastAns) % n + 1; if (l > r) { - tmp = l; + int tmp = l; l = r; r = tmp; } - k = (query(l, r, 1, n, root[l]) + 1) >> 1; - lastAns = find(k, 1, n, root[l]); + k = (queryDiff(l, r, 1, n, root[l]) + 1) >> 1; + lastAns = queryKth(k, 1, n, root[l]); io.write(" "); io.writeInt(lastAns); } diff --git a/src/class157/Code03_DifferentNumbers2.java b/src/class157/Code03_DifferentNumbers2.java index 5bfa3c95a..cf8ffec03 100644 --- a/src/class157/Code03_DifferentNumbers2.java +++ b/src/class157/Code03_DifferentNumbers2.java @@ -48,31 +48,31 @@ // return rt; //} // -//int query(int jobl, int jobr, int l, int r, int i) { +//int queryDiff(int jobl, int jobr, int l, int r, int i) { // if (jobl <= l && r <= jobr) { // return diff[i]; // } // int mid = (l + r) / 2; // int ans = 0; // if (jobl <= mid) { -// ans += query(jobl, jobr, l, mid, ls[i]); +// ans += queryDiff(jobl, jobr, l, mid, ls[i]); // } // if (jobr > mid) { -// ans += query(jobl, jobr, mid + 1, r, rs[i]); +// ans += queryDiff(jobl, jobr, mid + 1, r, rs[i]); // } // return ans; //} // -//int find(int jobk, int l, int r, int i) { +//int queryKth(int jobk, int l, int r, int i) { // if (l == r) { // return l; // } // int mid = (l + r) / 2; // int leftDiff = diff[ls[i]]; // if (leftDiff >= jobk) { -// return find(jobk, l, mid, ls[i]); +// return queryKth(jobk, l, mid, ls[i]); // } else { -// return find(jobk - leftDiff, mid + 1, r, rs[i]); +// return queryKth(jobk - leftDiff, mid + 1, r, rs[i]); // } //} // @@ -102,19 +102,15 @@ // } // prepare(); // cout << "Case #" << t << ":"; -// int lastAns = 0; -// for (int i = 1; i <= q; i++) { -// int l, r; +// for (int i = 1, l, r, k, lastAns = 0; i <= q; i++) { // cin >> l >> r; // l = (l + lastAns) % n + 1; // r = (r + lastAns) % n + 1; // if (l > r) { -// int tmp = l; -// l = r; -// r = tmp; +// swap(l, r); // } -// int k = (query(l, r, 1, n, root[l]) + 1) >> 1; -// lastAns = find(k, 1, n, root[l]); +// k = (queryDiff(l, r, 1, n, root[l]) + 1) >> 1; +// lastAns = queryKth(k, 1, n, root[l]); // cout << " " << lastAns; // } // cout << "\n"; From 242ce501297b8b2f333fbfed8915bc94b1365330 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 10 Jan 2025 18:39:27 +0800 Subject: [PATCH 0586/2029] modify code --- ...ava => Code01_PersistentSegmentTree1.java} | 63 +++--- .../Code01_PersistentSegmentTree2.java | 110 +++++++++++ ...lest.java => Code02_MissingSmallest1.java} | 46 +++-- src/class157/Code02_MissingSmallest2.java | 95 +++++++++ src/class157/Code03_DifferentNumbers1.java | 24 ++- src/class157/Code03_DifferentNumbers2.java | 26 ++- ...a => Code04_LazyTagPermanentization1.java} | 17 +- ...a => Code04_LazyTagPermanentization2.java} | 25 ++- ...dian.java => Code05_LargestUpMedian1.java} | 38 ++-- src/class157/Code05_LargestUpMedian2.java | 163 ++++++++++++++++ ...ntOnTree.java => Code06_CountOnTree1.java} | 34 ++-- src/class157/Code06_CountOnTree2.java | 180 ++++++++++++++++++ ...sive1.java => Code07_MoreImpressive1.java} | 10 +- ...sive2.java => Code07_MoreImpressive2.java} | 12 +- 14 files changed, 737 insertions(+), 106 deletions(-) rename src/class157/{Code01_PersistentSegmentTree.java => Code01_PersistentSegmentTree1.java} (85%) create mode 100644 src/class157/Code01_PersistentSegmentTree2.java rename src/class157/{Code02_MissingSmallest.java => Code02_MissingSmallest1.java} (75%) create mode 100644 src/class157/Code02_MissingSmallest2.java rename src/class157/{Code07_ToTheMoon1.java => Code04_LazyTagPermanentization1.java} (87%) rename src/class157/{Code07_ToTheMoon2.java => Code04_LazyTagPermanentization2.java} (78%) rename src/class157/{Code04_LargestMedian.java => Code05_LargestUpMedian1.java} (75%) create mode 100644 src/class157/Code05_LargestUpMedian2.java rename src/class157/{Code05_CountOnTree.java => Code06_CountOnTree1.java} (84%) create mode 100644 src/class157/Code06_CountOnTree2.java rename src/class157/{Code06_MoreImpressive1.java => Code07_MoreImpressive1.java} (90%) rename src/class157/{Code06_MoreImpressive2.java => Code07_MoreImpressive2.java} (84%) diff --git a/src/class157/Code01_PersistentSegmentTree.java b/src/class157/Code01_PersistentSegmentTree1.java similarity index 85% rename from src/class157/Code01_PersistentSegmentTree.java rename to src/class157/Code01_PersistentSegmentTree1.java index 2e6c3119e..8b4897e77 100644 --- a/src/class157/Code01_PersistentSegmentTree.java +++ b/src/class157/Code01_PersistentSegmentTree1.java @@ -1,6 +1,9 @@ package class157; -// 可持久化线段树模版题 +// 可持久化线段树模版题,java版 +// 给定一个长度为n的数组arr,下标1~n,一共有q条查询 +// 每条查询 l r k : 打印arr[l..r]中第k小的数字 +// 1 <= n、q <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3834 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -12,7 +15,7 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class Code01_PersistentSegmentTree { +public class Code01_PersistentSegmentTree1 { public static int MAXN = 200001; @@ -22,7 +25,7 @@ public class Code01_PersistentSegmentTree { public static int[] arr = new int[MAXN]; - public static int[] sort = new int[MAXN]; + public static int[] sorted = new int[MAXN]; public static int[] root = new int[MAXN]; @@ -34,31 +37,11 @@ public class Code01_PersistentSegmentTree { public static int cnt; - public static int build(int l, int r) { - int rt = ++cnt; - size[rt] = 0; - if (l < r) { - int mid = (l + r) / 2; - left[rt] = build(l, mid); - right[rt] = build(mid + 1, r); - } - return rt; - } - - public static void prepare() { - cnt = 0; - for (int i = 1; i <= n; i++) { - sort[i] = arr[i]; - } - Arrays.sort(sort, 1, n + 1); - root[0] = build(1, n); - } - - public static int rank(int v) { + public static int kth(int num) { int l = 1, r = n, m, ans = 0; while (l <= r) { m = (l + r) / 2; - if (sort[m] <= v) { + if (sorted[m] <= num) { ans = m; l = m + 1; } else { @@ -68,6 +51,17 @@ public static int rank(int v) { return ans; } + public static int build(int l, int r) { + int rt = ++cnt; + size[rt] = 0; + if (l < r) { + int mid = (l + r) / 2; + left[rt] = build(l, mid); + right[rt] = build(mid + 1, r); + } + return rt; + } + public static int insert(int jobi, int l, int r, int i) { int rt = ++cnt; left[rt] = left[i]; @@ -97,6 +91,19 @@ public static int query(int jobk, int l, int r, int u, int v) { } } + public static void prepare() { + cnt = 0; + for (int i = 1; i <= n; i++) { + sorted[i] = arr[i]; + } + Arrays.sort(sorted, 1, n + 1); + root[0] = build(1, n); + for (int i = 1, x; i <= n; i++) { + x = kth(arr[i]); + root[i] = insert(x, 1, n, root[i - 1]); + } + } + public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StreamTokenizer in = new StreamTokenizer(br); @@ -110,10 +117,6 @@ public static void main(String[] args) throws IOException { arr[i] = (int) in.nval; } prepare(); - for (int i = 1, x; i <= n; i++) { - x = rank(arr[i]); - root[i] = insert(x, 1, n, root[i - 1]); - } for (int i = 1, l, r, k; i <= q; i++) { in.nextToken(); l = (int) in.nval; @@ -122,7 +125,7 @@ public static void main(String[] args) throws IOException { in.nextToken(); k = (int) in.nval; int ans = query(k, 1, n, root[l - 1], root[r]); - out.println(sort[ans]); + out.println(sorted[ans]); } out.flush(); out.close(); diff --git a/src/class157/Code01_PersistentSegmentTree2.java b/src/class157/Code01_PersistentSegmentTree2.java new file mode 100644 index 000000000..ea65a6e86 --- /dev/null +++ b/src/class157/Code01_PersistentSegmentTree2.java @@ -0,0 +1,110 @@ +package class157; + +// 可持久化线段树模版题,C++版 +// 给定一个长度为n的数组arr,下标1~n,一共有q条查询 +// 每条查询 l r k : 打印arr[l..r]中第k小的数字 +// 1 <= n、q <= 2 * 10^5 +// 测试链接 : https://www.luogu.com.cn/problem/P3834 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +//#include +//#include +//#include +// +//using namespace std; +// +//const int MAXN = 200001; +//const int MAXM = MAXN * 22; +//int n, q; +//int arr[MAXN]; +//int sorted[MAXN]; +//int root[MAXN]; +//int ls[MAXM]; +//int rs[MAXM]; +//int size[MAXM]; +//int cnt; +// +//int kth(int num) { +// int l = 1, r = n, m, ans = 0; +// while (l <= r) { +// m = (l + r) / 2; +// if (sorted[m] <= num) { +// ans = m; +// l = m + 1; +// } else { +// r = m - 1; +// } +// } +// return ans; +//} +// +//int build(int l, int r) { +// int rt = ++cnt; +// size[rt] = 0; +// if (l < r) { +// int mid = (l + r) / 2; +// ls[rt] = build(l, mid); +// rs[rt] = build(mid + 1, r); +// } +// return rt; +//} +// +//int insert(int jobi, int l, int r, int i) { +// int rt = ++cnt; +// ls[rt] = ls[i]; +// rs[rt] = rs[i]; +// size[rt] = size[i] + 1; +// if (l < r) { +// 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]); +// } +// } +// return rt; +//} +// +//int query(int jobk, int l, int r, int u, int v) { +// if (l == r) { +// return l; +// } +// int lsize = size[ls[v]] - size[ls[u]]; +// int mid = (l + r) / 2; +// if (lsize >= jobk) { +// return query(jobk, l, mid, ls[u], ls[v]); +// } else { +// return query(jobk - lsize, mid + 1, r, rs[u], rs[v]); +// } +//} +// +//void prepare() { +// cnt = 0; +// for (int i = 1; i <= n; i++) { +// sorted[i] = arr[i]; +// } +// sort(sorted + 1, sorted + n + 1); +// root[0] = build(1, n); +// for (int i = 1, x; i <= n; i++) { +// x = kth(arr[i]); +// root[i] = insert(x, 1, n, root[i - 1]); +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> q; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// prepare(); +// for (int i = 1, l, r, k; i <= q; i++) { +// cin >> l >> r >> k; +// int ans = query(k, 1, n, root[l - 1], root[r]); +// cout << sorted[ans] << '\n'; +// } +// return 0; +//} \ No newline at end of file diff --git a/src/class157/Code02_MissingSmallest.java b/src/class157/Code02_MissingSmallest1.java similarity index 75% rename from src/class157/Code02_MissingSmallest.java rename to src/class157/Code02_MissingSmallest1.java index a3c71451d..5de0adba5 100644 --- a/src/class157/Code02_MissingSmallest.java +++ b/src/class157/Code02_MissingSmallest1.java @@ -1,9 +1,9 @@ package class157; -// 区间内没有出现的最小自然数 -// 给定一个长度为n的数组arr,一共有m次询问 -// 每次查询一个区间[l, r]内没有出现过的最小自然数 -// 注意0是自然数 +// 区间内没有出现的最小自然数,java版 +// 给定一个长度为n的数组arr,下标1~n,一共有q条查询 +// 每条查询 l r : 打印arr[l..r]内没有出现过的最小自然数,注意0是自然数 +// 1 <= n、q、arr[i] <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P4137 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -14,7 +14,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code02_MissingSmallest { +public class Code02_MissingSmallest1 { public static int MAXN = 200001; @@ -22,6 +22,8 @@ public class Code02_MissingSmallest { public static int n, q; + public static int[] arr = new int[MAXN]; + public static int[] root = new int[MAXN]; public static int[] left = new int[MAXM]; @@ -34,6 +36,17 @@ public class Code02_MissingSmallest { public static int cnt; + public static int build(int l, int r) { + int rt = ++cnt; + lateLeft[rt] = 0; + if (l < r) { + int mid = (l + r) / 2; + left[rt] = build(l, mid); + right[rt] = build(mid + 1, r); + } + return rt; + } + public static int update(int jobi, int jobv, int l, int r, int i) { int rt = ++cnt; left[rt] = left[i]; @@ -70,6 +83,18 @@ public static int query(int pos, int l, int r, int i) { } } + public static void prepare() { + cnt = 0; + root[0] = build(1, n); + for (int i = 1; i <= n; i++) { + if (arr[i] >= n) { + root[i] = root[i - 1]; + } else { + root[i] = update(arr[i], i, 0, n, root[i - 1]); + } + } + } + public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StreamTokenizer in = new StreamTokenizer(br); @@ -78,16 +103,11 @@ public static void main(String[] args) throws IOException { n = (int) in.nval; in.nextToken(); q = (int) in.nval; - cnt = 0; - for (int i = 1, v; i <= n; i++) { + for (int i = 1; i <= n; i++) { in.nextToken(); - v = (int) in.nval; - if (v >= n) { - root[i] = root[i - 1]; - } else { - root[i] = update(v, i, 0, n, root[i - 1]); - } + arr[i] = (int) in.nval; } + prepare(); for (int i = 1, l, r; i <= q; i++) { in.nextToken(); l = (int) in.nval; diff --git a/src/class157/Code02_MissingSmallest2.java b/src/class157/Code02_MissingSmallest2.java new file mode 100644 index 000000000..59164ff00 --- /dev/null +++ b/src/class157/Code02_MissingSmallest2.java @@ -0,0 +1,95 @@ +package class157; + +// 区间内没有出现的最小自然数,C++版 +// 给定一个长度为n的数组arr,下标1~n,一共有q条查询 +// 每条查询 l r : 打印arr[l..r]内没有出现过的最小自然数,注意0是自然数 +// 1 <= n、q、arr[i] <= 2 * 10^5 +// 测试链接 : https://www.luogu.com.cn/problem/P4137 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +//#include +//#include +//#include +// +//using namespace std; +// +//const int MAXN = 200001; +//const int MAXM = MAXN * 22; +//int n, q; +//int arr[MAXN]; +//int root[MAXN]; +//int ls[MAXM]; +//int rs[MAXM]; +//int lateLeft[MAXM]; +//int cnt; +// +//int build(int l, int r) { +// int rt = ++cnt; +// lateLeft[rt] = 0; +// if (l < r) { +// int mid = (l + r) / 2; +// ls[rt] = build(l, mid); +// rs[rt] = build(mid + 1, r); +// } +// return rt; +//} +// +//int update(int jobi, int jobv, int l, int r, int i) { +// int rt = ++cnt; +// ls[rt] = ls[i]; +// rs[rt] = rs[i]; +// lateLeft[rt] = lateLeft[i]; +// if (l == r) { +// lateLeft[rt] = jobv; +// } else { +// int mid = (l + r) / 2; +// if (jobi <= mid) { +// ls[rt] = update(jobi, jobv, l, mid, ls[rt]); +// } else { +// rs[rt] = update(jobi, jobv, mid + 1, r, rs[rt]); +// } +// lateLeft[rt] = min(lateLeft[ls[rt]], lateLeft[rs[rt]]); +// } +// return rt; +//} +// +//int query(int pos, int l, int r, int i) { +// if (l == r) { +// return l; +// } +// int mid = (l + r) / 2; +// if (lateLeft[ls[i]] < pos) { +// return query(pos, l, mid, ls[i]); +// } else { +// return query(pos, mid + 1, r, rs[i]); +// } +//} +// +//void prepare() { +// cnt = 0; +// root[0] = build(1, n); +// for (int i = 1; i <= n; i++) { +// if (arr[i] >= n) { +// root[i] = root[i - 1]; +// } else { +// root[i] = update(arr[i], i, 0, n, root[i - 1]); +// } +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> q; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// prepare(); +// for (int i = 0, l, r; i < q; i++) { +// cin >> l >> r; +// cout << query(l, 0, n, root[r]) << "\n"; +// } +// return 0; +//} \ No newline at end of file diff --git a/src/class157/Code03_DifferentNumbers1.java b/src/class157/Code03_DifferentNumbers1.java index ace768bdf..993ec3d87 100644 --- a/src/class157/Code03_DifferentNumbers1.java +++ b/src/class157/Code03_DifferentNumbers1.java @@ -1,6 +1,15 @@ package class157; // 区间内的不同数字,java版 +// 给定一个长度为n的数组arr,下标1~n,一共有q条查询 +// 每条查询 l r : 如果arr[l..r]范围有s种不同的数,打印第s/2种数,向上取整 +// 题目有强制在线的要求,上一次打印的答案为lastAns,初始时lastAns = 0 +// 每次给定的l和r,按照如下方式得到真实的l和r,查询完成后更新lastAns +// a = (给定l + lastAns) % n + 1 +// b = (给定r + lastAns) % n + 1 +// 真实l = min(a, b) +// 真实r = max(a, b) +// 1 <= n、q、arr[i] <= 2 * 10^5 // 测试链接 : https://acm.hdu.edu.cn/showproblem.php?pid=5919 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -113,15 +122,12 @@ public static void main(String[] args) throws IOException { io.write("Case #"); io.writeInt(t); io.write(":"); - for (int i = 1, l, r, k, lastAns = 0; i <= q; i++) { - l = (io.nextInt() + lastAns) % n + 1; - r = (io.nextInt() + lastAns) % n + 1; - if (l > r) { - int tmp = l; - l = r; - r = tmp; - } - k = (queryDiff(l, r, 1, n, root[l]) + 1) >> 1; + for (int i = 1, a, b, l, r, k, lastAns = 0; i <= q; i++) { + a = (io.nextInt() + lastAns) % n + 1; + b = (io.nextInt() + lastAns) % n + 1; + l = Math.min(a, b); + r = Math.max(a, b); + k = (queryDiff(l, r, 1, n, root[l]) + 1) / 2; lastAns = queryKth(k, 1, n, root[l]); io.write(" "); io.writeInt(lastAns); diff --git a/src/class157/Code03_DifferentNumbers2.java b/src/class157/Code03_DifferentNumbers2.java index cf8ffec03..25291fdfb 100644 --- a/src/class157/Code03_DifferentNumbers2.java +++ b/src/class157/Code03_DifferentNumbers2.java @@ -1,6 +1,15 @@ package class157; // 区间内的不同数字,C++版 +// 给定一个长度为n的数组arr,下标1~n,一共有q条查询 +// 每条查询 l r : 如果arr[l..r]范围有s种不同的数,打印第s/2种数,向上取整 +// 题目有强制在线的要求,上一次打印的答案为lastAns,初始时lastAns = 0 +// 每次给定的l和r,按照如下方式得到真实的l和r,查询完成后更新lastAns +// a = (给定l + lastAns) % n + 1 +// b = (给定r + lastAns) % n + 1 +// 真实l = min(a, b) +// 真实r = max(a, b) +// 1 <= n、q、arr[i] <= 2 * 10^5 // 测试链接 : https://acm.hdu.edu.cn/showproblem.php?pid=5919 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -9,8 +18,8 @@ // //using namespace std; // -//static const int MAXN = 200002; -//static const int MAXM = MAXN * 37; +//const int MAXN = 200002; +//const int MAXM = MAXN * 37; //int cases, n, q; //int arr[MAXN]; //int pos[MAXN]; @@ -102,14 +111,13 @@ // } // prepare(); // cout << "Case #" << t << ":"; -// for (int i = 1, l, r, k, lastAns = 0; i <= q; i++) { +// for (int i = 1, a, b, l, r, k, lastAns = 0; i <= q; i++) { // cin >> l >> r; -// l = (l + lastAns) % n + 1; -// r = (r + lastAns) % n + 1; -// if (l > r) { -// swap(l, r); -// } -// k = (queryDiff(l, r, 1, n, root[l]) + 1) >> 1; +// a = (l + lastAns) % n + 1; +// b = (r + lastAns) % n + 1; +// l = min(a, b); +// r = max(a, b); +// k = (queryDiff(l, r, 1, n, root[l]) + 1) / 2; // lastAns = queryKth(k, 1, n, root[l]); // cout << " " << lastAns; // } diff --git a/src/class157/Code07_ToTheMoon1.java b/src/class157/Code04_LazyTagPermanentization1.java similarity index 87% rename from src/class157/Code07_ToTheMoon1.java rename to src/class157/Code04_LazyTagPermanentization1.java index 2c83a452a..3fcaba968 100644 --- a/src/class157/Code07_ToTheMoon1.java +++ b/src/class157/Code04_LazyTagPermanentization1.java @@ -1,10 +1,18 @@ package class157; -// 去月球,java版 +// 可持久化线段树的标签永久化,java版 +// 给定一个长度为n的数组arr,下标1~n,时间戳t=0,arr认为是0版本的数组 +// 一共有q条查询,每条查询为如下四种类型中的一种 +// C x y z : 当前时间戳t版本的数组,[x..y]范围每个数字增加z,得到t+1版本数组,并且t++ +// Q x y : 当前时间戳t版本的数组,打印[x..y]范围累加和 +// H x y z : z版本的数组,打印[x..y]范围的累加和 +// B x : 当前时间戳t设置成x +// 1 <= n、q <= 10^5 +// -10^9 <= arr[i] <= +10^9 // 测试链接 : https://acm.hdu.edu.cn/showproblem.php?pid=4348 // 测试链接 : https://www.spoj.com/problems/TTM/ // 这道题的两个测试,都严重卡常,java版很难通过,这是语言歧视 -// 想通过用C++写吧,本节课Code07_ToTheMoon2文件就是C++的实现 +// 想通过用C++写吧,本节课Code04_LazyTagPermanentization2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 import java.io.BufferedWriter; @@ -12,7 +20,7 @@ import java.io.InputStream; import java.io.OutputStreamWriter; -public class Code07_ToTheMoon1 { +public class Code04_LazyTagPermanentization1 { public static int MAXN = 100001; @@ -117,7 +125,8 @@ public static void main(String[] args) throws IOException { z = in.nextInt(); out.write(query(x, y, 0, 1, n, root[z]) + "\n"); } else { - t = in.nextInt(); + x = in.nextInt(); + t = x; } } out.flush(); diff --git a/src/class157/Code07_ToTheMoon2.java b/src/class157/Code04_LazyTagPermanentization2.java similarity index 78% rename from src/class157/Code07_ToTheMoon2.java rename to src/class157/Code04_LazyTagPermanentization2.java index a9ae682e4..05002d400 100644 --- a/src/class157/Code07_ToTheMoon2.java +++ b/src/class157/Code04_LazyTagPermanentization2.java @@ -1,6 +1,14 @@ package class157; -// 去月球,C++版 +// 可持久化线段树的标签永久化,C++版 +// 给定一个长度为n的数组arr,下标1~n,时间戳t=0,arr认为是0版本的数组 +// 一共有q条查询,每条查询为如下四种类型中的一种 +// C x y z : 当前时间戳t版本的数组,[x..y]范围每个数字增加z,得到t+1版本数组,并且t++ +// Q x y : 当前时间戳t版本的数组,打印[x..y]范围累加和 +// H x y z : z版本的数组,打印[x..y]范围的累加和 +// B x : 当前时间戳t设置成x +// 1 <= n、q <= 10^5 +// -10^9 <= arr[i] <= +10^9 // 测试链接 : https://acm.hdu.edu.cn/showproblem.php?pid=4348 // 测试链接 : https://www.spoj.com/problems/TTM/ // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 @@ -10,8 +18,8 @@ // //using namespace std; // -//static const int MAXN = 100001; -//static const int MAXM = MAXN * 25; +//const int MAXN = 100001; +//const int MAXM = MAXN * 25; //int n, q, t = 0; //long long arr[MAXN]; //int root[MAXN]; @@ -78,25 +86,24 @@ // cin >> arr[i]; // } // root[0] = build(1, n); +// char op; +// int x, y; +// long long z; // for (int i = 1; i <= q; i++) { -// char op; // cin >> op; // if (op == 'C') { -// int x, y; -// long long z; // cin >> x >> y >> z; // root[t + 1] = add(x, y, z, 1, n, root[t]); // t++; // } else if (op == 'Q') { -// int x, y; // cin >> x >> y; // cout << query(x, y, 0, 1, n, root[t]) << "\n"; // } else if (op == 'H') { -// int x, y, z; // cin >> x >> y >> z; // cout << query(x, y, 0, 1, n, root[z]) << "\n"; // } else { -// cin >> t; +// cin >> x; +// t = x; // } // } // return 0; diff --git a/src/class157/Code04_LargestMedian.java b/src/class157/Code05_LargestUpMedian1.java similarity index 75% rename from src/class157/Code04_LargestMedian.java rename to src/class157/Code05_LargestUpMedian1.java index ac09b95c0..9575f88cd 100644 --- a/src/class157/Code04_LargestMedian.java +++ b/src/class157/Code05_LargestUpMedian1.java @@ -1,6 +1,15 @@ package class157; -// 区间内最大中位数 +// 区间最大上中位数,java版 +// 给定一个长度为n的数组arr,下标1~n,一共有q条查询 +// 每条查询 a b c d : 左端点在[a,b]之间、右端点在[c,d]之间,保证a= 0; } - public static int compute() { + public static int compute(int a, int b, int c, int d) { int l = 1, r = n, m, ans = 0; while (l <= r) { m = (l + r) / 2; - if (check(m)) { + if (check(a, b, c, d, m)) { ans = arr[m][1]; l = m + 1; } else { @@ -166,15 +174,15 @@ public static void main(String[] args) throws IOException { q = (int) in.nval; for (int i = 1, lastAns = 0; i <= q; i++) { in.nextToken(); - ques[0] = ((int) in.nval + lastAns) % n; + ques[0] = ((int) in.nval + lastAns) % n + 1; in.nextToken(); - ques[1] = ((int) in.nval + lastAns) % n; + ques[1] = ((int) in.nval + lastAns) % n + 1; in.nextToken(); - ques[2] = ((int) in.nval + lastAns) % n; + ques[2] = ((int) in.nval + lastAns) % n + 1; in.nextToken(); - ques[3] = ((int) in.nval + lastAns) % n; + ques[3] = ((int) in.nval + lastAns) % n + 1; Arrays.sort(ques); - lastAns = compute(); + lastAns = compute(ques[0], ques[1], ques[2], ques[3]); out.println(lastAns); } out.flush(); diff --git a/src/class157/Code05_LargestUpMedian2.java b/src/class157/Code05_LargestUpMedian2.java new file mode 100644 index 000000000..b0d11dbf3 --- /dev/null +++ b/src/class157/Code05_LargestUpMedian2.java @@ -0,0 +1,163 @@ +package class157; + +// 区间最大上中位数,C++版 +// 给定一个长度为n的数组arr,下标1~n,一共有q条查询 +// 每条查询 a b c d : 左端点在[a,b]之间、右端点在[c,d]之间,保证a +//#include +//#include +//#include +//#include +// +//using namespace std; +// +//const int MAXN = 20001; +//const int MAXM = MAXN * 20; +//const int INF = 10000001; +//int n, q; +//vector> arr; +//int root[MAXN]; +//int ls[MAXM]; +//int rs[MAXM]; +//int pre[MAXM]; +//int suf[MAXM]; +//int sum[MAXM]; +//int cnt; +//int ques[4], info[3]; +// +//int build(int l, int r) { +// int rt = ++cnt; +// pre[rt] = suf[rt] = sum[rt] = r - l + 1; +// if (l < r) { +// int mid = (l + r) / 2; +// ls[rt] = build(l, mid); +// rs[rt] = build(mid + 1, r); +// } +// return rt; +//} +// +//void up(int i) { +// pre[i] = max(pre[ls[i]], sum[ls[i]] + pre[rs[i]]); +// suf[i] = max(suf[rs[i]], suf[ls[i]] + sum[rs[i]]); +// sum[i] = sum[ls[i]] + sum[rs[i]]; +//} +// +//int update(int jobi, int l, int r, int i) { +// int rt = ++cnt; +// ls[rt] = ls[i]; +// rs[rt] = rs[i]; +// pre[rt] = pre[i]; +// suf[rt] = suf[i]; +// sum[rt] = sum[i]; +// if (l == r) { +// pre[rt] = suf[rt] = sum[rt] = -1; +// } else { +// int mid = (l + r) / 2; +// if (jobi <= mid) { +// ls[rt] = update(jobi, l, mid, ls[rt]); +// } else { +// rs[rt] = update(jobi, mid + 1, r, rs[rt]); +// } +// up(rt); +// } +// return rt; +//} +// +//void initInfo() { +// info[0] = info[1] = -INF; +// info[2] = 0; +//} +// +//void mergeRight(int r) { +// info[0] = max(info[0], info[2] + pre[r]); +// info[1] = max(suf[r], info[1] + sum[r]); +// info[2] += sum[r]; +//} +// +//void query(int jobl, int jobr, int l, int r, int i) { +// if (jobl <= l && r <= jobr) { +// mergeRight(i); +// } else { +// int mid = (l + r) / 2; +// if (jobl <= mid) { +// query(jobl, jobr, l, mid, ls[i]); +// } +// if (jobr > mid) { +// query(jobl, jobr, mid + 1, r, rs[i]); +// } +// } +//} +// +//void prepare() { +// sort(arr.begin() + 1, arr.end(), [](const pair& a, const pair& b) { +// return a.second < b.second; +// }); +// cnt = 0; +// root[1] = build(1, n); +// for (int i = 2; i <= n; i++) { +// root[i] = update(arr[i - 1].first, 1, n, root[i - 1]); +// } +//} +// +//bool check(int a, int b, int c, int d, int v) { +// initInfo(); +// query(a, b, 1, n, root[v]); +// int best = info[1]; +// initInfo(); +// query(c, d, 1, n, root[v]); +// best += info[0]; +// if (b + 1 <= c - 1) { +// initInfo(); +// query(b + 1, c - 1, 1, n, root[v]); +// best += info[2]; +// } +// return best >= 0; +//} +// +//int compute(int a, int b, int c, int d) { +// int l = 1, r = n, m, ans = 0; +// while (l <= r) { +// m = (l + r) / 2; +// if (check(a, b, c, d, m)) { +// ans = arr[m].second; +// l = m + 1; +// } else { +// r = m - 1; +// } +// } +// return ans; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n; +// arr.resize(n + 1); +// for (int i = 1; i <= n; i++) { +// arr[i].first = i; +// cin >> arr[i].second; +// } +// prepare(); +// cin >> q; +// for (int i = 1, lastAns = 0; i <= q; i++) { +// for (int j = 0; j < 4; j++) { +// cin >> ques[j]; +// ques[j] = (ques[j] + lastAns) % n + 1; +// } +// sort(ques, ques + 4); +// lastAns = compute(ques[0], ques[1], ques[2], ques[3]); +// cout << lastAns << '\n'; +// } +// return 0; +//} \ No newline at end of file diff --git a/src/class157/Code05_CountOnTree.java b/src/class157/Code06_CountOnTree1.java similarity index 84% rename from src/class157/Code05_CountOnTree.java rename to src/class157/Code06_CountOnTree1.java index 4b138446c..a9464950b 100644 --- a/src/class157/Code05_CountOnTree.java +++ b/src/class157/Code06_CountOnTree1.java @@ -1,6 +1,12 @@ package class157; -// 节点路径第k小值 +// 节点路径第k小值,java版 +// 有n个节点,编号1~n,每个节点有权值,有n-1条边,所有节点组成一棵树 +// 一共有q条查询,每条查询 u v k : 打印u号点到v号点的路径上,第k小的点权 +// 题目有强制在线的要求,上一次打印的答案为lastAns,初始时lastAns = 0 +// 每次给定的u、v、k,按照如下方式得到真实的u、v、k,查询完成后更新lastAns +// 真实u = 给定u ^ lastAns 真实v = 给定v 真实k = 给定k +// 1 <= n、q <= 10^5 1 <= arr[i] <= 2^32 - 1 // 测试链接 : https://www.luogu.com.cn/problem/P2633 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -12,7 +18,7 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class Code05_CountOnTree { +public class Code06_CountOnTree1 { public static int MAXN = 100001; @@ -26,7 +32,7 @@ public class Code05_CountOnTree { public static int[] arr = new int[MAXN]; // 收集权值排序做离散化 - public static int[] sort = new int[MAXN]; + public static int[] sorted = new int[MAXN]; // 链式前向星需要 public static int[] head = new int[MAXN]; @@ -53,13 +59,13 @@ public class Code05_CountOnTree { public static int[][] stjump = new int[MAXN][MAXH]; - public static int rank(int num) { + public static int kth(int num) { int l = 1, r = s, m; while (l <= r) { m = (l + r) / 2; - if (sort[m] == num) { + if (sorted[m] == num) { return m; - } else if (sort[m] < num) { + } else if (sorted[m] < num) { l = m + 1; } else { r = m - 1; @@ -81,13 +87,13 @@ public static int build(int l, int r) { public static void prepare() { for (int i = 1; i <= n; i++) { - sort[i] = arr[i]; + sorted[i] = arr[i]; } - Arrays.sort(sort, 1, n + 1); + Arrays.sort(sorted, 1, n + 1); s = 1; for (int i = 2; i <= n; i++) { - if (sort[s] != sort[i]) { - sort[++s] = sort[i]; + if (sorted[s] != sorted[i]) { + sorted[++s] = sorted[i]; } } root[0] = build(1, s); @@ -130,7 +136,7 @@ public static int query(int jobk, int l, int r, int u, int v, int lca, int lcafa // 递归版,C++可以通过,java无法通过,递归会爆栈 public static void dfs1(int u, int f) { - root[u] = insert(rank(arr[u]), 1, s, root[f]); + root[u] = insert(kth(arr[u]), 1, s, root[f]); deep[u] = deep[f] + 1; stjump[u][0] = f; for (int p = 1; p < MAXH; p++) { @@ -170,7 +176,7 @@ public static void dfs2() { while (stackSize > 0) { pop(); if (e == -1) { - root[u] = insert(rank(arr[u]), 1, s, root[f]); + root[u] = insert(kth(arr[u]), 1, s, root[f]); deep[u] = deep[f] + 1; stjump[u][0] = f; for (int p = 1; p < MAXH; p++) { @@ -215,7 +221,7 @@ public static int lca(int a, int b) { public static int kth(int u, int v, int k) { int lca = lca(u, v); int i = query(k, 1, s, root[u], root[v], root[lca], root[stjump[lca][0]]); - return sort[i]; + return sorted[i]; } public static void main(String[] args) throws IOException { @@ -242,7 +248,7 @@ public static void main(String[] args) throws IOException { dfs2(); // 使用迭代版防止爆栈 for (int i = 1, u, v, k, lastAns = 0; i <= q; i++) { in.nextToken(); - u = (int) in.nval ^ lastAns; // 题目要求 + u = (int) in.nval ^ lastAns; in.nextToken(); v = (int) in.nval; in.nextToken(); diff --git a/src/class157/Code06_CountOnTree2.java b/src/class157/Code06_CountOnTree2.java new file mode 100644 index 000000000..66d624dc3 --- /dev/null +++ b/src/class157/Code06_CountOnTree2.java @@ -0,0 +1,180 @@ +package class157; + +// 节点路径第k小值,C++版 +// 有n个节点,编号1~n,每个节点有权值,有n-1条边,所有节点组成一棵树 +// 一共有q条查询,每条查询 u v k : 打印u号点到v号点的路径上,第k小的点权 +// 题目有强制在线的要求,上一次打印的答案为lastAns,初始时lastAns = 0 +// 每次给定的u、v、k,按照如下方式得到真实的u、v、k,查询完成后更新lastAns +// 真实u = 给定u ^ lastAns 真实v = 给定v 真实k = 给定k +// 1 <= n、q <= 10^5 1 <= arr[i] <= 2^32 - 1 +// 测试链接 : https://www.luogu.com.cn/problem/P2633 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +//#include +//#include +//#include +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +//const int MAXH = 20; +//const int MAXM = MAXN * MAXH; +//int n, s, q; +//int arr[MAXN]; +//int sorted[MAXN]; +// +//int head[MAXN]; +//int to[MAXN << 1]; +//int nextEdge[MAXN << 1]; +//int cntg = 0; +// +//int root[MAXN]; +//int ls[MAXM]; +//int rs[MAXM]; +//int size[MAXM]; +//int cntt = 0; +// +//int deep[MAXN]; +//int stjump[MAXN][MAXH]; +// +//int kth(int num) { +// int l = 1, r = s, m; +// while (l <= r) { +// m = (l + r) / 2; +// if (sorted[m] == num) { +// return m; +// } else if (sorted[m] < num) { +// l = m + 1; +// } else { +// r = m - 1; +// } +// } +// return -1; +//} +// +//int build(int l, int r) { +// int rt = ++cntt; +// size[rt] = 0; +// if (l < r) { +// int mid = (l + r) / 2; +// ls[rt] = build(l, mid); +// rs[rt] = build(mid + 1, r); +// } +// return rt; +//} +// +//void prepare() { +// for (int i = 1; i <= n; i++) { +// sorted[i] = arr[i]; +// } +// sort(sorted + 1, sorted + n + 1); +// s = 1; +// for (int i = 2; i <= n; i++) { +// if (sorted[s] != sorted[i]) { +// sorted[++s] = sorted[i]; +// } +// } +// root[0] = build(1, s); +//} +// +//void addEdge(int u, int v) { +// nextEdge[++cntg] = head[u]; +// to[cntg] = v; +// head[u] = cntg; +//} +// +//int insert(int jobi, int l, int r, int i) { +// int rt = ++cntt; +// ls[rt] = ls[i]; +// rs[rt] = rs[i]; +// size[rt] = size[i] + 1; +// if (l < r) { +// 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]); +// } +// } +// return rt; +//} +// +//int query(int jobk, int l, int r, int u, int v, int lca, int lcafa) { +// if (l == r) { +// return l; +// } +// int lsize = size[ls[u]] + size[ls[v]] - size[ls[lca]] - size[ls[lcafa]]; +// int mid = (l + r) / 2; +// if (lsize >= 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]); +// } +//} +// +//void dfs(int u, int f) { +// root[u] = insert(kth(arr[u]), 1, s, root[f]); +// deep[u] = deep[f] + 1; +// stjump[u][0] = f; +// for (int p = 1; p < MAXH; p++) { +// stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; +// } +// for (int ei = head[u]; ei > 0; ei = nextEdge[ei]) { +// if (to[ei] != f) { +// dfs(to[ei], u); +// } +// } +//} +// +//int lca(int a, int b) { +// if (deep[a] < deep[b]) { +// swap(a, b); +// } +// for (int p = MAXH - 1; p >= 0; p--) { +// if (deep[stjump[a][p]] >= deep[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 kth(int u, int v, int k) { +// int lcaNode = lca(u, v); +// int i = query(k, 1, s, root[u], root[v], root[lcaNode], root[stjump[lcaNode][0]]); +// return sorted[i]; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> q; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// prepare(); +// 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, k, lastAns = 0; i <= q; i++) { +// cin >> u >> v >> k; +// u ^= lastAns; +// lastAns = kth(u, v, k); +// cout << lastAns << '\n'; +// } +// return 0; +//} \ No newline at end of file diff --git a/src/class157/Code06_MoreImpressive1.java b/src/class157/Code07_MoreImpressive1.java similarity index 90% rename from src/class157/Code06_MoreImpressive1.java rename to src/class157/Code07_MoreImpressive1.java index d470737c7..e9fa77da6 100644 --- a/src/class157/Code06_MoreImpressive1.java +++ b/src/class157/Code07_MoreImpressive1.java @@ -1,6 +1,14 @@ package class157; // 更为厉害,java版 +// 有n个节点,编号1~n,给定n-1条边,连成一棵树,1号点是树头 +// 如果节点a是节点b的祖先节点,认为"a比b更厉害" +// 如果节点a到节点b的路径上边的数量 <= 常数k,认为"a和b是盟友" +// 一共有q条查询,每条查询 p k : 查询有多少三元组(a, b, c)满足如下规定 +// 1,a就是节点p,但是a、b、c为三个不同的点 +// 2,a和b都比c厉害 +// 3,a和b是盟友,路径上边的数量 <= 给定的k +// 1 <= n、q、k <= 3 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3899 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -11,7 +19,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code06_MoreImpressive1 { +public class Code07_MoreImpressive1 { public static int MAXN = 300001; diff --git a/src/class157/Code06_MoreImpressive2.java b/src/class157/Code07_MoreImpressive2.java similarity index 84% rename from src/class157/Code06_MoreImpressive2.java rename to src/class157/Code07_MoreImpressive2.java index e33ed5d16..de8245cac 100644 --- a/src/class157/Code06_MoreImpressive2.java +++ b/src/class157/Code07_MoreImpressive2.java @@ -1,6 +1,14 @@ package class157; // 更为厉害,C++版 +// 有n个节点,编号1~n,给定n-1条边,连成一棵树,1号点是树头 +// 如果节点a是节点b的祖先节点,认为"a比b更厉害" +// 如果节点a到节点b的路径上边的数量 <= 常数k,认为"a和b是盟友" +// 一共有q条查询,每条查询 p k : 查询有多少三元组(a, b, c)满足如下规定 +// 1,a就是节点p,但是a、b、c为三个不同的点 +// 2,a和b都比c厉害 +// 3,a和b是盟友,路径上边的数量 <= 给定的k +// 1 <= n、q、k <= 3 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3899 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -9,8 +17,8 @@ // //using namespace std; // -//static const int MAXN = 300001; -//static const int MAXM = MAXN * 22; +//const int MAXN = 300001; +//const int MAXM = MAXN * 22; //int n, q; // //int head[MAXN]; From 550c0c0aa8684c59abd17d5b9f29b3bc1a85e76f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 10 Jan 2025 18:57:48 +0800 Subject: [PATCH 0587/2029] modify code --- ...e05_LargestUpMedian1.java => Code04_LargestUpMedian1.java} | 2 +- ...e05_LargestUpMedian2.java => Code04_LargestUpMedian2.java} | 0 ...nentization1.java => Code05_LazyTagPermanentization1.java} | 4 ++-- ...nentization2.java => Code05_LazyTagPermanentization2.java} | 0 4 files changed, 3 insertions(+), 3 deletions(-) rename src/class157/{Code05_LargestUpMedian1.java => Code04_LargestUpMedian1.java} (99%) rename src/class157/{Code05_LargestUpMedian2.java => Code04_LargestUpMedian2.java} (100%) rename src/class157/{Code04_LazyTagPermanentization1.java => Code05_LazyTagPermanentization1.java} (98%) rename src/class157/{Code04_LazyTagPermanentization2.java => Code05_LazyTagPermanentization2.java} (100%) diff --git a/src/class157/Code05_LargestUpMedian1.java b/src/class157/Code04_LargestUpMedian1.java similarity index 99% rename from src/class157/Code05_LargestUpMedian1.java rename to src/class157/Code04_LargestUpMedian1.java index 9575f88cd..ad1c76f2e 100644 --- a/src/class157/Code05_LargestUpMedian1.java +++ b/src/class157/Code04_LargestUpMedian1.java @@ -21,7 +21,7 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class Code05_LargestUpMedian1 { +public class Code04_LargestUpMedian1 { public static int MAXN = 20001; diff --git a/src/class157/Code05_LargestUpMedian2.java b/src/class157/Code04_LargestUpMedian2.java similarity index 100% rename from src/class157/Code05_LargestUpMedian2.java rename to src/class157/Code04_LargestUpMedian2.java diff --git a/src/class157/Code04_LazyTagPermanentization1.java b/src/class157/Code05_LazyTagPermanentization1.java similarity index 98% rename from src/class157/Code04_LazyTagPermanentization1.java rename to src/class157/Code05_LazyTagPermanentization1.java index 3fcaba968..8f99554ef 100644 --- a/src/class157/Code04_LazyTagPermanentization1.java +++ b/src/class157/Code05_LazyTagPermanentization1.java @@ -12,7 +12,7 @@ // 测试链接 : https://acm.hdu.edu.cn/showproblem.php?pid=4348 // 测试链接 : https://www.spoj.com/problems/TTM/ // 这道题的两个测试,都严重卡常,java版很难通过,这是语言歧视 -// 想通过用C++写吧,本节课Code04_LazyTagPermanentization2文件就是C++的实现 +// 想通过用C++写吧,本节课Code05_LazyTagPermanentization2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 import java.io.BufferedWriter; @@ -20,7 +20,7 @@ import java.io.InputStream; import java.io.OutputStreamWriter; -public class Code04_LazyTagPermanentization1 { +public class Code05_LazyTagPermanentization1 { public static int MAXN = 100001; diff --git a/src/class157/Code04_LazyTagPermanentization2.java b/src/class157/Code05_LazyTagPermanentization2.java similarity index 100% rename from src/class157/Code04_LazyTagPermanentization2.java rename to src/class157/Code05_LazyTagPermanentization2.java From 66eef1783bc6e704ef56869c6b00525689e937f1 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 10 Jan 2025 18:59:38 +0800 Subject: [PATCH 0588/2029] modify code --- ...ermanentization1.java => Code05_TagPermanentization1.java} | 4 ++-- ...ermanentization2.java => Code05_TagPermanentization2.java} | 0 2 files changed, 2 insertions(+), 2 deletions(-) rename src/class157/{Code05_LazyTagPermanentization1.java => Code05_TagPermanentization1.java} (97%) rename src/class157/{Code05_LazyTagPermanentization2.java => Code05_TagPermanentization2.java} (100%) diff --git a/src/class157/Code05_LazyTagPermanentization1.java b/src/class157/Code05_TagPermanentization1.java similarity index 97% rename from src/class157/Code05_LazyTagPermanentization1.java rename to src/class157/Code05_TagPermanentization1.java index 8f99554ef..78417c0a1 100644 --- a/src/class157/Code05_LazyTagPermanentization1.java +++ b/src/class157/Code05_TagPermanentization1.java @@ -12,7 +12,7 @@ // 测试链接 : https://acm.hdu.edu.cn/showproblem.php?pid=4348 // 测试链接 : https://www.spoj.com/problems/TTM/ // 这道题的两个测试,都严重卡常,java版很难通过,这是语言歧视 -// 想通过用C++写吧,本节课Code05_LazyTagPermanentization2文件就是C++的实现 +// 想通过用C++写吧,本节课Code05_TagPermanentization2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 import java.io.BufferedWriter; @@ -20,7 +20,7 @@ import java.io.InputStream; import java.io.OutputStreamWriter; -public class Code05_LazyTagPermanentization1 { +public class Code05_TagPermanentization1 { public static int MAXN = 100001; diff --git a/src/class157/Code05_LazyTagPermanentization2.java b/src/class157/Code05_TagPermanentization2.java similarity index 100% rename from src/class157/Code05_LazyTagPermanentization2.java rename to src/class157/Code05_TagPermanentization2.java From e8b15e724b23e5b13a7d8783d9b257e090659c65 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 10 Jan 2025 19:15:25 +0800 Subject: [PATCH 0589/2029] modify code --- src/class157/Code06_CountOnTree1.java | 3 ++- src/class157/Code06_CountOnTree2.java | 3 ++- src/class157/Code07_MoreImpressive1.java | 1 + src/class157/Code07_MoreImpressive2.java | 1 + 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/class157/Code06_CountOnTree1.java b/src/class157/Code06_CountOnTree1.java index a9464950b..5006b49cd 100644 --- a/src/class157/Code06_CountOnTree1.java +++ b/src/class157/Code06_CountOnTree1.java @@ -6,7 +6,8 @@ // 题目有强制在线的要求,上一次打印的答案为lastAns,初始时lastAns = 0 // 每次给定的u、v、k,按照如下方式得到真实的u、v、k,查询完成后更新lastAns // 真实u = 给定u ^ lastAns 真实v = 给定v 真实k = 给定k -// 1 <= n、q <= 10^5 1 <= arr[i] <= 2^32 - 1 +// 1 <= n、q <= 10^5 +// 1 <= arr[i] <= 2^32 - 1 // 测试链接 : https://www.luogu.com.cn/problem/P2633 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class157/Code06_CountOnTree2.java b/src/class157/Code06_CountOnTree2.java index 66d624dc3..a0f5c9bf3 100644 --- a/src/class157/Code06_CountOnTree2.java +++ b/src/class157/Code06_CountOnTree2.java @@ -6,7 +6,8 @@ // 题目有强制在线的要求,上一次打印的答案为lastAns,初始时lastAns = 0 // 每次给定的u、v、k,按照如下方式得到真实的u、v、k,查询完成后更新lastAns // 真实u = 给定u ^ lastAns 真实v = 给定v 真实k = 给定k -// 1 <= n、q <= 10^5 1 <= arr[i] <= 2^32 - 1 +// 1 <= n、q <= 10^5 +// 1 <= arr[i] <= 2^32 - 1 // 测试链接 : https://www.luogu.com.cn/problem/P2633 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class157/Code07_MoreImpressive1.java b/src/class157/Code07_MoreImpressive1.java index e9fa77da6..f7ebc522b 100644 --- a/src/class157/Code07_MoreImpressive1.java +++ b/src/class157/Code07_MoreImpressive1.java @@ -1,6 +1,7 @@ package class157; // 更为厉害,java版 +// 原始题意有坑,多注意! // 有n个节点,编号1~n,给定n-1条边,连成一棵树,1号点是树头 // 如果节点a是节点b的祖先节点,认为"a比b更厉害" // 如果节点a到节点b的路径上边的数量 <= 常数k,认为"a和b是盟友" diff --git a/src/class157/Code07_MoreImpressive2.java b/src/class157/Code07_MoreImpressive2.java index de8245cac..884101dcd 100644 --- a/src/class157/Code07_MoreImpressive2.java +++ b/src/class157/Code07_MoreImpressive2.java @@ -1,6 +1,7 @@ package class157; // 更为厉害,C++版 +// 原始题意有坑,多注意! // 有n个节点,编号1~n,给定n-1条边,连成一棵树,1号点是树头 // 如果节点a是节点b的祖先节点,认为"a比b更厉害" // 如果节点a到节点b的路径上边的数量 <= 常数k,认为"a和b是盟友" From 784500f2ef0f95080e5bea0b2eb9301320046532 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 10 Jan 2025 19:33:00 +0800 Subject: [PATCH 0590/2029] modify code --- ...anentization1.java => Code05_LazyPermanentization1.java} | 6 +++--- ...anentization2.java => Code05_LazyPermanentization2.java} | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) rename src/class157/{Code05_TagPermanentization1.java => Code05_LazyPermanentization1.java} (96%) rename src/class157/{Code05_TagPermanentization2.java => Code05_LazyPermanentization2.java} (98%) diff --git a/src/class157/Code05_TagPermanentization1.java b/src/class157/Code05_LazyPermanentization1.java similarity index 96% rename from src/class157/Code05_TagPermanentization1.java rename to src/class157/Code05_LazyPermanentization1.java index 78417c0a1..427f53dbc 100644 --- a/src/class157/Code05_TagPermanentization1.java +++ b/src/class157/Code05_LazyPermanentization1.java @@ -1,6 +1,6 @@ package class157; -// 可持久化线段树的标签永久化,java版 +// 可持久化线段树懒更新永久化,java版 // 给定一个长度为n的数组arr,下标1~n,时间戳t=0,arr认为是0版本的数组 // 一共有q条查询,每条查询为如下四种类型中的一种 // C x y z : 当前时间戳t版本的数组,[x..y]范围每个数字增加z,得到t+1版本数组,并且t++ @@ -12,7 +12,7 @@ // 测试链接 : https://acm.hdu.edu.cn/showproblem.php?pid=4348 // 测试链接 : https://www.spoj.com/problems/TTM/ // 这道题的两个测试,都严重卡常,java版很难通过,这是语言歧视 -// 想通过用C++写吧,本节课Code05_TagPermanentization2文件就是C++的实现 +// 想通过用C++写吧,本节课Code05_LazyPermanentization2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 import java.io.BufferedWriter; @@ -20,7 +20,7 @@ import java.io.InputStream; import java.io.OutputStreamWriter; -public class Code05_TagPermanentization1 { +public class Code05_LazyPermanentization1 { public static int MAXN = 100001; diff --git a/src/class157/Code05_TagPermanentization2.java b/src/class157/Code05_LazyPermanentization2.java similarity index 98% rename from src/class157/Code05_TagPermanentization2.java rename to src/class157/Code05_LazyPermanentization2.java index 05002d400..25f9fd61e 100644 --- a/src/class157/Code05_TagPermanentization2.java +++ b/src/class157/Code05_LazyPermanentization2.java @@ -1,6 +1,6 @@ package class157; -// 可持久化线段树的标签永久化,C++版 +// 可持久化线段树懒更新永久化,C++版 // 给定一个长度为n的数组arr,下标1~n,时间戳t=0,arr认为是0版本的数组 // 一共有q条查询,每条查询为如下四种类型中的一种 // C x y z : 当前时间戳t版本的数组,[x..y]范围每个数字增加z,得到t+1版本数组,并且t++ From 2659584bba187b41ce224c5d196d8c4123509130 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 10 Jan 2025 19:40:25 +0800 Subject: [PATCH 0591/2029] modify code --- ...manentization1.java => Code05_TagPermanentization1.java} | 6 +++--- ...manentization2.java => Code05_TagPermanentization2.java} | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) rename src/class157/{Code05_LazyPermanentization1.java => Code05_TagPermanentization1.java} (96%) rename src/class157/{Code05_LazyPermanentization2.java => Code05_TagPermanentization2.java} (98%) diff --git a/src/class157/Code05_LazyPermanentization1.java b/src/class157/Code05_TagPermanentization1.java similarity index 96% rename from src/class157/Code05_LazyPermanentization1.java rename to src/class157/Code05_TagPermanentization1.java index 427f53dbc..8ab1827b5 100644 --- a/src/class157/Code05_LazyPermanentization1.java +++ b/src/class157/Code05_TagPermanentization1.java @@ -1,6 +1,6 @@ package class157; -// 可持久化线段树懒更新永久化,java版 +// 可持久化线段树标记永久化,java版 // 给定一个长度为n的数组arr,下标1~n,时间戳t=0,arr认为是0版本的数组 // 一共有q条查询,每条查询为如下四种类型中的一种 // C x y z : 当前时间戳t版本的数组,[x..y]范围每个数字增加z,得到t+1版本数组,并且t++ @@ -12,7 +12,7 @@ // 测试链接 : https://acm.hdu.edu.cn/showproblem.php?pid=4348 // 测试链接 : https://www.spoj.com/problems/TTM/ // 这道题的两个测试,都严重卡常,java版很难通过,这是语言歧视 -// 想通过用C++写吧,本节课Code05_LazyPermanentization2文件就是C++的实现 +// 想通过用C++写吧,本节课Code05_TagPermanentization2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 import java.io.BufferedWriter; @@ -20,7 +20,7 @@ import java.io.InputStream; import java.io.OutputStreamWriter; -public class Code05_LazyPermanentization1 { +public class Code05_TagPermanentization1 { public static int MAXN = 100001; diff --git a/src/class157/Code05_LazyPermanentization2.java b/src/class157/Code05_TagPermanentization2.java similarity index 98% rename from src/class157/Code05_LazyPermanentization2.java rename to src/class157/Code05_TagPermanentization2.java index 25f9fd61e..6d64d9499 100644 --- a/src/class157/Code05_LazyPermanentization2.java +++ b/src/class157/Code05_TagPermanentization2.java @@ -1,6 +1,6 @@ package class157; -// 可持久化线段树懒更新永久化,C++版 +// 可持久化线段树标记永久化,C++版 // 给定一个长度为n的数组arr,下标1~n,时间戳t=0,arr认为是0版本的数组 // 一共有q条查询,每条查询为如下四种类型中的一种 // C x y z : 当前时间戳t版本的数组,[x..y]范围每个数字增加z,得到t+1版本数组,并且t++ From 08be4dca2b2433e366de9eda4348255dec4089c4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 11 Jan 2025 01:55:14 +0800 Subject: [PATCH 0592/2029] modify code --- src/class157/Code07_MoreImpressive1.java | 23 ++++++++++---------- src/class157/Code07_MoreImpressive2.java | 27 +++++++++++------------- 2 files changed, 23 insertions(+), 27 deletions(-) diff --git a/src/class157/Code07_MoreImpressive1.java b/src/class157/Code07_MoreImpressive1.java index f7ebc522b..6ed4f103d 100644 --- a/src/class157/Code07_MoreImpressive1.java +++ b/src/class157/Code07_MoreImpressive1.java @@ -1,14 +1,13 @@ package class157; // 更为厉害,java版 -// 原始题意有坑,多注意! // 有n个节点,编号1~n,给定n-1条边,连成一棵树,1号点是树头 -// 如果节点a是节点b的祖先节点,认为"a比b更厉害" -// 如果节点a到节点b的路径上边的数量 <= 常数k,认为"a和b是盟友" -// 一共有q条查询,每条查询 p k : 查询有多少三元组(a, b, c)满足如下规定 -// 1,a就是节点p,但是a、b、c为三个不同的点 +// 如果x是y的祖先节点,认为"x比y更厉害" +// 如果x到y的路径上,边的数量 <= 某个常数,认为"x和y是邻居" +// 一共有q条查询,每条查询 a k : 打印有多少三元组(a, b, c)满足如下规定 +// 1,a、b、c为三个不同的点 // 2,a和b都比c厉害 -// 3,a和b是盟友,路径上边的数量 <= 给定的k +// 3,a和b是邻居,路径边的数量 <= 给定的k // 1 <= n、q、k <= 3 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3899 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -202,9 +201,9 @@ public static void dfs4() { } } - public static long compute(int p, int k) { - long ans = query(deep[p] + 1, deep[p] + k, 1, n, root[dfn[p] - 1], root[dfn[p] + size[p] - 1]); - ans += (long) (size[p] - 1) * Math.min(k, deep[p] - 1); + public static long compute(int a, int k) { + long ans = query(deep[a] + 1, deep[a] + k, 1, n, root[dfn[a] - 1], root[dfn[a] + size[a] - 1]); + ans += (long) (size[a] - 1) * Math.min(k, deep[a] - 1); return ans; } @@ -227,12 +226,12 @@ public static void main(String[] args) throws IOException { root[0] = build(1, n); dfs3(); // 使用迭代版防止爆栈 dfs4(); // 使用迭代版防止爆栈 - for (int i = 1, p, k; i <= q; i++) { + for (int i = 1, a, k; i <= q; i++) { in.nextToken(); - p = (int) in.nval; + a = (int) in.nval; in.nextToken(); k = (int) in.nval; - out.println(compute(p, k)); + out.println(compute(a, k)); } out.flush(); out.close(); diff --git a/src/class157/Code07_MoreImpressive2.java b/src/class157/Code07_MoreImpressive2.java index 884101dcd..41534fe61 100644 --- a/src/class157/Code07_MoreImpressive2.java +++ b/src/class157/Code07_MoreImpressive2.java @@ -1,14 +1,13 @@ package class157; // 更为厉害,C++版 -// 原始题意有坑,多注意! // 有n个节点,编号1~n,给定n-1条边,连成一棵树,1号点是树头 -// 如果节点a是节点b的祖先节点,认为"a比b更厉害" -// 如果节点a到节点b的路径上边的数量 <= 常数k,认为"a和b是盟友" -// 一共有q条查询,每条查询 p k : 查询有多少三元组(a, b, c)满足如下规定 -// 1,a就是节点p,但是a、b、c为三个不同的点 +// 如果x是y的祖先节点,认为"x比y更厉害" +// 如果x到y的路径上,边的数量 <= 某个常数,认为"x和y是邻居" +// 一共有q条查询,每条查询 a k : 打印有多少三元组(a, b, c)满足如下规定 +// 1,a、b、c为三个不同的点 // 2,a和b都比c厉害 -// 3,a和b是盟友,路径上边的数量 <= 给定的k +// 3,a和b是邻居,路径边的数量 <= 给定的k // 1 <= n、q、k <= 3 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3899 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 @@ -111,9 +110,9 @@ // } //} // -//long long compute(int p, int k) { -// long long ans = query(dep[p] + 1, dep[p] + k, 1, n, root[dfn[p] - 1], root[dfn[p] + siz[p] - 1]); -// ans += (long long)(siz[p] - 1) * min(k, dep[p] - 1); +//long long compute(int a, int k) { +// long long ans = query(dep[a] + 1, dep[a] + k, 1, n, root[dfn[a] - 1], root[dfn[a] + siz[a] - 1]); +// ans += (long long)(siz[a] - 1) * min(k, dep[a] - 1); // return ans; //} // @@ -121,8 +120,7 @@ // ios::sync_with_stdio(false); // cin.tie(nullptr); // cin >> n >> q; -// for (int i = 1; i < n; i++) { -// int u, v; +// for (int i = 1, u, v; i < n; i++) { // cin >> u >> v; // addEdge(u, v); // addEdge(v, u); @@ -130,10 +128,9 @@ // root[0] = build(1, n); // dfs1(1, 0); // dfs2(1, 0); -// for(int i = 1; i <= q; i++) { -// int p, k; -// cin >> p >> k; -// cout << compute(p, k) << "\n"; +// for(int i = 1, a, k; i <= q; i++) { +// cin >> a >> k; +// cout << compute(a, k) << "\n"; // } // return 0; //} \ No newline at end of file From be80677c8df3f6d7264f376382d341b42a6d43b9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 11 Jan 2025 01:59:36 +0800 Subject: [PATCH 0593/2029] modify code --- src/class157/Code06_CountOnTree2.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/class157/Code06_CountOnTree2.java b/src/class157/Code06_CountOnTree2.java index a0f5c9bf3..60751e362 100644 --- a/src/class157/Code06_CountOnTree2.java +++ b/src/class157/Code06_CountOnTree2.java @@ -29,7 +29,7 @@ // //int head[MAXN]; //int to[MAXN << 1]; -//int nextEdge[MAXN << 1]; +//int nxt[MAXN << 1]; //int cntg = 0; // //int root[MAXN]; @@ -82,7 +82,7 @@ //} // //void addEdge(int u, int v) { -// nextEdge[++cntg] = head[u]; +// nxt[++cntg] = head[u]; // to[cntg] = v; // head[u] = cntg; //} @@ -123,7 +123,7 @@ // for (int p = 1; p < MAXH; p++) { // stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; // } -// for (int ei = head[u]; ei > 0; ei = nextEdge[ei]) { +// for (int ei = head[u]; ei > 0; ei = nxt[ei]) { // if (to[ei] != f) { // dfs(to[ei], u); // } From 04ef9ed121ee00d4d09efd3ec1bad80ff6fd571d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 11 Jan 2025 21:18:41 +0800 Subject: [PATCH 0594/2029] modify code --- src/class157/Code01_PersistentSegmentTree2.java | 5 +---- src/class157/Code02_MissingSmallest2.java | 5 +---- src/class157/Code04_LargestUpMedian2.java | 6 +----- src/class157/Code05_TagPermanentization1.java | 2 +- src/class157/Code05_TagPermanentization2.java | 2 +- src/class157/Code06_CountOnTree2.java | 6 +----- 6 files changed, 6 insertions(+), 20 deletions(-) diff --git a/src/class157/Code01_PersistentSegmentTree2.java b/src/class157/Code01_PersistentSegmentTree2.java index ea65a6e86..7f95eac3e 100644 --- a/src/class157/Code01_PersistentSegmentTree2.java +++ b/src/class157/Code01_PersistentSegmentTree2.java @@ -8,10 +8,7 @@ // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 -//#include -//#include -//#include -//#include +//#include // //using namespace std; // diff --git a/src/class157/Code02_MissingSmallest2.java b/src/class157/Code02_MissingSmallest2.java index 59164ff00..714b7e11d 100644 --- a/src/class157/Code02_MissingSmallest2.java +++ b/src/class157/Code02_MissingSmallest2.java @@ -8,10 +8,7 @@ // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 -//#include -//#include -//#include -//#include +//#include // //using namespace std; // diff --git a/src/class157/Code04_LargestUpMedian2.java b/src/class157/Code04_LargestUpMedian2.java index b0d11dbf3..f61b983f2 100644 --- a/src/class157/Code04_LargestUpMedian2.java +++ b/src/class157/Code04_LargestUpMedian2.java @@ -14,11 +14,7 @@ // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 -//#include -//#include -//#include -//#include -//#include +//#include // //using namespace std; // diff --git a/src/class157/Code05_TagPermanentization1.java b/src/class157/Code05_TagPermanentization1.java index 8ab1827b5..773b9aaac 100644 --- a/src/class157/Code05_TagPermanentization1.java +++ b/src/class157/Code05_TagPermanentization1.java @@ -1,6 +1,6 @@ package class157; -// 可持久化线段树标记永久化,java版 +// 线段树标记永久化结合可持久化,java版 // 给定一个长度为n的数组arr,下标1~n,时间戳t=0,arr认为是0版本的数组 // 一共有q条查询,每条查询为如下四种类型中的一种 // C x y z : 当前时间戳t版本的数组,[x..y]范围每个数字增加z,得到t+1版本数组,并且t++ diff --git a/src/class157/Code05_TagPermanentization2.java b/src/class157/Code05_TagPermanentization2.java index 6d64d9499..f1e6bb55b 100644 --- a/src/class157/Code05_TagPermanentization2.java +++ b/src/class157/Code05_TagPermanentization2.java @@ -1,6 +1,6 @@ package class157; -// 可持久化线段树标记永久化,C++版 +// 线段树标记永久化结合可持久化,C++版 // 给定一个长度为n的数组arr,下标1~n,时间戳t=0,arr认为是0版本的数组 // 一共有q条查询,每条查询为如下四种类型中的一种 // C x y z : 当前时间戳t版本的数组,[x..y]范围每个数字增加z,得到t+1版本数组,并且t++ diff --git a/src/class157/Code06_CountOnTree2.java b/src/class157/Code06_CountOnTree2.java index 60751e362..35331136f 100644 --- a/src/class157/Code06_CountOnTree2.java +++ b/src/class157/Code06_CountOnTree2.java @@ -12,11 +12,7 @@ // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 -//#include -//#include -//#include -//#include -//#include +//#include // //using namespace std; // From 1ac89b8251e7786ed29f8810d3022ebb90299641 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 13 Jan 2025 12:37:30 +0800 Subject: [PATCH 0595/2029] modify code --- .../Code01_PersistentSegmentTree1.java | 24 +++++++-------- .../Code01_PersistentSegmentTree2.java | 24 +++++++-------- ....java => Code02_TagPermanentization1.java} | 16 +++++----- ....java => Code02_TagPermanentization2.java} | 12 ++++---- ...est1.java => Code03_MissingSmallest1.java} | 12 ++++---- ...est2.java => Code03_MissingSmallest2.java} | 10 +++---- ...rs1.java => Code04_DifferentNumbers1.java} | 12 ++++---- ...rs2.java => Code04_DifferentNumbers2.java} | 10 +++---- ...ian1.java => Code05_LargestUpMedian1.java} | 26 ++++++++-------- ...ian2.java => Code05_LargestUpMedian2.java} | 24 +++++++-------- src/class157/Code06_CountOnTree1.java | 30 ++++++++++--------- src/class157/Code06_CountOnTree2.java | 30 ++++++++++--------- src/class157/Code07_MoreImpressive1.java | 10 +++---- src/class157/Code07_MoreImpressive2.java | 10 +++---- 14 files changed, 127 insertions(+), 123 deletions(-) rename src/class157/{Code05_TagPermanentization1.java => Code02_TagPermanentization1.java} (93%) rename src/class157/{Code05_TagPermanentization2.java => Code02_TagPermanentization2.java} (93%) rename src/class157/{Code02_MissingSmallest1.java => Code03_MissingSmallest1.java} (93%) rename src/class157/{Code02_MissingSmallest2.java => Code03_MissingSmallest2.java} (92%) rename src/class157/{Code03_DifferentNumbers1.java => Code04_DifferentNumbers1.java} (95%) rename src/class157/{Code03_DifferentNumbers2.java => Code04_DifferentNumbers2.java} (94%) rename src/class157/{Code04_LargestUpMedian1.java => Code05_LargestUpMedian1.java} (91%) rename src/class157/{Code04_LargestUpMedian2.java => Code05_LargestUpMedian2.java} (90%) diff --git a/src/class157/Code01_PersistentSegmentTree1.java b/src/class157/Code01_PersistentSegmentTree1.java index 8b4897e77..86d5116fe 100644 --- a/src/class157/Code01_PersistentSegmentTree1.java +++ b/src/class157/Code01_PersistentSegmentTree1.java @@ -1,9 +1,9 @@ package class157; // 可持久化线段树模版题,java版 -// 给定一个长度为n的数组arr,下标1~n,一共有q条查询 +// 给定一个长度为n的数组arr,下标1~n,一共有m条查询 // 每条查询 l r k : 打印arr[l..r]中第k小的数字 -// 1 <= n、q <= 2 * 10^5 +// 1 <= n、m <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3834 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -21,7 +21,7 @@ public class Code01_PersistentSegmentTree1 { public static int MAXM = MAXN * 22; - public static int n, q; + public static int n, m; public static int[] arr = new int[MAXN]; @@ -38,14 +38,14 @@ public class Code01_PersistentSegmentTree1 { public static int cnt; public static int kth(int num) { - int l = 1, r = n, m, ans = 0; - while (l <= r) { - m = (l + r) / 2; - if (sorted[m] <= num) { - ans = m; - l = m + 1; + int left = 1, right = n, mid, ans = 0; + while (left <= right) { + mid = (left + right) / 2; + if (sorted[mid] <= num) { + ans = mid; + left = mid + 1; } else { - r = m - 1; + right = mid - 1; } } return ans; @@ -111,13 +111,13 @@ public static void main(String[] args) throws IOException { in.nextToken(); n = (int) in.nval; in.nextToken(); - q = (int) in.nval; + m = (int) in.nval; for (int i = 1; i <= n; i++) { in.nextToken(); arr[i] = (int) in.nval; } prepare(); - for (int i = 1, l, r, k; i <= q; i++) { + for (int i = 1, l, r, k; i <= m; i++) { in.nextToken(); l = (int) in.nval; in.nextToken(); diff --git a/src/class157/Code01_PersistentSegmentTree2.java b/src/class157/Code01_PersistentSegmentTree2.java index 7f95eac3e..6634d416c 100644 --- a/src/class157/Code01_PersistentSegmentTree2.java +++ b/src/class157/Code01_PersistentSegmentTree2.java @@ -1,9 +1,9 @@ package class157; // 可持久化线段树模版题,C++版 -// 给定一个长度为n的数组arr,下标1~n,一共有q条查询 +// 给定一个长度为n的数组arr,下标1~n,一共有m条查询 // 每条查询 l r k : 打印arr[l..r]中第k小的数字 -// 1 <= n、q <= 2 * 10^5 +// 1 <= n、m <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3834 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -14,7 +14,7 @@ // //const int MAXN = 200001; //const int MAXM = MAXN * 22; -//int n, q; +//int n, m; //int arr[MAXN]; //int sorted[MAXN]; //int root[MAXN]; @@ -24,14 +24,14 @@ //int cnt; // //int kth(int num) { -// int l = 1, r = n, m, ans = 0; -// while (l <= r) { -// m = (l + r) / 2; -// if (sorted[m] <= num) { -// ans = m; -// l = m + 1; +// int left = 1, right = n, mid, ans = 0; +// while (left <= right) { +// mid = (left + right) / 2; +// if (sorted[mid] <= num) { +// ans = mid; +// left = mid + 1; // } else { -// r = m - 1; +// right = mid - 1; // } // } // return ans; @@ -93,12 +93,12 @@ //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]; // } // prepare(); -// for (int i = 1, l, r, k; i <= q; i++) { +// for (int i = 1, l, r, k; i <= m; i++) { // cin >> l >> r >> k; // int ans = query(k, 1, n, root[l - 1], root[r]); // cout << sorted[ans] << '\n'; diff --git a/src/class157/Code05_TagPermanentization1.java b/src/class157/Code02_TagPermanentization1.java similarity index 93% rename from src/class157/Code05_TagPermanentization1.java rename to src/class157/Code02_TagPermanentization1.java index 773b9aaac..2bc5ccbb8 100644 --- a/src/class157/Code05_TagPermanentization1.java +++ b/src/class157/Code02_TagPermanentization1.java @@ -1,18 +1,18 @@ package class157; -// 线段树标记永久化结合可持久化,java版 +// 范围修改的可持久化线段树 + 标记永久化,java版 // 给定一个长度为n的数组arr,下标1~n,时间戳t=0,arr认为是0版本的数组 -// 一共有q条查询,每条查询为如下四种类型中的一种 +// 一共有m条查询,每条查询为如下四种类型中的一种 // C x y z : 当前时间戳t版本的数组,[x..y]范围每个数字增加z,得到t+1版本数组,并且t++ // Q x y : 当前时间戳t版本的数组,打印[x..y]范围累加和 // H x y z : z版本的数组,打印[x..y]范围的累加和 // B x : 当前时间戳t设置成x -// 1 <= n、q <= 10^5 +// 1 <= n、m <= 10^5 // -10^9 <= arr[i] <= +10^9 // 测试链接 : https://acm.hdu.edu.cn/showproblem.php?pid=4348 // 测试链接 : https://www.spoj.com/problems/TTM/ // 这道题的两个测试,都严重卡常,java版很难通过,这是语言歧视 -// 想通过用C++写吧,本节课Code05_TagPermanentization2文件就是C++的实现 +// 想通过用C++写吧,本节课Code02_TagPermanentization2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 import java.io.BufferedWriter; @@ -20,13 +20,13 @@ import java.io.InputStream; import java.io.OutputStreamWriter; -public class Code05_TagPermanentization1 { +public class Code02_TagPermanentization1 { public static int MAXN = 100001; public static int MAXM = MAXN * 25; - public static int n, q, t = 0; + public static int n, m, t = 0; public static int[] arr = new int[MAXN]; @@ -101,13 +101,13 @@ public static void main(String[] args) throws IOException { FastReader in = new FastReader(); BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out)); n = in.nextInt(); - q = in.nextInt(); + m = in.nextInt(); for (int i = 1; i <= n; i++) { arr[i] = in.nextInt(); } root[0] = build(1, n); String op; - for (int i = 1, x, y, z; i <= q; i++) { + for (int i = 1, x, y, z; i <= m; i++) { op = in.next(); if (op.equals("C")) { x = in.nextInt(); diff --git a/src/class157/Code05_TagPermanentization2.java b/src/class157/Code02_TagPermanentization2.java similarity index 93% rename from src/class157/Code05_TagPermanentization2.java rename to src/class157/Code02_TagPermanentization2.java index f1e6bb55b..2449185ee 100644 --- a/src/class157/Code05_TagPermanentization2.java +++ b/src/class157/Code02_TagPermanentization2.java @@ -1,13 +1,13 @@ package class157; -// 线段树标记永久化结合可持久化,C++版 +// 范围修改的可持久化线段树 + 标记永久化,C++版 // 给定一个长度为n的数组arr,下标1~n,时间戳t=0,arr认为是0版本的数组 -// 一共有q条查询,每条查询为如下四种类型中的一种 +// 一共有m条查询,每条查询为如下四种类型中的一种 // C x y z : 当前时间戳t版本的数组,[x..y]范围每个数字增加z,得到t+1版本数组,并且t++ // Q x y : 当前时间戳t版本的数组,打印[x..y]范围累加和 // H x y z : z版本的数组,打印[x..y]范围的累加和 // B x : 当前时间戳t设置成x -// 1 <= n、q <= 10^5 +// 1 <= n、m <= 10^5 // -10^9 <= arr[i] <= +10^9 // 测试链接 : https://acm.hdu.edu.cn/showproblem.php?pid=4348 // 测试链接 : https://www.spoj.com/problems/TTM/ @@ -20,7 +20,7 @@ // //const int MAXN = 100001; //const int MAXM = MAXN * 25; -//int n, q, t = 0; +//int n, m, t = 0; //long long arr[MAXN]; //int root[MAXN]; //int ls[MAXM]; @@ -81,7 +81,7 @@ //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]; // } @@ -89,7 +89,7 @@ // char op; // int x, y; // long long z; -// for (int i = 1; i <= q; i++) { +// for (int i = 1; i <= m; i++) { // cin >> op; // if (op == 'C') { // cin >> x >> y >> z; diff --git a/src/class157/Code02_MissingSmallest1.java b/src/class157/Code03_MissingSmallest1.java similarity index 93% rename from src/class157/Code02_MissingSmallest1.java rename to src/class157/Code03_MissingSmallest1.java index 5de0adba5..b5df3ccac 100644 --- a/src/class157/Code02_MissingSmallest1.java +++ b/src/class157/Code03_MissingSmallest1.java @@ -1,9 +1,9 @@ package class157; // 区间内没有出现的最小自然数,java版 -// 给定一个长度为n的数组arr,下标1~n,一共有q条查询 +// 给定一个长度为n的数组arr,下标1~n,一共有m条查询 // 每条查询 l r : 打印arr[l..r]内没有出现过的最小自然数,注意0是自然数 -// 1 <= n、q、arr[i] <= 2 * 10^5 +// 1 <= n、m、arr[i] <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P4137 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -14,13 +14,13 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code02_MissingSmallest1 { +public class Code03_MissingSmallest1 { public static int MAXN = 200001; public static int MAXM = MAXN * 22; - public static int n, q; + public static int n, m; public static int[] arr = new int[MAXN]; @@ -102,13 +102,13 @@ public static void main(String[] args) throws IOException { in.nextToken(); n = (int) in.nval; in.nextToken(); - q = (int) in.nval; + m = (int) in.nval; for (int i = 1; i <= n; i++) { in.nextToken(); arr[i] = (int) in.nval; } prepare(); - for (int i = 1, l, r; i <= q; i++) { + for (int i = 1, l, r; i <= m; i++) { in.nextToken(); l = (int) in.nval; in.nextToken(); diff --git a/src/class157/Code02_MissingSmallest2.java b/src/class157/Code03_MissingSmallest2.java similarity index 92% rename from src/class157/Code02_MissingSmallest2.java rename to src/class157/Code03_MissingSmallest2.java index 714b7e11d..ad2f8635f 100644 --- a/src/class157/Code02_MissingSmallest2.java +++ b/src/class157/Code03_MissingSmallest2.java @@ -1,9 +1,9 @@ package class157; // 区间内没有出现的最小自然数,C++版 -// 给定一个长度为n的数组arr,下标1~n,一共有q条查询 +// 给定一个长度为n的数组arr,下标1~n,一共有m条查询 // 每条查询 l r : 打印arr[l..r]内没有出现过的最小自然数,注意0是自然数 -// 1 <= n、q、arr[i] <= 2 * 10^5 +// 1 <= n、m、arr[i] <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P4137 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -14,7 +14,7 @@ // //const int MAXN = 200001; //const int MAXM = MAXN * 22; -//int n, q; +//int n, m; //int arr[MAXN]; //int root[MAXN]; //int ls[MAXM]; @@ -79,12 +79,12 @@ //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]; // } // prepare(); -// for (int i = 0, l, r; i < q; i++) { +// for (int i = 1, l, r; i <= m; i++) { // cin >> l >> r; // cout << query(l, 0, n, root[r]) << "\n"; // } diff --git a/src/class157/Code03_DifferentNumbers1.java b/src/class157/Code04_DifferentNumbers1.java similarity index 95% rename from src/class157/Code03_DifferentNumbers1.java rename to src/class157/Code04_DifferentNumbers1.java index 993ec3d87..1a9ad5ea3 100644 --- a/src/class157/Code03_DifferentNumbers1.java +++ b/src/class157/Code04_DifferentNumbers1.java @@ -1,7 +1,7 @@ package class157; // 区间内的不同数字,java版 -// 给定一个长度为n的数组arr,下标1~n,一共有q条查询 +// 给定一个长度为n的数组arr,下标1~n,一共有m条查询 // 每条查询 l r : 如果arr[l..r]范围有s种不同的数,打印第s/2种数,向上取整 // 题目有强制在线的要求,上一次打印的答案为lastAns,初始时lastAns = 0 // 每次给定的l和r,按照如下方式得到真实的l和r,查询完成后更新lastAns @@ -9,20 +9,20 @@ // b = (给定r + lastAns) % n + 1 // 真实l = min(a, b) // 真实r = max(a, b) -// 1 <= n、q、arr[i] <= 2 * 10^5 +// 1 <= n、m、arr[i] <= 2 * 10^5 // 测试链接 : https://acm.hdu.edu.cn/showproblem.php?pid=5919 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.IOException; import java.util.Arrays; -public class Code03_DifferentNumbers1 { +public class Code04_DifferentNumbers1 { public static int MAXN = 200002; public static int MAXM = MAXN * 37; - public static int cases, n, q; + public static int cases, n, m; public static int[] arr = new int[MAXN]; @@ -114,7 +114,7 @@ public static void main(String[] args) throws IOException { cases = io.nextInt(); for (int t = 1; t <= cases; t++) { n = io.nextInt(); - q = io.nextInt(); + m = io.nextInt(); for (int i = 1; i <= n; i++) { arr[i] = io.nextInt(); } @@ -122,7 +122,7 @@ public static void main(String[] args) throws IOException { io.write("Case #"); io.writeInt(t); io.write(":"); - for (int i = 1, a, b, l, r, k, lastAns = 0; i <= q; i++) { + for (int i = 1, a, b, l, r, k, lastAns = 0; i <= m; i++) { a = (io.nextInt() + lastAns) % n + 1; b = (io.nextInt() + lastAns) % n + 1; l = Math.min(a, b); diff --git a/src/class157/Code03_DifferentNumbers2.java b/src/class157/Code04_DifferentNumbers2.java similarity index 94% rename from src/class157/Code03_DifferentNumbers2.java rename to src/class157/Code04_DifferentNumbers2.java index 25291fdfb..244bf3ae1 100644 --- a/src/class157/Code03_DifferentNumbers2.java +++ b/src/class157/Code04_DifferentNumbers2.java @@ -1,7 +1,7 @@ package class157; // 区间内的不同数字,C++版 -// 给定一个长度为n的数组arr,下标1~n,一共有q条查询 +// 给定一个长度为n的数组arr,下标1~n,一共有m条查询 // 每条查询 l r : 如果arr[l..r]范围有s种不同的数,打印第s/2种数,向上取整 // 题目有强制在线的要求,上一次打印的答案为lastAns,初始时lastAns = 0 // 每次给定的l和r,按照如下方式得到真实的l和r,查询完成后更新lastAns @@ -9,7 +9,7 @@ // b = (给定r + lastAns) % n + 1 // 真实l = min(a, b) // 真实r = max(a, b) -// 1 <= n、q、arr[i] <= 2 * 10^5 +// 1 <= n、m、arr[i] <= 2 * 10^5 // 测试链接 : https://acm.hdu.edu.cn/showproblem.php?pid=5919 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -20,7 +20,7 @@ // //const int MAXN = 200002; //const int MAXM = MAXN * 37; -//int cases, n, q; +//int cases, n, m; //int arr[MAXN]; //int pos[MAXN]; //int root[MAXN]; @@ -105,13 +105,13 @@ // cin.tie(nullptr); // cin >> cases; // for (int t = 1; t <= cases; t++) { -// cin >> n >> q; +// cin >> n >> m; // for (int i = 1; i <= n; i++) { // cin >> arr[i]; // } // prepare(); // cout << "Case #" << t << ":"; -// for (int i = 1, a, b, l, r, k, lastAns = 0; i <= q; i++) { +// for (int i = 1, a, b, l, r, k, lastAns = 0; i <= m; i++) { // cin >> l >> r; // a = (l + lastAns) % n + 1; // b = (r + lastAns) % n + 1; diff --git a/src/class157/Code04_LargestUpMedian1.java b/src/class157/Code05_LargestUpMedian1.java similarity index 91% rename from src/class157/Code04_LargestUpMedian1.java rename to src/class157/Code05_LargestUpMedian1.java index ad1c76f2e..e21ff5b4f 100644 --- a/src/class157/Code04_LargestUpMedian1.java +++ b/src/class157/Code05_LargestUpMedian1.java @@ -1,14 +1,14 @@ package class157; // 区间最大上中位数,java版 -// 给定一个长度为n的数组arr,下标1~n,一共有q条查询 +// 给定一个长度为n的数组arr,下标1~n,一共有m条查询 // 每条查询 a b c d : 左端点在[a,b]之间、右端点在[c,d]之间,保证a> arr; //int root[MAXN]; //int ls[MAXM]; @@ -122,14 +122,14 @@ //} // //int compute(int a, int b, int c, int d) { -// int l = 1, r = n, m, ans = 0; -// while (l <= r) { -// m = (l + r) / 2; -// if (check(a, b, c, d, m)) { -// ans = arr[m].second; -// l = m + 1; +// int left = 1, right = n, mid, ans = 0; +// while (left <= right) { +// mid = (left + right) / 2; +// if (check(a, b, c, d, mid)) { +// ans = arr[mid].second; +// left = mid + 1; // } else { -// r = m - 1; +// right = mid - 1; // } // } // return ans; @@ -145,8 +145,8 @@ // cin >> arr[i].second; // } // prepare(); -// cin >> q; -// for (int i = 1, lastAns = 0; i <= q; i++) { +// cin >> m; +// for (int i = 1, lastAns = 0; i <= m; i++) { // for (int j = 0; j < 4; j++) { // cin >> ques[j]; // ques[j] = (ques[j] + lastAns) % n + 1; diff --git a/src/class157/Code06_CountOnTree1.java b/src/class157/Code06_CountOnTree1.java index 5006b49cd..5d3c89222 100644 --- a/src/class157/Code06_CountOnTree1.java +++ b/src/class157/Code06_CountOnTree1.java @@ -2,11 +2,13 @@ // 节点路径第k小值,java版 // 有n个节点,编号1~n,每个节点有权值,有n-1条边,所有节点组成一棵树 -// 一共有q条查询,每条查询 u v k : 打印u号点到v号点的路径上,第k小的点权 +// 一共有m条查询,每条查询 u v k : 打印u号点到v号点的路径上,第k小的点权 // 题目有强制在线的要求,上一次打印的答案为lastAns,初始时lastAns = 0 // 每次给定的u、v、k,按照如下方式得到真实的u、v、k,查询完成后更新lastAns -// 真实u = 给定u ^ lastAns 真实v = 给定v 真实k = 给定k -// 1 <= n、q <= 10^5 +// 真实u = 给定u ^ lastAns +// 真实v = 给定v +// 真实k = 给定k +// 1 <= n、m <= 10^5 // 1 <= arr[i] <= 2^32 - 1 // 测试链接 : https://www.luogu.com.cn/problem/P2633 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -27,7 +29,7 @@ public class Code06_CountOnTree1 { public static int MAXM = MAXN * MAXH; - public static int n, s, q; + public static int n, s, m; // 各个节点权值 public static int[] arr = new int[MAXN]; @@ -61,15 +63,15 @@ public class Code06_CountOnTree1 { public static int[][] stjump = new int[MAXN][MAXH]; public static int kth(int num) { - int l = 1, r = s, m; - while (l <= r) { - m = (l + r) / 2; - if (sorted[m] == num) { - return m; - } else if (sorted[m] < num) { - l = m + 1; + 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 { - r = m - 1; + right = mid - 1; } } return -1; @@ -232,7 +234,7 @@ public static void main(String[] args) throws IOException { in.nextToken(); n = (int) in.nval; in.nextToken(); - q = (int) in.nval; + m = (int) in.nval; for (int i = 1; i <= n; i++) { in.nextToken(); arr[i] = (int) in.nval; @@ -247,7 +249,7 @@ public static void main(String[] args) throws IOException { addEdge(v, u); } dfs2(); // 使用迭代版防止爆栈 - for (int i = 1, u, v, k, lastAns = 0; i <= q; i++) { + for (int i = 1, u, v, k, lastAns = 0; i <= m; i++) { in.nextToken(); u = (int) in.nval ^ lastAns; in.nextToken(); diff --git a/src/class157/Code06_CountOnTree2.java b/src/class157/Code06_CountOnTree2.java index 35331136f..cb4d01c09 100644 --- a/src/class157/Code06_CountOnTree2.java +++ b/src/class157/Code06_CountOnTree2.java @@ -2,11 +2,13 @@ // 节点路径第k小值,C++版 // 有n个节点,编号1~n,每个节点有权值,有n-1条边,所有节点组成一棵树 -// 一共有q条查询,每条查询 u v k : 打印u号点到v号点的路径上,第k小的点权 +// 一共有m条查询,每条查询 u v k : 打印u号点到v号点的路径上,第k小的点权 // 题目有强制在线的要求,上一次打印的答案为lastAns,初始时lastAns = 0 // 每次给定的u、v、k,按照如下方式得到真实的u、v、k,查询完成后更新lastAns -// 真实u = 给定u ^ lastAns 真实v = 给定v 真实k = 给定k -// 1 <= n、q <= 10^5 +// 真实u = 给定u ^ lastAns +// 真实v = 给定v +// 真实k = 给定k +// 1 <= n、m <= 10^5 // 1 <= arr[i] <= 2^32 - 1 // 测试链接 : https://www.luogu.com.cn/problem/P2633 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 @@ -19,7 +21,7 @@ //const int MAXN = 100001; //const int MAXH = 20; //const int MAXM = MAXN * MAXH; -//int n, s, q; +//int n, s, m; //int arr[MAXN]; //int sorted[MAXN]; // @@ -38,15 +40,15 @@ //int stjump[MAXN][MAXH]; // //int kth(int num) { -// int l = 1, r = s, m; -// while (l <= r) { -// m = (l + r) / 2; -// if (sorted[m] == num) { -// return m; -// } else if (sorted[m] < num) { -// l = m + 1; +// 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 { -// r = m - 1; +// right = mid - 1; // } // } // return -1; @@ -156,7 +158,7 @@ //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]; // } @@ -167,7 +169,7 @@ // addEdge(v, u); // } // dfs(1, 0); -// for (int i = 1, u, v, k, lastAns = 0; i <= q; i++) { +// for (int i = 1, u, v, k, lastAns = 0; i <= m; i++) { // cin >> u >> v >> k; // u ^= lastAns; // lastAns = kth(u, v, k); diff --git a/src/class157/Code07_MoreImpressive1.java b/src/class157/Code07_MoreImpressive1.java index 6ed4f103d..01479c749 100644 --- a/src/class157/Code07_MoreImpressive1.java +++ b/src/class157/Code07_MoreImpressive1.java @@ -4,11 +4,11 @@ // 有n个节点,编号1~n,给定n-1条边,连成一棵树,1号点是树头 // 如果x是y的祖先节点,认为"x比y更厉害" // 如果x到y的路径上,边的数量 <= 某个常数,认为"x和y是邻居" -// 一共有q条查询,每条查询 a k : 打印有多少三元组(a, b, c)满足如下规定 +// 一共有m条查询,每条查询 a k : 打印有多少三元组(a, b, c)满足如下规定 // 1,a、b、c为三个不同的点 // 2,a和b都比c厉害 // 3,a和b是邻居,路径边的数量 <= 给定的k -// 1 <= n、q、k <= 3 * 10^5 +// 1 <= n、m、k <= 3 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3899 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -25,7 +25,7 @@ public class Code07_MoreImpressive1 { public static int MAXM = MAXN * 22; - public static int n, q; + public static int n, m; // 链式前向星需要 public static int[] head = new int[MAXN]; @@ -214,7 +214,7 @@ public static void main(String[] args) throws IOException { in.nextToken(); n = (int) in.nval; in.nextToken(); - q = (int) in.nval; + m = (int) in.nval; for (int i = 1, u, v; i < n; i++) { in.nextToken(); u = (int) in.nval; @@ -226,7 +226,7 @@ public static void main(String[] args) throws IOException { root[0] = build(1, n); dfs3(); // 使用迭代版防止爆栈 dfs4(); // 使用迭代版防止爆栈 - for (int i = 1, a, k; i <= q; i++) { + for (int i = 1, a, k; i <= m; i++) { in.nextToken(); a = (int) in.nval; in.nextToken(); diff --git a/src/class157/Code07_MoreImpressive2.java b/src/class157/Code07_MoreImpressive2.java index 41534fe61..15918ab20 100644 --- a/src/class157/Code07_MoreImpressive2.java +++ b/src/class157/Code07_MoreImpressive2.java @@ -4,11 +4,11 @@ // 有n个节点,编号1~n,给定n-1条边,连成一棵树,1号点是树头 // 如果x是y的祖先节点,认为"x比y更厉害" // 如果x到y的路径上,边的数量 <= 某个常数,认为"x和y是邻居" -// 一共有q条查询,每条查询 a k : 打印有多少三元组(a, b, c)满足如下规定 +// 一共有m条查询,每条查询 a k : 打印有多少三元组(a, b, c)满足如下规定 // 1,a、b、c为三个不同的点 // 2,a和b都比c厉害 // 3,a和b是邻居,路径边的数量 <= 给定的k -// 1 <= n、q、k <= 3 * 10^5 +// 1 <= n、m、k <= 3 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3899 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -19,7 +19,7 @@ // //const int MAXN = 300001; //const int MAXM = MAXN * 22; -//int n, q; +//int n, m; // //int head[MAXN]; //int to[MAXN << 1]; @@ -119,7 +119,7 @@ //int main() { // ios::sync_with_stdio(false); // cin.tie(nullptr); -// cin >> n >> q; +// cin >> n >> m; // for (int i = 1, u, v; i < n; i++) { // cin >> u >> v; // addEdge(u, v); @@ -128,7 +128,7 @@ // root[0] = build(1, n); // dfs1(1, 0); // dfs2(1, 0); -// for(int i = 1, a, k; i <= q; i++) { +// for(int i = 1, a, k; i <= m; i++) { // cin >> a >> k; // cout << compute(a, k) << "\n"; // } From fbd0aadc7faa32bb22670d35cc4b3ea7507310b8 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 13 Jan 2025 14:27:46 +0800 Subject: [PATCH 0596/2029] modify code --- src/class157/Code02_TagPermanentization1.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/class157/Code02_TagPermanentization1.java b/src/class157/Code02_TagPermanentization1.java index 2bc5ccbb8..6c965f37e 100644 --- a/src/class157/Code02_TagPermanentization1.java +++ b/src/class157/Code02_TagPermanentization1.java @@ -11,8 +11,10 @@ // -10^9 <= arr[i] <= +10^9 // 测试链接 : https://acm.hdu.edu.cn/showproblem.php?pid=4348 // 测试链接 : https://www.spoj.com/problems/TTM/ -// 这道题的两个测试,都严重卡常,java版很难通过,这是语言歧视 -// 想通过用C++写吧,本节课Code02_TagPermanentization2文件就是C++的实现 +// 这道题的目的是让你去实现标记永久化的版本,减少可持久化线段树的空间消耗 +// 所以题目一定要卡住,没有进行标记永久化的实现,而且是根据C++的使用空间来卡! +// 但是这样一来,空间资源非常少,java的实现哪怕做了标记永久化也很难通过了! +// 所以想通过就用C++实现吧,本节课Code02_TagPermanentization2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 import java.io.BufferedWriter; From 17f4cde76c6d4475fab597ab4ac87e79338e9199 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 13 Jan 2025 14:28:55 +0800 Subject: [PATCH 0597/2029] modify code --- src/class157/Code02_TagPermanentization1.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/class157/Code02_TagPermanentization1.java b/src/class157/Code02_TagPermanentization1.java index 6c965f37e..255a4f59f 100644 --- a/src/class157/Code02_TagPermanentization1.java +++ b/src/class157/Code02_TagPermanentization1.java @@ -14,6 +14,7 @@ // 这道题的目的是让你去实现标记永久化的版本,减少可持久化线段树的空间消耗 // 所以题目一定要卡住,没有进行标记永久化的实现,而且是根据C++的使用空间来卡! // 但是这样一来,空间资源非常少,java的实现哪怕做了标记永久化也很难通过了! +// java版本的实现也是最优解,逻辑一定是正确的 // 所以想通过就用C++实现吧,本节课Code02_TagPermanentization2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 From 94643a74df304a78a67be597d86de96ec183561a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 13 Jan 2025 14:31:21 +0800 Subject: [PATCH 0598/2029] modify code --- src/class157/Code02_TagPermanentization1.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/class157/Code02_TagPermanentization1.java b/src/class157/Code02_TagPermanentization1.java index 255a4f59f..5315fda8a 100644 --- a/src/class157/Code02_TagPermanentization1.java +++ b/src/class157/Code02_TagPermanentization1.java @@ -12,9 +12,9 @@ // 测试链接 : https://acm.hdu.edu.cn/showproblem.php?pid=4348 // 测试链接 : https://www.spoj.com/problems/TTM/ // 这道题的目的是让你去实现标记永久化的版本,减少可持久化线段树的空间消耗 -// 所以题目一定要卡住,没有进行标记永久化的实现,而且是根据C++的使用空间来卡! -// 但是这样一来,空间资源非常少,java的实现哪怕做了标记永久化也很难通过了! -// java版本的实现也是最优解,逻辑一定是正确的 +// 所以题目一定要卡住,没有进行标记永久化的实现,而且是根据C++使用空间的状况来卡的! +// 但是这样一来,空间资源非常少,java的实现哪怕做了标记永久化的优化,也很难通过了! +// java版本的实现一定是最优解,逻辑一定是正确的 // 所以想通过就用C++实现吧,本节课Code02_TagPermanentization2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 From c3eff3d1ca97e04ebe9632ff79cc2e86ce4b43c6 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 13 Jan 2025 14:56:34 +0800 Subject: [PATCH 0599/2029] modify code --- src/class157/Code07_MoreImpressive1.java | 4 +--- src/class157/Code07_MoreImpressive2.java | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/class157/Code07_MoreImpressive1.java b/src/class157/Code07_MoreImpressive1.java index 01479c749..ae2e02b14 100644 --- a/src/class157/Code07_MoreImpressive1.java +++ b/src/class157/Code07_MoreImpressive1.java @@ -5,9 +5,7 @@ // 如果x是y的祖先节点,认为"x比y更厉害" // 如果x到y的路径上,边的数量 <= 某个常数,认为"x和y是邻居" // 一共有m条查询,每条查询 a k : 打印有多少三元组(a, b, c)满足如下规定 -// 1,a、b、c为三个不同的点 -// 2,a和b都比c厉害 -// 3,a和b是邻居,路径边的数量 <= 给定的k +// a、b、c为三个不同的点;a和b都比c厉害;a和b是邻居,路径边的数量 <= 给定的k // 1 <= n、m、k <= 3 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3899 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class157/Code07_MoreImpressive2.java b/src/class157/Code07_MoreImpressive2.java index 15918ab20..39ca2f78d 100644 --- a/src/class157/Code07_MoreImpressive2.java +++ b/src/class157/Code07_MoreImpressive2.java @@ -5,9 +5,7 @@ // 如果x是y的祖先节点,认为"x比y更厉害" // 如果x到y的路径上,边的数量 <= 某个常数,认为"x和y是邻居" // 一共有m条查询,每条查询 a k : 打印有多少三元组(a, b, c)满足如下规定 -// 1,a、b、c为三个不同的点 -// 2,a和b都比c厉害 -// 3,a和b是邻居,路径边的数量 <= 给定的k +// a、b、c为三个不同的点;a和b都比c厉害;a和b是邻居,路径边的数量 <= 给定的k // 1 <= n、m、k <= 3 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3899 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 From 8a74050c67573cfa8bbd9c7798e8bc69bf1e1e5e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 13 Jan 2025 15:09:20 +0800 Subject: [PATCH 0600/2029] modify code --- src/class157/Code01_PersistentSegmentTree1.java | 2 +- src/class157/Code01_PersistentSegmentTree2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class157/Code01_PersistentSegmentTree1.java b/src/class157/Code01_PersistentSegmentTree1.java index 86d5116fe..f0f462019 100644 --- a/src/class157/Code01_PersistentSegmentTree1.java +++ b/src/class157/Code01_PersistentSegmentTree1.java @@ -1,6 +1,6 @@ package class157; -// 可持久化线段树模版题,java版 +// 单点修改的可持久化线段树模版题,java版 // 给定一个长度为n的数组arr,下标1~n,一共有m条查询 // 每条查询 l r k : 打印arr[l..r]中第k小的数字 // 1 <= n、m <= 2 * 10^5 diff --git a/src/class157/Code01_PersistentSegmentTree2.java b/src/class157/Code01_PersistentSegmentTree2.java index 6634d416c..6ab6d4796 100644 --- a/src/class157/Code01_PersistentSegmentTree2.java +++ b/src/class157/Code01_PersistentSegmentTree2.java @@ -1,6 +1,6 @@ package class157; -// 可持久化线段树模版题,C++版 +// 单点修改的可持久化线段树模版题,C++版 // 给定一个长度为n的数组arr,下标1~n,一共有m条查询 // 每条查询 l r k : 打印arr[l..r]中第k小的数字 // 1 <= n、m <= 2 * 10^5 From 44cd77526256863ec15793a43b8508f119430170 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 13 Jan 2025 15:16:40 +0800 Subject: [PATCH 0601/2029] modify code --- ...ifferentNumbers1.java => Code04_DifferentNumbersKth1.java} | 4 ++-- ...ifferentNumbers2.java => Code04_DifferentNumbersKth2.java} | 2 +- src/class157/Code05_LargestUpMedian1.java | 2 +- src/class157/Code05_LargestUpMedian2.java | 2 +- src/class157/Code06_CountOnTree1.java | 2 +- src/class157/Code06_CountOnTree2.java | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) rename src/class157/{Code04_DifferentNumbers1.java => Code04_DifferentNumbersKth1.java} (98%) rename src/class157/{Code04_DifferentNumbers2.java => Code04_DifferentNumbersKth2.java} (98%) diff --git a/src/class157/Code04_DifferentNumbers1.java b/src/class157/Code04_DifferentNumbersKth1.java similarity index 98% rename from src/class157/Code04_DifferentNumbers1.java rename to src/class157/Code04_DifferentNumbersKth1.java index 1a9ad5ea3..ff11fd605 100644 --- a/src/class157/Code04_DifferentNumbers1.java +++ b/src/class157/Code04_DifferentNumbersKth1.java @@ -1,6 +1,6 @@ package class157; -// 区间内的不同数字,java版 +// 区间内不同数字的第k小,java版 // 给定一个长度为n的数组arr,下标1~n,一共有m条查询 // 每条查询 l r : 如果arr[l..r]范围有s种不同的数,打印第s/2种数,向上取整 // 题目有强制在线的要求,上一次打印的答案为lastAns,初始时lastAns = 0 @@ -16,7 +16,7 @@ import java.io.IOException; import java.util.Arrays; -public class Code04_DifferentNumbers1 { +public class Code04_DifferentNumbersKth1 { public static int MAXN = 200002; diff --git a/src/class157/Code04_DifferentNumbers2.java b/src/class157/Code04_DifferentNumbersKth2.java similarity index 98% rename from src/class157/Code04_DifferentNumbers2.java rename to src/class157/Code04_DifferentNumbersKth2.java index 244bf3ae1..361824d3c 100644 --- a/src/class157/Code04_DifferentNumbers2.java +++ b/src/class157/Code04_DifferentNumbersKth2.java @@ -1,6 +1,6 @@ package class157; -// 区间内的不同数字,C++版 +// 区间内不同数字的第k小,C++版 // 给定一个长度为n的数组arr,下标1~n,一共有m条查询 // 每条查询 l r : 如果arr[l..r]范围有s种不同的数,打印第s/2种数,向上取整 // 题目有强制在线的要求,上一次打印的答案为lastAns,初始时lastAns = 0 diff --git a/src/class157/Code05_LargestUpMedian1.java b/src/class157/Code05_LargestUpMedian1.java index e21ff5b4f..c7d331640 100644 --- a/src/class157/Code05_LargestUpMedian1.java +++ b/src/class157/Code05_LargestUpMedian1.java @@ -1,6 +1,6 @@ package class157; -// 区间最大上中位数,java版 +// 浮动区间的最大上中位数,java版 // 给定一个长度为n的数组arr,下标1~n,一共有m条查询 // 每条查询 a b c d : 左端点在[a,b]之间、右端点在[c,d]之间,保证a Date: Mon, 13 Jan 2025 15:33:14 +0800 Subject: [PATCH 0602/2029] modify code --- src/class157/Code01_PersistentSegmentTree1.java | 1 + src/class157/Code01_PersistentSegmentTree2.java | 1 + 2 files changed, 2 insertions(+) diff --git a/src/class157/Code01_PersistentSegmentTree1.java b/src/class157/Code01_PersistentSegmentTree1.java index f0f462019..d91890ff8 100644 --- a/src/class157/Code01_PersistentSegmentTree1.java +++ b/src/class157/Code01_PersistentSegmentTree1.java @@ -4,6 +4,7 @@ // 给定一个长度为n的数组arr,下标1~n,一共有m条查询 // 每条查询 l r k : 打印arr[l..r]中第k小的数字 // 1 <= n、m <= 2 * 10^5 +// 0 <= arr[i] <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P3834 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class157/Code01_PersistentSegmentTree2.java b/src/class157/Code01_PersistentSegmentTree2.java index 6ab6d4796..15a205200 100644 --- a/src/class157/Code01_PersistentSegmentTree2.java +++ b/src/class157/Code01_PersistentSegmentTree2.java @@ -4,6 +4,7 @@ // 给定一个长度为n的数组arr,下标1~n,一共有m条查询 // 每条查询 l r k : 打印arr[l..r]中第k小的数字 // 1 <= n、m <= 2 * 10^5 +// 0 <= arr[i] <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P3834 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From 9e459d519ab66139c53ffb7eeb967a57727e4b48 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 13 Jan 2025 15:45:34 +0800 Subject: [PATCH 0603/2029] modify code --- .../Code01_PersistentSegmentTree1.java | 20 ++++++++++++------- .../Code01_PersistentSegmentTree2.java | 20 ++++++++++++------- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/src/class157/Code01_PersistentSegmentTree1.java b/src/class157/Code01_PersistentSegmentTree1.java index d91890ff8..bc50ce875 100644 --- a/src/class157/Code01_PersistentSegmentTree1.java +++ b/src/class157/Code01_PersistentSegmentTree1.java @@ -22,7 +22,7 @@ public class Code01_PersistentSegmentTree1 { public static int MAXM = MAXN * 22; - public static int n, m; + public static int n, s, m; public static int[] arr = new int[MAXN]; @@ -39,7 +39,7 @@ public class Code01_PersistentSegmentTree1 { public static int cnt; public static int kth(int num) { - int left = 1, right = n, mid, ans = 0; + int left = 1, right = s, mid, ans = 0; while (left <= right) { mid = (left + right) / 2; if (sorted[mid] <= num) { @@ -98,10 +98,16 @@ public static void prepare() { sorted[i] = arr[i]; } Arrays.sort(sorted, 1, n + 1); - root[0] = build(1, n); + s = 1; + for (int i = 2; i <= n; i++) { + if (sorted[s] != sorted[i]) { + sorted[++s] = sorted[i]; + } + } + root[0] = build(1, s); for (int i = 1, x; i <= n; i++) { x = kth(arr[i]); - root[i] = insert(x, 1, n, root[i - 1]); + root[i] = insert(x, 1, s, root[i - 1]); } } @@ -118,15 +124,15 @@ public static void main(String[] args) throws IOException { arr[i] = (int) in.nval; } prepare(); - for (int i = 1, l, r, k; i <= m; i++) { + for (int i = 1, l, r, k, rank; i <= m; i++) { in.nextToken(); l = (int) in.nval; in.nextToken(); r = (int) in.nval; in.nextToken(); k = (int) in.nval; - int ans = query(k, 1, n, root[l - 1], root[r]); - out.println(sorted[ans]); + rank = query(k, 1, s, root[l - 1], root[r]); + out.println(sorted[rank]); } out.flush(); out.close(); diff --git a/src/class157/Code01_PersistentSegmentTree2.java b/src/class157/Code01_PersistentSegmentTree2.java index 15a205200..ce0556e33 100644 --- a/src/class157/Code01_PersistentSegmentTree2.java +++ b/src/class157/Code01_PersistentSegmentTree2.java @@ -15,7 +15,7 @@ // //const int MAXN = 200001; //const int MAXM = MAXN * 22; -//int n, m; +//int n, s, m; //int arr[MAXN]; //int sorted[MAXN]; //int root[MAXN]; @@ -25,7 +25,7 @@ //int cnt; // //int kth(int num) { -// int left = 1, right = n, mid, ans = 0; +// int left = 1, right = s, mid, ans = 0; // while (left <= right) { // mid = (left + right) / 2; // if (sorted[mid] <= num) { @@ -84,10 +84,16 @@ // sorted[i] = arr[i]; // } // sort(sorted + 1, sorted + n + 1); -// root[0] = build(1, n); +// s = 1; +// for (int i = 2; i <= n; i++) { +// if (sorted[s] != sorted[i]) { +// sorted[++s] = sorted[i]; +// } +// } +// root[0] = build(1, s); // for (int i = 1, x; i <= n; i++) { // x = kth(arr[i]); -// root[i] = insert(x, 1, n, root[i - 1]); +// root[i] = insert(x, 1, s, root[i - 1]); // } //} // @@ -99,10 +105,10 @@ // cin >> arr[i]; // } // prepare(); -// for (int i = 1, l, r, k; i <= m; i++) { +// for (int i = 1, l, r, k, rank; i <= m; i++) { // cin >> l >> r >> k; -// int ans = query(k, 1, n, root[l - 1], root[r]); -// cout << sorted[ans] << '\n'; +// rank = query(k, 1, s, root[l - 1], root[r]); +// cout << sorted[rank] << '\n'; // } // return 0; //} \ No newline at end of file From fa05386313a4edac368756ace0fd2dc7b6e3c83a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 13 Jan 2025 16:06:34 +0800 Subject: [PATCH 0604/2029] modify code --- src/class044/Code02_TrieTree.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/class044/Code02_TrieTree.java b/src/class044/Code02_TrieTree.java index a840ff155..44efbfff1 100644 --- a/src/class044/Code02_TrieTree.java +++ b/src/class044/Code02_TrieTree.java @@ -71,6 +71,10 @@ public static int prefixNumber(String pre) { public static void delete(String word) { if (search(word) > 0) { int cur = 1; + // 如下这行代码,讲课的时候没加 + // 本题不会用到pass[1]的信息,所以加不加都可以 + // 不过正确的写法是加上 + pass[cur]--; for (int i = 0, path; i < word.length(); i++) { path = word.charAt(i) - 'a'; if (--pass[tree[cur][path]] == 0) { From f7c33bf0fd9ad9287259ae46d182cf4106930f28 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 13 Jan 2025 16:07:53 +0800 Subject: [PATCH 0605/2029] modify code --- src/class044/Code02_TrieTree.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/class044/Code02_TrieTree.java b/src/class044/Code02_TrieTree.java index 44efbfff1..53033c44f 100644 --- a/src/class044/Code02_TrieTree.java +++ b/src/class044/Code02_TrieTree.java @@ -71,9 +71,8 @@ public static int prefixNumber(String pre) { public static void delete(String word) { if (search(word) > 0) { int cur = 1; - // 如下这行代码,讲课的时候没加 - // 本题不会用到pass[1]的信息,所以加不加都可以 - // 不过正确的写法是加上 + // 下面这一行代码,讲课的时候没加 + // 本题不会用到pass[1]的信息,所以加不加都可以,不过正确的写法是加上 pass[cur]--; for (int i = 0, path; i < word.length(); i++) { path = word.charAt(i) - 'a'; From 10d2f6bb6d63dd8d872eac07e1af61ed33f31910 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 13 Jan 2025 16:12:02 +0800 Subject: [PATCH 0606/2029] modify code --- src/class157/Code01_PersistentSegmentTree1.java | 2 +- src/class157/Code01_PersistentSegmentTree2.java | 2 +- src/class157/Code06_CountOnTree1.java | 2 +- src/class157/Code06_CountOnTree2.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class157/Code01_PersistentSegmentTree1.java b/src/class157/Code01_PersistentSegmentTree1.java index bc50ce875..5403870b1 100644 --- a/src/class157/Code01_PersistentSegmentTree1.java +++ b/src/class157/Code01_PersistentSegmentTree1.java @@ -22,7 +22,7 @@ public class Code01_PersistentSegmentTree1 { public static int MAXM = MAXN * 22; - public static int n, s, m; + public static int n, m, s; public static int[] arr = new int[MAXN]; diff --git a/src/class157/Code01_PersistentSegmentTree2.java b/src/class157/Code01_PersistentSegmentTree2.java index ce0556e33..73b4948cb 100644 --- a/src/class157/Code01_PersistentSegmentTree2.java +++ b/src/class157/Code01_PersistentSegmentTree2.java @@ -15,7 +15,7 @@ // //const int MAXN = 200001; //const int MAXM = MAXN * 22; -//int n, s, m; +//int n, m, s; //int arr[MAXN]; //int sorted[MAXN]; //int root[MAXN]; diff --git a/src/class157/Code06_CountOnTree1.java b/src/class157/Code06_CountOnTree1.java index da0808874..e33585668 100644 --- a/src/class157/Code06_CountOnTree1.java +++ b/src/class157/Code06_CountOnTree1.java @@ -29,7 +29,7 @@ public class Code06_CountOnTree1 { public static int MAXM = MAXN * MAXH; - public static int n, s, m; + public static int n, m, s; // 各个节点权值 public static int[] arr = new int[MAXN]; diff --git a/src/class157/Code06_CountOnTree2.java b/src/class157/Code06_CountOnTree2.java index 9770cb763..f1347a8bd 100644 --- a/src/class157/Code06_CountOnTree2.java +++ b/src/class157/Code06_CountOnTree2.java @@ -21,7 +21,7 @@ //const int MAXN = 100001; //const int MAXH = 20; //const int MAXM = MAXN * MAXH; -//int n, s, m; +//int n, m, s; //int arr[MAXN]; //int sorted[MAXN]; // From eaf3448d4a557649f301befc78b477ded9e95672 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 13 Jan 2025 16:25:26 +0800 Subject: [PATCH 0607/2029] modify code --- src/class157/Code02_TagPermanentization1.java | 8 ++++---- src/class157/Code02_TagPermanentization2.java | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/class157/Code02_TagPermanentization1.java b/src/class157/Code02_TagPermanentization1.java index 5315fda8a..ee02d1043 100644 --- a/src/class157/Code02_TagPermanentization1.java +++ b/src/class157/Code02_TagPermanentization1.java @@ -85,17 +85,17 @@ public static int add(int jobl, int jobr, long jobv, int l, int r, int i) { return rt; } - public static long query(int jobl, int jobr, long historyAdd, int l, int r, int i) { + public static long query(int jobl, int jobr, long addHistory, int l, int r, int i) { if (jobl <= l && r <= jobr) { - return sum[i] + historyAdd * (r - l + 1); + return sum[i] + addHistory * (r - l + 1); } int mid = (l + r) / 2; long ans = 0; if (jobl <= mid) { - ans += query(jobl, jobr, historyAdd + addTag[i], l, mid, left[i]); + ans += query(jobl, jobr, addHistory + addTag[i], l, mid, left[i]); } if (jobr > mid) { - ans += query(jobl, jobr, historyAdd + addTag[i], mid + 1, r, right[i]); + ans += query(jobl, jobr, addHistory + addTag[i], mid + 1, r, right[i]); } return ans; } diff --git a/src/class157/Code02_TagPermanentization2.java b/src/class157/Code02_TagPermanentization2.java index 2449185ee..f68bc56e2 100644 --- a/src/class157/Code02_TagPermanentization2.java +++ b/src/class157/Code02_TagPermanentization2.java @@ -63,17 +63,17 @@ // return rt; //} // -//long long query(int jobl, int jobr, long long historyAdd, int l, int r, int i) { +//long long query(int jobl, int jobr, long long addHistory, int l, int r, int i) { // if (jobl <= l && r <= jobr) { -// return sum[i] + historyAdd * (r - l + 1); +// return sum[i] + addHistory * (r - l + 1); // } // int mid = (l + r) / 2; // long long ans = 0; // if (jobl <= mid) { -// ans += query(jobl, jobr, historyAdd + addTag[i], l, mid, ls[i]); +// ans += query(jobl, jobr, addHistory + addTag[i], l, mid, ls[i]); // } // if (jobr > mid) { -// ans += query(jobl, jobr, historyAdd + addTag[i], mid + 1, r, rs[i]); +// ans += query(jobl, jobr, addHistory + addTag[i], mid + 1, r, rs[i]); // } // return ans; //} From 4744d76f4124418f9f6a311a3d0c623bd29c9941 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 13 Jan 2025 16:39:15 +0800 Subject: [PATCH 0608/2029] modify code --- src/class157/Code01_PersistentSegmentTree1.java | 14 ++++++++++++++ src/class157/Code06_CountOnTree1.java | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/class157/Code01_PersistentSegmentTree1.java b/src/class157/Code01_PersistentSegmentTree1.java index 5403870b1..09d7d89fe 100644 --- a/src/class157/Code01_PersistentSegmentTree1.java +++ b/src/class157/Code01_PersistentSegmentTree1.java @@ -24,20 +24,28 @@ public class Code01_PersistentSegmentTree1 { public static int n, m, s; + // 原始数组 public static int[] arr = new int[MAXN]; + // 收集权值排序并且去重做离散化 public static int[] sorted = new int[MAXN]; + // 可持久化线段树需要 + // root[i] : 插入arr[i]之后形成的线段树,记录头节点编号 public static int[] root = new int[MAXN]; + // 左孩子 public static int[] left = new int[MAXM]; + // 右孩子 public static int[] right = new int[MAXM]; + // 收集了多少个数字 public static int[] size = new int[MAXM]; public static int cnt; + // 返回num在所有值中排名多少 public static int kth(int num) { int left = 1, right = s, mid, ans = 0; while (left <= right) { @@ -52,6 +60,7 @@ public static int kth(int num) { return ans; } + // l~r范围建立线段树,返回头节点编号 public static int build(int l, int r) { int rt = ++cnt; size[rt] = 0; @@ -63,6 +72,8 @@ public static int build(int l, int r) { return rt; } + // l~r范围,信息在i位置,增加一个jobi位置上的数字 + // 返回新的头节点编号 public static int insert(int jobi, int l, int r, int i) { int rt = ++cnt; left[rt] = left[i]; @@ -79,6 +90,8 @@ public static int insert(int jobi, int l, int r, int i) { return rt; } + // l~r范围,老版本信息在u位置,新版本信息在v位置 + // 返回第jobk小的数是多少 public static int query(int jobk, int l, int r, int u, int v) { if (l == r) { return l; @@ -92,6 +105,7 @@ public static int query(int jobk, int l, int r, int u, int v) { } } + // 权值做离散化并且去重 + 生成各版本的线段树 public static void prepare() { cnt = 0; for (int i = 1; i <= n; i++) { diff --git a/src/class157/Code06_CountOnTree1.java b/src/class157/Code06_CountOnTree1.java index e33585668..a8d6a2f86 100644 --- a/src/class157/Code06_CountOnTree1.java +++ b/src/class157/Code06_CountOnTree1.java @@ -34,7 +34,7 @@ public class Code06_CountOnTree1 { // 各个节点权值 public static int[] arr = new int[MAXN]; - // 收集权值排序做离散化 + // 收集权值排序并且去重做离散化 public static int[] sorted = new int[MAXN]; // 链式前向星需要 From e7a465c0bca672c8277203d86b31dd4041930762 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 13 Jan 2025 16:57:10 +0800 Subject: [PATCH 0609/2029] modify code --- src/class157/Code02_TagPermanentization1.java | 10 ++++++++++ src/class157/Code03_MissingSmallest1.java | 3 +++ src/class157/Code04_DifferentNumbersKth1.java | 3 +++ src/class157/Code05_LargestUpMedian1.java | 1 + src/class157/Code07_MoreImpressive1.java | 3 +++ 5 files changed, 20 insertions(+) diff --git a/src/class157/Code02_TagPermanentization1.java b/src/class157/Code02_TagPermanentization1.java index ee02d1043..9fe9a6a5b 100644 --- a/src/class157/Code02_TagPermanentization1.java +++ b/src/class157/Code02_TagPermanentization1.java @@ -31,16 +31,21 @@ public class Code02_TagPermanentization1 { public static int n, m, t = 0; + // 原始数组 public static int[] arr = new int[MAXN]; + // 可持久化线段树需要 + // root[i] : 时间戳i为版本号,线段树的头节点编号 public static int[] root = new int[MAXN]; public static int[] left = new int[MAXM]; public static int[] right = new int[MAXM]; + // 区间累加和 public static long[] sum = new long[MAXM]; + // 区间关于加的懒更新信息,变成了标记永久化信息 public static long[] addTag = new long[MAXM]; public static int cnt = 0; @@ -65,6 +70,8 @@ public static void prepare() { root[0] = build(1, n); } + // l~r范围,信息在i位置,任务是jobl~jobr范围,所有数字增加jobv + // 返回新的头节点编号 public static int add(int jobl, int jobr, long jobv, int l, int r, int i) { int rt = ++cnt, a = Math.max(jobl, l), b = Math.min(jobr, r); left[rt] = left[i]; @@ -85,6 +92,9 @@ public static int add(int jobl, int jobr, long jobv, int l, int r, int i) { return rt; } + // l~r范围,信息在i位置,任务是jobl~jobr范围,查询累加和 + // addHistory是从上方的大范围一路带下来的标记历史 + // 返回累加和 public static long query(int jobl, int jobr, long addHistory, int l, int r, int i) { if (jobl <= l && r <= jobr) { return sum[i] + addHistory * (r - l + 1); diff --git a/src/class157/Code03_MissingSmallest1.java b/src/class157/Code03_MissingSmallest1.java index b5df3ccac..86fde1a3d 100644 --- a/src/class157/Code03_MissingSmallest1.java +++ b/src/class157/Code03_MissingSmallest1.java @@ -47,6 +47,8 @@ public static int build(int l, int r) { return rt; } + // l~r范围,信息在i位置,jobi这个数字,最新出现在jobv位置 + // 返回新的头节点编号 public static int update(int jobi, int jobv, int l, int r, int i) { int rt = ++cnt; left[rt] = left[i]; @@ -66,6 +68,7 @@ public static int update(int jobi, int jobv, int l, int r, int i) { return rt; } + // 数字在l~r范围上,没有出现的最小自然数,课上重点图解 public static int query(int pos, int l, int r, int i) { if (l == r) { return l; diff --git a/src/class157/Code04_DifferentNumbersKth1.java b/src/class157/Code04_DifferentNumbersKth1.java index ff11fd605..eef2ea10e 100644 --- a/src/class157/Code04_DifferentNumbersKth1.java +++ b/src/class157/Code04_DifferentNumbersKth1.java @@ -26,14 +26,17 @@ public class Code04_DifferentNumbersKth1 { public static int[] arr = new int[MAXN]; + // pos[v] : v这个数字最左出现的位置 public static int[] pos = new int[MAXN]; + // 可持久化线段树需要 public static int[] root = new int[MAXN]; public static int[] left = new int[MAXM]; public static int[] right = new int[MAXM]; + // 区间不同数字的个数 public static int[] diff = new int[MAXM]; public static int cnt; diff --git a/src/class157/Code05_LargestUpMedian1.java b/src/class157/Code05_LargestUpMedian1.java index c7d331640..dba38ef6a 100644 --- a/src/class157/Code05_LargestUpMedian1.java +++ b/src/class157/Code05_LargestUpMedian1.java @@ -34,6 +34,7 @@ public class Code05_LargestUpMedian1 { // 原始位置、数值 public static int[][] arr = new int[MAXN][2]; + // 可持久化线段树需要 public static int[] root = new int[MAXN]; public static int[] left = new int[MAXM]; diff --git a/src/class157/Code07_MoreImpressive1.java b/src/class157/Code07_MoreImpressive1.java index ae2e02b14..542ce253a 100644 --- a/src/class157/Code07_MoreImpressive1.java +++ b/src/class157/Code07_MoreImpressive1.java @@ -46,10 +46,13 @@ public class Code07_MoreImpressive1 { public static int cntt = 0; // dfs需要 + // deep[i] : i号节点的深度 public static int[] deep = new int[MAXN]; + // size[i] : 以i号节点为头的树,有多少个节点 public static int[] size = new int[MAXN]; + // dfn[i] : i号节点的dfn序号 public static int[] dfn = new int[MAXN]; public static int cntd = 0; From 81d9108329da24cde29aed9b58015ccbce60fe4c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 13 Jan 2025 17:00:45 +0800 Subject: [PATCH 0610/2029] modify code --- ...fferentNumbersKth1.java => Code03_DifferentNumbersKth1.java} | 2 +- ...fferentNumbersKth2.java => Code03_DifferentNumbersKth2.java} | 0 ...ode03_MissingSmallest1.java => Code04_MissingSmallest1.java} | 2 +- ...ode03_MissingSmallest2.java => Code04_MissingSmallest2.java} | 0 4 files changed, 2 insertions(+), 2 deletions(-) rename src/class157/{Code04_DifferentNumbersKth1.java => Code03_DifferentNumbersKth1.java} (99%) rename src/class157/{Code04_DifferentNumbersKth2.java => Code03_DifferentNumbersKth2.java} (100%) rename src/class157/{Code03_MissingSmallest1.java => Code04_MissingSmallest1.java} (98%) rename src/class157/{Code03_MissingSmallest2.java => Code04_MissingSmallest2.java} (100%) diff --git a/src/class157/Code04_DifferentNumbersKth1.java b/src/class157/Code03_DifferentNumbersKth1.java similarity index 99% rename from src/class157/Code04_DifferentNumbersKth1.java rename to src/class157/Code03_DifferentNumbersKth1.java index eef2ea10e..e167cfb52 100644 --- a/src/class157/Code04_DifferentNumbersKth1.java +++ b/src/class157/Code03_DifferentNumbersKth1.java @@ -16,7 +16,7 @@ import java.io.IOException; import java.util.Arrays; -public class Code04_DifferentNumbersKth1 { +public class Code03_DifferentNumbersKth1 { public static int MAXN = 200002; diff --git a/src/class157/Code04_DifferentNumbersKth2.java b/src/class157/Code03_DifferentNumbersKth2.java similarity index 100% rename from src/class157/Code04_DifferentNumbersKth2.java rename to src/class157/Code03_DifferentNumbersKth2.java diff --git a/src/class157/Code03_MissingSmallest1.java b/src/class157/Code04_MissingSmallest1.java similarity index 98% rename from src/class157/Code03_MissingSmallest1.java rename to src/class157/Code04_MissingSmallest1.java index 86fde1a3d..db09ee17b 100644 --- a/src/class157/Code03_MissingSmallest1.java +++ b/src/class157/Code04_MissingSmallest1.java @@ -14,7 +14,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code03_MissingSmallest1 { +public class Code04_MissingSmallest1 { public static int MAXN = 200001; diff --git a/src/class157/Code03_MissingSmallest2.java b/src/class157/Code04_MissingSmallest2.java similarity index 100% rename from src/class157/Code03_MissingSmallest2.java rename to src/class157/Code04_MissingSmallest2.java From 29215c0a4349a5d3ab3a4eca3dd79e9094f0ad11 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 13 Jan 2025 17:07:01 +0800 Subject: [PATCH 0611/2029] modify code --- src/class157/Code04_MissingSmallest1.java | 2 +- src/class157/Code04_MissingSmallest2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class157/Code04_MissingSmallest1.java b/src/class157/Code04_MissingSmallest1.java index db09ee17b..5bfd203e3 100644 --- a/src/class157/Code04_MissingSmallest1.java +++ b/src/class157/Code04_MissingSmallest1.java @@ -88,7 +88,7 @@ public static int query(int pos, int l, int r, int i) { public static void prepare() { cnt = 0; - root[0] = build(1, n); + root[0] = build(0, n); for (int i = 1; i <= n; i++) { if (arr[i] >= n) { root[i] = root[i - 1]; diff --git a/src/class157/Code04_MissingSmallest2.java b/src/class157/Code04_MissingSmallest2.java index ad2f8635f..ab2d25b3b 100644 --- a/src/class157/Code04_MissingSmallest2.java +++ b/src/class157/Code04_MissingSmallest2.java @@ -66,7 +66,7 @@ // //void prepare() { // cnt = 0; -// root[0] = build(1, n); +// root[0] = build(0, n); // for (int i = 1; i <= n; i++) { // if (arr[i] >= n) { // root[i] = root[i - 1]; From 140ba31303218bb44ebf7ed52e1bffd241f4de5f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 13 Jan 2025 18:48:56 +0800 Subject: [PATCH 0612/2029] modify code --- ...fferentNumbersKth1.java => Code03_Sequence1.java} | 12 +++++++----- ...fferentNumbersKth2.java => Code03_Sequence2.java} | 10 ++++++---- src/class157/Code04_MissingSmallest1.java | 3 ++- src/class157/Code04_MissingSmallest2.java | 3 ++- 4 files changed, 17 insertions(+), 11 deletions(-) rename src/class157/{Code03_DifferentNumbersKth1.java => Code03_Sequence1.java} (92%) rename src/class157/{Code03_DifferentNumbersKth2.java => Code03_Sequence2.java} (90%) diff --git a/src/class157/Code03_DifferentNumbersKth1.java b/src/class157/Code03_Sequence1.java similarity index 92% rename from src/class157/Code03_DifferentNumbersKth1.java rename to src/class157/Code03_Sequence1.java index e167cfb52..2614807ac 100644 --- a/src/class157/Code03_DifferentNumbersKth1.java +++ b/src/class157/Code03_Sequence1.java @@ -1,22 +1,24 @@ package class157; -// 区间内不同数字的第k小,java版 -// 给定一个长度为n的数组arr,下标1~n,一共有m条查询 -// 每条查询 l r : 如果arr[l..r]范围有s种不同的数,打印第s/2种数,向上取整 +// 下标序列,java版 +// 给定一个长度为n的数组arr,下标1~n,一共有m条查询,每条查询格式如下 +// l r : arr[l..r]范围上,每个数第一次出现的位置,把这些位置组成一个序列 +// 假设该范围有s种不同的数,那么序列长度为s +// 打印该序列第s/2个位置(向上取整),对应arr的什么位置 // 题目有强制在线的要求,上一次打印的答案为lastAns,初始时lastAns = 0 // 每次给定的l和r,按照如下方式得到真实的l和r,查询完成后更新lastAns // a = (给定l + lastAns) % n + 1 // b = (给定r + lastAns) % n + 1 // 真实l = min(a, b) // 真实r = max(a, b) -// 1 <= n、m、arr[i] <= 2 * 10^5 +// 1 <= n、m <= 2 * 10^5 0 <= arr[i] <= 2 * 10^5 // 测试链接 : https://acm.hdu.edu.cn/showproblem.php?pid=5919 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.IOException; import java.util.Arrays; -public class Code03_DifferentNumbersKth1 { +public class Code03_Sequence1 { public static int MAXN = 200002; diff --git a/src/class157/Code03_DifferentNumbersKth2.java b/src/class157/Code03_Sequence2.java similarity index 90% rename from src/class157/Code03_DifferentNumbersKth2.java rename to src/class157/Code03_Sequence2.java index 361824d3c..fa869c49f 100644 --- a/src/class157/Code03_DifferentNumbersKth2.java +++ b/src/class157/Code03_Sequence2.java @@ -1,15 +1,17 @@ package class157; -// 区间内不同数字的第k小,C++版 -// 给定一个长度为n的数组arr,下标1~n,一共有m条查询 -// 每条查询 l r : 如果arr[l..r]范围有s种不同的数,打印第s/2种数,向上取整 +// 下标序列,C++版 +// 给定一个长度为n的数组arr,下标1~n,一共有m条查询,每条查询格式如下 +// l r : arr[l..r]范围上,每个数第一次出现的位置,把这些位置组成一个序列 +// 假设该范围有s种不同的数,那么序列长度为s +// 打印该序列第s/2个位置(向上取整),对应arr的什么位置 // 题目有强制在线的要求,上一次打印的答案为lastAns,初始时lastAns = 0 // 每次给定的l和r,按照如下方式得到真实的l和r,查询完成后更新lastAns // a = (给定l + lastAns) % n + 1 // b = (给定r + lastAns) % n + 1 // 真实l = min(a, b) // 真实r = max(a, b) -// 1 <= n、m、arr[i] <= 2 * 10^5 +// 1 <= n、m <= 2 * 10^5 0 <= arr[i] <= 2 * 10^5 // 测试链接 : https://acm.hdu.edu.cn/showproblem.php?pid=5919 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class157/Code04_MissingSmallest1.java b/src/class157/Code04_MissingSmallest1.java index 5bfd203e3..34fb0fe7c 100644 --- a/src/class157/Code04_MissingSmallest1.java +++ b/src/class157/Code04_MissingSmallest1.java @@ -3,7 +3,8 @@ // 区间内没有出现的最小自然数,java版 // 给定一个长度为n的数组arr,下标1~n,一共有m条查询 // 每条查询 l r : 打印arr[l..r]内没有出现过的最小自然数,注意0是自然数 -// 1 <= n、m、arr[i] <= 2 * 10^5 +// 1 <= n、m <= 2 * 10^5 +// 0 <= arr[i] <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P4137 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class157/Code04_MissingSmallest2.java b/src/class157/Code04_MissingSmallest2.java index ab2d25b3b..e0c5a8baf 100644 --- a/src/class157/Code04_MissingSmallest2.java +++ b/src/class157/Code04_MissingSmallest2.java @@ -3,7 +3,8 @@ // 区间内没有出现的最小自然数,C++版 // 给定一个长度为n的数组arr,下标1~n,一共有m条查询 // 每条查询 l r : 打印arr[l..r]内没有出现过的最小自然数,注意0是自然数 -// 1 <= n、m、arr[i] <= 2 * 10^5 +// 1 <= n、m <= 2 * 10^5 +// 0 <= arr[i] <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P4137 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From 4a084201e01eab2acfa0adfac8f4c699c67de6ff Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 14 Jan 2025 18:55:22 +0800 Subject: [PATCH 0613/2029] modify code --- src/class157/Code01_PointPersistent1.java | 182 ++++++++++++ src/class157/Code01_PointPersistent2.java | 89 ++++++ ...ree1.java => Code02_PointPersistent1.java} | 12 +- ...ree2.java => Code02_PointPersistent2.java} | 10 +- src/class157/Code03_RangePersistent1.java | 262 ++++++++++++++++++ src/class157/Code03_RangePersistent2.java | 143 ++++++++++ src/class157/Code04_TagPermanentization1.java | 110 ++++++++ src/class157/Code04_TagPermanentization2.java | 88 ++++++ ...ion1.java => Code05_RangePersistent1.java} | 24 +- ...ion2.java => Code05_RangePersistent2.java} | 14 +- .../Code01_FirstTimeSequence1.java} | 14 +- .../Code01_FirstTimeSequence2.java} | 12 +- .../Code02_MissingSmallest1.java} | 12 +- .../Code02_MissingSmallest2.java} | 10 +- .../Code03_LargestUpMedian1.java} | 16 +- .../Code03_LargestUpMedian2.java} | 14 +- .../Code04_CountOnTree1.java} | 12 +- .../Code04_CountOnTree2.java} | 10 +- .../Code05_MoreImpressive1.java} | 12 +- .../Code05_MoreImpressive2.java} | 10 +- 20 files changed, 964 insertions(+), 92 deletions(-) create mode 100644 src/class157/Code01_PointPersistent1.java create mode 100644 src/class157/Code01_PointPersistent2.java rename src/class157/{Code01_PersistentSegmentTree1.java => Code02_PointPersistent1.java} (93%) rename src/class157/{Code01_PersistentSegmentTree2.java => Code02_PointPersistent2.java} (95%) create mode 100644 src/class157/Code03_RangePersistent1.java create mode 100644 src/class157/Code03_RangePersistent2.java create mode 100644 src/class157/Code04_TagPermanentization1.java create mode 100644 src/class157/Code04_TagPermanentization2.java rename src/class157/{Code02_TagPermanentization1.java => Code05_RangePersistent1.java} (86%) rename src/class157/{Code02_TagPermanentization2.java => Code05_RangePersistent2.java} (92%) rename src/{class157/Code03_Sequence1.java => class158/Code01_FirstTimeSequence1.java} (95%) rename src/{class157/Code03_Sequence2.java => class158/Code01_FirstTimeSequence2.java} (96%) rename src/{class157/Code04_MissingSmallest1.java => class158/Code02_MissingSmallest1.java} (93%) rename src/{class157/Code04_MissingSmallest2.java => class158/Code02_MissingSmallest2.java} (95%) rename src/{class157/Code05_LargestUpMedian1.java => class158/Code03_LargestUpMedian1.java} (93%) rename src/{class157/Code05_LargestUpMedian2.java => class158/Code03_LargestUpMedian2.java} (96%) rename src/{class157/Code06_CountOnTree1.java => class158/Code04_CountOnTree1.java} (96%) rename src/{class157/Code06_CountOnTree2.java => class158/Code04_CountOnTree2.java} (97%) rename src/{class157/Code07_MoreImpressive1.java => class158/Code05_MoreImpressive1.java} (96%) rename src/{class157/Code07_MoreImpressive2.java => class158/Code05_MoreImpressive2.java} (97%) diff --git a/src/class157/Code01_PointPersistent1.java b/src/class157/Code01_PointPersistent1.java new file mode 100644 index 000000000..e9f2081de --- /dev/null +++ b/src/class157/Code01_PointPersistent1.java @@ -0,0 +1,182 @@ +package class157; + +// 单点修改的可持久化线段树模版题1,java版 +// 给定一个长度为n的数组arr,下标1~n,原始数组认为是0号版本 +// 一共有m条操作,每条操作是如下两种类型中的一种 +// v 1 x y : 基于v号版本的数组,把x位置的值设置成y,生成新版本的数组 +// v 2 x : 基于v号版本的数组,打印x位置的值,生成新版本的数组和v版本一致 +// 每条操作后得到的新版本数组,版本编号为操作的计数 +// 1 <= n, m <= 10^6 +// 测试链接 : https://www.luogu.com.cn/problem/P3919 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.InputStream; +import java.io.OutputStream; +import java.io.IOException; + +public class Code01_PointPersistent1 { + + public static int MAXN = 1000001; + + public static int MAXT = MAXN * 23; + + public static int n, m; + + public static int[] arr = new int[MAXN]; + + public static int[] root = new int[MAXN]; + + public static int[] left = new int[MAXT]; + + public static int[] right = new int[MAXT]; + + public static int[] value = new int[MAXT]; + + public static int cnt = 0; + + public static int build(int l, int r) { + int rt = ++cnt; + if (l == r) { + value[rt] = arr[l]; + } else { + int mid = (l + r) >> 1; + left[rt] = build(l, mid); + right[rt] = build(mid + 1, r); + } + return rt; + } + + public static int update(int jobi, int jobv, int l, int r, int i) { + int rt = ++cnt; + left[rt] = left[i]; + right[rt] = right[i]; + value[rt] = value[i]; + if (l == r) { + value[rt] = jobv; + } else { + int mid = (l + r) >> 1; + if (jobi <= mid) { + left[rt] = update(jobi, jobv, l, mid, left[rt]); + } else { + right[rt] = update(jobi, jobv, mid + 1, r, right[rt]); + } + } + return rt; + } + + public static int query(int jobi, int l, int r, int i) { + if (l == r) { + return value[i]; + } + int mid = (l + r) >> 1; + if (jobi <= mid) { + return query(jobi, l, mid, left[i]); + } else { + return query(jobi, mid + 1, r, right[i]); + } + } + + 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 <= n; i++) { + arr[i] = io.nextInt(); + } + root[0] = build(1, n); + for (int i = 1, version, op, x, y; i <= m; i++) { + version = io.nextInt(); + op = io.nextInt(); + x = io.nextInt(); + if (op == 1) { + y = io.nextInt(); + root[i] = update(x, y, 1, n, root[version]); + } else { + root[i] = root[version]; + io.writelnInt(query(x, 1, n, root[i])); + } + } + 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); + } + } + } + +} \ No newline at end of file diff --git a/src/class157/Code01_PointPersistent2.java b/src/class157/Code01_PointPersistent2.java new file mode 100644 index 000000000..40d4980fb --- /dev/null +++ b/src/class157/Code01_PointPersistent2.java @@ -0,0 +1,89 @@ +package class157; + +// 单点修改的可持久化线段树模版题1,C++版 +// 给定一个长度为n的数组arr,下标1~n,原始数组认为是0号版本 +// 一共有m条操作,每条操作是如下两种类型中的一种 +// v 1 x y : 基于v号版本的数组,把x位置的值设置成y,生成新版本的数组 +// v 2 x : 基于v号版本的数组,打印x位置的值,生成新版本的数组和v版本一致 +// 每条操作后得到的新版本数组,版本编号为操作的计数 +// 1 <= n, m <= 10^6 +// 测试链接 : https://www.luogu.com.cn/problem/P3919 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 1000001; +//const int MAXT = MAXN * 23; +//int n, m; +//int arr[MAXN]; +//int root[MAXN]; +//int ls[MAXT]; +//int rs[MAXT]; +//int value[MAXT]; +//int cnt = 0; +// +//int build(int l, int r) { +// int rt = ++cnt; +// if (l == r) { +// value[rt] = arr[l]; +// } else { +// int mid = (l + r) >> 1; +// ls[rt] = build(l, mid); +// rs[rt] = build(mid + 1, r); +// } +// return rt; +//} +// +//int update(int jobi, int jobv, int l, int r, int i) { +// int rt = ++cnt; +// ls[rt] = ls[i]; +// rs[rt] = rs[i]; +// value[rt] = value[i]; +// if (l == r) { +// value[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]); +// } +// } +// return rt; +//} +// +//int query(int jobi, int l, int r, int i) { +// if (l == r) { +// return value[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]); +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// root[0] = build(1, n); +// for (int i = 1, version, op, x, y; i <= m; i++) { +// cin >> version >> op >> x; +// if (op == 1) { +// cin >> y; +// root[i] = update(x, y, 1, n, root[version]); +// } else { +// root[i] = root[version]; +// cout << query(x, 1, n, root[i]) << '\n'; +// } +// } +// return 0; +//} \ No newline at end of file diff --git a/src/class157/Code01_PersistentSegmentTree1.java b/src/class157/Code02_PointPersistent1.java similarity index 93% rename from src/class157/Code01_PersistentSegmentTree1.java rename to src/class157/Code02_PointPersistent1.java index 09d7d89fe..614328e9f 100644 --- a/src/class157/Code01_PersistentSegmentTree1.java +++ b/src/class157/Code02_PointPersistent1.java @@ -1,6 +1,6 @@ package class157; -// 单点修改的可持久化线段树模版题,java版 +// 单点修改的可持久化线段树模版题2,java版 // 给定一个长度为n的数组arr,下标1~n,一共有m条查询 // 每条查询 l r k : 打印arr[l..r]中第k小的数字 // 1 <= n、m <= 2 * 10^5 @@ -16,11 +16,11 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class Code01_PersistentSegmentTree1 { +public class Code02_PointPersistent1 { public static int MAXN = 200001; - public static int MAXM = MAXN * 22; + public static int MAXT = MAXN * 22; public static int n, m, s; @@ -35,13 +35,13 @@ public class Code01_PersistentSegmentTree1 { public static int[] root = new int[MAXN]; // 左孩子 - public static int[] left = new int[MAXM]; + public static int[] left = new int[MAXT]; // 右孩子 - public static int[] right = new int[MAXM]; + public static int[] right = new int[MAXT]; // 收集了多少个数字 - public static int[] size = new int[MAXM]; + public static int[] size = new int[MAXT]; public static int cnt; diff --git a/src/class157/Code01_PersistentSegmentTree2.java b/src/class157/Code02_PointPersistent2.java similarity index 95% rename from src/class157/Code01_PersistentSegmentTree2.java rename to src/class157/Code02_PointPersistent2.java index 73b4948cb..31e5b9ca5 100644 --- a/src/class157/Code01_PersistentSegmentTree2.java +++ b/src/class157/Code02_PointPersistent2.java @@ -1,6 +1,6 @@ package class157; -// 单点修改的可持久化线段树模版题,C++版 +// 单点修改的可持久化线段树模版题2,C++版 // 给定一个长度为n的数组arr,下标1~n,一共有m条查询 // 每条查询 l r k : 打印arr[l..r]中第k小的数字 // 1 <= n、m <= 2 * 10^5 @@ -14,14 +14,14 @@ //using namespace std; // //const int MAXN = 200001; -//const int MAXM = MAXN * 22; +//const int MAXT = MAXN * 22; //int n, m, s; //int arr[MAXN]; //int sorted[MAXN]; //int root[MAXN]; -//int ls[MAXM]; -//int rs[MAXM]; -//int size[MAXM]; +//int ls[MAXT]; +//int rs[MAXT]; +//int size[MAXT]; //int cnt; // //int kth(int num) { diff --git a/src/class157/Code03_RangePersistent1.java b/src/class157/Code03_RangePersistent1.java new file mode 100644 index 000000000..d8b740115 --- /dev/null +++ b/src/class157/Code03_RangePersistent1.java @@ -0,0 +1,262 @@ +package class157; + +// 范围修改的可持久化线段树,经典的方式,java版 +// 给定一个长度为n的数组arr,下标1~n,时间戳t=0,arr认为是0版本的数组 +// 一共有m条查询,每条查询为如下四种类型中的一种 +// C x y z : 当前时间戳t版本的数组,[x..y]范围每个数字增加z,得到t+1版本数组,并且t++ +// Q x y : 当前时间戳t版本的数组,打印[x..y]范围累加和 +// H x y z : z版本的数组,打印[x..y]范围的累加和 +// B x : 当前时间戳t设置成x +// 1 <= n、m <= 10^5 +// -10^9 <= arr[i] <= +10^9 +// 测试链接 : https://www.luogu.com.cn/problem/SP11470 +// 测试链接 : https://www.spoj.com/problems/TTM/ +// 这是实现范围修改的可持久化线段树,经典的方式 +// 但是java的实现过不了,因为这道题各种平台测试的时候,就没考虑java的用户 +// 所以想通过就用C++实现吧,本节课Code03_RangePersistent2文件就是C++的实现 +// 两个版本的逻辑完全一样,C++版本可以通过所有测试 + +import java.io.BufferedWriter; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; + +public class Code03_RangePersistent1 { + + public static int MAXN = 100001; + + public static int MAXT = MAXN * 100; + + public static int n, m, t = 0; + + public static int[] arr = new int[MAXN]; + + public static int[] root = new int[MAXN]; + + public static int[] left = new int[MAXT]; + + public static int[] right = new int[MAXT]; + + public static long[] sum = new long[MAXT]; + + public static long[] add = new long[MAXT]; + + public static int cnt = 0; + + public static int clone(int i) { + int rt = ++cnt; + left[rt] = left[i]; + right[rt] = right[i]; + sum[rt] = sum[i]; + add[rt] = add[i]; + return rt; + } + + public static void up(int i) { + sum[i] = sum[left[i]] + sum[right[i]]; + } + + public static void lazy(int i, long v, int n) { + sum[i] += v * n; + add[i] += v; + } + + public static void down(int i, int ln, int rn) { + if (add[i] != 0) { + left[i] = clone(left[i]); + right[i] = clone(right[i]); + lazy(left[i], add[i], ln); + lazy(right[i], add[i], rn); + add[i] = 0; + } + } + + public static int build(int l, int r) { + int rt = ++cnt; + add[rt] = 0; + if (l == r) { + sum[rt] = arr[l]; + } else { + int mid = (l + r) / 2; + left[rt] = build(l, mid); + right[rt] = build(mid + 1, r); + up(rt); + } + return rt; + } + + public static int add(int jobl, int jobr, long jobv, int l, int r, int i) { + int rt = clone(i); + if (jobl <= l && r <= jobr) { + lazy(rt, jobv, r - l + 1); + } else { + int mid = (l + r) / 2; + down(rt, mid - l + 1, r - mid); + if (jobl <= mid) { + left[rt] = add(jobl, jobr, jobv, l, mid, left[rt]); + } + if (jobr > mid) { + right[rt] = add(jobl, jobr, jobv, mid + 1, r, right[rt]); + } + up(rt); + } + return rt; + } + + public static long query(int jobl, int jobr, int l, int r, int i) { + if (jobl <= l && r <= jobr) { + return sum[i]; + } + int mid = (l + r) / 2; + down(i, mid - l + 1, r - mid); + long ans = 0; + if (jobl <= mid) { + ans += query(jobl, jobr, l, mid, left[i]); + } + if (jobr > mid) { + ans += query(jobl, jobr, mid + 1, r, right[i]); + } + return ans; + } + + public static void prepare() { + t = 0; + cnt = 0; + root[0] = build(1, n); + } + + public static void main(String[] args) throws IOException { + FastReader in = new FastReader(); + BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + root[0] = build(1, n); + String op; + for (int i = 1, x, y, z; i <= m; i++) { + op = in.next(); + if (op.equals("C")) { + x = in.nextInt(); + y = in.nextInt(); + z = in.nextInt(); + root[t + 1] = add(x, y, z, 1, n, root[t]); + t++; + } else if (op.equals("Q")) { + x = in.nextInt(); + y = in.nextInt(); + out.write(query(x, y, 1, n, root[t]) + "\n"); + } else if (op.equals("H")) { + x = in.nextInt(); + y = in.nextInt(); + z = in.nextInt(); + out.write(query(x, y, 1, n, root[z]) + "\n"); + } else { + x = in.nextInt(); + t = 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 boolean hasNext() throws IOException { + while (hasNextByte()) { + byte b = buffer[ptr]; + if (!isWhitespace(b)) + return true; + ptr++; + } + return false; + } + + public String next() throws IOException { + byte c; + do { + c = readByte(); + if (c == -1) + return null; + } while (c <= ' '); + StringBuilder sb = new StringBuilder(); + while (c > ' ') { + sb.append((char) c); + c = 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; + } + + public double nextDouble() throws IOException { + double num = 0, div = 1; + byte b = readByte(); + while (isWhitespace(b)) + b = readByte(); + boolean minus = false; + if (b == '-') { + minus = true; + b = readByte(); + } + while (!isWhitespace(b) && b != '.' && b != -1) { + num = num * 10 + (b - '0'); + b = readByte(); + } + if (b == '.') { + b = readByte(); + while (!isWhitespace(b) && b != -1) { + num += (b - '0') / (div *= 10); + b = readByte(); + } + } + return minus ? -num : num; + } + + private boolean isWhitespace(byte b) { + return b == ' ' || b == '\n' || b == '\r' || b == '\t'; + } + } + +} diff --git a/src/class157/Code03_RangePersistent2.java b/src/class157/Code03_RangePersistent2.java new file mode 100644 index 000000000..7a2fccb23 --- /dev/null +++ b/src/class157/Code03_RangePersistent2.java @@ -0,0 +1,143 @@ +package class157; + +// 范围修改的可持久化线段树,经典的方式,C++版 +// 给定一个长度为n的数组arr,下标1~n,时间戳t=0,arr认为是0版本的数组 +// 一共有m条查询,每条查询为如下四种类型中的一种 +// C x y z : 当前时间戳t版本的数组,[x..y]范围每个数字增加z,得到t+1版本数组,并且t++ +// Q x y : 当前时间戳t版本的数组,打印[x..y]范围累加和 +// H x y z : z版本的数组,打印[x..y]范围的累加和 +// B x : 当前时间戳t设置成x +// 1 <= n、m <= 10^5 +// -10^9 <= arr[i] <= +10^9 +// 测试链接 : https://www.luogu.com.cn/problem/SP11470 +// 测试链接 : https://www.spoj.com/problems/TTM/ +// 这是实现范围修改的可持久化线段树,经典的方式 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +//const int MAXT = MAXN * 100; +//int n, m, t; +//int arr[MAXN]; +//int root[MAXN]; +//int ls[MAXT]; +//int rs[MAXT]; +//long long sum[MAXT]; +//long long add[MAXT]; +//int cnt; +// +//int clone(int i) { +// int rt = ++cnt; +// ls[rt] = ls[i]; +// rs[rt] = rs[i]; +// sum[rt] = sum[i]; +// add[rt] = add[i]; +// return rt; +//} +// +//void up(int i) { +// sum[i] = sum[ls[i]] + sum[rs[i]]; +//} +// +//void lazy(int i, long long v, int n) { +// sum[i] += v * n; +// add[i] += v; +//} +// +//void down(int i, int ln, int rn) { +// if (add[i] != 0) { +// ls[i] = clone(ls[i]); +// rs[i] = clone(rs[i]); +// lazy(ls[i], add[i], ln); +// lazy(rs[i], add[i], rn); +// add[i] = 0; +// } +//} +// +//int build(int l, int r) { +// int rt = ++cnt; +// add[rt] = 0; +// if (l == r) { +// sum[rt] = arr[l]; +// } else { +// int mid = (l + r) / 2; +// ls[rt] = build(l, mid); +// rs[rt] = build(mid + 1, r); +// up(rt); +// } +// return rt; +//} +// +//int addRange(int jobl, int jobr, long long jobv, int l, int r, int i) { +// int rt = clone(i); +// if (jobl <= l && r <= jobr) { +// lazy(rt, jobv, r - l + 1); +// } else { +// int mid = (l + r) / 2; +// down(rt, mid - l + 1, r - mid); +// if (jobl <= mid) { +// ls[rt] = addRange(jobl, jobr, jobv, l, mid, ls[rt]); +// } +// if (jobr > mid) { +// rs[rt] = addRange(jobl, jobr, jobv, mid + 1, r, rs[rt]); +// } +// up(rt); +// } +// return rt; +//} +// +//long long query(int jobl, int jobr, int l, int r, int i) { +// if (jobl <= l && r <= jobr) { +// return sum[i]; +// } +// int mid = (l + r) / 2; +// down(i, mid - l + 1, r - mid); +// 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; +//} +// +//void prepare() { +// t = 0; +// cnt = 0; +// root[0] = build(1, n); +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// root[0] = build(1, n); +// string op; +// int x, y, z; +// for (int i = 1; i <= m; i++) { +// cin >> op; +// if (op == "C") { +// cin >> x >> y >> z; +// root[t + 1] = addRange(x, y, z, 1, n, root[t]); +// t++; +// } else if (op == "Q") { +// cin >> x >> y; +// cout << query(x, y, 1, n, root[t]) << "\n"; +// } else if (op == "H") { +// cin >> x >> y >> z; +// cout << query(x, y, 1, n, root[z]) << "\n"; +// } else if (op == "B") { +// cin >> x; +// t = x; +// } +// } +// return 0; +//} \ No newline at end of file diff --git a/src/class157/Code04_TagPermanentization1.java b/src/class157/Code04_TagPermanentization1.java new file mode 100644 index 000000000..fa10b81f6 --- /dev/null +++ b/src/class157/Code04_TagPermanentization1.java @@ -0,0 +1,110 @@ +package class157; + +// 标记永久化,范围增加、查询累加和,java版 +// 给定一个长度为n的数组arr,下标1~n,一共有m条操作,操作类型如下 +// 1 x y k : 将区间[x, y]每个数加上k +// 2 x y : 打印区间[x, y]的累加和 +// 这就是普通线段树,请用标记永久化的方式实现 +// 测试链接 : https://www.luogu.com.cn/problem/P3372 +// 提交以下的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 Code04_TagPermanentization1 { + + public static int MAXN = 100001; + + public static long[] arr = new long[MAXN]; + + public static long[] sum = new long[MAXN << 2]; + + public static long[] addTag = new long[MAXN << 2]; + + public static void build(int l, int r, int i) { + if (l == r) { + sum[i] = arr[l]; + } else { + int mid = (l + r) / 2; + build(l, mid, i << 1); + build(mid + 1, r, i << 1 | 1); + sum[i] = sum[i << 1] + sum[i << 1 | 1]; + } + addTag[i] = 0; + } + + public static void add(int jobl, int jobr, long jobv, int l, int r, int i) { + int a = Math.max(jobl, l), b = Math.min(jobr, r); + sum[i] += jobv * (b - a + 1); + if (jobl <= l && r <= jobr) { + addTag[i] += jobv; + } else { + int mid = (l + r) / 2; + 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 long query(int jobl, int jobr, long addHistory, int l, int r, int i) { + if (jobl <= l && r <= jobr) { + return sum[i] + addHistory * (r - l + 1); + } + int mid = (l + r) >> 1; + long ans = 0; + if (jobl <= mid) { + ans += query(jobl, jobr, addHistory + addTag[i], l, mid, i << 1); + } + if (jobr > mid) { + ans += query(jobl, jobr, addHistory + addTag[i], mid + 1, r, i << 1 | 1); + } + return ans; + } + + 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(); + int n = (int) in.nval; + in.nextToken(); + int m = (int) in.nval; + for (int i = 1; i <= n; i++) { + in.nextToken(); + arr[i] = (long) in.nval; + } + build(1, n, 1); + int op, jobl, jobr; + long jobv; + for (int i = 1; i <= m; i++) { + in.nextToken(); + op = (int) in.nval; + if (op == 1) { + in.nextToken(); + jobl = (int) in.nval; + in.nextToken(); + jobr = (int) in.nval; + in.nextToken(); + jobv = (long) in.nval; + add(jobl, jobr, jobv, 1, n, 1); + } else { + in.nextToken(); + jobl = (int) in.nval; + in.nextToken(); + jobr = (int) in.nval; + out.println(query(jobl, jobr, 0, 1, n, 1)); + } + } + out.flush(); + out.close(); + br.close(); + } + +} \ No newline at end of file diff --git a/src/class157/Code04_TagPermanentization2.java b/src/class157/Code04_TagPermanentization2.java new file mode 100644 index 000000000..cf282b323 --- /dev/null +++ b/src/class157/Code04_TagPermanentization2.java @@ -0,0 +1,88 @@ +package class157; + +// 标记永久化,范围增加、查询累加和,C++版 +// 给定一个长度为n的数组arr,下标1~n,一共有m条操作,操作类型如下 +// 1 x y k : 将区间[x, y]每个数加上k +// 2 x y : 打印区间[x, y]的累加和 +// 这就是普通线段树,请用标记永久化的方式实现 +// 测试链接 : https://www.luogu.com.cn/problem/P3372 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +//#include +//#include +//#include +//using namespace std; +// +//const int MAXN = 100001; +//long long arr[MAXN]; +//long long sum[MAXN << 2]; +//long long addTag[MAXN << 2]; +// +//void build(int l, int r, int i) { +// if (l == r) { +// sum[i] = arr[l]; +// } else { +// int mid = (l + r) / 2; +// build(l, mid, i << 1); +// build(mid + 1, r, i << 1 | 1); +// sum[i] = sum[i << 1] + sum[i << 1 | 1]; +// } +// addTag[i] = 0; +//} +// +//void add(int jobl, int jobr, long long jobv, int l, int r, int i) { +// int a = max(jobl, l), b = min(jobr, r); +// sum[i] += jobv * (b - a + 1); +// if (jobl <= l && r <= jobr) { +// addTag[i] += jobv; +// } else { +// int mid = (l + r) / 2; +// if (jobl <= mid) { +// add(jobl, jobr, jobv, l, mid, i << 1); +// } +// if (jobr > mid) { +// add(jobl, jobr, jobv, mid + 1, r, i << 1 | 1); +// } +// } +//} +// +//long long query(int jobl, int jobr, long long addHistory, int l, int r, int i) { +// if (jobl <= l && r <= jobr) { +// return sum[i] + addHistory * (r - l + 1); +// } +// int mid = (l + r) >> 1; +// long long ans = 0; +// if (jobl <= mid) { +// ans += query(jobl, jobr, addHistory + addTag[i], l, mid, i << 1); +// } +// if (jobr > mid) { +// ans += query(jobl, jobr, addHistory + addTag[i], mid + 1, r, i << 1 | 1); +// } +// return ans; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// int n, m; +// cin >> n >> m; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// build(1, n, 1); +// int op, jobl, jobr; +// long long jobv; +// for (int i = 1; i <= m; i++) { +// cin >> op; +// if (op == 1) { +// cin >> jobl >> jobr >> jobv; +// add(jobl, jobr, jobv, 1, n, 1); +// } else { +// cin >> jobl >> jobr; +// cout << query(jobl, jobr, 0, 1, n, 1) << "\n"; +// } +// } +// return 0; +//} \ No newline at end of file diff --git a/src/class157/Code02_TagPermanentization1.java b/src/class157/Code05_RangePersistent1.java similarity index 86% rename from src/class157/Code02_TagPermanentization1.java rename to src/class157/Code05_RangePersistent1.java index 9fe9a6a5b..89ea9d889 100644 --- a/src/class157/Code02_TagPermanentization1.java +++ b/src/class157/Code05_RangePersistent1.java @@ -1,6 +1,6 @@ package class157; -// 范围修改的可持久化线段树 + 标记永久化,java版 +// 范围修改的可持久化线段树 + 标记永久化减少空间占用,java版 // 给定一个长度为n的数组arr,下标1~n,时间戳t=0,arr认为是0版本的数组 // 一共有m条查询,每条查询为如下四种类型中的一种 // C x y z : 当前时间戳t版本的数组,[x..y]范围每个数字增加z,得到t+1版本数组,并且t++ @@ -9,13 +9,11 @@ // B x : 当前时间戳t设置成x // 1 <= n、m <= 10^5 // -10^9 <= arr[i] <= +10^9 -// 测试链接 : https://acm.hdu.edu.cn/showproblem.php?pid=4348 +// 测试链接 : https://www.luogu.com.cn/problem/SP11470 // 测试链接 : https://www.spoj.com/problems/TTM/ -// 这道题的目的是让你去实现标记永久化的版本,减少可持久化线段树的空间消耗 -// 所以题目一定要卡住,没有进行标记永久化的实现,而且是根据C++使用空间的状况来卡的! -// 但是这样一来,空间资源非常少,java的实现哪怕做了标记永久化的优化,也很难通过了! -// java版本的实现一定是最优解,逻辑一定是正确的 -// 所以想通过就用C++实现吧,本节课Code02_TagPermanentization2文件就是C++的实现 +// 这是实现范围修改的可持久化线段树,使用标记永久化减少空间占用的方式 +// 但是java的实现依然通过不了,因为这道题各种平台测试的时候,就没考虑java的用户 +// 所以想通过就用C++实现吧,本节课Code05_RangePersistent2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 import java.io.BufferedWriter; @@ -23,11 +21,11 @@ import java.io.InputStream; import java.io.OutputStreamWriter; -public class Code02_TagPermanentization1 { +public class Code05_RangePersistent1 { public static int MAXN = 100001; - public static int MAXM = MAXN * 25; + public static int MAXT = MAXN * 25; public static int n, m, t = 0; @@ -38,15 +36,15 @@ public class Code02_TagPermanentization1 { // root[i] : 时间戳i为版本号,线段树的头节点编号 public static int[] root = new int[MAXN]; - public static int[] left = new int[MAXM]; + public static int[] left = new int[MAXT]; - public static int[] right = new int[MAXM]; + public static int[] right = new int[MAXT]; // 区间累加和 - public static long[] sum = new long[MAXM]; + public static long[] sum = new long[MAXT]; // 区间关于加的懒更新信息,变成了标记永久化信息 - public static long[] addTag = new long[MAXM]; + public static long[] addTag = new long[MAXT]; public static int cnt = 0; diff --git a/src/class157/Code02_TagPermanentization2.java b/src/class157/Code05_RangePersistent2.java similarity index 92% rename from src/class157/Code02_TagPermanentization2.java rename to src/class157/Code05_RangePersistent2.java index f68bc56e2..9c4177f45 100644 --- a/src/class157/Code02_TagPermanentization2.java +++ b/src/class157/Code05_RangePersistent2.java @@ -1,6 +1,6 @@ package class157; -// 范围修改的可持久化线段树 + 标记永久化,C++版 +// 范围修改的可持久化线段树 + 标记永久化减少空间占用,C++版 // 给定一个长度为n的数组arr,下标1~n,时间戳t=0,arr认为是0版本的数组 // 一共有m条查询,每条查询为如下四种类型中的一种 // C x y z : 当前时间戳t版本的数组,[x..y]范围每个数字增加z,得到t+1版本数组,并且t++ @@ -9,7 +9,7 @@ // B x : 当前时间戳t设置成x // 1 <= n、m <= 10^5 // -10^9 <= arr[i] <= +10^9 -// 测试链接 : https://acm.hdu.edu.cn/showproblem.php?pid=4348 +// 测试链接 : https://www.luogu.com.cn/problem/SP11470 // 测试链接 : https://www.spoj.com/problems/TTM/ // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -19,14 +19,14 @@ //using namespace std; // //const int MAXN = 100001; -//const int MAXM = MAXN * 25; +//const int MAXT = MAXN * 25; //int n, m, t = 0; //long long arr[MAXN]; //int root[MAXN]; -//int ls[MAXM]; -//int rs[MAXM]; -//long long sum[MAXM]; -//long long addTag[MAXM]; +//int ls[MAXT]; +//int rs[MAXT]; +//long long sum[MAXT]; +//long long addTag[MAXT]; //int cnt = 0; // //int build(int l, int r) { diff --git a/src/class157/Code03_Sequence1.java b/src/class158/Code01_FirstTimeSequence1.java similarity index 95% rename from src/class157/Code03_Sequence1.java rename to src/class158/Code01_FirstTimeSequence1.java index 2614807ac..b01112f23 100644 --- a/src/class157/Code03_Sequence1.java +++ b/src/class158/Code01_FirstTimeSequence1.java @@ -1,6 +1,6 @@ -package class157; +package class158; -// 下标序列,java版 +// 第一次出现位置的序列,java版 // 给定一个长度为n的数组arr,下标1~n,一共有m条查询,每条查询格式如下 // l r : arr[l..r]范围上,每个数第一次出现的位置,把这些位置组成一个序列 // 假设该范围有s种不同的数,那么序列长度为s @@ -18,11 +18,11 @@ import java.io.IOException; import java.util.Arrays; -public class Code03_Sequence1 { +public class Code01_FirstTimeSequence1 { public static int MAXN = 200002; - public static int MAXM = MAXN * 37; + public static int MAXT = MAXN * 37; public static int cases, n, m; @@ -34,12 +34,12 @@ public class Code03_Sequence1 { // 可持久化线段树需要 public static int[] root = new int[MAXN]; - public static int[] left = new int[MAXM]; + public static int[] left = new int[MAXT]; - public static int[] right = new int[MAXM]; + public static int[] right = new int[MAXT]; // 区间不同数字的个数 - public static int[] diff = new int[MAXM]; + public static int[] diff = new int[MAXT]; public static int cnt; diff --git a/src/class157/Code03_Sequence2.java b/src/class158/Code01_FirstTimeSequence2.java similarity index 96% rename from src/class157/Code03_Sequence2.java rename to src/class158/Code01_FirstTimeSequence2.java index fa869c49f..72a3ac746 100644 --- a/src/class157/Code03_Sequence2.java +++ b/src/class158/Code01_FirstTimeSequence2.java @@ -1,6 +1,6 @@ -package class157; +package class158; -// 下标序列,C++版 +// 第一次出现位置的序列,C++版 // 给定一个长度为n的数组arr,下标1~n,一共有m条查询,每条查询格式如下 // l r : arr[l..r]范围上,每个数第一次出现的位置,把这些位置组成一个序列 // 假设该范围有s种不同的数,那么序列长度为s @@ -21,14 +21,14 @@ //using namespace std; // //const int MAXN = 200002; -//const int MAXM = MAXN * 37; +//const int MAXT = MAXN * 37; //int cases, n, m; //int arr[MAXN]; //int pos[MAXN]; //int root[MAXN]; -//int ls[MAXM]; -//int rs[MAXM]; -//int diff[MAXM]; +//int ls[MAXT]; +//int rs[MAXT]; +//int diff[MAXT]; //int cnt; // //int build(int l, int r) { diff --git a/src/class157/Code04_MissingSmallest1.java b/src/class158/Code02_MissingSmallest1.java similarity index 93% rename from src/class157/Code04_MissingSmallest1.java rename to src/class158/Code02_MissingSmallest1.java index 34fb0fe7c..132b9f5d5 100644 --- a/src/class157/Code04_MissingSmallest1.java +++ b/src/class158/Code02_MissingSmallest1.java @@ -1,4 +1,4 @@ -package class157; +package class158; // 区间内没有出现的最小自然数,java版 // 给定一个长度为n的数组arr,下标1~n,一共有m条查询 @@ -15,11 +15,11 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code04_MissingSmallest1 { +public class Code02_MissingSmallest1 { public static int MAXN = 200001; - public static int MAXM = MAXN * 22; + public static int MAXT = MAXN * 22; public static int n, m; @@ -27,13 +27,13 @@ public class Code04_MissingSmallest1 { public static int[] root = new int[MAXN]; - public static int[] left = new int[MAXM]; + public static int[] left = new int[MAXT]; - public static int[] right = new int[MAXM]; + public static int[] right = new int[MAXT]; // last[i] : l~r的信息存在last[i] // 表示该范围每个数字最后出现的位置中,最左在哪 - public static int[] lateLeft = new int[MAXM]; + public static int[] lateLeft = new int[MAXT]; public static int cnt; diff --git a/src/class157/Code04_MissingSmallest2.java b/src/class158/Code02_MissingSmallest2.java similarity index 95% rename from src/class157/Code04_MissingSmallest2.java rename to src/class158/Code02_MissingSmallest2.java index e0c5a8baf..9b2d473ce 100644 --- a/src/class157/Code04_MissingSmallest2.java +++ b/src/class158/Code02_MissingSmallest2.java @@ -1,4 +1,4 @@ -package class157; +package class158; // 区间内没有出现的最小自然数,C++版 // 给定一个长度为n的数组arr,下标1~n,一共有m条查询 @@ -14,13 +14,13 @@ //using namespace std; // //const int MAXN = 200001; -//const int MAXM = MAXN * 22; +//const int MAXT = MAXN * 22; //int n, m; //int arr[MAXN]; //int root[MAXN]; -//int ls[MAXM]; -//int rs[MAXM]; -//int lateLeft[MAXM]; +//int ls[MAXT]; +//int rs[MAXT]; +//int lateLeft[MAXT]; //int cnt; // //int build(int l, int r) { diff --git a/src/class157/Code05_LargestUpMedian1.java b/src/class158/Code03_LargestUpMedian1.java similarity index 93% rename from src/class157/Code05_LargestUpMedian1.java rename to src/class158/Code03_LargestUpMedian1.java index dba38ef6a..7a20cb3bc 100644 --- a/src/class157/Code05_LargestUpMedian1.java +++ b/src/class158/Code03_LargestUpMedian1.java @@ -1,4 +1,4 @@ -package class157; +package class158; // 浮动区间的最大上中位数,java版 // 给定一个长度为n的数组arr,下标1~n,一共有m条查询 @@ -21,11 +21,11 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class Code05_LargestUpMedian1 { +public class Code03_LargestUpMedian1 { public static int MAXN = 20001; - public static int MAXM = MAXN * 20; + public static int MAXT = MAXN * 20; public static int INF = 10000001; @@ -37,18 +37,18 @@ public class Code05_LargestUpMedian1 { // 可持久化线段树需要 public static int[] root = new int[MAXN]; - public static int[] left = new int[MAXM]; + public static int[] left = new int[MAXT]; - public static int[] right = new int[MAXM]; + public static int[] right = new int[MAXT]; // 区间内最大前缀和,前缀不能为空 - public static int[] pre = new int[MAXM]; + public static int[] pre = new int[MAXT]; // 区间内最大后缀和,后缀不能为空 - public static int[] suf = new int[MAXM]; + public static int[] suf = new int[MAXT]; // 区间内累加和,区间为空认为累加和是0 - public static int[] sum = new int[MAXM]; + public static int[] sum = new int[MAXT]; public static int cnt; diff --git a/src/class157/Code05_LargestUpMedian2.java b/src/class158/Code03_LargestUpMedian2.java similarity index 96% rename from src/class157/Code05_LargestUpMedian2.java rename to src/class158/Code03_LargestUpMedian2.java index 145424a0a..5e3b3cc2b 100644 --- a/src/class157/Code05_LargestUpMedian2.java +++ b/src/class158/Code03_LargestUpMedian2.java @@ -1,4 +1,4 @@ -package class157; +package class158; // 浮动区间的最大上中位数,C++版 // 给定一个长度为n的数组arr,下标1~n,一共有m条查询 @@ -19,16 +19,16 @@ //using namespace std; // //const int MAXN = 20001; -//const int MAXM = MAXN * 20; +//const int MAXT = MAXN * 20; //const int INF = 10000001; //int n, m; //vector> arr; //int root[MAXN]; -//int ls[MAXM]; -//int rs[MAXM]; -//int pre[MAXM]; -//int suf[MAXM]; -//int sum[MAXM]; +//int ls[MAXT]; +//int rs[MAXT]; +//int pre[MAXT]; +//int suf[MAXT]; +//int sum[MAXT]; //int cnt; //int ques[4], info[3]; // diff --git a/src/class157/Code06_CountOnTree1.java b/src/class158/Code04_CountOnTree1.java similarity index 96% rename from src/class157/Code06_CountOnTree1.java rename to src/class158/Code04_CountOnTree1.java index a8d6a2f86..555dedd95 100644 --- a/src/class157/Code06_CountOnTree1.java +++ b/src/class158/Code04_CountOnTree1.java @@ -1,4 +1,4 @@ -package class157; +package class158; // 路径上的第k小,java版 // 有n个节点,编号1~n,每个节点有权值,有n-1条边,所有节点组成一棵树 @@ -21,13 +21,13 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class Code06_CountOnTree1 { +public class Code04_CountOnTree1 { public static int MAXN = 100001; public static int MAXH = 20; - public static int MAXM = MAXN * MAXH; + public static int MAXT = MAXN * MAXH; public static int n, m, s; @@ -49,11 +49,11 @@ public class Code06_CountOnTree1 { // 可持久化线段树需要 public static int[] root = new int[MAXN]; - public static int[] left = new int[MAXM]; + public static int[] left = new int[MAXT]; - public static int[] right = new int[MAXM]; + public static int[] right = new int[MAXT]; - public static int[] size = new int[MAXM]; + public static int[] size = new int[MAXT]; public static int cntt = 0; diff --git a/src/class157/Code06_CountOnTree2.java b/src/class158/Code04_CountOnTree2.java similarity index 97% rename from src/class157/Code06_CountOnTree2.java rename to src/class158/Code04_CountOnTree2.java index f1347a8bd..af273f7ed 100644 --- a/src/class157/Code06_CountOnTree2.java +++ b/src/class158/Code04_CountOnTree2.java @@ -1,4 +1,4 @@ -package class157; +package class158; // 路径上的第k小,C++版 // 有n个节点,编号1~n,每个节点有权值,有n-1条边,所有节点组成一棵树 @@ -20,7 +20,7 @@ // //const int MAXN = 100001; //const int MAXH = 20; -//const int MAXM = MAXN * MAXH; +//const int MAXT = MAXN * MAXH; //int n, m, s; //int arr[MAXN]; //int sorted[MAXN]; @@ -31,9 +31,9 @@ //int cntg = 0; // //int root[MAXN]; -//int ls[MAXM]; -//int rs[MAXM]; -//int size[MAXM]; +//int ls[MAXT]; +//int rs[MAXT]; +//int size[MAXT]; //int cntt = 0; // //int deep[MAXN]; diff --git a/src/class157/Code07_MoreImpressive1.java b/src/class158/Code05_MoreImpressive1.java similarity index 96% rename from src/class157/Code07_MoreImpressive1.java rename to src/class158/Code05_MoreImpressive1.java index 542ce253a..d9b6b60e9 100644 --- a/src/class157/Code07_MoreImpressive1.java +++ b/src/class158/Code05_MoreImpressive1.java @@ -1,4 +1,4 @@ -package class157; +package class158; // 更为厉害,java版 // 有n个节点,编号1~n,给定n-1条边,连成一棵树,1号点是树头 @@ -17,11 +17,11 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code07_MoreImpressive1 { +public class Code05_MoreImpressive1 { public static int MAXN = 300001; - public static int MAXM = MAXN * 22; + public static int MAXT = MAXN * 22; public static int n, m; @@ -37,11 +37,11 @@ public class Code07_MoreImpressive1 { // 可持久化线段树需要 public static int[] root = new int[MAXN]; - public static int[] left = new int[MAXM]; + public static int[] left = new int[MAXT]; - public static int[] right = new int[MAXM]; + public static int[] right = new int[MAXT]; - public static long[] sum = new long[MAXM]; + public static long[] sum = new long[MAXT]; public static int cntt = 0; diff --git a/src/class157/Code07_MoreImpressive2.java b/src/class158/Code05_MoreImpressive2.java similarity index 97% rename from src/class157/Code07_MoreImpressive2.java rename to src/class158/Code05_MoreImpressive2.java index 39ca2f78d..13a36eda8 100644 --- a/src/class157/Code07_MoreImpressive2.java +++ b/src/class158/Code05_MoreImpressive2.java @@ -1,4 +1,4 @@ -package class157; +package class158; // 更为厉害,C++版 // 有n个节点,编号1~n,给定n-1条边,连成一棵树,1号点是树头 @@ -16,7 +16,7 @@ //using namespace std; // //const int MAXN = 300001; -//const int MAXM = MAXN * 22; +//const int MAXT = MAXN * 22; //int n, m; // //int head[MAXN]; @@ -25,9 +25,9 @@ //int cntg = 0; // //int root[MAXN]; -//int ls[MAXM]; -//int rs[MAXM]; -//long long sum[MAXM]; +//int ls[MAXT]; +//int rs[MAXT]; +//long long sum[MAXT]; //int cntt = 0; // //int dep[MAXN]; From f0983c66fde39e8fd77d83b1113561c6d8581633 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 14 Jan 2025 18:57:38 +0800 Subject: [PATCH 0614/2029] modify code --- ..._RangePersistent1.java => Code03_RangePersistentClassic1.java} | 0 ..._RangePersistent2.java => Code03_RangePersistentClassic2.java} | 0 ...angePersistent1.java => Code05_RangePersistentLessSpace1.java} | 0 ...angePersistent2.java => Code05_RangePersistentLessSpace2.java} | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename src/class157/{Code03_RangePersistent1.java => Code03_RangePersistentClassic1.java} (100%) rename src/class157/{Code03_RangePersistent2.java => Code03_RangePersistentClassic2.java} (100%) rename src/class157/{Code05_RangePersistent1.java => Code05_RangePersistentLessSpace1.java} (100%) rename src/class157/{Code05_RangePersistent2.java => Code05_RangePersistentLessSpace2.java} (100%) diff --git a/src/class157/Code03_RangePersistent1.java b/src/class157/Code03_RangePersistentClassic1.java similarity index 100% rename from src/class157/Code03_RangePersistent1.java rename to src/class157/Code03_RangePersistentClassic1.java diff --git a/src/class157/Code03_RangePersistent2.java b/src/class157/Code03_RangePersistentClassic2.java similarity index 100% rename from src/class157/Code03_RangePersistent2.java rename to src/class157/Code03_RangePersistentClassic2.java diff --git a/src/class157/Code05_RangePersistent1.java b/src/class157/Code05_RangePersistentLessSpace1.java similarity index 100% rename from src/class157/Code05_RangePersistent1.java rename to src/class157/Code05_RangePersistentLessSpace1.java diff --git a/src/class157/Code05_RangePersistent2.java b/src/class157/Code05_RangePersistentLessSpace2.java similarity index 100% rename from src/class157/Code05_RangePersistent2.java rename to src/class157/Code05_RangePersistentLessSpace2.java From bb4dc602bd5e034543c1143b40ea52c71295a860 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 14 Jan 2025 18:57:45 +0800 Subject: [PATCH 0615/2029] modify code --- src/class157/Code03_RangePersistentClassic1.java | 4 ++-- src/class157/Code05_RangePersistentLessSpace1.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class157/Code03_RangePersistentClassic1.java b/src/class157/Code03_RangePersistentClassic1.java index d8b740115..0df595f8b 100644 --- a/src/class157/Code03_RangePersistentClassic1.java +++ b/src/class157/Code03_RangePersistentClassic1.java @@ -13,7 +13,7 @@ // 测试链接 : https://www.spoj.com/problems/TTM/ // 这是实现范围修改的可持久化线段树,经典的方式 // 但是java的实现过不了,因为这道题各种平台测试的时候,就没考虑java的用户 -// 所以想通过就用C++实现吧,本节课Code03_RangePersistent2文件就是C++的实现 +// 所以想通过就用C++实现吧,本节课Code03_RangePersistentClassic2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 import java.io.BufferedWriter; @@ -21,7 +21,7 @@ import java.io.InputStream; import java.io.OutputStreamWriter; -public class Code03_RangePersistent1 { +public class Code03_RangePersistentClassic1 { public static int MAXN = 100001; diff --git a/src/class157/Code05_RangePersistentLessSpace1.java b/src/class157/Code05_RangePersistentLessSpace1.java index 89ea9d889..a02bb2d94 100644 --- a/src/class157/Code05_RangePersistentLessSpace1.java +++ b/src/class157/Code05_RangePersistentLessSpace1.java @@ -13,7 +13,7 @@ // 测试链接 : https://www.spoj.com/problems/TTM/ // 这是实现范围修改的可持久化线段树,使用标记永久化减少空间占用的方式 // 但是java的实现依然通过不了,因为这道题各种平台测试的时候,就没考虑java的用户 -// 所以想通过就用C++实现吧,本节课Code05_RangePersistent2文件就是C++的实现 +// 所以想通过就用C++实现吧,本节课Code05_RangePersistentLessSpace2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 import java.io.BufferedWriter; @@ -21,7 +21,7 @@ import java.io.InputStream; import java.io.OutputStreamWriter; -public class Code05_RangePersistent1 { +public class Code05_RangePersistentLessSpace1 { public static int MAXN = 100001; From 60db40e35d4c6414c250bfbecd1c8ec751544201 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 14 Jan 2025 19:08:24 +0800 Subject: [PATCH 0616/2029] modify code --- src/class157/Code03_RangePersistentClassic1.java | 2 +- src/class157/Code05_RangePersistentLessSpace1.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class157/Code03_RangePersistentClassic1.java b/src/class157/Code03_RangePersistentClassic1.java index 0df595f8b..22bb0abdc 100644 --- a/src/class157/Code03_RangePersistentClassic1.java +++ b/src/class157/Code03_RangePersistentClassic1.java @@ -12,7 +12,7 @@ // 测试链接 : https://www.luogu.com.cn/problem/SP11470 // 测试链接 : https://www.spoj.com/problems/TTM/ // 这是实现范围修改的可持久化线段树,经典的方式 -// 但是java的实现过不了,因为这道题各种平台测试的时候,就没考虑java的用户 +// 但是java的实现过不了,因为这道题完全根据C++的性能设置的通过标准,根本没考虑java的用户 // 所以想通过就用C++实现吧,本节课Code03_RangePersistentClassic2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 diff --git a/src/class157/Code05_RangePersistentLessSpace1.java b/src/class157/Code05_RangePersistentLessSpace1.java index a02bb2d94..e2dd6aa2d 100644 --- a/src/class157/Code05_RangePersistentLessSpace1.java +++ b/src/class157/Code05_RangePersistentLessSpace1.java @@ -12,7 +12,7 @@ // 测试链接 : https://www.luogu.com.cn/problem/SP11470 // 测试链接 : https://www.spoj.com/problems/TTM/ // 这是实现范围修改的可持久化线段树,使用标记永久化减少空间占用的方式 -// 但是java的实现依然通过不了,因为这道题各种平台测试的时候,就没考虑java的用户 +// 但是java的实现过不了,因为这道题完全根据C++的性能设置的通过标准,根本没考虑java的用户 // 所以想通过就用C++实现吧,本节课Code05_RangePersistentLessSpace2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 From d78b3c8cd6da3aa417a99945b657351347a67776 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 15 Jan 2025 13:56:25 +0800 Subject: [PATCH 0617/2029] modify code --- src/class157/Code04_TagPermanentization1.java | 2 +- src/class157/Code04_TagPermanentization2.java | 2 +- src/class157/Code05_RangePersistentLessSpace1.java | 5 ++--- src/class157/Code05_RangePersistentLessSpace2.java | 5 ++--- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/class157/Code04_TagPermanentization1.java b/src/class157/Code04_TagPermanentization1.java index fa10b81f6..4209de55f 100644 --- a/src/class157/Code04_TagPermanentization1.java +++ b/src/class157/Code04_TagPermanentization1.java @@ -1,6 +1,6 @@ package class157; -// 标记永久化,范围增加、查询累加和,java版 +// 标记永久化,范围增加 + 查询累加和,java版 // 给定一个长度为n的数组arr,下标1~n,一共有m条操作,操作类型如下 // 1 x y k : 将区间[x, y]每个数加上k // 2 x y : 打印区间[x, y]的累加和 diff --git a/src/class157/Code04_TagPermanentization2.java b/src/class157/Code04_TagPermanentization2.java index cf282b323..0e83b7a0d 100644 --- a/src/class157/Code04_TagPermanentization2.java +++ b/src/class157/Code04_TagPermanentization2.java @@ -1,6 +1,6 @@ package class157; -// 标记永久化,范围增加、查询累加和,C++版 +// 标记永久化,范围增加 + 查询累加和,C++版 // 给定一个长度为n的数组arr,下标1~n,一共有m条操作,操作类型如下 // 1 x y k : 将区间[x, y]每个数加上k // 2 x y : 打印区间[x, y]的累加和 diff --git a/src/class157/Code05_RangePersistentLessSpace1.java b/src/class157/Code05_RangePersistentLessSpace1.java index e2dd6aa2d..d0a9c7cbe 100644 --- a/src/class157/Code05_RangePersistentLessSpace1.java +++ b/src/class157/Code05_RangePersistentLessSpace1.java @@ -1,6 +1,6 @@ package class157; -// 范围修改的可持久化线段树 + 标记永久化减少空间占用,java版 +// 范围修改的可持久化线段树,标记永久化减少空间占用,java版 // 给定一个长度为n的数组arr,下标1~n,时间戳t=0,arr认为是0版本的数组 // 一共有m条查询,每条查询为如下四种类型中的一种 // C x y z : 当前时间戳t版本的数组,[x..y]范围每个数字增加z,得到t+1版本数组,并且t++ @@ -9,8 +9,7 @@ // B x : 当前时间戳t设置成x // 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://acm.hdu.edu.cn/showproblem.php?pid=4348 // 这是实现范围修改的可持久化线段树,使用标记永久化减少空间占用的方式 // 但是java的实现过不了,因为这道题完全根据C++的性能设置的通过标准,根本没考虑java的用户 // 所以想通过就用C++实现吧,本节课Code05_RangePersistentLessSpace2文件就是C++的实现 diff --git a/src/class157/Code05_RangePersistentLessSpace2.java b/src/class157/Code05_RangePersistentLessSpace2.java index 9c4177f45..603b54777 100644 --- a/src/class157/Code05_RangePersistentLessSpace2.java +++ b/src/class157/Code05_RangePersistentLessSpace2.java @@ -1,6 +1,6 @@ package class157; -// 范围修改的可持久化线段树 + 标记永久化减少空间占用,C++版 +// 范围修改的可持久化线段树,标记永久化减少空间占用,C++版 // 给定一个长度为n的数组arr,下标1~n,时间戳t=0,arr认为是0版本的数组 // 一共有m条查询,每条查询为如下四种类型中的一种 // C x y z : 当前时间戳t版本的数组,[x..y]范围每个数字增加z,得到t+1版本数组,并且t++ @@ -9,8 +9,7 @@ // B x : 当前时间戳t设置成x // 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://acm.hdu.edu.cn/showproblem.php?pid=4348 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From 406a6a8ae6b62d2b84a2365f2f3f074702aa8a7f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 15 Jan 2025 14:05:25 +0800 Subject: [PATCH 0618/2029] modify code --- src/class157/Code03_RangePersistentClassic1.java | 8 ++++---- src/class157/Code03_RangePersistentClassic2.java | 2 +- src/class157/Code05_RangePersistentLessSpace1.java | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/class157/Code03_RangePersistentClassic1.java b/src/class157/Code03_RangePersistentClassic1.java index 22bb0abdc..c874c9242 100644 --- a/src/class157/Code03_RangePersistentClassic1.java +++ b/src/class157/Code03_RangePersistentClassic1.java @@ -11,9 +11,9 @@ // -10^9 <= arr[i] <= +10^9 // 测试链接 : https://www.luogu.com.cn/problem/SP11470 // 测试链接 : https://www.spoj.com/problems/TTM/ -// 这是实现范围修改的可持久化线段树,经典的方式 -// 但是java的实现过不了,因为这道题完全根据C++的性能设置的通过标准,根本没考虑java的用户 -// 所以想通过就用C++实现吧,本节课Code03_RangePersistentClassic2文件就是C++的实现 +// java实现的逻辑一定是正确的,但是通过不了 +// 因为这道题根据C++的运行时间,制定通过标准,根本没考虑java的用户 +// 想通过用C++实现,本节课Code03_RangePersistentClassic2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 import java.io.BufferedWriter; @@ -25,7 +25,7 @@ public class Code03_RangePersistentClassic1 { public static int MAXN = 100001; - public static int MAXT = MAXN * 100; + public static int MAXT = MAXN * 70; public static int n, m, t = 0; diff --git a/src/class157/Code03_RangePersistentClassic2.java b/src/class157/Code03_RangePersistentClassic2.java index 7a2fccb23..39739d65e 100644 --- a/src/class157/Code03_RangePersistentClassic2.java +++ b/src/class157/Code03_RangePersistentClassic2.java @@ -20,7 +20,7 @@ //using namespace std; // //const int MAXN = 100001; -//const int MAXT = MAXN * 100; +//const int MAXT = MAXN * 70; //int n, m, t; //int arr[MAXN]; //int root[MAXN]; diff --git a/src/class157/Code05_RangePersistentLessSpace1.java b/src/class157/Code05_RangePersistentLessSpace1.java index d0a9c7cbe..f26016315 100644 --- a/src/class157/Code05_RangePersistentLessSpace1.java +++ b/src/class157/Code05_RangePersistentLessSpace1.java @@ -10,9 +10,9 @@ // 1 <= n、m <= 10^5 // -10^9 <= arr[i] <= +10^9 // 测试链接 : https://acm.hdu.edu.cn/showproblem.php?pid=4348 -// 这是实现范围修改的可持久化线段树,使用标记永久化减少空间占用的方式 -// 但是java的实现过不了,因为这道题完全根据C++的性能设置的通过标准,根本没考虑java的用户 -// 所以想通过就用C++实现吧,本节课Code05_RangePersistentLessSpace2文件就是C++的实现 +// java实现的逻辑一定是正确的,但是通过不了 +// 因为这道题根据C++的运行空间,制定通过标准,根本没考虑java的用户 +// 想通过用C++实现,本节课Code05_RangePersistentLessSpace2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 import java.io.BufferedWriter; From ccffbeb11176d36aa84b1dd6f686e0a17052514b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 15 Jan 2025 14:06:33 +0800 Subject: [PATCH 0619/2029] modify code --- src/class157/Code03_RangePersistentClassic2.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/class157/Code03_RangePersistentClassic2.java b/src/class157/Code03_RangePersistentClassic2.java index 39739d65e..2818f33bd 100644 --- a/src/class157/Code03_RangePersistentClassic2.java +++ b/src/class157/Code03_RangePersistentClassic2.java @@ -11,7 +11,6 @@ // -10^9 <= arr[i] <= +10^9 // 测试链接 : https://www.luogu.com.cn/problem/SP11470 // 测试链接 : https://www.spoj.com/problems/TTM/ -// 这是实现范围修改的可持久化线段树,经典的方式 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From 902608bb5e032979c0425a38396c358659a37c2f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 15 Jan 2025 14:13:58 +0800 Subject: [PATCH 0620/2029] modify code --- src/class157/Code05_RangePersistentLessSpace1.java | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/class157/Code05_RangePersistentLessSpace1.java b/src/class157/Code05_RangePersistentLessSpace1.java index f26016315..d1bdd1c15 100644 --- a/src/class157/Code05_RangePersistentLessSpace1.java +++ b/src/class157/Code05_RangePersistentLessSpace1.java @@ -28,21 +28,16 @@ public class Code05_RangePersistentLessSpace1 { public static int n, m, t = 0; - // 原始数组 public static int[] arr = new int[MAXN]; - // 可持久化线段树需要 - // root[i] : 时间戳i为版本号,线段树的头节点编号 public static int[] root = new int[MAXN]; public static int[] left = new int[MAXT]; public static int[] right = new int[MAXT]; - // 区间累加和 public static long[] sum = new long[MAXT]; - // 区间关于加的懒更新信息,变成了标记永久化信息 public static long[] addTag = new long[MAXT]; public static int cnt = 0; @@ -67,8 +62,6 @@ public static void prepare() { root[0] = build(1, n); } - // l~r范围,信息在i位置,任务是jobl~jobr范围,所有数字增加jobv - // 返回新的头节点编号 public static int add(int jobl, int jobr, long jobv, int l, int r, int i) { int rt = ++cnt, a = Math.max(jobl, l), b = Math.min(jobr, r); left[rt] = left[i]; @@ -89,9 +82,6 @@ public static int add(int jobl, int jobr, long jobv, int l, int r, int i) { return rt; } - // l~r范围,信息在i位置,任务是jobl~jobr范围,查询累加和 - // addHistory是从上方的大范围一路带下来的标记历史 - // 返回累加和 public static long query(int jobl, int jobr, long addHistory, int l, int r, int i) { if (jobl <= l && r <= jobr) { return sum[i] + addHistory * (r - l + 1); From d366f3694e568ab57dc54b79327c0f7ea2410e43 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 15 Jan 2025 14:20:45 +0800 Subject: [PATCH 0621/2029] modify code --- src/class157/Code01_PointPersistent1.java | 11 +++++++++++ src/class157/Code02_PointPersistent1.java | 6 ++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/class157/Code01_PointPersistent1.java b/src/class157/Code01_PointPersistent1.java index e9f2081de..8fe3b3f30 100644 --- a/src/class157/Code01_PointPersistent1.java +++ b/src/class157/Code01_PointPersistent1.java @@ -22,18 +22,24 @@ public class Code01_PointPersistent1 { public static int n, m; + // 原始数组 public static int[] arr = new int[MAXN]; + // 可持久化线段树需要 + // root[i] : i号版本线段树的头节点编号 public static int[] root = new int[MAXN]; public static int[] left = new int[MAXT]; public static int[] right = new int[MAXT]; + // value[i] : 节点i的值信息,只有叶节点有这个信息 public static int[] value = new int[MAXT]; + // 可持久化线段树的节点空间计数 public static int cnt = 0; + // 建树,返回头节点编号 public static int build(int l, int r) { int rt = ++cnt; if (l == r) { @@ -46,6 +52,9 @@ public static int build(int l, int r) { return rt; } + // 线段树范围l~r,信息在i号节点里 + // 在l~r范围上,jobi位置的值,设置成jobv + // 生成的新节点编号返回 public static int update(int jobi, int jobv, int l, int r, int i) { int rt = ++cnt; left[rt] = left[i]; @@ -64,6 +73,8 @@ public static int update(int jobi, int jobv, int l, int r, int i) { return rt; } + // 线段树范围l~r,信息在i号节点里 + // 返回l~r范围上jobi位置的值 public static int query(int jobi, int l, int r, int i) { if (l == r) { return value[i]; diff --git a/src/class157/Code02_PointPersistent1.java b/src/class157/Code02_PointPersistent1.java index 614328e9f..0f2a87a3b 100644 --- a/src/class157/Code02_PointPersistent1.java +++ b/src/class157/Code02_PointPersistent1.java @@ -31,16 +31,14 @@ public class Code02_PointPersistent1 { public static int[] sorted = new int[MAXN]; // 可持久化线段树需要 - // root[i] : 插入arr[i]之后形成的线段树,记录头节点编号 + // root[i] : 插入arr[i]之后形成新版本的线段树,记录头节点编号 public static int[] root = new int[MAXN]; - // 左孩子 public static int[] left = new int[MAXT]; - // 右孩子 public static int[] right = new int[MAXT]; - // 收集了多少个数字 + // 范围内收集了多少个数字 public static int[] size = new int[MAXT]; public static int cnt; From 4fe826f9d1af916cc4bf54db83ce36fd26355ccc Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 15 Jan 2025 16:12:41 +0800 Subject: [PATCH 0622/2029] modify code --- src/class157/Code02_PointPersistent1.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/class157/Code02_PointPersistent1.java b/src/class157/Code02_PointPersistent1.java index 0f2a87a3b..56baaa0f6 100644 --- a/src/class157/Code02_PointPersistent1.java +++ b/src/class157/Code02_PointPersistent1.java @@ -38,7 +38,7 @@ public class Code02_PointPersistent1 { public static int[] right = new int[MAXT]; - // 范围内收集了多少个数字 + // 数字范围内收集了多少个数字 public static int[] size = new int[MAXT]; public static int cnt; @@ -58,7 +58,7 @@ public static int kth(int num) { return ans; } - // l~r范围建立线段树,返回头节点编号 + // 数字范围l~r,建立线段树,返回头节点编号 public static int build(int l, int r) { int rt = ++cnt; size[rt] = 0; @@ -70,7 +70,7 @@ public static int build(int l, int r) { return rt; } - // l~r范围,信息在i位置,增加一个jobi位置上的数字 + // 数字范围l~r,信息在i号节点,增加一个数字jobi // 返回新的头节点编号 public static int insert(int jobi, int l, int r, int i) { int rt = ++cnt; @@ -88,8 +88,8 @@ public static int insert(int jobi, int l, int r, int i) { return rt; } - // l~r范围,老版本信息在u位置,新版本信息在v位置 - // 返回第jobk小的数是多少 + // 数字范围l~r,老版本信息在u号节点,新版本信息在v号节点 + // 返回第jobk小的数 public static int query(int jobk, int l, int r, int u, int v) { if (l == r) { return l; From ba0e0eebd5d1ffe6a1561d9f8e9b4a1d5f455758 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 15 Jan 2025 16:18:19 +0800 Subject: [PATCH 0623/2029] modify code --- src/class157/Code02_PointPersistent1.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/class157/Code02_PointPersistent1.java b/src/class157/Code02_PointPersistent1.java index 56baaa0f6..1bc9150c5 100644 --- a/src/class157/Code02_PointPersistent1.java +++ b/src/class157/Code02_PointPersistent1.java @@ -38,7 +38,7 @@ public class Code02_PointPersistent1 { public static int[] right = new int[MAXT]; - // 数字范围内收集了多少个数字 + // 排名范围内收集了多少个数字 public static int[] size = new int[MAXT]; public static int cnt; @@ -58,7 +58,7 @@ public static int kth(int num) { return ans; } - // 数字范围l~r,建立线段树,返回头节点编号 + // 排名范围l~r,建立线段树,返回头节点编号 public static int build(int l, int r) { int rt = ++cnt; size[rt] = 0; @@ -70,7 +70,7 @@ public static int build(int l, int r) { return rt; } - // 数字范围l~r,信息在i号节点,增加一个数字jobi + // 排名范围l~r,信息在i号节点,增加一个排名为jobi的数字 // 返回新的头节点编号 public static int insert(int jobi, int l, int r, int i) { int rt = ++cnt; @@ -88,8 +88,8 @@ public static int insert(int jobi, int l, int r, int i) { return rt; } - // 数字范围l~r,老版本信息在u号节点,新版本信息在v号节点 - // 返回第jobk小的数 + // 排名范围l~r,老版本信息在u号节点,新版本信息在v号节点 + // 返回第jobk小的排名 public static int query(int jobk, int l, int r, int u, int v) { if (l == r) { return l; From 1ef8fb49ab1e742b12dc9faf01371ed069bd2529 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 15 Jan 2025 17:41:59 +0800 Subject: [PATCH 0624/2029] modify code --- src/class157/Code02_PointPersistent1.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/class157/Code02_PointPersistent1.java b/src/class157/Code02_PointPersistent1.java index 1bc9150c5..27839e758 100644 --- a/src/class157/Code02_PointPersistent1.java +++ b/src/class157/Code02_PointPersistent1.java @@ -32,6 +32,8 @@ public class Code02_PointPersistent1 { // 可持久化线段树需要 // root[i] : 插入arr[i]之后形成新版本的线段树,记录头节点编号 + // 0号版本的线段树代表一个数字也没有时,每种名次的数字出现的次数 + // i号版本的线段树代表arr[1..i]范围内,每种名次的数字出现的次数 public static int[] root = new int[MAXN]; public static int[] left = new int[MAXT]; @@ -89,7 +91,7 @@ public static int insert(int jobi, int l, int r, int i) { } // 排名范围l~r,老版本信息在u号节点,新版本信息在v号节点 - // 返回第jobk小的排名 + // 返回,第jobk小的数字,排名多少 public static int query(int jobk, int l, int r, int u, int v) { if (l == r) { return l; From 49977a20efb36c975facad874521930cb767b56b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 15 Jan 2025 20:20:49 +0800 Subject: [PATCH 0625/2029] modify code --- src/class157/Code03_RangePersistentClassic1.java | 4 +++- src/class157/Code03_RangePersistentClassic2.java | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/class157/Code03_RangePersistentClassic1.java b/src/class157/Code03_RangePersistentClassic1.java index c874c9242..35df62a8d 100644 --- a/src/class157/Code03_RangePersistentClassic1.java +++ b/src/class157/Code03_RangePersistentClassic1.java @@ -2,7 +2,7 @@ // 范围修改的可持久化线段树,经典的方式,java版 // 给定一个长度为n的数组arr,下标1~n,时间戳t=0,arr认为是0版本的数组 -// 一共有m条查询,每条查询为如下四种类型中的一种 +// 一共有m条操作,每条操作为如下四种类型中的一种 // C x y z : 当前时间戳t版本的数组,[x..y]范围每个数字增加z,得到t+1版本数组,并且t++ // Q x y : 当前时间戳t版本的数组,打印[x..y]范围累加和 // H x y z : z版本的数组,打印[x..y]范围的累加和 @@ -37,8 +37,10 @@ public class Code03_RangePersistentClassic1 { public static int[] right = new int[MAXT]; + // 累加和信息 public static long[] sum = new long[MAXT]; + // 懒更新信息,范围增加的懒更新 public static long[] add = new long[MAXT]; public static int cnt = 0; diff --git a/src/class157/Code03_RangePersistentClassic2.java b/src/class157/Code03_RangePersistentClassic2.java index 2818f33bd..7298feb31 100644 --- a/src/class157/Code03_RangePersistentClassic2.java +++ b/src/class157/Code03_RangePersistentClassic2.java @@ -2,7 +2,7 @@ // 范围修改的可持久化线段树,经典的方式,C++版 // 给定一个长度为n的数组arr,下标1~n,时间戳t=0,arr认为是0版本的数组 -// 一共有m条查询,每条查询为如下四种类型中的一种 +// 一共有m条操作,每条操作为如下四种类型中的一种 // C x y z : 当前时间戳t版本的数组,[x..y]范围每个数字增加z,得到t+1版本数组,并且t++ // Q x y : 当前时间戳t版本的数组,打印[x..y]范围累加和 // H x y z : z版本的数组,打印[x..y]范围的累加和 From ea7238160d44c6261e32090212a7f0ff8cf8fe0e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 15 Jan 2025 21:33:05 +0800 Subject: [PATCH 0626/2029] modify code --- src/class157/Code04_TagPermanentization1.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/class157/Code04_TagPermanentization1.java b/src/class157/Code04_TagPermanentization1.java index 4209de55f..d9436d39c 100644 --- a/src/class157/Code04_TagPermanentization1.java +++ b/src/class157/Code04_TagPermanentization1.java @@ -21,8 +21,12 @@ public class Code04_TagPermanentization1 { public static long[] arr = new long[MAXN]; + // 不是真实累加和,而是之前的任务中 + // 不考虑被上方范围截住的任务,只考虑来到当前范围 或者 往下走的任务 + // 累加和变成了什么 public static long[] sum = new long[MAXN << 2]; + // 不再是懒更新信息,变成标记信息 public static long[] addTag = new long[MAXN << 2]; public static void build(int l, int r, int i) { From 6b245980ccbe8be8eed0a4f8e7824f1c7feb8161 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 15 Jan 2025 21:40:35 +0800 Subject: [PATCH 0627/2029] modify code --- src/class157/Code03_RangePersistentClassic1.java | 6 ------ src/class157/Code03_RangePersistentClassic2.java | 10 ++-------- src/class157/Code05_RangePersistentLessSpace1.java | 10 ++++------ 3 files changed, 6 insertions(+), 20 deletions(-) diff --git a/src/class157/Code03_RangePersistentClassic1.java b/src/class157/Code03_RangePersistentClassic1.java index 35df62a8d..24bd5105d 100644 --- a/src/class157/Code03_RangePersistentClassic1.java +++ b/src/class157/Code03_RangePersistentClassic1.java @@ -121,12 +121,6 @@ public static long query(int jobl, int jobr, int l, int r, int i) { return ans; } - public static void prepare() { - t = 0; - cnt = 0; - root[0] = build(1, n); - } - public static void main(String[] args) throws IOException { FastReader in = new FastReader(); BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out)); diff --git a/src/class157/Code03_RangePersistentClassic2.java b/src/class157/Code03_RangePersistentClassic2.java index 7298feb31..3ae4ab33d 100644 --- a/src/class157/Code03_RangePersistentClassic2.java +++ b/src/class157/Code03_RangePersistentClassic2.java @@ -20,14 +20,14 @@ // //const int MAXN = 100001; //const int MAXT = MAXN * 70; -//int n, m, t; +//int n, m, t = 0; //int arr[MAXN]; //int root[MAXN]; //int ls[MAXT]; //int rs[MAXT]; //long long sum[MAXT]; //long long add[MAXT]; -//int cnt; +//int cnt = 0; // //int clone(int i) { // int rt = ++cnt; @@ -105,12 +105,6 @@ // return ans; //} // -//void prepare() { -// t = 0; -// cnt = 0; -// root[0] = build(1, n); -//} -// //int main() { // ios::sync_with_stdio(false); // cin.tie(nullptr); diff --git a/src/class157/Code05_RangePersistentLessSpace1.java b/src/class157/Code05_RangePersistentLessSpace1.java index d1bdd1c15..3d01cd922 100644 --- a/src/class157/Code05_RangePersistentLessSpace1.java +++ b/src/class157/Code05_RangePersistentLessSpace1.java @@ -36,8 +36,12 @@ public class Code05_RangePersistentLessSpace1 { public static int[] right = new int[MAXT]; + // 不是真实累加和,而是之前的任务中 + // 不考虑被上方范围截住的任务,只考虑来到当前范围 或者 往下走的任务 + // 累加和变成了什么 public static long[] sum = new long[MAXT]; + // 不再是懒更新信息,变成标记信息 public static long[] addTag = new long[MAXT]; public static int cnt = 0; @@ -56,12 +60,6 @@ public static int build(int l, int r) { return rt; } - public static void prepare() { - t = 0; - cnt = 0; - root[0] = build(1, n); - } - public static int add(int jobl, int jobr, long jobv, int l, int r, int i) { int rt = ++cnt, a = Math.max(jobl, l), b = Math.min(jobr, r); left[rt] = left[i]; From 1a3ac8688a3673dc2fe6a237dc77e9e1da29bd56 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 15 Jan 2025 21:50:59 +0800 Subject: [PATCH 0628/2029] modify code --- ...60\346\260\270\344\271\205\345\214\226.pptx" | Bin 0 -> 51544 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "ppt/\347\256\227\346\263\225\350\256\262\350\247\243157\343\200\220\346\214\272\351\232\276\343\200\221\345\217\257\346\214\201\344\271\205\345\214\226\347\272\277\346\256\265\346\240\221\345\222\214\346\240\207\350\256\260\346\260\270\344\271\205\345\214\226.pptx" diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243157\343\200\220\346\214\272\351\232\276\343\200\221\345\217\257\346\214\201\344\271\205\345\214\226\347\272\277\346\256\265\346\240\221\345\222\214\346\240\207\350\256\260\346\260\270\344\271\205\345\214\226.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243157\343\200\220\346\214\272\351\232\276\343\200\221\345\217\257\346\214\201\344\271\205\345\214\226\347\272\277\346\256\265\346\240\221\345\222\214\346\240\207\350\256\260\346\260\270\344\271\205\345\214\226.pptx" new file mode 100644 index 0000000000000000000000000000000000000000..ac8fd7d3f9a940a989ce6b376e1defb459923890 GIT binary patch literal 51544 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 literal 0 HcmV?d00001 From 0674f2bf32fc9972c15b729aae4f869d814b8074 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 16 Jan 2025 13:16:29 +0800 Subject: [PATCH 0629/2029] modify code --- src/class158/Code01_FirstTimeSequence1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class158/Code01_FirstTimeSequence1.java b/src/class158/Code01_FirstTimeSequence1.java index b01112f23..ad7823944 100644 --- a/src/class158/Code01_FirstTimeSequence1.java +++ b/src/class158/Code01_FirstTimeSequence1.java @@ -38,7 +38,7 @@ public class Code01_FirstTimeSequence1 { public static int[] right = new int[MAXT]; - // 区间不同数字的个数 + // 数组范围上出现不同数字的个数 public static int[] diff = new int[MAXT]; public static int cnt; From 10df8fb6665d7e3af98c167e90143e7509c90556 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 16 Jan 2025 13:22:29 +0800 Subject: [PATCH 0630/2029] modify code --- src/class158/Code02_MissingSmallest1.java | 1 + src/class158/Code02_MissingSmallest2.java | 1 + 2 files changed, 2 insertions(+) diff --git a/src/class158/Code02_MissingSmallest1.java b/src/class158/Code02_MissingSmallest1.java index 132b9f5d5..0f1c40bed 100644 --- a/src/class158/Code02_MissingSmallest1.java +++ b/src/class158/Code02_MissingSmallest1.java @@ -3,6 +3,7 @@ // 区间内没有出现的最小自然数,java版 // 给定一个长度为n的数组arr,下标1~n,一共有m条查询 // 每条查询 l r : 打印arr[l..r]内没有出现过的最小自然数,注意0是自然数 +// 请用在线算法解决该问题,因为可以设计强制在线的要求,让离线算法失效 // 1 <= n、m <= 2 * 10^5 // 0 <= arr[i] <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P4137 diff --git a/src/class158/Code02_MissingSmallest2.java b/src/class158/Code02_MissingSmallest2.java index 9b2d473ce..61d3341a3 100644 --- a/src/class158/Code02_MissingSmallest2.java +++ b/src/class158/Code02_MissingSmallest2.java @@ -3,6 +3,7 @@ // 区间内没有出现的最小自然数,C++版 // 给定一个长度为n的数组arr,下标1~n,一共有m条查询 // 每条查询 l r : 打印arr[l..r]内没有出现过的最小自然数,注意0是自然数 +// 请用在线算法解决该问题,因为可以设计强制在线的要求,让离线算法失效 // 1 <= n、m <= 2 * 10^5 // 0 <= arr[i] <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P4137 From 689626cccddfa7835b959153d6245369618c2204 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 16 Jan 2025 14:01:23 +0800 Subject: [PATCH 0631/2029] modify code --- src/class158/Code03_LargestUpMedian1.java | 1 + src/class158/Code03_LargestUpMedian2.java | 1 + 2 files changed, 2 insertions(+) diff --git a/src/class158/Code03_LargestUpMedian1.java b/src/class158/Code03_LargestUpMedian1.java index 7a20cb3bc..4d16f773d 100644 --- a/src/class158/Code03_LargestUpMedian1.java +++ b/src/class158/Code03_LargestUpMedian1.java @@ -1,6 +1,7 @@ package class158; // 浮动区间的最大上中位数,java版 +// 为了方便理解,我改写了题意,但是改写的题意和原始题意等效 // 给定一个长度为n的数组arr,下标1~n,一共有m条查询 // 每条查询 a b c d : 左端点在[a,b]之间、右端点在[c,d]之间,保证a Date: Thu, 16 Jan 2025 14:02:48 +0800 Subject: [PATCH 0632/2029] modify code --- src/class158/Code05_MoreImpressive1.java | 1 + src/class158/Code05_MoreImpressive2.java | 1 + 2 files changed, 2 insertions(+) diff --git a/src/class158/Code05_MoreImpressive1.java b/src/class158/Code05_MoreImpressive1.java index d9b6b60e9..e2c2e255e 100644 --- a/src/class158/Code05_MoreImpressive1.java +++ b/src/class158/Code05_MoreImpressive1.java @@ -1,6 +1,7 @@ package class158; // 更为厉害,java版 +// 为了方便理解,我改写了题意,但是改写的题意和原始题意等效 // 有n个节点,编号1~n,给定n-1条边,连成一棵树,1号点是树头 // 如果x是y的祖先节点,认为"x比y更厉害" // 如果x到y的路径上,边的数量 <= 某个常数,认为"x和y是邻居" diff --git a/src/class158/Code05_MoreImpressive2.java b/src/class158/Code05_MoreImpressive2.java index 13a36eda8..7dfe04b9a 100644 --- a/src/class158/Code05_MoreImpressive2.java +++ b/src/class158/Code05_MoreImpressive2.java @@ -1,6 +1,7 @@ package class158; // 更为厉害,C++版 +// 为了方便理解,我改写了题意,但是改写的题意和原始题意等效 // 有n个节点,编号1~n,给定n-1条边,连成一棵树,1号点是树头 // 如果x是y的祖先节点,认为"x比y更厉害" // 如果x到y的路径上,边的数量 <= 某个常数,认为"x和y是邻居" From b940672d22add017d6bb5887514f40061d1abbbb Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 16 Jan 2025 14:47:52 +0800 Subject: [PATCH 0633/2029] modify code --- src/class158/Code01_FirstTimeSequence1.java | 18 +++++++++--------- src/class158/Code01_FirstTimeSequence2.java | 16 ++++++++-------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/class158/Code01_FirstTimeSequence1.java b/src/class158/Code01_FirstTimeSequence1.java index ad7823944..59bd650c6 100644 --- a/src/class158/Code01_FirstTimeSequence1.java +++ b/src/class158/Code01_FirstTimeSequence1.java @@ -38,8 +38,8 @@ public class Code01_FirstTimeSequence1 { public static int[] right = new int[MAXT]; - // 数组范围上出现不同数字的个数 - public static int[] diff = new int[MAXT]; + // 数组范围上只记录每种数第一次出现的位置,这样的位置有多少个 + public static int[] firstSize = new int[MAXT]; public static int cnt; @@ -58,7 +58,7 @@ public static int update(int jobi, int jobv, int l, int r, int i) { int rt = ++cnt; left[rt] = left[i]; right[rt] = right[i]; - diff[rt] = diff[i] + jobv; + firstSize[rt] = firstSize[i] + jobv; if (l == r) { return rt; } @@ -71,17 +71,17 @@ public static int update(int jobi, int jobv, int l, int r, int i) { return rt; } - public static int queryDiff(int jobl, int jobr, int l, int r, int i) { + public static int querySize(int jobl, int jobr, int l, int r, int i) { if (jobl <= l && r <= jobr) { - return diff[i]; + return firstSize[i]; } int mid = (l + r) / 2; int ans = 0; if (jobl <= mid) { - ans += queryDiff(jobl, jobr, l, mid, left[i]); + ans += querySize(jobl, jobr, l, mid, left[i]); } if (jobr > mid) { - ans += queryDiff(jobl, jobr, mid + 1, r, right[i]); + ans += querySize(jobl, jobr, mid + 1, r, right[i]); } return ans; } @@ -91,7 +91,7 @@ public static int queryKth(int jobk, int l, int r, int i) { return l; } int mid = (l + r) / 2; - int leftDiff = diff[left[i]]; + int leftDiff = firstSize[left[i]]; if (leftDiff >= jobk) { return queryKth(jobk, l, mid, left[i]); } else { @@ -132,7 +132,7 @@ public static void main(String[] args) throws IOException { b = (io.nextInt() + lastAns) % n + 1; l = Math.min(a, b); r = Math.max(a, b); - k = (queryDiff(l, r, 1, n, root[l]) + 1) / 2; + k = (querySize(l, r, 1, n, root[l]) + 1) / 2; lastAns = queryKth(k, 1, n, root[l]); io.write(" "); io.writeInt(lastAns); diff --git a/src/class158/Code01_FirstTimeSequence2.java b/src/class158/Code01_FirstTimeSequence2.java index 72a3ac746..6a74d32cb 100644 --- a/src/class158/Code01_FirstTimeSequence2.java +++ b/src/class158/Code01_FirstTimeSequence2.java @@ -28,7 +28,7 @@ //int root[MAXN]; //int ls[MAXT]; //int rs[MAXT]; -//int diff[MAXT]; +//int firstSize[MAXT]; //int cnt; // //int build(int l, int r) { @@ -46,7 +46,7 @@ // int rt = ++cnt; // ls[rt] = ls[i]; // rs[rt] = rs[i]; -// diff[rt] = diff[i] + jobv; +// firstSize[rt] = firstSize[i] + jobv; // if (l == r) { // return rt; // } @@ -59,17 +59,17 @@ // return rt; //} // -//int queryDiff(int jobl, int jobr, int l, int r, int i) { +//int querySize(int jobl, int jobr, int l, int r, int i) { // if (jobl <= l && r <= jobr) { -// return diff[i]; +// return firstSize[i]; // } // int mid = (l + r) / 2; // int ans = 0; // if (jobl <= mid) { -// ans += queryDiff(jobl, jobr, l, mid, ls[i]); +// ans += querySize(jobl, jobr, l, mid, ls[i]); // } // if (jobr > mid) { -// ans += queryDiff(jobl, jobr, mid + 1, r, rs[i]); +// ans += querySize(jobl, jobr, mid + 1, r, rs[i]); // } // return ans; //} @@ -79,7 +79,7 @@ // return l; // } // int mid = (l + r) / 2; -// int leftDiff = diff[ls[i]]; +// int leftDiff = firstSize[ls[i]]; // if (leftDiff >= jobk) { // return queryKth(jobk, l, mid, ls[i]); // } else { @@ -119,7 +119,7 @@ // b = (r + lastAns) % n + 1; // l = min(a, b); // r = max(a, b); -// k = (queryDiff(l, r, 1, n, root[l]) + 1) / 2; +// k = (querySize(l, r, 1, n, root[l]) + 1) / 2; // lastAns = queryKth(k, 1, n, root[l]); // cout << " " << lastAns; // } From 93ac05aaacf7638ee4ed4f907fe36bcd496a0d9d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 16 Jan 2025 16:12:46 +0800 Subject: [PATCH 0634/2029] modify code --- src/class158/Code01_FirstTimeSequence1.java | 19 ++++++++++++++----- src/class158/Code01_FirstTimeSequence2.java | 10 +++++----- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/class158/Code01_FirstTimeSequence1.java b/src/class158/Code01_FirstTimeSequence1.java index 59bd650c6..c83b0fb46 100644 --- a/src/class158/Code01_FirstTimeSequence1.java +++ b/src/class158/Code01_FirstTimeSequence1.java @@ -45,15 +45,19 @@ public class Code01_FirstTimeSequence1 { public static int build(int l, int r) { int rt = ++cnt; - if (l == r) { - return rt; + if (l < r) { + int mid = (l + r) / 2; + left[rt] = build(l, mid); + right[rt] = build(mid + 1, r); } - int mid = (l + r) / 2; - left[rt] = build(l, mid); - right[rt] = build(mid + 1, r); + firstSize[rt] = 0; return rt; } + // 数组范围l~r,信息在i号节点 + // 如果jobv = -1,意味着jobi位置减少一个计数 + // 如果jobv = 1,意味着jobi位置增加一个计数 + // 返回新的头节点编号 public static int update(int jobi, int jobv, int l, int r, int i) { int rt = ++cnt; left[rt] = left[i]; @@ -71,6 +75,8 @@ public static int update(int jobi, int jobv, int l, int r, int i) { return rt; } + // 数组范围l~r,信息在i号节点 + // jobl ~ jobr范围上,一共有几种不同的数字,也就是这个范围上,有多少个位置有1 public static int querySize(int jobl, int jobr, int l, int r, int i) { if (jobl <= l && r <= jobr) { return firstSize[i]; @@ -86,6 +92,8 @@ public static int querySize(int jobl, int jobr, int l, int r, int i) { return ans; } + // 数组范围l~r,信息在i号节点 + // 查询这个范围上,第jobk个1在哪 public static int queryKth(int jobk, int l, int r, int i) { if (l == r) { return l; @@ -99,6 +107,7 @@ public static int queryKth(int jobk, int l, int r, int i) { } } + // 从右往左建立各个版本的线段树 public static void prepare() { cnt = 0; Arrays.fill(pos, 0); diff --git a/src/class158/Code01_FirstTimeSequence2.java b/src/class158/Code01_FirstTimeSequence2.java index 6a74d32cb..28b3c3d7e 100644 --- a/src/class158/Code01_FirstTimeSequence2.java +++ b/src/class158/Code01_FirstTimeSequence2.java @@ -33,12 +33,12 @@ // //int build(int l, int r) { // int rt = ++cnt; -// if (l == r) { -// return rt; +// if (l < r) { +// int mid = (l + r) / 2; +// ls[rt] = build(l, mid); +// rs[rt] = build(mid + 1, r); // } -// int mid = (l + r) / 2; -// ls[rt] = build(l, mid); -// rs[rt] = build(mid + 1, r); +// firstSize[rt] = 0; // return rt; //} // From edee772da1dfe243344f2e1a2de5b1108dff4335 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 16 Jan 2025 16:32:59 +0800 Subject: [PATCH 0635/2029] modify code --- src/class158/Code01_FirstTimeSequence1.java | 10 +++++----- src/class158/Code01_FirstTimeSequence2.java | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/class158/Code01_FirstTimeSequence1.java b/src/class158/Code01_FirstTimeSequence1.java index c83b0fb46..417d9e98e 100644 --- a/src/class158/Code01_FirstTimeSequence1.java +++ b/src/class158/Code01_FirstTimeSequence1.java @@ -28,7 +28,7 @@ public class Code01_FirstTimeSequence1 { public static int[] arr = new int[MAXN]; - // pos[v] : v这个数字最左出现的位置 + // pos[v] : v这个数字上次出现的位置 public static int[] pos = new int[MAXN]; // 可持久化线段树需要 @@ -56,7 +56,7 @@ public static int build(int l, int r) { // 数组范围l~r,信息在i号节点 // 如果jobv = -1,意味着jobi位置减少一个计数 - // 如果jobv = 1,意味着jobi位置增加一个计数 + // 如果jobv = +1,意味着jobi位置增加一个计数 // 返回新的头节点编号 public static int update(int jobi, int jobv, int l, int r, int i) { int rt = ++cnt; @@ -99,11 +99,11 @@ public static int queryKth(int jobk, int l, int r, int i) { return l; } int mid = (l + r) / 2; - int leftDiff = firstSize[left[i]]; - if (leftDiff >= jobk) { + int lsize = firstSize[left[i]]; + if (lsize >= jobk) { return queryKth(jobk, l, mid, left[i]); } else { - return queryKth(jobk - leftDiff, mid + 1, r, right[i]); + return queryKth(jobk - lsize, mid + 1, r, right[i]); } } diff --git a/src/class158/Code01_FirstTimeSequence2.java b/src/class158/Code01_FirstTimeSequence2.java index 28b3c3d7e..1cf70176e 100644 --- a/src/class158/Code01_FirstTimeSequence2.java +++ b/src/class158/Code01_FirstTimeSequence2.java @@ -79,11 +79,11 @@ // return l; // } // int mid = (l + r) / 2; -// int leftDiff = firstSize[ls[i]]; -// if (leftDiff >= jobk) { +// int lsize = firstSize[ls[i]]; +// if (lsize >= jobk) { // return queryKth(jobk, l, mid, ls[i]); // } else { -// return queryKth(jobk - leftDiff, mid + 1, r, rs[i]); +// return queryKth(jobk - lsize, mid + 1, r, rs[i]); // } //} // From 4e536110d660f140576b7a45349e91a68586b6ee Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 16 Jan 2025 19:16:40 +0800 Subject: [PATCH 0636/2029] modify code --- src/class158/Code02_MissingSmallest1.java | 6 +++--- src/class158/Code05_MoreImpressive1.java | 21 ++++++++++++++------- src/class158/Code05_MoreImpressive2.java | 18 ++++++++++++------ 3 files changed, 29 insertions(+), 16 deletions(-) diff --git a/src/class158/Code02_MissingSmallest1.java b/src/class158/Code02_MissingSmallest1.java index 0f1c40bed..4aaca1ee6 100644 --- a/src/class158/Code02_MissingSmallest1.java +++ b/src/class158/Code02_MissingSmallest1.java @@ -32,8 +32,7 @@ public class Code02_MissingSmallest1 { public static int[] right = new int[MAXT]; - // last[i] : l~r的信息存在last[i] - // 表示该范围每个数字最后出现的位置中,最左在哪 + // 数字范围中,每个数字出现的最晚位置中,最左的位置在哪 public static int[] lateLeft = new int[MAXT]; public static int cnt; @@ -49,7 +48,8 @@ public static int build(int l, int r) { return rt; } - // l~r范围,信息在i位置,jobi这个数字,最新出现在jobv位置 + // 数字范围l~r,信息在i号节点 + // jobi这个数字,当前最晚出现在jobv位置 // 返回新的头节点编号 public static int update(int jobi, int jobv, int l, int r, int i) { int rt = ++cnt; diff --git a/src/class158/Code05_MoreImpressive1.java b/src/class158/Code05_MoreImpressive1.java index e2c2e255e..6e4c1612a 100644 --- a/src/class158/Code05_MoreImpressive1.java +++ b/src/class158/Code05_MoreImpressive1.java @@ -24,7 +24,7 @@ public class Code05_MoreImpressive1 { public static int MAXT = MAXN * 22; - public static int n, m; + public static int n, m, depth; // 链式前向星需要 public static int[] head = new int[MAXN]; @@ -109,6 +109,7 @@ public static long query(int jobl, int jobr, int l, int r, int u, int v) { // 递归版,C++可以通过,java无法通过,递归会爆栈 public static void dfs1(int u, int f) { deep[u] = deep[f] + 1; + depth = Math.max(depth, deep[u]); size[u] = 1; dfn[u] = ++cntd; for (int ei = head[u]; ei > 0; ei = next[ei]) { @@ -125,7 +126,7 @@ public static void dfs1(int u, int f) { // 递归版,C++可以通过,java无法通过,递归会爆栈 public static void dfs2(int u, int f) { - root[dfn[u]] = add(deep[u], size[u] - 1, 1, n, root[dfn[u] - 1]); + root[dfn[u]] = add(deep[u], size[u] - 1, 1, depth, root[dfn[u] - 1]); for (int ei = head[u]; ei > 0; ei = next[ei]) { if (to[ei] != f) { dfs2(to[ei], u); @@ -161,6 +162,7 @@ public static void dfs3() { pop(); if (e == -1) { deep[u] = deep[f] + 1; + depth = Math.max(depth, deep[u]); size[u] = 1; dfn[u] = ++cntd; e = head[u]; @@ -189,7 +191,7 @@ public static void dfs4() { while (stackSize > 0) { pop(); if (e == -1) { - root[dfn[u]] = add(deep[u], size[u] - 1, 1, n, root[dfn[u] - 1]); + root[dfn[u]] = add(deep[u], size[u] - 1, 1, depth, root[dfn[u] - 1]); e = head[u]; } else { e = next[e]; @@ -203,8 +205,15 @@ public static void dfs4() { } } + public static void prepare() { + depth = 0; + dfs3(); // 使用迭代版防止爆栈 + root[0] = build(1, depth); + dfs4(); // 使用迭代版防止爆栈 + } + public static long compute(int a, int k) { - long ans = query(deep[a] + 1, deep[a] + k, 1, n, root[dfn[a] - 1], root[dfn[a] + size[a] - 1]); + long ans = query(deep[a] + 1, deep[a] + k, 1, depth, root[dfn[a] - 1], root[dfn[a] + size[a] - 1]); ans += (long) (size[a] - 1) * Math.min(k, deep[a] - 1); return ans; } @@ -225,9 +234,7 @@ public static void main(String[] args) throws IOException { addEdge(u, v); addEdge(v, u); } - root[0] = build(1, n); - dfs3(); // 使用迭代版防止爆栈 - dfs4(); // 使用迭代版防止爆栈 + prepare(); for (int i = 1, a, k; i <= m; i++) { in.nextToken(); a = (int) in.nval; diff --git a/src/class158/Code05_MoreImpressive2.java b/src/class158/Code05_MoreImpressive2.java index 7dfe04b9a..9cf12cbd7 100644 --- a/src/class158/Code05_MoreImpressive2.java +++ b/src/class158/Code05_MoreImpressive2.java @@ -18,7 +18,7 @@ // //const int MAXN = 300001; //const int MAXT = MAXN * 22; -//int n, m; +//int n, m, depth; // //int head[MAXN]; //int to[MAXN << 1]; @@ -86,6 +86,7 @@ // //void dfs1(int u, int f) { // dep[u] = dep[f] + 1; +// depth = max(depth, dep[u]); // siz[u] = 1; // dfn[u] = ++cntd; // for (int ei = head[u]; ei > 0; ei = nxt[ei]) { @@ -101,7 +102,7 @@ //} // //void dfs2(int u, int f) { -// root[dfn[u]] = add(dep[u], (long long)siz[u] - 1, 1, n, root[dfn[u] - 1]); +// root[dfn[u]] = add(dep[u], (long long)siz[u] - 1, 1, depth, root[dfn[u] - 1]); // for (int ei = head[u]; ei > 0; ei = nxt[ei]) { // if (to[ei] != f) { // dfs2(to[ei], u); @@ -109,8 +110,15 @@ // } //} // +//void prepare() { +// depth = 0; +// dfs1(1, 0); +// root[0] = build(1, depth); +// dfs2(1, 0); +//} +// //long long compute(int a, int k) { -// long long ans = query(dep[a] + 1, dep[a] + k, 1, n, root[dfn[a] - 1], root[dfn[a] + siz[a] - 1]); +// long long ans = query(dep[a] + 1, dep[a] + k, 1, depth, root[dfn[a] - 1], root[dfn[a] + siz[a] - 1]); // ans += (long long)(siz[a] - 1) * min(k, dep[a] - 1); // return ans; //} @@ -124,9 +132,7 @@ // addEdge(u, v); // addEdge(v, u); // } -// root[0] = build(1, n); -// dfs1(1, 0); -// dfs2(1, 0); +// prepare(); // for(int i = 1, a, k; i <= m; i++) { // cin >> a >> k; // cout << compute(a, k) << "\n"; From 4d227fa9dc1048ba31753bf6f9bf101a3d77858e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 16 Jan 2025 19:59:38 +0800 Subject: [PATCH 0637/2029] modify code --- src/class158/Code02_MissingSmallest1.java | 4 ++-- src/class158/Code02_MissingSmallest2.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/class158/Code02_MissingSmallest1.java b/src/class158/Code02_MissingSmallest1.java index 4aaca1ee6..bca570236 100644 --- a/src/class158/Code02_MissingSmallest1.java +++ b/src/class158/Code02_MissingSmallest1.java @@ -49,7 +49,7 @@ public static int build(int l, int r) { } // 数字范围l~r,信息在i号节点 - // jobi这个数字,当前最晚出现在jobv位置 + // 数字范围上,jobi这个数字,最晚出现的位置更新为jobv // 返回新的头节点编号 public static int update(int jobi, int jobv, int l, int r, int i) { int rt = ++cnt; @@ -92,7 +92,7 @@ public static void prepare() { cnt = 0; root[0] = build(0, n); for (int i = 1; i <= n; i++) { - if (arr[i] >= n) { + if (arr[i] > n) { root[i] = root[i - 1]; } else { root[i] = update(arr[i], i, 0, n, root[i - 1]); diff --git a/src/class158/Code02_MissingSmallest2.java b/src/class158/Code02_MissingSmallest2.java index 61d3341a3..313049915 100644 --- a/src/class158/Code02_MissingSmallest2.java +++ b/src/class158/Code02_MissingSmallest2.java @@ -70,7 +70,7 @@ // cnt = 0; // root[0] = build(0, n); // for (int i = 1; i <= n; i++) { -// if (arr[i] >= n) { +// if (arr[i] > n) { // root[i] = root[i - 1]; // } else { // root[i] = update(arr[i], i, 0, n, root[i - 1]); From 054d60960dc33bbb2a14e700456b1d6f3e61fe56 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 16 Jan 2025 20:08:34 +0800 Subject: [PATCH 0638/2029] modify code --- src/class158/Code02_MissingSmallest1.java | 2 +- src/class158/Code02_MissingSmallest2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class158/Code02_MissingSmallest1.java b/src/class158/Code02_MissingSmallest1.java index bca570236..ace64190c 100644 --- a/src/class158/Code02_MissingSmallest1.java +++ b/src/class158/Code02_MissingSmallest1.java @@ -92,7 +92,7 @@ public static void prepare() { cnt = 0; root[0] = build(0, n); for (int i = 1; i <= n; i++) { - if (arr[i] > n) { + if (arr[i] > n || arr[i] < 0) { root[i] = root[i - 1]; } else { root[i] = update(arr[i], i, 0, n, root[i - 1]); diff --git a/src/class158/Code02_MissingSmallest2.java b/src/class158/Code02_MissingSmallest2.java index 313049915..bbdbf6275 100644 --- a/src/class158/Code02_MissingSmallest2.java +++ b/src/class158/Code02_MissingSmallest2.java @@ -70,7 +70,7 @@ // cnt = 0; // root[0] = build(0, n); // for (int i = 1; i <= n; i++) { -// if (arr[i] > n) { +// if (arr[i] > n || arr[i] < 0) { // root[i] = root[i - 1]; // } else { // root[i] = update(arr[i], i, 0, n, root[i - 1]); From e787e0ff5aba99729d61f8e63843aaeb751ba20c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 16 Jan 2025 22:53:33 +0800 Subject: [PATCH 0639/2029] modify code --- src/class158/Code03_LargestUpMedian1.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/class158/Code03_LargestUpMedian1.java b/src/class158/Code03_LargestUpMedian1.java index 4d16f773d..da2983ce9 100644 --- a/src/class158/Code03_LargestUpMedian1.java +++ b/src/class158/Code03_LargestUpMedian1.java @@ -48,7 +48,7 @@ public class Code03_LargestUpMedian1 { // 区间内最大后缀和,后缀不能为空 public static int[] suf = new int[MAXT]; - // 区间内累加和,区间为空认为累加和是0 + // 区间内累加和 public static int[] sum = new int[MAXT]; public static int cnt; @@ -76,6 +76,7 @@ public static void up(int i) { sum[i] = sum[left[i]] + sum[right[i]]; } + // jobi位置,原来是1,现在改为-1 public static int update(int jobi, int l, int r, int i) { int rt = ++cnt; left[rt] = left[i]; From 7eb7faae263e4144804ec0d85579a3513a0162ae Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 17 Jan 2025 01:04:56 +0800 Subject: [PATCH 0640/2029] modify code --- ...70\345\205\263\351\242\230\347\233\256.pptx" | Bin 0 -> 46661 bytes src/class158/Code05_MoreImpressive1.java | 4 ++-- src/class158/Code05_MoreImpressive2.java | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 "ppt/\347\256\227\346\263\225\350\256\262\350\247\243158\343\200\220\346\214\272\351\232\276\343\200\221\345\217\257\346\214\201\344\271\205\345\214\226\347\272\277\346\256\265\346\240\221\347\232\204\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\243158\343\200\220\346\214\272\351\232\276\343\200\221\345\217\257\346\214\201\344\271\205\345\214\226\347\272\277\346\256\265\346\240\221\347\232\204\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\243158\343\200\220\346\214\272\351\232\276\343\200\221\345\217\257\346\214\201\344\271\205\345\214\226\347\272\277\346\256\265\346\240\221\347\232\204\347\233\270\345\205\263\351\242\230\347\233\256.pptx" new file mode 100644 index 0000000000000000000000000000000000000000..65c50aa3ad26827bed0a9d39c08607ea65a8150c GIT binary patch literal 46661 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 Date: Fri, 17 Jan 2025 23:24:03 +0800 Subject: [PATCH 0641/2029] modify code --- src/class109/Code04_DifferentColors.java | 160 ++++++++++++++++++----- 1 file changed, 124 insertions(+), 36 deletions(-) diff --git a/src/class109/Code04_DifferentColors.java b/src/class109/Code04_DifferentColors.java index f18005492..3698a4b76 100644 --- a/src/class109/Code04_DifferentColors.java +++ b/src/class109/Code04_DifferentColors.java @@ -8,21 +8,18 @@ // 1 <= n、m、arr[i] <= 10^6 // 1 <= li <= ri <= n // 测试链接 : https://www.luogu.com.cn/problem/P1972 -// 请同学们务必参考如下代码中关于输入、输出的处理 -// 这是输入输出处理效率很高的写法 -// 提交以下的code,提交时请把类名改成"Main",可以直接通过 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 +// 代码逻辑和课上讲的完全一致,但是重写了读写工具类,增加了io效率 -import java.io.BufferedReader; +import java.io.BufferedWriter; 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 Code04_DifferentColors { - public static int MAXN = 1000010; + public static int MAXN = 1000001; public static int[] arr = new int[MAXN]; @@ -60,34 +57,6 @@ public static int range(int l, int r) { return sum(r) - sum(l - 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)); - in.nextToken(); - n = (int) in.nval; - for (int i = 1; i <= n; i++) { - in.nextToken(); - arr[i] = (int) in.nval; - } - in.nextToken(); - m = (int) in.nval; - for (int i = 1; i <= m; i++) { - in.nextToken(); - query[i][0] = (int) in.nval; - in.nextToken(); - query[i][1] = (int) in.nval; - query[i][2] = i; - } - compute(); - for (int i = 1; i <= m; i++) { - out.println(ans[i]); - } - out.flush(); - out.close(); - br.close(); - } - public static void compute() { Arrays.sort(query, 1, m + 1, (a, b) -> a[1] - b[1]); for (int s = 1, q = 1, l, r, i; q <= m; q++) { @@ -106,4 +75,123 @@ public static void compute() { } } + public static void main(String[] args) throws IOException { + FastReader in = new FastReader(); + BufferedWriter out = new BufferedWriter(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; + } + compute(); + for (int i = 1; i <= m; i++) { + out.write(ans[i] + "\n"); + } + 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 boolean hasNext() throws IOException { + while (hasNextByte()) { + byte b = buffer[ptr]; + if (!isWhitespace(b)) + return true; + ptr++; + } + return false; + } + + public String next() throws IOException { + byte c; + do { + c = readByte(); + if (c == -1) + return null; + } while (c <= ' '); + StringBuilder sb = new StringBuilder(); + while (c > ' ') { + sb.append((char) c); + c = 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; + } + + public double nextDouble() throws IOException { + double num = 0, div = 1; + byte b = readByte(); + while (isWhitespace(b)) + b = readByte(); + boolean minus = false; + if (b == '-') { + minus = true; + b = readByte(); + } + while (!isWhitespace(b) && b != '.' && b != -1) { + num = num * 10 + (b - '0'); + b = readByte(); + } + if (b == '.') { + b = readByte(); + while (!isWhitespace(b) && b != -1) { + num += (b - '0') / (div *= 10); + b = readByte(); + } + } + return minus ? -num : num; + } + + private boolean isWhitespace(byte b) { + return b == ' ' || b == '\n' || b == '\r' || b == '\t'; + } + } + } From e06e093e26eb672fc78dfe2887ac1c1e3385c2dc Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 19 Jan 2025 00:31:41 +0800 Subject: [PATCH 0642/2029] modify code --- .../Code03_RangePersistentClassic1.java | 1 + .../Code05_RangePersistentLessSpace1.java | 1 + src/class159/Code01_MaxExclusiveOr1.java | 197 ++++++++++++++++++ src/class159/Code01_MaxExclusiveOr2.java | 77 +++++++ 4 files changed, 276 insertions(+) create mode 100644 src/class159/Code01_MaxExclusiveOr1.java create mode 100644 src/class159/Code01_MaxExclusiveOr2.java diff --git a/src/class157/Code03_RangePersistentClassic1.java b/src/class157/Code03_RangePersistentClassic1.java index 24bd5105d..6fe9f1dfe 100644 --- a/src/class157/Code03_RangePersistentClassic1.java +++ b/src/class157/Code03_RangePersistentClassic1.java @@ -11,6 +11,7 @@ // -10^9 <= arr[i] <= +10^9 // 测试链接 : https://www.luogu.com.cn/problem/SP11470 // 测试链接 : https://www.spoj.com/problems/TTM/ +// 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但是通过不了 // 因为这道题根据C++的运行时间,制定通过标准,根本没考虑java的用户 // 想通过用C++实现,本节课Code03_RangePersistentClassic2文件就是C++的实现 diff --git a/src/class157/Code05_RangePersistentLessSpace1.java b/src/class157/Code05_RangePersistentLessSpace1.java index 3d01cd922..c28752a9b 100644 --- a/src/class157/Code05_RangePersistentLessSpace1.java +++ b/src/class157/Code05_RangePersistentLessSpace1.java @@ -10,6 +10,7 @@ // 1 <= n、m <= 10^5 // -10^9 <= arr[i] <= +10^9 // 测试链接 : https://acm.hdu.edu.cn/showproblem.php?pid=4348 +// 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但是通过不了 // 因为这道题根据C++的运行空间,制定通过标准,根本没考虑java的用户 // 想通过用C++实现,本节课Code05_RangePersistentLessSpace2文件就是C++的实现 diff --git a/src/class159/Code01_MaxExclusiveOr1.java b/src/class159/Code01_MaxExclusiveOr1.java new file mode 100644 index 000000000..1ab336a1c --- /dev/null +++ b/src/class159/Code01_MaxExclusiveOr1.java @@ -0,0 +1,197 @@ +package class159; + +// 最大异或和,java版 +// 因为练的就是可持久化前缀树,所以就用在线算法 +// 测试链接 : https://www.luogu.com.cn/problem/P4735 +// 提交以下的code,提交时请把类名改成"Main" +// java实现的逻辑一定是正确的,但是通过不了 +// 因为这道题根据C++的运行时间,制定通过标准,根本没考虑java的用户 +// 想通过用C++实现,本节课Code01_MaxExclusiveOr2文件就是C++的实现 +// 两个版本的逻辑完全一样,C++版本可以通过所有测试 + +import java.io.BufferedWriter; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.InputStream; + +public class Code01_MaxExclusiveOr1 { + + public static int MAXN = 600001; + + public static int MAXT = MAXN * 22; + + public static int BIT = 25; + + public static int n, m; + + public static int[] root = new int[MAXN]; + + public static int[][] next = new int[MAXT][2]; + + public static int[] size = new int[MAXT]; + + public static int cnt = 0; + + public static int[] eor = new int[MAXN]; + + public static int insert(int num, int bit, int i) { + int rt = ++cnt; + next[rt][0] = next[i][0]; + next[rt][1] = next[i][1]; + size[rt] = size[i] + 1; + if (bit >= 0) { + int cur = (num >> bit) & 1; + next[rt][cur] = insert(num, bit - 1, next[rt][cur]); + } + return rt; + } + + public static int query(int num, int bit, int u, int v) { + if (bit < 0) { + return 0; + } + int cur = (num >> bit) & 1; + int opp = cur ^ 1; + if (size[next[v][opp]] > size[next[u][opp]]) { + return (1 << bit) + query(num, bit - 1, next[u][opp], next[v][opp]); + } else { + return query(num, bit - 1, next[u][cur], next[v][cur]); + } + } + + public static void main(String[] args) throws IOException { + FastReader in = new FastReader(); + BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + m = in.nextInt(); + root[0] = insert(0, BIT, 0); + for (int i = 1, num; i <= n; i++) { + num = in.nextInt(); + eor[i] = eor[i - 1] ^ num; + root[i] = insert(eor[i], BIT, root[i - 1]); + } + String op; + int x, y, z; + StringBuilder ans = new StringBuilder(); + for (int i = 1; i <= m; i++) { + op = in.next(); + if (op.equals("A")) { + x = in.nextInt(); + n++; + eor[n] = eor[n - 1] ^ x; + root[n] = insert(eor[n], 25, root[n - 1]); + } else { + x = in.nextInt(); + y = in.nextInt(); + z = in.nextInt(); + if (x == 1) { + ans.append(query(eor[n] ^ z, BIT, 0, root[y - 1])).append("\n"); + } else { + ans.append(query(eor[n] ^ z, BIT, root[x - 2], root[y - 1])).append("\n"); + } + } + } + out.write(ans.toString()); + 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 boolean hasNext() throws IOException { + while (hasNextByte()) { + byte b = buffer[ptr]; + if (!isWhitespace(b)) + return true; + ptr++; + } + return false; + } + + public String next() throws IOException { + byte c; + do { + c = readByte(); + if (c == -1) + return null; + } while (c <= ' '); + StringBuilder sb = new StringBuilder(); + while (c > ' ') { + sb.append((char) c); + c = 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; + } + + public double nextDouble() throws IOException { + double num = 0, div = 1; + byte b = readByte(); + while (isWhitespace(b)) + b = readByte(); + boolean minus = false; + if (b == '-') { + minus = true; + b = readByte(); + } + while (!isWhitespace(b) && b != '.' && b != -1) { + num = num * 10 + (b - '0'); + b = readByte(); + } + if (b == '.') { + b = readByte(); + while (!isWhitespace(b) && b != -1) { + num += (b - '0') / (div *= 10); + b = readByte(); + } + } + return minus ? -num : num; + } + + private boolean isWhitespace(byte b) { + return b == ' ' || b == '\n' || b == '\r' || b == '\t'; + } + } + +} \ No newline at end of file diff --git a/src/class159/Code01_MaxExclusiveOr2.java b/src/class159/Code01_MaxExclusiveOr2.java new file mode 100644 index 000000000..71cf5f820 --- /dev/null +++ b/src/class159/Code01_MaxExclusiveOr2.java @@ -0,0 +1,77 @@ +package class159; + +// 最大异或和,C++版 +// 因为练的就是可持久化前缀树,所以就用在线算法 +// 测试链接 : https://www.luogu.com.cn/problem/P4735 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 600001; +//const int MAXT = MAXN * 22; +//const int BIT = 25; +//int n, m; +//int root[MAXN]; +//int nxt[MAXT][2]; +//int size[MAXT]; +//int cnt = 0; +//int eor[MAXN]; +// +//int insert(int num, int bit, int i) { +// int rt = ++cnt; +// nxt[rt][0] = nxt[i][0]; +// nxt[rt][1] = nxt[i][1]; +// size[rt] = size[i] + 1; +// if (bit >= 0) { +// int cur = (num >> bit) & 1; +// nxt[rt][cur] = insert(num, bit - 1, nxt[rt][cur]); +// } +// return rt; +//} +// +//int query(int num, int bit, int u, int v) { +// if (bit < 0) { +// return 0; +// } +// int cur = (num >> bit) & 1; +// int opp = cur ^ 1; +// if (size[nxt[v][opp]] > size[nxt[u][opp]]) { +// return (1 << bit) + query(num, bit - 1, nxt[u][opp], nxt[v][opp]); +// } else { +// return query(num, bit - 1, nxt[u][cur], nxt[v][cur]); +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(0); +// cin >> n >> m; +// root[0] = insert(0, BIT, 0); +// for (int i = 1, num; i <= n; i++) { +// cin >> num; +// eor[i] = eor[i - 1] ^ num; +// root[i] = insert(eor[i], BIT, root[i - 1]); +// } +// string op; +// int x, y, z; +// for (int i = 1; i <= m; i++) { +// cin >> op; +// if (op == "A") { +// cin >> x; +// n++; +// eor[n] = eor[n - 1] ^ x; +// root[n] = insert(eor[n], BIT, root[n - 1]); +// } else { +// cin >> x >> y >> z; +// if (x == 1) { +// cout << query(eor[n] ^ z, BIT, 0, root[y - 1]) << "\n"; +// } else { +// cout << query(eor[n] ^ z, BIT, root[x - 2], root[y - 1]) << "\n"; +// } +// } +// } +// return 0; +//} \ No newline at end of file From 76c6b208d5dae679ea4eddff71b1e31f5bffa962 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 19 Jan 2025 00:34:29 +0800 Subject: [PATCH 0643/2029] modify code --- src/class159/Code01_MaxExclusiveOr1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class159/Code01_MaxExclusiveOr1.java b/src/class159/Code01_MaxExclusiveOr1.java index 1ab336a1c..3dfd24e8e 100644 --- a/src/class159/Code01_MaxExclusiveOr1.java +++ b/src/class159/Code01_MaxExclusiveOr1.java @@ -4,7 +4,7 @@ // 因为练的就是可持久化前缀树,所以就用在线算法 // 测试链接 : https://www.luogu.com.cn/problem/P4735 // 提交以下的code,提交时请把类名改成"Main" -// java实现的逻辑一定是正确的,但是通过不了 +// java实现的逻辑一定是正确的,但是通过不了所有测试用例 // 因为这道题根据C++的运行时间,制定通过标准,根本没考虑java的用户 // 想通过用C++实现,本节课Code01_MaxExclusiveOr2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 From 80f220e62fc6acedc7a63ceda4422ddeaf156248 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 19 Jan 2025 00:45:36 +0800 Subject: [PATCH 0644/2029] modify code --- src/class159/Code01_MaxExclusiveOr1.java | 21 +++++++++------------ src/class159/Code01_MaxExclusiveOr2.java | 14 +++++++------- 2 files changed, 16 insertions(+), 19 deletions(-) diff --git a/src/class159/Code01_MaxExclusiveOr1.java b/src/class159/Code01_MaxExclusiveOr1.java index 3dfd24e8e..48123c703 100644 --- a/src/class159/Code01_MaxExclusiveOr1.java +++ b/src/class159/Code01_MaxExclusiveOr1.java @@ -9,9 +9,9 @@ // 想通过用C++实现,本节课Code01_MaxExclusiveOr2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 -import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStreamWriter; +import java.io.PrintWriter; import java.io.InputStream; public class Code01_MaxExclusiveOr1 { @@ -32,8 +32,6 @@ public class Code01_MaxExclusiveOr1 { public static int cnt = 0; - public static int[] eor = new int[MAXN]; - public static int insert(int num, int bit, int i) { int rt = ++cnt; next[rt][0] = next[i][0]; @@ -61,37 +59,36 @@ public static int query(int num, int bit, int u, int v) { public static void main(String[] args) throws IOException { FastReader in = new FastReader(); - BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out)); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); n = in.nextInt(); m = in.nextInt(); root[0] = insert(0, BIT, 0); + int eor = 0; for (int i = 1, num; i <= n; i++) { num = in.nextInt(); - eor[i] = eor[i - 1] ^ num; - root[i] = insert(eor[i], BIT, root[i - 1]); + eor ^= num; + root[i] = insert(eor, BIT, root[i - 1]); } String op; int x, y, z; - StringBuilder ans = new StringBuilder(); for (int i = 1; i <= m; i++) { op = in.next(); if (op.equals("A")) { x = in.nextInt(); + eor ^= x; n++; - eor[n] = eor[n - 1] ^ x; - root[n] = insert(eor[n], 25, root[n - 1]); + root[n] = insert(eor, 25, root[n - 1]); } else { x = in.nextInt(); y = in.nextInt(); z = in.nextInt(); if (x == 1) { - ans.append(query(eor[n] ^ z, BIT, 0, root[y - 1])).append("\n"); + out.println(query(eor ^ z, BIT, 0, root[y - 1])); } else { - ans.append(query(eor[n] ^ z, BIT, root[x - 2], root[y - 1])).append("\n"); + out.println(query(eor ^ z, BIT, root[x - 2], root[y - 1])); } } } - out.write(ans.toString()); out.flush(); out.close(); } diff --git a/src/class159/Code01_MaxExclusiveOr2.java b/src/class159/Code01_MaxExclusiveOr2.java index 71cf5f820..a2b20c206 100644 --- a/src/class159/Code01_MaxExclusiveOr2.java +++ b/src/class159/Code01_MaxExclusiveOr2.java @@ -18,7 +18,6 @@ //int nxt[MAXT][2]; //int size[MAXT]; //int cnt = 0; -//int eor[MAXN]; // //int insert(int num, int bit, int i) { // int rt = ++cnt; @@ -50,10 +49,11 @@ // cin.tie(0); // cin >> n >> m; // root[0] = insert(0, BIT, 0); +// int eor = 0; // for (int i = 1, num; i <= n; i++) { // cin >> num; -// eor[i] = eor[i - 1] ^ num; -// root[i] = insert(eor[i], BIT, root[i - 1]); +// eor ^= num; +// root[i] = insert(eor, BIT, root[i - 1]); // } // string op; // int x, y, z; @@ -61,15 +61,15 @@ // cin >> op; // if (op == "A") { // cin >> x; +// eor ^= x; // n++; -// eor[n] = eor[n - 1] ^ x; -// root[n] = insert(eor[n], BIT, root[n - 1]); +// root[n] = insert(eor, BIT, root[n - 1]); // } else { // cin >> x >> y >> z; // if (x == 1) { -// cout << query(eor[n] ^ z, BIT, 0, root[y - 1]) << "\n"; +// cout << query(eor ^ z, BIT, 0, root[y - 1]) << "\n"; // } else { -// cout << query(eor[n] ^ z, BIT, root[x - 2], root[y - 1]) << "\n"; +// cout << query(eor ^ z, BIT, root[x - 2], root[y - 1]) << "\n"; // } // } // } From 1bd81c22819232b5f168df0bf52abbeea68ed813 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 19 Jan 2025 12:37:32 +0800 Subject: [PATCH 0645/2029] modify code --- src/class159/Code01_MaxExclusiveOr1.java | 6 +++--- src/class159/Code01_MaxExclusiveOr2.java | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/class159/Code01_MaxExclusiveOr1.java b/src/class159/Code01_MaxExclusiveOr1.java index 48123c703..1cc2fd917 100644 --- a/src/class159/Code01_MaxExclusiveOr1.java +++ b/src/class159/Code01_MaxExclusiveOr1.java @@ -28,7 +28,7 @@ public class Code01_MaxExclusiveOr1 { public static int[][] next = new int[MAXT][2]; - public static int[] size = new int[MAXT]; + public static int[] pass = new int[MAXT]; public static int cnt = 0; @@ -36,7 +36,7 @@ public static int insert(int num, int bit, int i) { int rt = ++cnt; next[rt][0] = next[i][0]; next[rt][1] = next[i][1]; - size[rt] = size[i] + 1; + pass[rt] = pass[i] + 1; if (bit >= 0) { int cur = (num >> bit) & 1; next[rt][cur] = insert(num, bit - 1, next[rt][cur]); @@ -50,7 +50,7 @@ public static int query(int num, int bit, int u, int v) { } int cur = (num >> bit) & 1; int opp = cur ^ 1; - if (size[next[v][opp]] > size[next[u][opp]]) { + if (pass[next[v][opp]] > pass[next[u][opp]]) { return (1 << bit) + query(num, bit - 1, next[u][opp], next[v][opp]); } else { return query(num, bit - 1, next[u][cur], next[v][cur]); diff --git a/src/class159/Code01_MaxExclusiveOr2.java b/src/class159/Code01_MaxExclusiveOr2.java index a2b20c206..6cb22d8f5 100644 --- a/src/class159/Code01_MaxExclusiveOr2.java +++ b/src/class159/Code01_MaxExclusiveOr2.java @@ -16,14 +16,14 @@ //int n, m; //int root[MAXN]; //int nxt[MAXT][2]; -//int size[MAXT]; +//int pass[MAXT]; //int cnt = 0; // //int insert(int num, int bit, int i) { // int rt = ++cnt; // nxt[rt][0] = nxt[i][0]; // nxt[rt][1] = nxt[i][1]; -// size[rt] = size[i] + 1; +// pass[rt] = pass[i] + 1; // if (bit >= 0) { // int cur = (num >> bit) & 1; // nxt[rt][cur] = insert(num, bit - 1, nxt[rt][cur]); @@ -37,7 +37,7 @@ // } // int cur = (num >> bit) & 1; // int opp = cur ^ 1; -// if (size[nxt[v][opp]] > size[nxt[u][opp]]) { +// if (pass[nxt[v][opp]] > pass[nxt[u][opp]]) { // return (1 << bit) + query(num, bit - 1, nxt[u][opp], nxt[v][opp]); // } else { // return query(num, bit - 1, nxt[u][cur], nxt[v][cur]); From 22c7397f9a7d1b0d038539520cb9fd0a7cf2a7d9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 19 Jan 2025 12:40:57 +0800 Subject: [PATCH 0646/2029] modify code --- src/class159/Code01_MaxExclusiveOr1.java | 6 +++--- src/class159/Code01_MaxExclusiveOr2.java | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/class159/Code01_MaxExclusiveOr1.java b/src/class159/Code01_MaxExclusiveOr1.java index 1cc2fd917..a59d9f592 100644 --- a/src/class159/Code01_MaxExclusiveOr1.java +++ b/src/class159/Code01_MaxExclusiveOr1.java @@ -22,7 +22,7 @@ public class Code01_MaxExclusiveOr1 { public static int BIT = 25; - public static int n, m; + public static int n, m, eor; public static int[] root = new int[MAXN]; @@ -62,8 +62,8 @@ public static void main(String[] args) throws IOException { PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); n = in.nextInt(); m = in.nextInt(); - root[0] = insert(0, BIT, 0); - int eor = 0; + eor = 0; + root[0] = insert(eor, BIT, 0); for (int i = 1, num; i <= n; i++) { num = in.nextInt(); eor ^= num; diff --git a/src/class159/Code01_MaxExclusiveOr2.java b/src/class159/Code01_MaxExclusiveOr2.java index 6cb22d8f5..aa22932b5 100644 --- a/src/class159/Code01_MaxExclusiveOr2.java +++ b/src/class159/Code01_MaxExclusiveOr2.java @@ -13,7 +13,7 @@ //const int MAXN = 600001; //const int MAXT = MAXN * 22; //const int BIT = 25; -//int n, m; +//int n, m, eor; //int root[MAXN]; //int nxt[MAXT][2]; //int pass[MAXT]; @@ -48,8 +48,8 @@ // ios::sync_with_stdio(false); // cin.tie(0); // cin >> n >> m; -// root[0] = insert(0, BIT, 0); -// int eor = 0; +// eor = 0; +// root[0] = insert(eor, BIT, 0); // for (int i = 1, num; i <= n; i++) { // cin >> num; // eor ^= num; From 0ef9a067c6e1f6786a3bb12e595f14e9316cff23 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 19 Jan 2025 19:41:11 +0800 Subject: [PATCH 0647/2029] modify code --- src/class159/Code02_Yummy1.java | 133 ++++++++++++++++++++++++++++++++ src/class159/Code02_Yummy2.java | 107 +++++++++++++++++++++++++ 2 files changed, 240 insertions(+) create mode 100644 src/class159/Code02_Yummy1.java create mode 100644 src/class159/Code02_Yummy2.java diff --git a/src/class159/Code02_Yummy1.java b/src/class159/Code02_Yummy1.java new file mode 100644 index 000000000..83dedb53f --- /dev/null +++ b/src/class159/Code02_Yummy1.java @@ -0,0 +1,133 @@ +package class159; + +// 美味,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P3293 +// 提交以下的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 Code02_Yummy1 { + + public static int MAXN = 200001; + + public static int MAXT = 4000001; + + public static int BIT = 18; + + public static int n, m, s; + + public static int[] arr = new int[MAXN]; + + public static int[] root = new int[MAXN]; + + public static int[] left = new int[MAXT]; + + public static int[] right = new int[MAXT]; + + public static int[] size = new int[MAXT]; + + public static int cnt; + + public static int build(int l, int r) { + int rt = ++cnt; + size[rt] = 0; + if (l < r) { + int mid = (l + r) / 2; + left[rt] = build(l, mid); + right[rt] = build(mid + 1, r); + } + return rt; + } + + public static int update(int jobi, int l, int r, int i) { + int rt = ++cnt; + left[rt] = left[i]; + right[rt] = right[i]; + size[rt] = size[i] + 1; + if (l < r) { + int mid = (l + r) / 2; + if (jobi <= mid) { + left[rt] = update(jobi, l, mid, left[rt]); + } else { + right[rt] = update(jobi, mid + 1, r, right[rt]); + } + } + return rt; + } + + public static int query(int jobl, int jobr, int l, int r, int u, int v) { + if (jobr < l || jobl > r) { + return 0; + } + if (jobl <= l && r <= jobr) { + return size[v] - size[u]; + } + int mid = (l + r) / 2; + int ans = 0; + if (jobl <= mid) { + ans += query(jobl, jobr, l, mid, left[u], left[v]); + } + if (jobr > mid) { + ans += query(jobl, jobr, mid + 1, r, right[u], right[v]); + } + return ans; + } + + public static void prepare() { + cnt = 0; + s = 0; + for (int i = 1; i <= n; i++) { + s = Math.max(s, arr[i]); + } + root[0] = build(0, s); + for (int i = 1; i <= n; i++) { + root[i] = update(arr[i], 0, s, root[i - 1]); + } + } + + public static int compute(int b, int x, int l, int r) { + int ans = 0; + for (int i = BIT; i >= 0; i--) { + if (((b >> i) & 1) == 1) { + if (query(ans - x, ans - x + (1 << i) - 1, 0, s, root[l - 1], root[r]) == 0) { + ans += 1 << i; + } + } else { + if (query(ans - x + (1 << i), ans - x + (1 << (i + 1)) - 1, 0, s, root[l - 1], root[r]) != 0) { + ans += 1 << i; + } + } + } + return ans ^ b; + } + + 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; i <= n; i++) { + in.nextToken(); + arr[i] = (int) in.nval; + } + prepare(); + for (int i = 1, b, x, l, r; i <= m; i++) { + in.nextToken(); b = (int) in.nval; + in.nextToken(); x = (int) in.nval; + in.nextToken(); l = (int) in.nval; + in.nextToken(); r = (int) in.nval; + out.println(compute(b, x, l, r)); + } + out.flush(); + out.close(); + } + +} diff --git a/src/class159/Code02_Yummy2.java b/src/class159/Code02_Yummy2.java new file mode 100644 index 000000000..7b8bb1e55 --- /dev/null +++ b/src/class159/Code02_Yummy2.java @@ -0,0 +1,107 @@ +package class159; + +// 美味,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P3293 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 200001; +//const int MAXT = 4000001; +//const int BIT = 18; +//int n, m, s; +//int arr[MAXN]; +//int root[MAXN]; +//int ls[MAXT], rs[MAXT], size[MAXT]; +//int cnt; +// +//int build(int l, int r) { +// int rt = ++cnt; +// size[rt] = 0; +// if (l < r) { +// int mid = (l + r) / 2; +// ls[rt] = build(l, mid); +// rs[rt] = build(mid + 1, r); +// } +// return rt; +//} +// +//int update(int jobi, int l, int r, int i) { +// int rt = ++cnt; +// ls[rt] = ls[i]; +// rs[rt] = rs[i]; +// size[rt] = size[i] + 1; +// if (l < r) { +// int mid = (l + r) / 2; +// if (jobi <= mid) { +// ls[rt] = update(jobi, l, mid, ls[rt]); +// } else { +// rs[rt] = update(jobi, mid + 1, r, rs[rt]); +// } +// } +// return rt; +//} +// +//int query(int jobl, int jobr, int l, int r, int u, int v) { +// if (jobr < l || jobl > r) { +// return 0; +// } +// if (jobl <= l && r <= jobr) { +// return size[v] - size[u]; +// } +// int mid = (l + r) / 2; +// int ans = 0; +// if (jobl <= mid) { +// ans += query(jobl, jobr, l, mid, ls[u], ls[v]); +// } +// if (jobr > mid) { +// ans += query(jobl, jobr, mid + 1, r, rs[u], rs[v]); +// } +// return ans; +//} +// +//void prepare() { +// cnt = 0; +// s = 0; +// for (int i = 1; i <= n; i++) { +// s = max(s, arr[i]); +// } +// root[0] = build(0, s); +// for (int i = 1; i <= n; i++) { +// root[i] = update(arr[i], 0, s, root[i - 1]); +// } +//} +// +//int compute(int b, int x, int l, int r) { +// int ans = 0; +// for (int i = BIT; i >= 0; i--) { +// if (((b >> i) & 1) == 1) { +// if (query(ans - x, ans - x + (1 << i) - 1, 0, s, root[l - 1], root[r]) == 0) { +// ans += 1 << i; +// } +// } else { +// if (query(ans - x + (1 << i), ans - x + (1 << (i + 1)) - 1, 0, s, root[l - 1], root[r]) != 0) { +// ans += 1 << i; +// } +// } +// } +// return ans ^ b; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(0); +// cin >> n >> m; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// prepare(); +// for (int i = 1, b, x, l, r; i <= m; i++) { +// cin >> b >> x >> l >> r; +// cout << compute(b, x, l, r) << "\n"; +// } +// return 0; +//} \ No newline at end of file From 1f7de2a0e805262aa1e12af2311427cee71036a8 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 20 Jan 2025 16:54:33 +0800 Subject: [PATCH 0648/2029] modify code --- src/class159/Code01_MaxExclusiveOr1.java | 53 +++-- src/class159/Code01_MaxExclusiveOr2.java | 53 +++-- src/class159/Code02_Yummy1.java | 8 +- src/class159/Code02_Yummy2.java | 8 +- src/class159/Code03_StringTree1.java | 254 +++++++++++++++++++++++ src/class159/Code03_StringTree2.java | 127 ++++++++++++ 6 files changed, 451 insertions(+), 52 deletions(-) create mode 100644 src/class159/Code03_StringTree1.java create mode 100644 src/class159/Code03_StringTree2.java diff --git a/src/class159/Code01_MaxExclusiveOr1.java b/src/class159/Code01_MaxExclusiveOr1.java index a59d9f592..f83b540d7 100644 --- a/src/class159/Code01_MaxExclusiveOr1.java +++ b/src/class159/Code01_MaxExclusiveOr1.java @@ -26,35 +26,44 @@ public class Code01_MaxExclusiveOr1 { public static int[] root = new int[MAXN]; - public static int[][] next = new int[MAXT][2]; + public static int[][] tree = new int[MAXT][2]; public static int[] pass = new int[MAXT]; public static int cnt = 0; - public static int insert(int num, int bit, int i) { + public static int insert(int num, int i) { int rt = ++cnt; - next[rt][0] = next[i][0]; - next[rt][1] = next[i][1]; + tree[rt][0] = tree[i][0]; + tree[rt][1] = tree[i][1]; pass[rt] = pass[i] + 1; - if (bit >= 0) { - int cur = (num >> bit) & 1; - next[rt][cur] = insert(num, bit - 1, next[rt][cur]); + for (int b = BIT, path, pre = rt, cur; b >= 0; b--, pre = cur) { + path = (num >> b) & 1; + i = tree[i][path]; + cur = ++cnt; + 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 bit, int u, int v) { - if (bit < 0) { - return 0; - } - int cur = (num >> bit) & 1; - int opp = cur ^ 1; - if (pass[next[v][opp]] > pass[next[u][opp]]) { - return (1 << bit) + query(num, bit - 1, next[u][opp], next[v][opp]); - } else { - return query(num, bit - 1, next[u][cur], next[v][cur]); + 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 main(String[] args) throws IOException { @@ -63,11 +72,11 @@ public static void main(String[] args) throws IOException { n = in.nextInt(); m = in.nextInt(); eor = 0; - root[0] = insert(eor, BIT, 0); + root[0] = insert(eor, 0); for (int i = 1, num; i <= n; i++) { num = in.nextInt(); eor ^= num; - root[i] = insert(eor, BIT, root[i - 1]); + root[i] = insert(eor, root[i - 1]); } String op; int x, y, z; @@ -77,15 +86,15 @@ public static void main(String[] args) throws IOException { x = in.nextInt(); eor ^= x; n++; - root[n] = insert(eor, 25, root[n - 1]); + root[n] = insert(eor, root[n - 1]); } else { x = in.nextInt(); y = in.nextInt(); z = in.nextInt(); if (x == 1) { - out.println(query(eor ^ z, BIT, 0, root[y - 1])); + out.println(query(eor ^ z, 0, root[y - 1])); } else { - out.println(query(eor ^ z, BIT, root[x - 2], root[y - 1])); + out.println(query(eor ^ z, root[x - 2], root[y - 1])); } } } diff --git a/src/class159/Code01_MaxExclusiveOr2.java b/src/class159/Code01_MaxExclusiveOr2.java index aa22932b5..be2b18585 100644 --- a/src/class159/Code01_MaxExclusiveOr2.java +++ b/src/class159/Code01_MaxExclusiveOr2.java @@ -15,33 +15,42 @@ //const int BIT = 25; //int n, m, eor; //int root[MAXN]; -//int nxt[MAXT][2]; +//int tree[MAXT][2]; //int pass[MAXT]; //int cnt = 0; // -//int insert(int num, int bit, int i) { +//int insert(int num, int i) { // int rt = ++cnt; -// nxt[rt][0] = nxt[i][0]; -// nxt[rt][1] = nxt[i][1]; +// tree[rt][0] = tree[i][0]; +// tree[rt][1] = tree[i][1]; // pass[rt] = pass[i] + 1; -// if (bit >= 0) { -// int cur = (num >> bit) & 1; -// nxt[rt][cur] = insert(num, bit - 1, nxt[rt][cur]); +// for (int b = BIT, path, pre = rt, cur; b >= 0; b--, pre = cur) { +// path = (num >> b) & 1; +// i = tree[i][path]; +// cur = ++cnt; +// 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 bit, int u, int v) { -// if (bit < 0) { -// return 0; -// } -// int cur = (num >> bit) & 1; -// int opp = cur ^ 1; -// if (pass[nxt[v][opp]] > pass[nxt[u][opp]]) { -// return (1 << bit) + query(num, bit - 1, nxt[u][opp], nxt[v][opp]); -// } else { -// return query(num, bit - 1, nxt[u][cur], nxt[v][cur]); +//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; //} // //int main() { @@ -49,11 +58,11 @@ // cin.tie(0); // cin >> n >> m; // eor = 0; -// root[0] = insert(eor, BIT, 0); +// root[0] = insert(eor, 0); // for (int i = 1, num; i <= n; i++) { // cin >> num; // eor ^= num; -// root[i] = insert(eor, BIT, root[i - 1]); +// root[i] = insert(eor, root[i - 1]); // } // string op; // int x, y, z; @@ -63,13 +72,13 @@ // cin >> x; // eor ^= x; // n++; -// root[n] = insert(eor, BIT, root[n - 1]); +// root[n] = insert(eor, root[n - 1]); // } else { // cin >> x >> y >> z; // if (x == 1) { -// cout << query(eor ^ z, BIT, 0, root[y - 1]) << "\n"; +// cout << query(eor ^ z, 0, root[y - 1]) << "\n"; // } else { -// cout << query(eor ^ z, BIT, root[x - 2], root[y - 1]) << "\n"; +// cout << query(eor ^ z, root[x - 2], root[y - 1]) << "\n"; // } // } // } diff --git a/src/class159/Code02_Yummy1.java b/src/class159/Code02_Yummy1.java index 83dedb53f..470407dfb 100644 --- a/src/class159/Code02_Yummy1.java +++ b/src/class159/Code02_Yummy1.java @@ -44,7 +44,7 @@ public static int build(int l, int r) { return rt; } - public static int update(int jobi, int l, int r, int i) { + public static int insert(int jobi, int l, int r, int i) { int rt = ++cnt; left[rt] = left[i]; right[rt] = right[i]; @@ -52,9 +52,9 @@ public static int update(int jobi, int l, int r, int i) { if (l < r) { int mid = (l + r) / 2; if (jobi <= mid) { - left[rt] = update(jobi, l, mid, left[rt]); + left[rt] = insert(jobi, l, mid, left[rt]); } else { - right[rt] = update(jobi, mid + 1, r, right[rt]); + right[rt] = insert(jobi, mid + 1, r, right[rt]); } } return rt; @@ -86,7 +86,7 @@ public static void prepare() { } root[0] = build(0, s); for (int i = 1; i <= n; i++) { - root[i] = update(arr[i], 0, s, root[i - 1]); + root[i] = insert(arr[i], 0, s, root[i - 1]); } } diff --git a/src/class159/Code02_Yummy2.java b/src/class159/Code02_Yummy2.java index 7b8bb1e55..ebfa72d58 100644 --- a/src/class159/Code02_Yummy2.java +++ b/src/class159/Code02_Yummy2.java @@ -29,7 +29,7 @@ // return rt; //} // -//int update(int jobi, int l, int r, int i) { +//int insert(int jobi, int l, int r, int i) { // int rt = ++cnt; // ls[rt] = ls[i]; // rs[rt] = rs[i]; @@ -37,9 +37,9 @@ // if (l < r) { // int mid = (l + r) / 2; // if (jobi <= mid) { -// ls[rt] = update(jobi, l, mid, ls[rt]); +// ls[rt] = insert(jobi, l, mid, ls[rt]); // } else { -// rs[rt] = update(jobi, mid + 1, r, rs[rt]); +// rs[rt] = insert(jobi, mid + 1, r, rs[rt]); // } // } // return rt; @@ -71,7 +71,7 @@ // } // root[0] = build(0, s); // for (int i = 1; i <= n; i++) { -// root[i] = update(arr[i], 0, s, root[i - 1]); +// root[i] = insert(arr[i], 0, s, root[i - 1]); // } //} // diff --git a/src/class159/Code03_StringTree1.java b/src/class159/Code03_StringTree1.java new file mode 100644 index 000000000..ad45c5082 --- /dev/null +++ b/src/class159/Code03_StringTree1.java @@ -0,0 +1,254 @@ +package class159; + +// 字符串树,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P6088 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.util.StringTokenizer; + +public class Code03_StringTree1 { + + public static int MAXN = 100001; + + public static int MAXT = 1000001; + + 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 String[] weight = new String[MAXN << 1]; + + public static int cntg; + + public static int[] root = new int[MAXN]; + + public static int[][] tree = new int[MAXT][27]; + + public static int[] pass = new int[MAXT]; + + public static int cntt = 0; + + public static int[] deep = new int[MAXN]; + + public static int[][] stjump = new int[MAXN][MAXH]; + + public static void addEdge(int u, int v, String w) { + next[++cntg] = head[u]; + to[cntg] = v; + weight[cntg] = w; + head[u] = cntg; + } + + public static int num(char cha) { + return cha - 'a' + 1; + } + + public static int clone(int i) { + int rt = ++cntt; + for (int cha = 1; cha <= 26; cha++) { + tree[rt][cha] = tree[i][cha]; + } + pass[rt] = pass[i]; + return rt; + } + + public static int insert(String str, int i) { + int rt = clone(i); + pass[rt]++; + for (int j = 0, path, pre = rt, cur; j < str.length(); j++, pre = cur) { + path = num(str.charAt(j)); + i = tree[i][path]; + cur = clone(i); + pass[cur]++; + tree[pre][path] = cur; + } + return rt; + } + + public static int query(String str, int i) { + for (int j = 0, path; j < str.length(); j++) { + path = num(str.charAt(j)); + i = tree[i][path]; + if (i == 0) { + return 0; + } + } + return pass[i]; + } + + // 递归版,C++可以通过,java无法通过,递归会爆栈 + public static void dfs1(int u, int fa, String path) { + root[u] = insert(path, root[fa]); + deep[u] = deep[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 = next[e]) { + if (to[e] != fa) { + dfs1(to[e], u, weight[e]); + } + } + } + + // 迭代版,都可以通过 + // 讲解118,详解了从递归版改迭代版 + public static int[] us = new int[MAXN]; + public static int[] fs = new int[MAXN]; + public static int[] es = new int[MAXN]; + public static String[] ps = new String[MAXN]; + public static int stackSize; + public static int u; + public static int f; + public static int e; + public static String p; + + public static void push(int u, int f, int e, String p) { + us[stackSize] = u; + fs[stackSize] = f; + es[stackSize] = e; + ps[stackSize] = p; + stackSize++; + } + + public static void pop() { + --stackSize; + u = us[stackSize]; + f = fs[stackSize]; + e = es[stackSize]; + p = ps[stackSize]; + } + + // dfs1方法改成迭代版 + public static void dfs2() { + stackSize = 0; + push(1, 0, -1, ""); + while (stackSize > 0) { + pop(); + if (e == -1) { + root[u] = insert(p, root[f]); + deep[u] = deep[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 = next[e]; + } + if (e != 0) { + push(u, f, e, p); + if (to[e] != f) { + push(to[e], u, -1, weight[e]); + } + } + } + } + + public static int lca(int a, int b) { + if (deep[a] < deep[b]) { + int tmp = a; + a = b; + b = tmp; + } + for (int p = MAXH - 1; p >= 0; p--) { + if (deep[stjump[a][p]] >= deep[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 compute(int u, int v, String s) { + return query(s, root[u]) + query(s, root[v]) - 2 * query(s, root[lca(u, v)]); + } + + public static void main(String[] args) { + Kattio io = new Kattio(); + n = io.nextInt(); + int u, v; + String s; + for (int i = 1; i < n; i++) { + u = io.nextInt(); + v = io.nextInt(); + s = io.next(); + addEdge(u, v, s); + addEdge(v, u, s); + } + dfs2(); // 使用迭代版防止爆栈 + m = io.nextInt(); + for (int i = 1; i <= m; i++) { + u = io.nextInt(); + v = io.nextInt(); + s = io.next(); + io.println(compute(u, v, s)); + } + io.flush(); + io.close(); + } + + // 读写工具类 + public static class Kattio extends PrintWriter { + private BufferedReader r; + private StringTokenizer st; + + public Kattio() { + this(System.in, System.out); + } + + public Kattio(InputStream i, OutputStream o) { + super(o); + r = new BufferedReader(new InputStreamReader(i)); + } + + public Kattio(String intput, String output) throws IOException { + super(output); + r = new BufferedReader(new FileReader(intput)); + } + + public String next() { + try { + while (st == null || !st.hasMoreTokens()) + st = new StringTokenizer(r.readLine()); + return st.nextToken(); + } catch (Exception e) { + } + return null; + } + + public int nextInt() { + return Integer.parseInt(next()); + } + + public double nextDouble() { + return Double.parseDouble(next()); + } + + public long nextLong() { + return Long.parseLong(next()); + } + } + +} diff --git a/src/class159/Code03_StringTree2.java b/src/class159/Code03_StringTree2.java new file mode 100644 index 000000000..ce14a9634 --- /dev/null +++ b/src/class159/Code03_StringTree2.java @@ -0,0 +1,127 @@ +package class159; + +// 字符串树,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P6088 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//static const int MAXN = 100001; +//static const int MAXT = 1000001; +//static const int MAXH = 20; +//int n, m; +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//string weight[MAXN << 1]; +//int cntg; +//int root[MAXN]; +//int tree[MAXT][27]; +//int pass[MAXT]; +//int cntt; +//int deep[MAXN]; +//int stjump[MAXN][MAXH]; +// +//void addEdge(int u, int v, const string &w) { +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// weight[cntg] = w; +// head[u] = cntg; +//} +// +//int num(char c) { +// return c - 'a' + 1; +//} +// +//int clone(int i) { +// int rt = ++cntt; +// for (int c = 1; c <= 26; c++) { +// tree[rt][c] = tree[i][c]; +// } +// pass[rt] = pass[i]; +// return rt; +//} +// +//int insert(const string &str, int i) { +// int rt = clone(i); +// pass[rt]++; +// int pre = rt; +// for (int j = 0; j < (int)str.size(); j++) { +// int path = num(str[j]); +// i = tree[i][path]; +// int cur = clone(i); +// pass[cur]++; +// tree[pre][path] = cur; +// pre = cur; +// } +// return rt; +//} +// +//int query(const string &str, int i) { +// for (int j = 0; j < (int)str.size(); j++) { +// int path = num(str[j]); +// i = tree[i][path]; +// if (!i) return 0; +// } +// return pass[i]; +//} +// +//void dfs(int u, int fa, const string &path) { +// root[u] = insert(path, root[fa]); +// deep[u] = deep[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]) { +// if (to[e] != fa) { +// dfs(to[e], u, weight[e]); +// } +// } +//} +// +//int lca(int a, int b) { +// if (deep[a] < deep[b]) swap(a, b); +// for (int p = MAXH - 1; p >= 0; p--) { +// if (deep[stjump[a][p]] >= deep[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 compute(int u, int v, const string &s) { +// return query(s, root[u]) + query(s, root[v]) - 2 * query(s, root[lca(u, v)]); +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n; +// for (int i = 1; i < n; i++) { +// int u, v; +// string s; +// cin >> u >> v >> s; +// addEdge(u, v, s); +// addEdge(v, u, s); +// } +// dfs(1, 0, ""); +// cin >> m; +// while (m--) { +// int u, v; +// string s; +// cin >> u >> v >> s; +// cout << compute(u, v, s) << "\n"; +// } +// return 0; +//} \ No newline at end of file From e678379d8238efd721c11f3e782eee02ebab7f91 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 20 Jan 2025 16:56:41 +0800 Subject: [PATCH 0649/2029] modify code --- src/class159/Code03_StringTree1.java | 2 +- src/class159/Code03_StringTree2.java | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/class159/Code03_StringTree1.java b/src/class159/Code03_StringTree1.java index ad45c5082..09f6e639d 100644 --- a/src/class159/Code03_StringTree1.java +++ b/src/class159/Code03_StringTree1.java @@ -31,7 +31,7 @@ public class Code03_StringTree1 { public static String[] weight = new String[MAXN << 1]; - public static int cntg; + public static int cntg = 0; public static int[] root = new int[MAXN]; diff --git a/src/class159/Code03_StringTree2.java b/src/class159/Code03_StringTree2.java index ce14a9634..43b1dfb19 100644 --- a/src/class159/Code03_StringTree2.java +++ b/src/class159/Code03_StringTree2.java @@ -13,15 +13,18 @@ //static const int MAXT = 1000001; //static const int MAXH = 20; //int n, m; +// //int head[MAXN]; //int nxt[MAXN << 1]; //int to[MAXN << 1]; //string weight[MAXN << 1]; -//int cntg; +//int cntg = 0; +// //int root[MAXN]; //int tree[MAXT][27]; //int pass[MAXT]; -//int cntt; +//int cntt = 0; +// //int deep[MAXN]; //int stjump[MAXN][MAXH]; // From 16f01eec3fe0de76eff0d58283b0109f38684ce6 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 20 Jan 2025 20:47:44 +0800 Subject: [PATCH 0650/2029] modify code --- .../{Code03_StringTree1.java => Code02_StringTree1.java} | 2 +- .../{Code03_StringTree2.java => Code02_StringTree2.java} | 0 src/class159/{Code02_Yummy1.java => Code03_Yummy1.java} | 2 +- src/class159/{Code02_Yummy2.java => Code03_Yummy2.java} | 0 4 files changed, 2 insertions(+), 2 deletions(-) rename src/class159/{Code03_StringTree1.java => Code02_StringTree1.java} (99%) rename src/class159/{Code03_StringTree2.java => Code02_StringTree2.java} (100%) rename src/class159/{Code02_Yummy1.java => Code03_Yummy1.java} (99%) rename src/class159/{Code02_Yummy2.java => Code03_Yummy2.java} (100%) diff --git a/src/class159/Code03_StringTree1.java b/src/class159/Code02_StringTree1.java similarity index 99% rename from src/class159/Code03_StringTree1.java rename to src/class159/Code02_StringTree1.java index 09f6e639d..6eac5dd9a 100644 --- a/src/class159/Code03_StringTree1.java +++ b/src/class159/Code02_StringTree1.java @@ -13,7 +13,7 @@ import java.io.PrintWriter; import java.util.StringTokenizer; -public class Code03_StringTree1 { +public class Code02_StringTree1 { public static int MAXN = 100001; diff --git a/src/class159/Code03_StringTree2.java b/src/class159/Code02_StringTree2.java similarity index 100% rename from src/class159/Code03_StringTree2.java rename to src/class159/Code02_StringTree2.java diff --git a/src/class159/Code02_Yummy1.java b/src/class159/Code03_Yummy1.java similarity index 99% rename from src/class159/Code02_Yummy1.java rename to src/class159/Code03_Yummy1.java index 470407dfb..b8649b16a 100644 --- a/src/class159/Code02_Yummy1.java +++ b/src/class159/Code03_Yummy1.java @@ -11,7 +11,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code02_Yummy1 { +public class Code03_Yummy1 { public static int MAXN = 200001; diff --git a/src/class159/Code02_Yummy2.java b/src/class159/Code03_Yummy2.java similarity index 100% rename from src/class159/Code02_Yummy2.java rename to src/class159/Code03_Yummy2.java From aab5213c6de40f55a07e418bae62881a0148cd2f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 20 Jan 2025 23:20:50 +0800 Subject: [PATCH 0651/2029] modify code --- src/class159/Code03_Yummy1.java | 1 + src/class159/Code03_Yummy2.java | 2 +- src/class159/Code04_ALO1.java | 125 ++++++++++++++++++++++++++++++++ src/class159/Code04_ALO2.java | 106 +++++++++++++++++++++++++++ 4 files changed, 233 insertions(+), 1 deletion(-) create mode 100644 src/class159/Code04_ALO1.java create mode 100644 src/class159/Code04_ALO2.java diff --git a/src/class159/Code03_Yummy1.java b/src/class159/Code03_Yummy1.java index b8649b16a..7d579de24 100644 --- a/src/class159/Code03_Yummy1.java +++ b/src/class159/Code03_Yummy1.java @@ -128,6 +128,7 @@ public static void main(String[] args) throws IOException { } out.flush(); out.close(); + br.close(); } } diff --git a/src/class159/Code03_Yummy2.java b/src/class159/Code03_Yummy2.java index ebfa72d58..d79fca517 100644 --- a/src/class159/Code03_Yummy2.java +++ b/src/class159/Code03_Yummy2.java @@ -93,7 +93,7 @@ // //int main() { // ios::sync_with_stdio(false); -// cin.tie(0); +// cin.tie(nullptr); // cin >> n >> m; // for (int i = 1; i <= n; i++) { // cin >> arr[i]; diff --git a/src/class159/Code04_ALO1.java b/src/class159/Code04_ALO1.java new file mode 100644 index 000000000..fdc30b6bd --- /dev/null +++ b/src/class159/Code04_ALO1.java @@ -0,0 +1,125 @@ +package class159; + +// 生成能量密度最大的宝石,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P4098 +// 提交以下的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 Code04_ALO1 { + + public static int MAXN = 50002; + + public static int MAXT = MAXN * 32; + + public static int BIT = 30; + + public static int n, m; + + public static int[][] arr = new int[MAXN][2]; + + public static int[] root = new int[MAXN]; + + public static int[][] tree = new int[MAXT][2]; + + public static int[] pass = new int[MAXT]; + + public static int cnt; + + public static int[] last = new int[MAXN]; + + public static int[] next = new int[MAXN]; + + public static int insert(int num, int i) { + int rt = ++cnt; + 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 = ++cnt; + 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 prepare() { + last[0] = 0; + next[0] = 1; + last[n + 1] = n; + next[n + 1] = n + 1; + for (int i = 1; i <= n; i++) { + root[i] = insert(arr[i][1], root[i - 1]); + last[i] = i - 1; + next[i] = i + 1; + } + Arrays.sort(arr, 1, n + 1, (a, b) -> a[1] - b[1]); + } + + public static int compute() { + int ans = 0; + for (int i = 1, index, value, l1, l2, r1, r2; i <= n; i++) { + index = arr[i][0]; + value = arr[i][1]; + l1 = last[index]; + l2 = last[l1]; + r1 = next[index]; + r2 = next[r1]; + if (l1 != 0) { + ans = Math.max(ans, query(value, root[l2], root[r1 - 1])); + } + if (r1 != n + 1) { + ans = Math.max(ans, query(value, root[l1], root[r2 - 1])); + } + next[l1] = r1; + last[r1] = l1; + } + return ans; + } + + 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; + for (int i = 1; i <= n; i++) { + arr[i][0] = i; + in.nextToken(); + arr[i][1] = (int) in.nval; + } + prepare(); + out.println(compute()); + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class159/Code04_ALO2.java b/src/class159/Code04_ALO2.java new file mode 100644 index 000000000..a67e63650 --- /dev/null +++ b/src/class159/Code04_ALO2.java @@ -0,0 +1,106 @@ +package class159; + +// 生成能量密度最大的宝石,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P4098 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 50002; +//const int MAXT = MAXN * 32; +//const int BIT = 30; +//int n, m; +//vector> arr; +//int root[MAXN]; +//int tree[MAXT][2]; +//int pass[MAXT]; +//int cnt; +//int last[MAXN]; +//int nxt[MAXN]; +// +//int insert_(int num, int i) { +// int rt = ++cnt; +// 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 = ++cnt; +// 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 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; +//} +// +//void prepare() { +// last[0] = 0; +// nxt[0] = 1; +// last[n + 1] = n; +// nxt[n + 1] = n + 1; +// for (int i = 1; i <= n; i++) { +// root[i] = insert_(arr[i].second, root[i - 1]); +// last[i] = i - 1; +// nxt[i] = i + 1; +// } +// sort(arr.begin() + 1, arr.end(), [](const pair& a, const pair& b) { +// return a.second < b.second; +// }); +//} +// +//int compute() { +// int ans = 0; +// for (int i = 1, index, value, l1, l2, r1, r2; i <= n; i++) { +// index = arr[i].first; +// value = arr[i].second; +// l1 = last[index]; +// l2 = last[l1]; +// r1 = nxt[index]; +// r2 = nxt[r1]; +// if (l1 != 0) { +// ans = max(ans, query(value, root[l2], root[r1 - 1])); +// } +// if (r1 != n + 1) { +// ans = max(ans, query(value, root[l1], root[r2 - 1])); +// } +// nxt[l1] = r1; +// last[r1] = l1; +// } +// return ans; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n; +// arr.resize(n + 1); +// for (int i = 1; i <= n; i++) { +// arr[i].first = i; +// cin >> arr[i].second; +// } +// prepare(); +// cout << compute() << "\n"; +// return 0; +//} \ No newline at end of file From 7ec30ea7351744df72f60871589373bdf56e293b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 20 Jan 2025 23:23:35 +0800 Subject: [PATCH 0652/2029] modify code --- src/class159/Code04_ALO2.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class159/Code04_ALO2.java b/src/class159/Code04_ALO2.java index a67e63650..97fc84ee7 100644 --- a/src/class159/Code04_ALO2.java +++ b/src/class159/Code04_ALO2.java @@ -21,7 +21,7 @@ //int last[MAXN]; //int nxt[MAXN]; // -//int insert_(int num, int i) { +//int insert(int num, int i) { // int rt = ++cnt; // tree[rt][0] = tree[i][0]; // tree[rt][1] = tree[i][1]; @@ -61,7 +61,7 @@ // last[n + 1] = n; // nxt[n + 1] = n + 1; // for (int i = 1; i <= n; i++) { -// root[i] = insert_(arr[i].second, root[i - 1]); +// root[i] = insert(arr[i].second, root[i - 1]); // last[i] = i - 1; // nxt[i] = i + 1; // } From 1cbb2c18eb20a0528c9602e9a2508226e9f84708 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 21 Jan 2025 13:58:16 +0800 Subject: [PATCH 0653/2029] modify code --- ...xExclusiveOr1.java => Code01_MaxXor1.java} | 4 +-- ...xExclusiveOr2.java => Code01_MaxXor2.java} | 0 src/class159/Code03_PathDfnXor1.java | 26 +++++++++++++++++++ ...{Code03_Yummy1.java => Code04_Yummy1.java} | 2 +- ...{Code03_Yummy2.java => Code04_Yummy2.java} | 0 .../{Code04_ALO1.java => Code05_ALO1.java} | 2 +- .../{Code04_ALO2.java => Code05_ALO2.java} | 0 7 files changed, 30 insertions(+), 4 deletions(-) rename src/class159/{Code01_MaxExclusiveOr1.java => Code01_MaxXor1.java} (97%) rename src/class159/{Code01_MaxExclusiveOr2.java => Code01_MaxXor2.java} (100%) create mode 100644 src/class159/Code03_PathDfnXor1.java rename src/class159/{Code03_Yummy1.java => Code04_Yummy1.java} (99%) rename src/class159/{Code03_Yummy2.java => Code04_Yummy2.java} (100%) rename src/class159/{Code04_ALO1.java => Code05_ALO1.java} (99%) rename src/class159/{Code04_ALO2.java => Code05_ALO2.java} (100%) diff --git a/src/class159/Code01_MaxExclusiveOr1.java b/src/class159/Code01_MaxXor1.java similarity index 97% rename from src/class159/Code01_MaxExclusiveOr1.java rename to src/class159/Code01_MaxXor1.java index f83b540d7..16c12cf01 100644 --- a/src/class159/Code01_MaxExclusiveOr1.java +++ b/src/class159/Code01_MaxXor1.java @@ -6,7 +6,7 @@ // 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但是通过不了所有测试用例 // 因为这道题根据C++的运行时间,制定通过标准,根本没考虑java的用户 -// 想通过用C++实现,本节课Code01_MaxExclusiveOr2文件就是C++的实现 +// 想通过用C++实现,本节课Code01_MaxXor2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 import java.io.IOException; @@ -14,7 +14,7 @@ import java.io.PrintWriter; import java.io.InputStream; -public class Code01_MaxExclusiveOr1 { +public class Code01_MaxXor1 { public static int MAXN = 600001; diff --git a/src/class159/Code01_MaxExclusiveOr2.java b/src/class159/Code01_MaxXor2.java similarity index 100% rename from src/class159/Code01_MaxExclusiveOr2.java rename to src/class159/Code01_MaxXor2.java diff --git a/src/class159/Code03_PathDfnXor1.java b/src/class159/Code03_PathDfnXor1.java new file mode 100644 index 000000000..6336002c5 --- /dev/null +++ b/src/class159/Code03_PathDfnXor1.java @@ -0,0 +1,26 @@ +package class159; + +// 路径和子树的异或,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P4592 +// 提交以下的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 Code03_PathDfnXor1 { + + 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)); + + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class159/Code03_Yummy1.java b/src/class159/Code04_Yummy1.java similarity index 99% rename from src/class159/Code03_Yummy1.java rename to src/class159/Code04_Yummy1.java index 7d579de24..31ac72adb 100644 --- a/src/class159/Code03_Yummy1.java +++ b/src/class159/Code04_Yummy1.java @@ -11,7 +11,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code03_Yummy1 { +public class Code04_Yummy1 { public static int MAXN = 200001; diff --git a/src/class159/Code03_Yummy2.java b/src/class159/Code04_Yummy2.java similarity index 100% rename from src/class159/Code03_Yummy2.java rename to src/class159/Code04_Yummy2.java diff --git a/src/class159/Code04_ALO1.java b/src/class159/Code05_ALO1.java similarity index 99% rename from src/class159/Code04_ALO1.java rename to src/class159/Code05_ALO1.java index fdc30b6bd..f55e7911a 100644 --- a/src/class159/Code04_ALO1.java +++ b/src/class159/Code05_ALO1.java @@ -12,7 +12,7 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class Code04_ALO1 { +public class Code05_ALO1 { public static int MAXN = 50002; diff --git a/src/class159/Code04_ALO2.java b/src/class159/Code05_ALO2.java similarity index 100% rename from src/class159/Code04_ALO2.java rename to src/class159/Code05_ALO2.java From ce271e9b67ffdfe1dcc416c83a36bdf11db50f80 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 21 Jan 2025 15:11:47 +0800 Subject: [PATCH 0654/2029] modify code --- src/class159/Code01_MaxXor1.java | 2 +- src/class159/Code03_PathDfnXor1.java | 180 ++++++++++++++++++++++++++- src/class159/Code03_PathDfnXor2.java | 153 +++++++++++++++++++++++ 3 files changed, 332 insertions(+), 3 deletions(-) create mode 100644 src/class159/Code03_PathDfnXor2.java diff --git a/src/class159/Code01_MaxXor1.java b/src/class159/Code01_MaxXor1.java index 16c12cf01..4f8996ade 100644 --- a/src/class159/Code01_MaxXor1.java +++ b/src/class159/Code01_MaxXor1.java @@ -4,7 +4,7 @@ // 因为练的就是可持久化前缀树,所以就用在线算法 // 测试链接 : https://www.luogu.com.cn/problem/P4735 // 提交以下的code,提交时请把类名改成"Main" -// java实现的逻辑一定是正确的,但是通过不了所有测试用例 +// java实现的逻辑一定是正确的,但是通过不了 // 因为这道题根据C++的运行时间,制定通过标准,根本没考虑java的用户 // 想通过用C++实现,本节课Code01_MaxXor2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 diff --git a/src/class159/Code03_PathDfnXor1.java b/src/class159/Code03_PathDfnXor1.java index 6336002c5..4ca07794f 100644 --- a/src/class159/Code03_PathDfnXor1.java +++ b/src/class159/Code03_PathDfnXor1.java @@ -2,7 +2,10 @@ // 路径和子树的异或,java版 // 测试链接 : https://www.luogu.com.cn/problem/P4592 -// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 +// java实现的逻辑一定是正确的,但是通过不了 +// 因为这道题根据C++的运行空间,制定通过标准,根本没考虑java的用户 +// 想通过用C++实现,本节课Code03_PathDfnXor2文件就是C++的实现 +// 两个版本的逻辑完全一样,C++版本可以通过所有测试 import java.io.BufferedReader; import java.io.IOException; @@ -13,11 +16,184 @@ public class Code03_PathDfnXor1 { + public static int MAXN = 100001; + + public static int MAXT = MAXN * 62; + + public static int MAXH = 16; + + public static int BIT = 29; + + public static int n, m; + + 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; + + public static int[] deep = new int[MAXN]; + + public static int[] size = new int[MAXN]; + + public static int[][] stjump = new int[MAXN][MAXH]; + + public static int[] dfn = new int[MAXN]; + + public static int cntd; + + public static int[] root1 = new int[MAXN]; + + public static int[] root2 = new int[MAXN]; + + public static int[][] tree = new int[MAXT][2]; + + public static int[] pass = new int[MAXT]; + + public static int cntt; + + public static void addEdge(int u, int v) { + next[++cntg] = head[u]; + to[cntg] = v; + head[u] = cntg; + } + + 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; + } + + // 按道理说dfs1应该改成迭代版,防止递归爆栈 + // 不过本题给定的空间很小,java版怎么也无法通过,索性不改了 + // 有兴趣的同学可以看一下,讲解118,详解了树上dfs从递归版改迭代版 + public static void dfs1(int u, int fa) { + deep[u] = deep[fa] + 1; + size[u] = 1; + stjump[u][0] = fa; + dfn[u] = ++cntd; + for (int p = 1; p < MAXH; p++) { + stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; + } + for (int ei = head[u]; ei > 0; ei = next[ei]) { + if (to[ei] != fa) { + dfs1(to[ei], u); + } + } + for (int ei = head[u]; ei > 0; ei = next[ei]) { + if (to[ei] != fa) { + size[u] += size[to[ei]]; + } + } + } + + // 按道理说dfs2应该改成迭代版,防止递归爆栈 + // 不过本题给定的空间很小,java版怎么也无法通过,索性不改了 + // 有兴趣的同学可以看一下,讲解118,详解了树上dfs从递归版改迭代版 + public static void dfs2(int u, int fa) { + root1[dfn[u]] = insert(arr[u], root1[dfn[u] - 1]); + root2[u] = insert(arr[u], root2[fa]); + for (int ei = head[u]; ei > 0; ei = next[ei]) { + if (to[ei] != fa) { + dfs2(to[ei], u); + } + } + } + + public static int lca(int a, int b) { + if (deep[a] < deep[b]) { + int tmp = a; + a = b; + b = tmp; + } + for (int p = MAXH - 1; p >= 0; p--) { + if (deep[stjump[a][p]] >= deep[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 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; i <= n; i++) { + in.nextToken(); + arr[i] = (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); + } + dfs1(1, 0); + dfs2(1, 0); + for (int i = 1, op, x, y, z; i <= m; i++) { + in.nextToken(); + op = (int) in.nval; + in.nextToken(); + x = (int) in.nval; + in.nextToken(); + y = (int) in.nval; + if (op == 1) { + out.println(query(y, root1[dfn[x] - 1], root1[dfn[x] + size[x] - 1])); + } else { + in.nextToken(); + z = (int) in.nval; + int lcafa = stjump[lca(x, y)][0]; + int ans = Math.max(query(z, root2[lcafa], root2[x]), query(z, root2[lcafa], root2[y])); + out.println(ans); + } + } out.flush(); out.close(); br.close(); diff --git a/src/class159/Code03_PathDfnXor2.java b/src/class159/Code03_PathDfnXor2.java new file mode 100644 index 000000000..05262f34f --- /dev/null +++ b/src/class159/Code03_PathDfnXor2.java @@ -0,0 +1,153 @@ +package class159; + +// 路径和子树的异或,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P4592 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +//const int MAXT = MAXN * 62; +//const int MAXH = 16; +//const int BIT = 29; +//int n, m; +//int arr[MAXN]; +// +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int cntg; +// +//int deep[MAXN]; +//int size[MAXN]; +//int stjump[MAXN][MAXH]; +//int dfn[MAXN]; +//int cntd; +// +//int root1[MAXN]; +//int root2[MAXN]; +//int tree[MAXT][2]; +//int pass[MAXT]; +//int cntt; +// +//void addEdge(int u, int v) { +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// head[u] = cntg; +//} +// +//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 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; +//} +// +//void dfs1(int u, int fa) { +// deep[u] = deep[fa] + 1; +// size[u] = 1; +// stjump[u][0] = fa; +// dfn[u] = ++cntd; +// for (int p = 1; p < MAXH; p++) { +// stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; +// } +// for (int ei = head[u]; ei > 0; ei = nxt[ei]) { +// if (to[ei] != fa) { +// dfs1(to[ei], u); +// } +// } +// for (int ei = head[u]; ei > 0; ei = nxt[ei]) { +// if (to[ei] != fa) { +// size[u] += size[to[ei]]; +// } +// } +//} +// +//void dfs2(int u, int fa) { +// root1[dfn[u]] = insert(arr[u], root1[dfn[u] - 1]); +// root2[u] = insert(arr[u], root2[fa]); +// for (int ei = head[u]; ei > 0; ei = nxt[ei]) { +// if (to[ei] != fa) { +// dfs2(to[ei], u); +// } +// } +//} +// +//int lca(int a, int b) { +// if (deep[a] < deep[b]) { +// swap(a, b); +// } +// for (int p = MAXH - 1; p >= 0; p--) { +// if (deep[stjump[a][p]] >= deep[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 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, 0); +// 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'; +// } else { +// cin >> z; +// int lcafa = stjump[lca(x, y)][0]; +// int ans = max(query(z, root2[lcafa], root2[x]), query(z, root2[lcafa], root2[y])); +// cout << ans << '\n'; +// } +// } +// return 0; +//} \ No newline at end of file From 7b68d489f13d57d50840ba190e543367cbb286d4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 21 Jan 2025 15:18:08 +0800 Subject: [PATCH 0655/2029] modify code --- src/class159/Code03_PathDfnXor1.java | 13 +++++-------- src/class159/Code03_PathDfnXor2.java | 15 ++++++--------- 2 files changed, 11 insertions(+), 17 deletions(-) diff --git a/src/class159/Code03_PathDfnXor1.java b/src/class159/Code03_PathDfnXor1.java index 4ca07794f..3834d411c 100644 --- a/src/class159/Code03_PathDfnXor1.java +++ b/src/class159/Code03_PathDfnXor1.java @@ -107,14 +107,11 @@ public static void dfs1(int u, int fa) { for (int p = 1; p < MAXH; p++) { stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; } - for (int ei = head[u]; ei > 0; ei = next[ei]) { - if (to[ei] != fa) { - dfs1(to[ei], u); - } - } - for (int ei = head[u]; ei > 0; ei = next[ei]) { - if (to[ei] != fa) { - size[u] += size[to[ei]]; + for (int ei = head[u], v; ei > 0; ei = next[ei]) { + v = to[ei]; + if (v != fa) { + dfs1(v, u); + size[u] += size[v]; } } } diff --git a/src/class159/Code03_PathDfnXor2.java b/src/class159/Code03_PathDfnXor2.java index 05262f34f..c46b6e010 100644 --- a/src/class159/Code03_PathDfnXor2.java +++ b/src/class159/Code03_PathDfnXor2.java @@ -34,7 +34,7 @@ //int cntt; // //void addEdge(int u, int v) { -// nxt[++cntg] = head[u]; +// nxt[++cntg] = head[u]; // to[cntg] = v; // head[u] = cntg; //} @@ -81,14 +81,11 @@ // for (int p = 1; p < MAXH; p++) { // stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; // } -// for (int ei = head[u]; ei > 0; ei = nxt[ei]) { -// if (to[ei] != fa) { -// dfs1(to[ei], u); -// } -// } -// for (int ei = head[u]; ei > 0; ei = nxt[ei]) { -// if (to[ei] != fa) { -// size[u] += size[to[ei]]; +// for (int ei = head[u], v; ei > 0; ei = nxt[ei]) { +// v = to[ei]; +// if (v != fa) { +// dfs1(v, u); +// size[u] += size[v]; // } // } //} From 2ca7a9c5cd0e47568340535d4ea3df79aea157ba Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 21 Jan 2025 17:58:30 +0800 Subject: [PATCH 0656/2029] modify code --- src/class159/Code03_PathDfnXor1.java | 6 +- src/class159/Code03_PathDfnXor2.java | 6 +- src/class159/Code05_XorOperation1.java | 131 +++++++++++++++++++++++++ src/class159/Code05_XorOperation2.java | 97 ++++++++++++++++++ 4 files changed, 234 insertions(+), 6 deletions(-) create mode 100644 src/class159/Code05_XorOperation1.java create mode 100644 src/class159/Code05_XorOperation2.java diff --git a/src/class159/Code03_PathDfnXor1.java b/src/class159/Code03_PathDfnXor1.java index 3834d411c..bb60b109d 100644 --- a/src/class159/Code03_PathDfnXor1.java +++ b/src/class159/Code03_PathDfnXor1.java @@ -34,7 +34,7 @@ public class Code03_PathDfnXor1 { public static int[] to = new int[MAXN << 1]; - public static int cntg; + public static int cntg = 0; public static int[] deep = new int[MAXN]; @@ -44,7 +44,7 @@ public class Code03_PathDfnXor1 { public static int[] dfn = new int[MAXN]; - public static int cntd; + public static int cntd = 0; public static int[] root1 = new int[MAXN]; @@ -54,7 +54,7 @@ public class Code03_PathDfnXor1 { public static int[] pass = new int[MAXT]; - public static int cntt; + public static int cntt = 0; public static void addEdge(int u, int v) { next[++cntg] = head[u]; diff --git a/src/class159/Code03_PathDfnXor2.java b/src/class159/Code03_PathDfnXor2.java index c46b6e010..82f4ec7c7 100644 --- a/src/class159/Code03_PathDfnXor2.java +++ b/src/class159/Code03_PathDfnXor2.java @@ -19,19 +19,19 @@ //int head[MAXN]; //int nxt[MAXN << 1]; //int to[MAXN << 1]; -//int cntg; +//int cntg = 0; // //int deep[MAXN]; //int size[MAXN]; //int stjump[MAXN][MAXH]; //int dfn[MAXN]; -//int cntd; +//int cntd = 0; // //int root1[MAXN]; //int root2[MAXN]; //int tree[MAXT][2]; //int pass[MAXT]; -//int cntt; +//int cntt = 0; // //void addEdge(int u, int v) { // nxt[++cntg] = head[u]; diff --git a/src/class159/Code05_XorOperation1.java b/src/class159/Code05_XorOperation1.java new file mode 100644 index 000000000..c2a1bec51 --- /dev/null +++ b/src/class159/Code05_XorOperation1.java @@ -0,0 +1,131 @@ +package class159; + +// 异或运算,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P5795 +// 提交以下的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 Code05_XorOperation1 { + + public static int MAXN = 300001; + + public static int MAXT = MAXN * 32; + + public static int BIT = 30; + + public static int n, m, p; + + public static int[] x = new int[MAXN]; + + public static int[] y = new int[MAXN]; + + public static int[] root = new int[MAXN]; + + public static int[][] tree = new int[MAXT][2]; + + public static int[] pass = new int[MAXT]; + + public static int cnt = 0; + + public static int[][] rtpath = new int[MAXN][2]; + + public static int insert(int num, int i) { + int rt = ++cnt; + 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 = ++cnt; + 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 xorMaxKth(int xl, int xr, int yl, int yr, int k) { + for (int i = xl; i <= xr; i++) { + rtpath[i][0] = root[yl - 1]; + rtpath[i][1] = root[yr]; + } + int ans = 0; + for (int b = BIT, path, best, sum; b >= 0; b--) { + sum = 0; + for (int i = xl; i <= xr; i++) { + path = (x[i] >> b) & 1; + best = path ^ 1; + sum += pass[tree[rtpath[i][1]][best]] - pass[tree[rtpath[i][0]][best]]; + } + for (int i = xl; i <= xr; i++) { + path = (x[i] >> b) & 1; + best = path ^ 1; + if (sum >= k) { + rtpath[i][0] = tree[rtpath[i][0]][best]; + rtpath[i][1] = tree[rtpath[i][1]][best]; + } else { + rtpath[i][0] = tree[rtpath[i][0]][path]; + rtpath[i][1] = tree[rtpath[i][1]][path]; + } + } + if (sum >= k) { + ans += 1 << b; + } else { + k -= sum; + } + } + return ans; + } + + public static void prepare() { + for (int i = 1; i <= m; i++) { + root[i] = insert(y[i], root[i - 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)); + in.nextToken(); + n = (int) in.nval; + in.nextToken(); + m = (int) in.nval; + for (int i = 1; i <= n; i++) { + in.nextToken(); + x[i] = (int) in.nval; + } + for (int i = 1; i <= m; i++) { + in.nextToken(); + y[i] = (int) in.nval; + } + prepare(); + in.nextToken(); + p = (int) in.nval; + for (int i = 1, xl, xr, yl, yr, k; i <= p; i++) { + in.nextToken(); + xl = (int) in.nval; + in.nextToken(); + xr = (int) in.nval; + in.nextToken(); + yl = (int) in.nval; + in.nextToken(); + yr = (int) in.nval; + in.nextToken(); + k = (int) in.nval; + out.println(xorMaxKth(xl, xr, yl, yr, k)); + } + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class159/Code05_XorOperation2.java b/src/class159/Code05_XorOperation2.java new file mode 100644 index 000000000..5a686da3f --- /dev/null +++ b/src/class159/Code05_XorOperation2.java @@ -0,0 +1,97 @@ +package class159; + +// 异或运算,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P5795 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 300001; +//const int MAXT = MAXN * 32; +//const int BIT = 30; +//int n, m, p; +//int x[MAXN]; +//int y[MAXN]; +//int root[MAXN]; +//int tree[MAXT][2]; +//int pass[MAXT]; +//int cnt = 0; +//int rtpath[MAXN][2]; +// +//int insert(int num, int i) { +// int rt = ++cnt; +// 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 = ++cnt; +// tree[cur][0] = tree[i][0]; +// tree[cur][1] = tree[i][1]; +// pass[cur] = pass[i] + 1; +// tree[pre][path] = cur; +// } +// return rt; +//} +// +//int xorMaxKth(int xl, int xr, int yl, int yr, int k) { +// for (int i = xl; i <= xr; i++) { +// rtpath[i][0] = root[yl - 1]; +// rtpath[i][1] = root[yr]; +// } +// int ans = 0; +// for (int b = BIT, path, best, sum; b >= 0; b--) { +// sum = 0; +// for (int i = xl; i <= xr; i++) { +// path = (x[i] >> b) & 1; +// best = path ^ 1; +// sum += pass[tree[rtpath[i][1]][best]] - pass[tree[rtpath[i][0]][best]]; +// } +// for (int i = xl; i <= xr; i++) { +// path = (x[i] >> b) & 1; +// best = path ^ 1; +// if (sum >= k) { +// rtpath[i][0] = tree[rtpath[i][0]][best]; +// rtpath[i][1] = tree[rtpath[i][1]][best]; +// } else { +// rtpath[i][0] = tree[rtpath[i][0]][path]; +// rtpath[i][1] = tree[rtpath[i][1]][path]; +// } +// } +// if (sum >= k) { +// ans += 1 << b; +// } else { +// k -= sum; +// } +// } +// return ans; +//} +// +//void prepare() { +// for (int i = 1; i <= m; i++) { +// root[i] = insert(y[i], root[i - 1]); +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1; i <= n; i++) { +// cin >> x[i]; +// } +// for (int i = 1; i <= m; i++) { +// cin >> y[i]; +// } +// prepare(); +// cin >> p; +// for (int i = 1, xl, xr, yl, yr, k; i <= p; i++) { +// cin >> xl >> xr >> yl >> yr >> k; +// cout << xorMaxKth(xl, xr, yl, yr, k) << "\n"; +// } +// return 0; +//} \ No newline at end of file From 5aaf935f620442a9c8f89c5d36d199aa2a06e8b1 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 21 Jan 2025 17:59:01 +0800 Subject: [PATCH 0657/2029] modify code --- .../{Code05_XorOperation1.java => Code06_XorOperation1.java} | 2 +- .../{Code05_XorOperation2.java => Code06_XorOperation2.java} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/class159/{Code05_XorOperation1.java => Code06_XorOperation1.java} (98%) rename src/class159/{Code05_XorOperation2.java => Code06_XorOperation2.java} (100%) diff --git a/src/class159/Code05_XorOperation1.java b/src/class159/Code06_XorOperation1.java similarity index 98% rename from src/class159/Code05_XorOperation1.java rename to src/class159/Code06_XorOperation1.java index c2a1bec51..1ecc744cd 100644 --- a/src/class159/Code05_XorOperation1.java +++ b/src/class159/Code06_XorOperation1.java @@ -11,7 +11,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code05_XorOperation1 { +public class Code06_XorOperation1 { public static int MAXN = 300001; diff --git a/src/class159/Code05_XorOperation2.java b/src/class159/Code06_XorOperation2.java similarity index 100% rename from src/class159/Code05_XorOperation2.java rename to src/class159/Code06_XorOperation2.java From 5599c087720f6138f7ad0c6aae5888cc6f03e381 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 21 Jan 2025 18:00:18 +0800 Subject: [PATCH 0658/2029] modify code --- src/class159/Code06_XorOperation1.java | 4 ++-- src/class159/Code06_XorOperation2.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class159/Code06_XorOperation1.java b/src/class159/Code06_XorOperation1.java index 1ecc744cd..2e392df8a 100644 --- a/src/class159/Code06_XorOperation1.java +++ b/src/class159/Code06_XorOperation1.java @@ -52,7 +52,7 @@ public static int insert(int num, int i) { return rt; } - public static int xorMaxKth(int xl, int xr, int yl, int yr, int k) { + public static int maxKth(int xl, int xr, int yl, int yr, int k) { for (int i = xl; i <= xr; i++) { rtpath[i][0] = root[yl - 1]; rtpath[i][1] = root[yr]; @@ -121,7 +121,7 @@ public static void main(String[] args) throws IOException { yr = (int) in.nval; in.nextToken(); k = (int) in.nval; - out.println(xorMaxKth(xl, xr, yl, yr, k)); + out.println(maxKth(xl, xr, yl, yr, k)); } out.flush(); out.close(); diff --git a/src/class159/Code06_XorOperation2.java b/src/class159/Code06_XorOperation2.java index 5a686da3f..a94d2f92d 100644 --- a/src/class159/Code06_XorOperation2.java +++ b/src/class159/Code06_XorOperation2.java @@ -38,7 +38,7 @@ // return rt; //} // -//int xorMaxKth(int xl, int xr, int yl, int yr, int k) { +//int maxKth(int xl, int xr, int yl, int yr, int k) { // for (int i = xl; i <= xr; i++) { // rtpath[i][0] = root[yl - 1]; // rtpath[i][1] = root[yr]; @@ -91,7 +91,7 @@ // cin >> p; // for (int i = 1, xl, xr, yl, yr, k; i <= p; i++) { // cin >> xl >> xr >> yl >> yr >> k; -// cout << xorMaxKth(xl, xr, yl, yr, k) << "\n"; +// cout << maxKth(xl, xr, yl, yr, k) << "\n"; // } // return 0; //} \ No newline at end of file From fd7abd6811749d71168088b1130a96fa2ab15dce Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 22 Jan 2025 11:45:32 +0800 Subject: [PATCH 0659/2029] modify code --- src/class159/Code06_XorOperation1.java | 16 ++++++++-------- src/class159/Code06_XorOperation2.java | 16 ++++++++-------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/class159/Code06_XorOperation1.java b/src/class159/Code06_XorOperation1.java index 2e392df8a..0c52b8341 100644 --- a/src/class159/Code06_XorOperation1.java +++ b/src/class159/Code06_XorOperation1.java @@ -33,7 +33,7 @@ public class Code06_XorOperation1 { public static int cnt = 0; - public static int[][] rtpath = new int[MAXN][2]; + public static int[][] xroad = new int[MAXN][2]; public static int insert(int num, int i) { int rt = ++cnt; @@ -54,8 +54,8 @@ public static int insert(int num, int i) { public static int maxKth(int xl, int xr, int yl, int yr, int k) { for (int i = xl; i <= xr; i++) { - rtpath[i][0] = root[yl - 1]; - rtpath[i][1] = root[yr]; + xroad[i][0] = root[yl - 1]; + xroad[i][1] = root[yr]; } int ans = 0; for (int b = BIT, path, best, sum; b >= 0; b--) { @@ -63,17 +63,17 @@ public static int maxKth(int xl, int xr, int yl, int yr, int k) { for (int i = xl; i <= xr; i++) { path = (x[i] >> b) & 1; best = path ^ 1; - sum += pass[tree[rtpath[i][1]][best]] - pass[tree[rtpath[i][0]][best]]; + sum += pass[tree[xroad[i][1]][best]] - pass[tree[xroad[i][0]][best]]; } for (int i = xl; i <= xr; i++) { path = (x[i] >> b) & 1; best = path ^ 1; if (sum >= k) { - rtpath[i][0] = tree[rtpath[i][0]][best]; - rtpath[i][1] = tree[rtpath[i][1]][best]; + xroad[i][0] = tree[xroad[i][0]][best]; + xroad[i][1] = tree[xroad[i][1]][best]; } else { - rtpath[i][0] = tree[rtpath[i][0]][path]; - rtpath[i][1] = tree[rtpath[i][1]][path]; + xroad[i][0] = tree[xroad[i][0]][path]; + xroad[i][1] = tree[xroad[i][1]][path]; } } if (sum >= k) { diff --git a/src/class159/Code06_XorOperation2.java b/src/class159/Code06_XorOperation2.java index a94d2f92d..f1754da3b 100644 --- a/src/class159/Code06_XorOperation2.java +++ b/src/class159/Code06_XorOperation2.java @@ -19,7 +19,7 @@ //int tree[MAXT][2]; //int pass[MAXT]; //int cnt = 0; -//int rtpath[MAXN][2]; +//int xroad[MAXN][2]; // //int insert(int num, int i) { // int rt = ++cnt; @@ -40,8 +40,8 @@ // //int maxKth(int xl, int xr, int yl, int yr, int k) { // for (int i = xl; i <= xr; i++) { -// rtpath[i][0] = root[yl - 1]; -// rtpath[i][1] = root[yr]; +// xroad[i][0] = root[yl - 1]; +// xroad[i][1] = root[yr]; // } // int ans = 0; // for (int b = BIT, path, best, sum; b >= 0; b--) { @@ -49,17 +49,17 @@ // for (int i = xl; i <= xr; i++) { // path = (x[i] >> b) & 1; // best = path ^ 1; -// sum += pass[tree[rtpath[i][1]][best]] - pass[tree[rtpath[i][0]][best]]; +// sum += pass[tree[xroad[i][1]][best]] - pass[tree[xroad[i][0]][best]]; // } // for (int i = xl; i <= xr; i++) { // path = (x[i] >> b) & 1; // best = path ^ 1; // if (sum >= k) { -// rtpath[i][0] = tree[rtpath[i][0]][best]; -// rtpath[i][1] = tree[rtpath[i][1]][best]; +// xroad[i][0] = tree[xroad[i][0]][best]; +// xroad[i][1] = tree[xroad[i][1]][best]; // } else { -// rtpath[i][0] = tree[rtpath[i][0]][path]; -// rtpath[i][1] = tree[rtpath[i][1]][path]; +// xroad[i][0] = tree[xroad[i][0]][path]; +// xroad[i][1] = tree[xroad[i][1]][path]; // } // } // if (sum >= k) { From 5d361988f2a47a1fd94646696fdad09feaddc184 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 22 Jan 2025 12:00:56 +0800 Subject: [PATCH 0660/2029] modify code --- src/class159/Code01_MaxXor1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class159/Code01_MaxXor1.java b/src/class159/Code01_MaxXor1.java index 4f8996ade..a29d58e9b 100644 --- a/src/class159/Code01_MaxXor1.java +++ b/src/class159/Code01_MaxXor1.java @@ -4,7 +4,7 @@ // 因为练的就是可持久化前缀树,所以就用在线算法 // 测试链接 : https://www.luogu.com.cn/problem/P4735 // 提交以下的code,提交时请把类名改成"Main" -// java实现的逻辑一定是正确的,但是通过不了 +// java实现的逻辑一定是正确的,但是有一些测试用例通过不了 // 因为这道题根据C++的运行时间,制定通过标准,根本没考虑java的用户 // 想通过用C++实现,本节课Code01_MaxXor2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 From b06ef9c3d56609ea9ab9850f952ca692bd7a01b9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 22 Jan 2025 18:52:12 +0800 Subject: [PATCH 0661/2029] modify code --- src/class159/Code07_Friends1.java | 178 ++++++++++++++++++++++++++++++ src/class159/Code07_Friends3.java | 160 +++++++++++++++++++++++++++ 2 files changed, 338 insertions(+) create mode 100644 src/class159/Code07_Friends1.java create mode 100644 src/class159/Code07_Friends3.java diff --git a/src/class159/Code07_Friends1.java b/src/class159/Code07_Friends1.java new file mode 100644 index 000000000..495f8bfd4 --- /dev/null +++ b/src/class159/Code07_Friends1.java @@ -0,0 +1,178 @@ +package class159; + +// 前m大两两异或值的和,java版 +// 本题只用到了经典前缀树,没有用到可持久化前缀树 +// 测试链接 : https://www.luogu.com.cn/problem/CF241B +// 测试链接 : https://codeforces.com/problemset/problem/241/B +// 提交以下的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 Code07_Friends1 { + + public static int MAXN = 50001; + + public static int MAXT = MAXN * 20; + + public static int BIT = 30; + + public static int MOD = 1000000007; + + public static int INV2 = 500000004; + + public static int n, k; + + public static int[] arr = new int[MAXN]; + + public static int[][] tree = new int[MAXT][2]; + + public static int[] pass = new int[MAXT]; + + public static int cnt = 1; + + public static int[][] sum = new int[MAXT][BIT + 1]; + + public static void insert(int num) { + int cur = 1; + pass[cur]++; + for (int b = BIT, path; b >= 0; b--) { + path = (num >> b) & 1; + if (tree[cur][path] == 0) { + tree[cur][path] = ++cnt; + } + cur = tree[cur][path]; + pass[cur]++; + } + } + + public static void dfs(int u, int h, int s) { + if (u == 0) { + return; + } + if (h == 0) { + for (int i = 0; i <= BIT; i++) { + if (((s >> i) & 1) == 1) { + sum[u][i] = pass[u]; + } + } + } else { + dfs(tree[u][0], h - 1, s); + dfs(tree[u][1], h - 1, s | (1 << (h - 1))); + for (int i = 0; i <= BIT; i++) { + sum[u][i] = sum[tree[u][0]][i] + sum[tree[u][1]][i]; + } + } + } + + public static long moreThan(int x) { + long sum = 0; + for (int i = 1, num, cur; i <= n; i++) { + num = arr[i]; + cur = 1; + for (int b = BIT, path, best, xpath; b >= 0; b--) { + path = (num >> b) & 1; + best = path ^ 1; + xpath = (x >> b) & 1; + if (xpath == 0) { + sum += pass[tree[cur][best]]; + cur = tree[cur][path]; + } else { + cur = tree[cur][best]; + } + if (cur == 0) { + break; + } + } + sum += pass[cur]; + } + if (x == 0) { + sum -= n; + } + return sum / 2; + } + + public static int maxKth() { + int l = 0, r = 1 << BIT, m; + int ans = 0; + while (l <= r) { + m = (l + r) / 2; + if (moreThan(m) >= k) { + ans = m; + l = m + 1; + } else { + r = m - 1; + } + } + return ans; + } + + public static void prepare() { + for (int i = 1; i <= n; i++) { + insert(arr[i]); + } + dfs(tree[1][0], BIT, 0); + dfs(tree[1][1], BIT, 1 << BIT); + } + + public static long compute() { + int kth = maxKth(); + long ans = 0; + for (int i = 1, num, cur; i <= n; i++) { + num = arr[i]; + cur = 1; + for (int b = BIT, path, best, kpath; b >= 0; b--) { + path = (num >> b) & 1; + best = path ^ 1; + kpath = (kth >> b) & 1; + if (kpath == 0) { + for (int j = 0; j <= BIT; j++) { + if (((num >> j) & 1) == 1) { + ans = (ans + ((long) pass[tree[cur][best]] - sum[tree[cur][best]][j]) * (1L << j)) % MOD; + } else { + ans = (ans + (long) sum[tree[cur][best]][j] * (1L << j)) % MOD; + } + } + cur = tree[cur][path]; + } else { + cur = tree[cur][best]; + } + if (cur == 0) { + break; + } + } + ans = (ans + (long) pass[cur] * kth) % MOD; + } + ans = ans * INV2 % MOD; + ans = ((ans - (moreThan(kth) - k) * kth % MOD) % MOD + MOD) % MOD; + return ans; + } + + 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(); + k = (int) in.nval; + for (int i = 1; i <= n; i++) { + in.nextToken(); + arr[i] = (int) in.nval; + } + if (k == 0) { + out.println(0); + } else { + prepare(); + out.println(compute()); + } + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class159/Code07_Friends3.java b/src/class159/Code07_Friends3.java new file mode 100644 index 000000000..07e3ff987 --- /dev/null +++ b/src/class159/Code07_Friends3.java @@ -0,0 +1,160 @@ +package class159; + +// 前m大两两异或值的和,C++版 +// 本题只用到了经典前缀树,没有用到可持久化前缀树 +// 测试链接 : https://www.luogu.com.cn/problem/CF241B +// 测试链接 : https://codeforces.com/problemset/problem/241/B +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 50001; +//const int MAXT = MAXN * 20; +//const int BIT = 30; +//const int MOD = 1000000007; +//const int INV2 = 500000004; +//int n, k; +//int arr[MAXN]; +//int tree[MAXT][2]; +//int pass[MAXT]; +//int cnt = 1; +//int sum[MAXT][BIT + 1]; +// +//void insert(int num) { +// int cur = 1; +// pass[cur]++; +// for (int b = BIT; b >= 0; b--) { +// int path = (num >> b) & 1; +// if (!tree[cur][path]) { +// tree[cur][path] = ++cnt; +// } +// cur = tree[cur][path]; +// pass[cur]++; +// } +//} +// +//void dfs(int u, int h, int s) { +// if (!u) { +// return; +// } +// if (!h) { +// for (int i = 0; i <= BIT; i++) { +// if ((s >> i) & 1) { +// sum[u][i] = pass[u]; +// } +// } +// } else { +// dfs(tree[u][0], h - 1, s); +// dfs(tree[u][1], h - 1, s | (1 << (h - 1))); +// for (int i = 0; i <= BIT; i++) { +// sum[u][i] = sum[tree[u][0]][i] + sum[tree[u][1]][i]; +// } +// } +//} +// +//long long moreThan(int x) { +// long long sum = 0; +// for (int i = 1; i <= n; i++) { +// int num = arr[i]; +// int cur = 1; +// for (int b = BIT; b >= 0; b--) { +// int path = (num >> b) & 1; +// int best = path ^ 1; +// int xpath = (x >> b) & 1; +// if (!xpath) { +// sum += pass[tree[cur][best]]; +// cur = tree[cur][path]; +// } else { +// cur = tree[cur][best]; +// } +// if (!cur) { +// break; +// } +// } +// if (cur) { +// sum += pass[cur]; +// } +// } +// if (!x) { +// sum -= n; +// } +// return sum / 2; +//} +// +//int maxKth() { +// int l = 0, r = 1 << BIT, ans = 0; +// while (l <= r) { +// int m = (l + r) >> 1; +// if (moreThan(m) >= k) { +// ans = m; +// l = m + 1; +// } else { +// r = m - 1; +// } +// } +// return ans; +//} +// +//void prepare() { +// for (int i = 1; i <= n; i++) { +// insert(arr[i]); +// } +// dfs(tree[1][0], BIT, 0); +// dfs(tree[1][1], BIT, 1 << BIT); +//} +// +//long long compute() { +// int kth = maxKth(); +// long long ans = 0; +// for (int i = 1; i <= n; i++) { +// int num = arr[i]; +// int cur = 1; +// for (int b = BIT; b >= 0; b--) { +// int path = (num >> b) & 1; +// int best = path ^ 1; +// int kpath = (kth >> b) & 1; +// if (!kpath) { +// if (tree[cur][best]) { +// for (int j = 0; j <= BIT; j++) { +// if ((num >> j) & 1) { +// ans = (ans + ((long long)pass[tree[cur][best]] - sum[tree[cur][best]][j]) * (1LL << j)) % MOD; +// } else { +// ans = (ans + ((long long)sum[tree[cur][best]][j]) * (1LL << j)) % MOD; +// } +// } +// } +// cur = tree[cur][path]; +// } else { +// cur = tree[cur][best]; +// } +// if (!cur) { +// break; +// } +// } +// if (cur) { +// ans = (ans + (long long)pass[cur] * kth) % MOD; +// } +// } +// ans = ans * INV2 % MOD; +// ans = ((ans - ((moreThan(kth) - k) * kth) % MOD) % MOD + MOD) % MOD; +// return ans; +//} +// +//int main(){ +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> k; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// if (!k) { +// cout << 0 << "\n"; +// } else { +// prepare(); +// cout << compute() << "\n"; +// } +// return 0; +//} \ No newline at end of file From 11c9c0d4ba1f805a475eee9434ec0ed2de372c38 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 22 Jan 2025 18:56:06 +0800 Subject: [PATCH 0662/2029] modify code --- src/class159/{Code07_Friends3.java => Code07_Friends2.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/class159/{Code07_Friends3.java => Code07_Friends2.java} (100%) diff --git a/src/class159/Code07_Friends3.java b/src/class159/Code07_Friends2.java similarity index 100% rename from src/class159/Code07_Friends3.java rename to src/class159/Code07_Friends2.java From a1790359d9cf7684554695aab0dcb62603bd14d4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 26 Jan 2025 17:42:53 +0800 Subject: [PATCH 0663/2029] modify code --- src/class159/Code01_MaxXor1.java | 9 ++++++++- src/class159/Code01_MaxXor2.java | 9 ++++++++- src/class159/Code02_StringTree1.java | 5 +++++ src/class159/Code02_StringTree2.java | 5 +++++ src/class159/Code03_PathDfnXor1.java | 6 ++++++ src/class159/Code03_PathDfnXor2.java | 6 ++++++ src/class159/Code04_Yummy1.java | 17 +++++++++++++---- src/class159/Code04_Yummy2.java | 5 +++++ src/class159/Code05_ALO1.java | 6 ++++++ src/class159/Code05_ALO2.java | 6 ++++++ src/class159/Code06_XorOperation1.java | 8 ++++++++ src/class159/Code06_XorOperation2.java | 8 ++++++++ src/class159/Code07_Friends1.java | 7 +++++++ src/class159/Code07_Friends2.java | 7 +++++++ 14 files changed, 98 insertions(+), 6 deletions(-) diff --git a/src/class159/Code01_MaxXor1.java b/src/class159/Code01_MaxXor1.java index a29d58e9b..a7b3a4399 100644 --- a/src/class159/Code01_MaxXor1.java +++ b/src/class159/Code01_MaxXor1.java @@ -1,7 +1,14 @@ package class159; // 最大异或和,java版 -// 因为练的就是可持久化前缀树,所以就用在线算法 +// 非负序列arr的初始长度为n,一共有m条操作,每条操作是如下两种类型中的一种 +// A x : arr的末尾增加数字x,arr的长度n也增加1 +// Q l r x : l~r这些位置中,选一个位置p,现在希望 +// arr[p] ^ arr[p+1] ^ .. ^ arr[n] ^ x 这个值最大 +// 打印这个最大值 +// 1 <= n、m <= 3 * 10^5 +// 0 <= arr[i]、x <= 10^7 +// 因为练的就是可持久化前缀树,所以就用在线算法,不要使用离线算法 // 测试链接 : https://www.luogu.com.cn/problem/P4735 // 提交以下的code,提交时请把类名改成"Main" // java实现的逻辑一定是正确的,但是有一些测试用例通过不了 diff --git a/src/class159/Code01_MaxXor2.java b/src/class159/Code01_MaxXor2.java index be2b18585..ef1010587 100644 --- a/src/class159/Code01_MaxXor2.java +++ b/src/class159/Code01_MaxXor2.java @@ -1,7 +1,14 @@ package class159; // 最大异或和,C++版 -// 因为练的就是可持久化前缀树,所以就用在线算法 +// 非负序列arr的初始长度为n,一共有m条操作,每条操作是如下两种类型中的一种 +// A x : arr的末尾增加数字x,arr的长度n也增加1 +// Q l r x : l~r这些位置中,选一个位置p,现在希望 +// arr[p] ^ arr[p+1] ^ .. ^ arr[n] ^ x 这个值最大 +// 打印这个最大值 +// 1 <= n、m <= 3 * 10^5 +// 0 <= arr[i]、x <= 10^7 +// 因为练的就是可持久化前缀树,所以就用在线算法,不要使用离线算法 // 测试链接 : https://www.luogu.com.cn/problem/P4735 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class159/Code02_StringTree1.java b/src/class159/Code02_StringTree1.java index 6eac5dd9a..3c7ec3295 100644 --- a/src/class159/Code02_StringTree1.java +++ b/src/class159/Code02_StringTree1.java @@ -1,6 +1,11 @@ package class159; // 字符串树,java版 +// 一共有n个节点,n-1条边,组成一棵树,每条边的边权为字符串 +// 一共有m条查询,每条查询的格式为 +// u v s : 查询节点u到节点v的路径中,有多少边的字符串以字符串s作为前缀 +// 1 <= n、m <= 10^5 +// 所有字符串长度不超过10,并且都由字符a~z组成 // 测试链接 : https://www.luogu.com.cn/problem/P6088 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class159/Code02_StringTree2.java b/src/class159/Code02_StringTree2.java index 43b1dfb19..47898dc6a 100644 --- a/src/class159/Code02_StringTree2.java +++ b/src/class159/Code02_StringTree2.java @@ -1,6 +1,11 @@ package class159; // 字符串树,C++版 +// 一共有n个节点,n-1条边,组成一棵树,每条边的边权为字符串 +// 一共有m条查询,每条查询的格式为 +// u v s : 查询节点u到节点v的路径中,有多少边的字符串以字符串s作为前缀 +// 1 <= n、m <= 10^5 +// 所有字符串长度不超过10,并且都由字符a~z组成 // 测试链接 : https://www.luogu.com.cn/problem/P6088 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class159/Code03_PathDfnXor1.java b/src/class159/Code03_PathDfnXor1.java index bb60b109d..33f76d10c 100644 --- a/src/class159/Code03_PathDfnXor1.java +++ b/src/class159/Code03_PathDfnXor1.java @@ -1,6 +1,12 @@ package class159; // 路径和子树的异或,java版 +// 一共有n个节点,n-1条边,组成一棵树,1号节点为树头,每个节点给定点权 +// 一共有m条查询,每条查询是如下两种类型中的一种 +// 1 x y : 以x为头的子树中任选一个值,希望异或y之后的值最大,打印最大值 +// 2 x y z : 节点x到节点y的路径中任选一个值,希望异或z之后的值最大,打印最大值 +// 2 <= n、m <= 10^5 +// 1 <= 点权、z < 2^30 // 测试链接 : https://www.luogu.com.cn/problem/P4592 // java实现的逻辑一定是正确的,但是通过不了 // 因为这道题根据C++的运行空间,制定通过标准,根本没考虑java的用户 diff --git a/src/class159/Code03_PathDfnXor2.java b/src/class159/Code03_PathDfnXor2.java index 82f4ec7c7..e899a01a8 100644 --- a/src/class159/Code03_PathDfnXor2.java +++ b/src/class159/Code03_PathDfnXor2.java @@ -1,6 +1,12 @@ package class159; // 路径和子树的异或,C++版 +// 一共有n个节点,n-1条边,组成一棵树,1号节点为树头,每个节点给定点权 +// 一共有m条查询,每条查询是如下两种类型中的一种 +// 1 x y : 以x为头的子树中任选一个值,希望异或y之后的值最大,打印最大值 +// 2 x y z : 节点x到节点y的路径中任选一个值,希望异或z之后的值最大,打印最大值 +// 2 <= n、m <= 10^5 +// 1 <= 点权、z < 2^30 // 测试链接 : https://www.luogu.com.cn/problem/P4592 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class159/Code04_Yummy1.java b/src/class159/Code04_Yummy1.java index 31ac72adb..3829938bb 100644 --- a/src/class159/Code04_Yummy1.java +++ b/src/class159/Code04_Yummy1.java @@ -1,6 +1,11 @@ package class159; // 美味,java版 +// 给定一个长度为n的数组arr,一共有m条查询,查询格式如下 +// b x l r : 从arr[l..r]中选一个数字,希望b ^ (该数字 + x)的值最大,打印这个值 +// 1 <= n <= 2 * 10^5 +// 1 <= m <= 10^5 +// 0 <= arr[i]、b、x < 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3293 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -120,10 +125,14 @@ public static void main(String[] args) throws IOException { } prepare(); for (int i = 1, b, x, l, r; i <= m; i++) { - in.nextToken(); b = (int) in.nval; - in.nextToken(); x = (int) in.nval; - in.nextToken(); l = (int) in.nval; - in.nextToken(); r = (int) in.nval; + in.nextToken(); + b = (int) in.nval; + in.nextToken(); + x = (int) in.nval; + in.nextToken(); + l = (int) in.nval; + in.nextToken(); + r = (int) in.nval; out.println(compute(b, x, l, r)); } out.flush(); diff --git a/src/class159/Code04_Yummy2.java b/src/class159/Code04_Yummy2.java index d79fca517..761ab6ffa 100644 --- a/src/class159/Code04_Yummy2.java +++ b/src/class159/Code04_Yummy2.java @@ -1,6 +1,11 @@ package class159; // 美味,C++版 +// 给定一个长度为n的数组arr,一共有m条查询,查询格式如下 +// b x l r : 从arr[l..r]中选一个数字,希望b ^ (该数字 + x)的值最大,打印这个值 +// 1 <= n <= 2 * 10^5 +// 1 <= m <= 10^5 +// 0 <= arr[i]、b、x < 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3293 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class159/Code05_ALO1.java b/src/class159/Code05_ALO1.java index f55e7911a..58b810e52 100644 --- a/src/class159/Code05_ALO1.java +++ b/src/class159/Code05_ALO1.java @@ -1,6 +1,12 @@ package class159; // 生成能量密度最大的宝石,java版 +// 给定一个长度为n的数组arr,数组中没有重复数字 +// 你可以随意挑选一个连续的部分,该部分的长度要求大于等于2 +// 这部分的次大值 ^ 除了次大值之外随意选一个数字,所能得到的最大值,叫做这部分的能量密度 +// 那么必有某个连续部分,拥有最大的能量密度,打印这个最大的能量密度 +// 1 <= n <= 5 * 10^4 +// 0 <= arr[i] <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P4098 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class159/Code05_ALO2.java b/src/class159/Code05_ALO2.java index 97fc84ee7..cc709fbb3 100644 --- a/src/class159/Code05_ALO2.java +++ b/src/class159/Code05_ALO2.java @@ -1,6 +1,12 @@ package class159; // 生成能量密度最大的宝石,C++版 +// 给定一个长度为n的数组arr,数组中没有重复数字 +// 你可以随意挑选一个连续的部分,该部分的长度要求大于等于2 +// 这部分的次大值 ^ 除了次大值之外随意选一个数字,所能得到的最大值,叫做这部分的能量密度 +// 那么必有某个连续部分,拥有最大的能量密度,打印这个最大的能量密度 +// 1 <= n <= 5 * 10^4 +// 0 <= arr[i] <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P4098 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class159/Code06_XorOperation1.java b/src/class159/Code06_XorOperation1.java index 0c52b8341..fe71790a5 100644 --- a/src/class159/Code06_XorOperation1.java +++ b/src/class159/Code06_XorOperation1.java @@ -1,6 +1,14 @@ package class159; // 异或运算,java版 +// 给定一个长度n的数组x,还有一个长度为m的数组y +// 想象一个二维矩阵mat,数组x作为行,数组y作为列,mat[i][j] = x[i] ^ y[j] +// 一共有p条查询,每条查询格式如下 +// xl xr yl yr k : 划定mat的范围是,行从xl~xr,列从yl~yr,打印其中第k大的值 +// 1 <= n <= 1000 +// 1 <= m <= 3 * 10^5 +// 1 <= p <= 500 +// 0 <= x[i]、y[i] < 2^31 // 测试链接 : https://www.luogu.com.cn/problem/P5795 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class159/Code06_XorOperation2.java b/src/class159/Code06_XorOperation2.java index f1754da3b..47c3dc44e 100644 --- a/src/class159/Code06_XorOperation2.java +++ b/src/class159/Code06_XorOperation2.java @@ -1,6 +1,14 @@ package class159; // 异或运算,C++版 +// 给定一个长度n的数组x,还有一个长度为m的数组y +// 想象一个二维矩阵mat,数组x作为行,数组y作为列,mat[i][j] = x[i] ^ y[j] +// 一共有p条查询,每条查询格式如下 +// xl xr yl yr k : 划定mat的范围是,行从xl~xr,列从yl~yr,打印其中第k大的值 +// 1 <= n <= 1000 +// 1 <= m <= 3 * 10^5 +// 1 <= p <= 500 +// 0 <= x[i]、y[i] < 2^31 // 测试链接 : https://www.luogu.com.cn/problem/P5795 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class159/Code07_Friends1.java b/src/class159/Code07_Friends1.java index 495f8bfd4..8760372d0 100644 --- a/src/class159/Code07_Friends1.java +++ b/src/class159/Code07_Friends1.java @@ -2,6 +2,13 @@ // 前m大两两异或值的和,java版 // 本题只用到了经典前缀树,没有用到可持久化前缀树 +// 给定一个长度为n的数组arr,下标1~n +// 你可以随意选不同位置的两个数字进行异或,这叫做两两异或值 +// 那么,两两异或值,就有第1大、第2大... +// 返回前m大两两异或值的累加和,答案对1000000007取模 +// 1 <= n <= 5 * 10^4 +// 0 <= m <= n * (n-1) / 2 +// 0 <= arr[i] <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/CF241B // 测试链接 : https://codeforces.com/problemset/problem/241/B // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class159/Code07_Friends2.java b/src/class159/Code07_Friends2.java index 07e3ff987..2dacd683a 100644 --- a/src/class159/Code07_Friends2.java +++ b/src/class159/Code07_Friends2.java @@ -2,6 +2,13 @@ // 前m大两两异或值的和,C++版 // 本题只用到了经典前缀树,没有用到可持久化前缀树 +// 给定一个长度为n的数组arr,下标1~n +// 你可以随意选不同位置的两个数字进行异或,这叫做两两异或值 +// 那么,两两异或值,就有第1大、第2大... +// 返回前m大两两异或值的累加和,答案对1000000007取模 +// 1 <= n <= 5 * 10^4 +// 0 <= m <= n * (n-1) / 2 +// 0 <= arr[i] <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/CF241B // 测试链接 : https://codeforces.com/problemset/problem/241/B // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 From e32e404c01fdc84e54b3b6b158d4d4897e3dd4ae Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 27 Jan 2025 00:53:38 +0800 Subject: [PATCH 0664/2029] modify code --- src/class056/Code02_UnionFindLuogu.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class056/Code02_UnionFindLuogu.java b/src/class056/Code02_UnionFindLuogu.java index 8aa9a2bba..96fd9629f 100644 --- a/src/class056/Code02_UnionFindLuogu.java +++ b/src/class056/Code02_UnionFindLuogu.java @@ -16,7 +16,7 @@ public class Code02_UnionFindLuogu { - public static int MAXN = 10001; + public static int MAXN = 200001; public static int[] father = new int[MAXN]; From 108a9ee26cb9ae38282929942cfb01f2aa4e1d69 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 27 Jan 2025 22:01:10 +0800 Subject: [PATCH 0665/2029] modify code --- src/class159/Code01_MaxXor1.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/class159/Code01_MaxXor1.java b/src/class159/Code01_MaxXor1.java index a7b3a4399..80c96cddc 100644 --- a/src/class159/Code01_MaxXor1.java +++ b/src/class159/Code01_MaxXor1.java @@ -79,6 +79,7 @@ public static void main(String[] args) throws IOException { n = in.nextInt(); m = in.nextInt(); eor = 0; + // 其实有空版本,空版本的头节点编号是0 root[0] = insert(eor, 0); for (int i = 1, num; i <= n; i++) { num = in.nextInt(); @@ -95,9 +96,9 @@ public static void main(String[] args) throws IOException { n++; root[n] = insert(eor, root[n - 1]); } else { - x = in.nextInt(); - y = in.nextInt(); - z = in.nextInt(); + x = in.nextInt(); // l + y = in.nextInt(); // r + z = in.nextInt(); // x if (x == 1) { out.println(query(eor ^ z, 0, root[y - 1])); } else { From 9308ee5eac5b8370763e26453565ca5d71cdf19d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 27 Jan 2025 23:56:34 +0800 Subject: [PATCH 0666/2029] modify code --- src/class159/Code02_StringTree1.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/class159/Code02_StringTree1.java b/src/class159/Code02_StringTree1.java index 3c7ec3295..9043037ff 100644 --- a/src/class159/Code02_StringTree1.java +++ b/src/class159/Code02_StringTree1.java @@ -28,6 +28,7 @@ public class Code02_StringTree1 { public static int n, m; + // 链式前向星需要 public static int[] head = new int[MAXN]; public static int[] next = new int[MAXN << 1]; @@ -38,6 +39,7 @@ public class Code02_StringTree1 { public static int cntg = 0; + // 可持久化前缀树需要 public static int[] root = new int[MAXN]; public static int[][] tree = new int[MAXT][27]; @@ -46,6 +48,7 @@ public class Code02_StringTree1 { public static int cntt = 0; + // 树上倍增和LCA需要 public static int[] deep = new int[MAXN]; public static int[][] stjump = new int[MAXN][MAXH]; From 34132e04b29cd03bc197033a3216cf0b216fd1b3 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 28 Jan 2025 00:56:05 +0800 Subject: [PATCH 0667/2029] modify code --- src/class159/Code03_PathDfnXor1.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/class159/Code03_PathDfnXor1.java b/src/class159/Code03_PathDfnXor1.java index 33f76d10c..60e281a0a 100644 --- a/src/class159/Code03_PathDfnXor1.java +++ b/src/class159/Code03_PathDfnXor1.java @@ -32,34 +32,47 @@ public class Code03_PathDfnXor1 { public static int n, m; + // 每个节点的点权 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; + // 树上dfs求节点深度 public static int[] deep = new int[MAXN]; + // 树上dfs求子树大小 public static int[] size = new int[MAXN]; + // 树上dfs求st表 public static int[][] stjump = new int[MAXN][MAXH]; + // 树上dfs求每个节点的dfn序号 public static int[] dfn = new int[MAXN]; + // dfn序号计数 public static int cntd = 0; + // 1类型的可持久化01Trie,根据dfn序号的次序建树 public static int[] root1 = new int[MAXN]; + // 2类型的可持久化01Trie,根据父节点的版本建新树 public static int[] root2 = new int[MAXN]; + // 1类型和2类型都可以用这个tree结构 public static int[][] tree = new int[MAXT][2]; + // 1类型和2类型都可以用这个pass数组 public static int[] pass = new int[MAXT]; + // 1类型和2类型一起的节点计数 public static int cntt = 0; public static void addEdge(int u, int v) { From f94196d35cc53fa5650a61149368883f811cef31 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 28 Jan 2025 01:04:03 +0800 Subject: [PATCH 0668/2029] modify code --- src/class159/Code04_Yummy1.java | 13 +++++++------ src/class159/Code04_Yummy2.java | 16 +++++++++------- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/class159/Code04_Yummy1.java b/src/class159/Code04_Yummy1.java index 3829938bb..093f42918 100644 --- a/src/class159/Code04_Yummy1.java +++ b/src/class159/Code04_Yummy1.java @@ -28,6 +28,7 @@ public class Code04_Yummy1 { public static int[] arr = new int[MAXN]; + // 可持久化线段树需要 public static int[] root = new int[MAXN]; public static int[] left = new int[MAXT]; @@ -96,19 +97,19 @@ public static void prepare() { } public static int compute(int b, int x, int l, int r) { - int ans = 0; + int best = 0; for (int i = BIT; i >= 0; i--) { if (((b >> i) & 1) == 1) { - if (query(ans - x, ans - x + (1 << i) - 1, 0, s, root[l - 1], root[r]) == 0) { - ans += 1 << i; + if (query(best - x, best - x + (1 << i) - 1, 0, s, root[l - 1], root[r]) == 0) { + best += 1 << i; } } else { - if (query(ans - x + (1 << i), ans - x + (1 << (i + 1)) - 1, 0, s, root[l - 1], root[r]) != 0) { - ans += 1 << i; + if (query(best - x + (1 << i), best - x + (1 << (i + 1)) - 1, 0, s, root[l - 1], root[r]) != 0) { + best += 1 << i; } } } - return ans ^ b; + return best ^ b; } public static void main(String[] args) throws IOException { diff --git a/src/class159/Code04_Yummy2.java b/src/class159/Code04_Yummy2.java index 761ab6ffa..74fb8f2b3 100644 --- a/src/class159/Code04_Yummy2.java +++ b/src/class159/Code04_Yummy2.java @@ -20,7 +20,9 @@ //int n, m, s; //int arr[MAXN]; //int root[MAXN]; -//int ls[MAXT], rs[MAXT], size[MAXT]; +//int ls[MAXT]; +//int rs[MAXT]; +//int size[MAXT]; //int cnt; // //int build(int l, int r) { @@ -81,19 +83,19 @@ //} // //int compute(int b, int x, int l, int r) { -// int ans = 0; +// int best = 0; // for (int i = BIT; i >= 0; i--) { // if (((b >> i) & 1) == 1) { -// if (query(ans - x, ans - x + (1 << i) - 1, 0, s, root[l - 1], root[r]) == 0) { -// ans += 1 << i; +// if (query(best - x, best - x + (1 << i) - 1, 0, s, root[l - 1], root[r]) == 0) { +// best += 1 << i; // } // } else { -// if (query(ans - x + (1 << i), ans - x + (1 << (i + 1)) - 1, 0, s, root[l - 1], root[r]) != 0) { -// ans += 1 << i; +// if (query(best - x + (1 << i), best - x + (1 << (i + 1)) - 1, 0, s, root[l - 1], root[r]) != 0) { +// best += 1 << i; // } // } // } -// return ans ^ b; +// return best ^ b; //} // //int main() { From 0777330c1588032bef4f61917d938832a871d3fd Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 28 Jan 2025 03:07:46 +0800 Subject: [PATCH 0669/2029] modify code --- src/class159/Code04_Yummy1.java | 4 ++-- src/class159/Code04_Yummy2.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class159/Code04_Yummy1.java b/src/class159/Code04_Yummy1.java index 093f42918..a7b5119ee 100644 --- a/src/class159/Code04_Yummy1.java +++ b/src/class159/Code04_Yummy1.java @@ -100,11 +100,11 @@ public static int compute(int b, int x, int l, int r) { int best = 0; for (int i = BIT; i >= 0; i--) { if (((b >> i) & 1) == 1) { - if (query(best - x, best - x + (1 << i) - 1, 0, s, root[l - 1], root[r]) == 0) { + if (query(best - x, best + (1 << i) - 1 - x, 0, s, root[l - 1], root[r]) == 0) { best += 1 << i; } } else { - if (query(best - x + (1 << i), best - x + (1 << (i + 1)) - 1, 0, s, root[l - 1], root[r]) != 0) { + if (query(best + (1 << i) - x, best + (1 << (i + 1)) - 1 - x, 0, s, root[l - 1], root[r]) != 0) { best += 1 << i; } } diff --git a/src/class159/Code04_Yummy2.java b/src/class159/Code04_Yummy2.java index 74fb8f2b3..18a567473 100644 --- a/src/class159/Code04_Yummy2.java +++ b/src/class159/Code04_Yummy2.java @@ -86,11 +86,11 @@ // int best = 0; // for (int i = BIT; i >= 0; i--) { // if (((b >> i) & 1) == 1) { -// if (query(best - x, best - x + (1 << i) - 1, 0, s, root[l - 1], root[r]) == 0) { +// if (query(best - x, best + (1 << i) - 1 - x, 0, s, root[l - 1], root[r]) == 0) { // best += 1 << i; // } // } else { -// if (query(best - x + (1 << i), best - x + (1 << (i + 1)) - 1, 0, s, root[l - 1], root[r]) != 0) { +// if (query(best + (1 << i) - x, best + (1 << (i + 1)) - 1 - x, 0, s, root[l - 1], root[r]) != 0) { // best += 1 << i; // } // } From d03b7d037a92061035891ef4dca9fc171b9096af Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 29 Jan 2025 13:40:26 +0800 Subject: [PATCH 0670/2029] modify code --- src/class159/Code05_ALO1.java | 11 ++++++----- src/class159/Code05_ALO2.java | 11 ++++++----- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/class159/Code05_ALO1.java b/src/class159/Code05_ALO1.java index 58b810e52..984bde0df 100644 --- a/src/class159/Code05_ALO1.java +++ b/src/class159/Code05_ALO1.java @@ -2,10 +2,11 @@ // 生成能量密度最大的宝石,java版 // 给定一个长度为n的数组arr,数组中没有重复数字 -// 你可以随意挑选一个连续的部分,该部分的长度要求大于等于2 -// 这部分的次大值 ^ 除了次大值之外随意选一个数字,所能得到的最大值,叫做这部分的能量密度 -// 那么必有某个连续部分,拥有最大的能量密度,打印这个最大的能量密度 -// 1 <= n <= 5 * 10^4 +// 你可以随意选择一个子数组,长度要求大于等于2,因为这样一来,子数组必存在次大值 +// 子数组的次大值 ^ 子数组中除了次大值之外随意选一个数字 +// 所能得到的最大结果,叫做子数组的能量密度 +// 那么必有某个子数组,拥有最大的能量密度,打印这个最大的能量密度 +// 2 <= n <= 5 * 10^4 // 0 <= arr[i] <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P4098 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -26,7 +27,7 @@ public class Code05_ALO1 { public static int BIT = 30; - public static int n, m; + public static int n; public static int[][] arr = new int[MAXN][2]; diff --git a/src/class159/Code05_ALO2.java b/src/class159/Code05_ALO2.java index cc709fbb3..35d8394c1 100644 --- a/src/class159/Code05_ALO2.java +++ b/src/class159/Code05_ALO2.java @@ -2,10 +2,11 @@ // 生成能量密度最大的宝石,C++版 // 给定一个长度为n的数组arr,数组中没有重复数字 -// 你可以随意挑选一个连续的部分,该部分的长度要求大于等于2 -// 这部分的次大值 ^ 除了次大值之外随意选一个数字,所能得到的最大值,叫做这部分的能量密度 -// 那么必有某个连续部分,拥有最大的能量密度,打印这个最大的能量密度 -// 1 <= n <= 5 * 10^4 +// 你可以随意选择一个子数组,长度要求大于等于2,因为这样一来,子数组必存在次大值 +// 子数组的次大值 ^ 子数组中除了次大值之外随意选一个数字 +// 所能得到的最大结果,叫做子数组的能量密度 +// 那么必有某个子数组,拥有最大的能量密度,打印这个最大的能量密度 +// 2 <= n <= 5 * 10^4 // 0 <= arr[i] <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P4098 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 @@ -18,7 +19,7 @@ //const int MAXN = 50002; //const int MAXT = MAXN * 32; //const int BIT = 30; -//int n, m; +//int n; //vector> arr; //int root[MAXN]; //int tree[MAXT][2]; From 58d7da1fe9c5a824ccd1a46e51b3ceeb247ab1a4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 29 Jan 2025 15:36:26 +0800 Subject: [PATCH 0671/2029] modify code --- src/class159/Code06_XorOperation1.java | 23 ++++++++++++----------- src/class159/Code06_XorOperation2.java | 11 ++++------- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/src/class159/Code06_XorOperation1.java b/src/class159/Code06_XorOperation1.java index fe71790a5..0db0d3e01 100644 --- a/src/class159/Code06_XorOperation1.java +++ b/src/class159/Code06_XorOperation1.java @@ -31,8 +31,6 @@ public class Code06_XorOperation1 { public static int[] x = new int[MAXN]; - public static int[] y = new int[MAXN]; - public static int[] root = new int[MAXN]; public static int[][] tree = new int[MAXT][2]; @@ -61,6 +59,7 @@ public static int insert(int num, int i) { } public static int maxKth(int xl, int xr, int yl, int yr, int k) { + // 基于哪两个节点的pass值查询,一开始x[xl...xr]每个数字,都是一样的 for (int i = xl; i <= xr; i++) { xroad[i][0] = root[yl - 1]; xroad[i][1] = root[yr]; @@ -68,11 +67,19 @@ public static int maxKth(int xl, int xr, int yl, int yr, int k) { int ans = 0; for (int b = BIT, path, best, sum; b >= 0; b--) { sum = 0; + // 统计x[xl...xr]范围上 + // 每个数字 ^ y[yl...yr]任意一个数字,在第b位上能取得1的结果,有多少个 + // 结果数量累加起来 for (int i = xl; i <= xr; i++) { path = (x[i] >> b) & 1; best = path ^ 1; sum += pass[tree[xroad[i][1]][best]] - pass[tree[xroad[i][0]][best]]; } + // 如果sum >= k + // 说明x[xl...xr]对应y[yl...yr],第k大的异或结果,在第b位上能是1 + // 如果sum < k + // 说明x[xl...xr]对应y[yl...yr],第k大的异或结果,在第b位上只能是0 + // x[xl...xr]每个数字,都有自己专属的跳转,要记录好! for (int i = xl; i <= xr; i++) { path = (x[i] >> b) & 1; best = path ^ 1; @@ -93,12 +100,6 @@ public static int maxKth(int xl, int xr, int yl, int yr, int k) { return ans; } - public static void prepare() { - for (int i = 1; i <= m; i++) { - root[i] = insert(y[i], root[i - 1]); - } - } - public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StreamTokenizer in = new StreamTokenizer(br); @@ -111,11 +112,11 @@ public static void main(String[] args) throws IOException { in.nextToken(); x[i] = (int) in.nval; } - for (int i = 1; i <= m; i++) { + for (int i = 1, yi; i <= m; i++) { in.nextToken(); - y[i] = (int) in.nval; + yi = (int) in.nval; + root[i] = insert(yi, root[i - 1]); } - prepare(); in.nextToken(); p = (int) in.nval; for (int i = 1, xl, xr, yl, yr, k; i <= p; i++) { diff --git a/src/class159/Code06_XorOperation2.java b/src/class159/Code06_XorOperation2.java index 47c3dc44e..a767981c0 100644 --- a/src/class159/Code06_XorOperation2.java +++ b/src/class159/Code06_XorOperation2.java @@ -22,7 +22,6 @@ //const int BIT = 30; //int n, m, p; //int x[MAXN]; -//int y[MAXN]; //int root[MAXN]; //int tree[MAXT][2]; //int pass[MAXT]; @@ -80,9 +79,7 @@ //} // //void prepare() { -// for (int i = 1; i <= m; i++) { -// root[i] = insert(y[i], root[i - 1]); -// } + //} // //int main() { @@ -92,10 +89,10 @@ // for (int i = 1; i <= n; i++) { // cin >> x[i]; // } -// for (int i = 1; i <= m; i++) { -// cin >> y[i]; +// for (int i = 1, yi; i <= m; i++) { +// cin >> yi; +// root[i] = insert(yi, root[i - 1]); // } -// prepare(); // cin >> p; // for (int i = 1, xl, xr, yl, yr, k; i <= p; i++) { // cin >> xl >> xr >> yl >> yr >> k; From 27998a22a01255168fb94d110044a766f2db91ac Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 29 Jan 2025 20:26:00 +0800 Subject: [PATCH 0672/2029] modify code --- ...\345\205\263\351\242\230\347\233\256.pptx" | Bin 0 -> 51811 bytes src/class159/Code07_Friends1.java | 65 ++++++++------- src/class159/Code07_Friends2.java | 75 +++++++++--------- 3 files changed, 68 insertions(+), 72 deletions(-) create mode 100644 "ppt/\347\256\227\346\263\225\350\256\262\350\247\243159\343\200\220\346\214\272\351\232\276\343\200\221\345\217\257\346\214\201\344\271\205\345\214\226\345\211\215\347\274\200\346\240\221\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\243159\343\200\220\346\214\272\351\232\276\343\200\221\345\217\257\346\214\201\344\271\205\345\214\226\345\211\215\347\274\200\346\240\221\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\243159\343\200\220\346\214\272\351\232\276\343\200\221\345\217\257\346\214\201\344\271\205\345\214\226\345\211\215\347\274\200\346\240\221\345\222\214\347\233\270\345\205\263\351\242\230\347\233\256.pptx" new file mode 100644 index 0000000000000000000000000000000000000000..285a603fbfd9548282a80bf622615efc20dd39c1 GIT binary patch literal 51811 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 0; b--) { path = (num >> b) & 1; if (tree[cur][path] == 0) { @@ -57,27 +57,27 @@ public static void insert(int num) { } } - public static void dfs(int u, int h, int s) { - if (u == 0) { + public static void dfs(int i, int h, int s) { + if (i == 0) { return; } if (h == 0) { - for (int i = 0; i <= BIT; i++) { - if (((s >> i) & 1) == 1) { - sum[u][i] = pass[u]; + for (int j = 0; j <= BIT; j++) { + if (((s >> j) & 1) == 1) { + sum[i][j] = pass[i]; } } } else { - dfs(tree[u][0], h - 1, s); - dfs(tree[u][1], h - 1, s | (1 << (h - 1))); - for (int i = 0; i <= BIT; i++) { - sum[u][i] = sum[tree[u][0]][i] + sum[tree[u][1]][i]; + dfs(tree[i][0], h - 1, s); + dfs(tree[i][1], h - 1, s | (1 << (h - 1))); + for (int j = 0; j <= BIT; j++) { + sum[i][j] = sum[tree[i][0]][j] + sum[tree[i][1]][j]; } } } - public static long moreThan(int x) { - long sum = 0; + public static long moreEqual(int x) { + long ans = 0; for (int i = 1, num, cur; i <= n; i++) { num = arr[i]; cur = 1; @@ -86,7 +86,7 @@ public static long moreThan(int x) { best = path ^ 1; xpath = (x >> b) & 1; if (xpath == 0) { - sum += pass[tree[cur][best]]; + ans += pass[tree[cur][best]]; cur = tree[cur][path]; } else { cur = tree[cur][best]; @@ -95,12 +95,12 @@ public static long moreThan(int x) { break; } } - sum += pass[cur]; + ans += pass[cur]; } if (x == 0) { - sum -= n; + ans -= n; } - return sum / 2; + return ans / 2; } public static int maxKth() { @@ -108,7 +108,7 @@ public static int maxKth() { int ans = 0; while (l <= r) { m = (l + r) / 2; - if (moreThan(m) >= k) { + if (moreEqual(m) >= k) { ans = m; l = m + 1; } else { @@ -118,27 +118,18 @@ public static int maxKth() { return ans; } - public static void prepare() { - for (int i = 1; i <= n; i++) { - insert(arr[i]); - } - dfs(tree[1][0], BIT, 0); - dfs(tree[1][1], BIT, 1 << BIT); - } - public static long compute() { int kth = maxKth(); long ans = 0; - for (int i = 1, num, cur; i <= n; i++) { - num = arr[i]; + for (int i = 1, cur; i <= n; i++) { cur = 1; for (int b = BIT, path, best, kpath; b >= 0; b--) { - path = (num >> b) & 1; + path = (arr[i] >> b) & 1; best = path ^ 1; kpath = (kth >> b) & 1; if (kpath == 0) { for (int j = 0; j <= BIT; j++) { - if (((num >> j) & 1) == 1) { + if (((arr[i] >> j) & 1) == 1) { ans = (ans + ((long) pass[tree[cur][best]] - sum[tree[cur][best]][j]) * (1L << j)) % MOD; } else { ans = (ans + (long) sum[tree[cur][best]][j] * (1L << j)) % MOD; @@ -155,10 +146,18 @@ public static long compute() { ans = (ans + (long) pass[cur] * kth) % MOD; } ans = ans * INV2 % MOD; - ans = ((ans - (moreThan(kth) - k) * kth % MOD) % MOD + MOD) % MOD; + ans = ((ans - (moreEqual(kth) - k) * kth % MOD) % MOD + MOD) % MOD; return ans; } + public static void prepare() { + for (int i = 1; i <= n; i++) { + insert(arr[i]); + } + dfs(tree[1][0], BIT, 0); + dfs(tree[1][1], BIT, 1 << BIT); + } + public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StreamTokenizer in = new StreamTokenizer(br); diff --git a/src/class159/Code07_Friends2.java b/src/class159/Code07_Friends2.java index 2dacd683a..b8c3c88c9 100644 --- a/src/class159/Code07_Friends2.java +++ b/src/class159/Code07_Friends2.java @@ -3,11 +3,11 @@ // 前m大两两异或值的和,C++版 // 本题只用到了经典前缀树,没有用到可持久化前缀树 // 给定一个长度为n的数组arr,下标1~n -// 你可以随意选不同位置的两个数字进行异或,这叫做两两异或值 +// 你可以随意选两个不同位置的数字进行异或,得到两两异或值,顺序不同的话,算做一个两两异或值 // 那么,两两异或值,就有第1大、第2大... -// 返回前m大两两异或值的累加和,答案对1000000007取模 +// 返回前k大两两异或值的累加和,答案对1000000007取模 // 1 <= n <= 5 * 10^4 -// 0 <= m <= n * (n-1) / 2 +// 0 <= k <= n * (n-1) / 2 // 0 <= arr[i] <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/CF241B // 测试链接 : https://codeforces.com/problemset/problem/241/B @@ -32,38 +32,38 @@ // //void insert(int num) { // int cur = 1; -// pass[cur]++; +// pass[1]++; // for (int b = BIT; b >= 0; b--) { // int path = (num >> b) & 1; // if (!tree[cur][path]) { -// tree[cur][path] = ++cnt; +// tree[cur][path] = ++cnt; // } // cur = tree[cur][path]; // pass[cur]++; // } //} // -//void dfs(int u, int h, int s) { -// if (!u) { +//void dfs(int i, int h, int s) { +// if (!i) { // return; // } // if (!h) { -// for (int i = 0; i <= BIT; i++) { -// if ((s >> i) & 1) { -// sum[u][i] = pass[u]; +// for (int j = 0; j <= BIT; j++) { +// if ((s >> j) & 1) { +// sum[i][j] = pass[i]; // } // } // } else { -// dfs(tree[u][0], h - 1, s); -// dfs(tree[u][1], h - 1, s | (1 << (h - 1))); -// for (int i = 0; i <= BIT; i++) { -// sum[u][i] = sum[tree[u][0]][i] + sum[tree[u][1]][i]; +// dfs(tree[i][0], h - 1, s); +// dfs(tree[i][1], h - 1, s | (1 << (h - 1))); +// for (int j = 0; j <= BIT; j++) { +// sum[i][j] = sum[tree[i][0]][j] + sum[tree[i][1]][j]; // } // } //} // -//long long moreThan(int x) { -// long long sum = 0; +//long long moreEqual(int x) { +// long long ans = 0; // for (int i = 1; i <= n; i++) { // int num = arr[i]; // int cur = 1; @@ -72,7 +72,7 @@ // int best = path ^ 1; // int xpath = (x >> b) & 1; // if (!xpath) { -// sum += pass[tree[cur][best]]; +// ans += pass[tree[cur][best]]; // cur = tree[cur][path]; // } else { // cur = tree[cur][best]; @@ -81,21 +81,19 @@ // break; // } // } -// if (cur) { -// sum += pass[cur]; -// } +// ans += pass[cur]; // } -// if (!x) { -// sum -= n; +// if (x == 0) { +// ans -= n; // } -// return sum / 2; +// return ans / 2; //} // //int maxKth() { // int l = 0, r = 1 << BIT, ans = 0; // while (l <= r) { // int m = (l + r) >> 1; -// if (moreThan(m) >= k) { +// if (moreEqual(m) >= k) { // ans = m; // l = m + 1; // } else { @@ -105,28 +103,19 @@ // return ans; //} // -//void prepare() { -// for (int i = 1; i <= n; i++) { -// insert(arr[i]); -// } -// dfs(tree[1][0], BIT, 0); -// dfs(tree[1][1], BIT, 1 << BIT); -//} -// //long long compute() { // int kth = maxKth(); // long long ans = 0; -// for (int i = 1; i <= n; i++) { -// int num = arr[i]; -// int cur = 1; +// for (int i = 1, cur; i <= n; i++) { +// cur = 1; // for (int b = BIT; b >= 0; b--) { -// int path = (num >> b) & 1; +// int path = (arr[i] >> b) & 1; // int best = path ^ 1; // int kpath = (kth >> b) & 1; // if (!kpath) { // if (tree[cur][best]) { // for (int j = 0; j <= BIT; j++) { -// if ((num >> j) & 1) { +// if ((arr[i] >> j) & 1) { // ans = (ans + ((long long)pass[tree[cur][best]] - sum[tree[cur][best]][j]) * (1LL << j)) % MOD; // } else { // ans = (ans + ((long long)sum[tree[cur][best]][j]) * (1LL << j)) % MOD; @@ -146,11 +135,19 @@ // } // } // ans = ans * INV2 % MOD; -// ans = ((ans - ((moreThan(kth) - k) * kth) % MOD) % MOD + MOD) % MOD; +// ans = ((ans - ((moreEqual(kth) - k) * kth) % MOD) % MOD + MOD) % MOD; // return ans; //} // -//int main(){ +//void prepare() { +// for (int i = 1; i <= n; i++) { +// insert(arr[i]); +// } +// dfs(tree[1][0], BIT, 0); +// dfs(tree[1][1], BIT, 1 << BIT); +//} +// +//int main() { // ios::sync_with_stdio(false); // cin.tie(nullptr); // cin >> n >> k; From ce623c11ccbe85fcea6614d13289c026ac01f46f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 6 Feb 2025 11:56:57 +0800 Subject: [PATCH 0673/2029] modify code --- src/class159/Code06_XorOperation2.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/class159/Code06_XorOperation2.java b/src/class159/Code06_XorOperation2.java index a767981c0..18bfb94fe 100644 --- a/src/class159/Code06_XorOperation2.java +++ b/src/class159/Code06_XorOperation2.java @@ -76,10 +76,6 @@ // } // } // return ans; -//} -// -//void prepare() { - //} // //int main() { From 5afdb0ec32e860c7890f666779664b02174f560f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 7 Feb 2025 17:05:33 +0800 Subject: [PATCH 0674/2029] modify code --- src/class160/Code01_NestedTree1.java | 269 +++++++++++++++++++++++++++ src/class160/Code01_NestedTree2.java | 213 +++++++++++++++++++++ 2 files changed, 482 insertions(+) create mode 100644 src/class160/Code01_NestedTree1.java create mode 100644 src/class160/Code01_NestedTree2.java diff --git a/src/class160/Code01_NestedTree1.java b/src/class160/Code01_NestedTree1.java new file mode 100644 index 000000000..75ccb5fc8 --- /dev/null +++ b/src/class160/Code01_NestedTree1.java @@ -0,0 +1,269 @@ +package class160; + +// 树套树,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P3380 +// 提交以下的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 Code01_NestedTree1 { + + public static int MAXN = 50001; + + public static int MAXT = MAXN * 160; + + public static int INF = Integer.MAX_VALUE; + + public static int n, m, s; + + public static int[] arr = new int[MAXN]; + + public static int[][] ques = new int[MAXN][4]; + + public static int[] sorted = new int[MAXN * 2]; + + // 注意这不是主席树!而是若干棵动态开点权值线段树! + public static int[] root = new int[MAXN]; + + public static int[] sum = new int[MAXT]; + + public static int[] left = new int[MAXT]; + + public static int[] right = new int[MAXT]; + + public static int cntt = 0; + + public static int[] pos = new int[MAXN]; + + public static int[] pre = new int[MAXN]; + + public static int cntpos; + + public static int cntpre; + + 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 int lowbit(int i) { + return i & -i; + } + + public static void up(int i) { + sum[i] = sum[left[i]] + sum[right[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] += jobv; + } else { + int mid = (l + r) / 2; + if (jobi <= mid) { + left[i] = add(jobi, jobv, l, mid, left[i]); + } else { + right[i] = add(jobi, jobv, mid + 1, r, right[i]); + } + up(i); + } + return i; + } + + public static void add(int i, int v) { + for (int j = i; j <= n; j += lowbit(j)) { + root[j] = add(arr[i], v, 1, s, root[j]); + } + } + + public static int queryNumber(int jobk, int l, int r) { + if (l == r) { + return l; + } + int mid = (l + r) / 2; + int leftsum = 0; + for (int i = 1; i <= cntpos; i++) { + leftsum += sum[left[pos[i]]]; + } + for (int i = 1; i <= cntpre; i++) { + leftsum -= sum[left[pre[i]]]; + } + if (jobk <= leftsum) { + for (int i = 1; i <= cntpos; i++) { + pos[i] = left[pos[i]]; + } + for (int i = 1; i <= cntpre; i++) { + pre[i] = left[pre[i]]; + } + return queryNumber(jobk, l, mid); + } else { + for (int i = 1; i <= cntpos; i++) { + pos[i] = right[pos[i]]; + } + for (int i = 1; i <= cntpre; i++) { + pre[i] = right[pre[i]]; + } + return queryNumber(jobk - leftsum, mid + 1, r); + } + } + + public static int findNumber(int l, int r, int k) { + cntpos = cntpre = 0; + for (int i = r; i > 0; i -= lowbit(i)) { + pos[++cntpos] = root[i]; + } + for (int i = l - 1; i > 0; i -= lowbit(i)) { + pre[++cntpre] = root[i]; + } + return queryNumber(k, 1, s); + } + + public static int queryRank(int jobk, int l, int r) { + if (l == r) { + return 0; + } + int mid = (l + r) / 2; + if (jobk <= mid) { + for (int i = 1; i <= cntpos; i++) { + pos[i] = left[pos[i]]; + } + for (int i = 1; i <= cntpre; i++) { + pre[i] = left[pre[i]]; + } + return queryRank(jobk, l, mid); + } else { + int leftsum = 0; + for (int i = 1; i <= cntpos; i++) { + leftsum += sum[left[pos[i]]]; + pos[i] = right[pos[i]]; + } + for (int i = 1; i <= cntpre; i++) { + leftsum -= sum[left[pre[i]]]; + pre[i] = right[pre[i]]; + } + return leftsum + queryRank(jobk, mid + 1, r); + } + } + + public static int findRank(int l, int r, int k) { + cntpos = cntpre = 0; + for (int i = r; i > 0; i -= lowbit(i)) { + pos[++cntpos] = root[i]; + } + for (int i = l - 1; i > 0; i -= lowbit(i)) { + pre[++cntpre] = root[i]; + } + return queryRank(k, 1, s) + 1; + } + + public static int findLast(int l, int r, int k) { + int rank = findRank(l, r, k); + if (rank == 1) { + return 0; + } + return findNumber(l, r, rank - 1); + } + + public static int findNext(int l, int r, int k) { + if (k == s) { + return s + 1; + } + int rank = findRank(l, r, k + 1); + if (rank == r - l + 2) { + return s + 1; + } + return findNumber(l, r, rank); + } + + public static void prepare() { + s = 0; + for (int i = 1; i <= n; i++) { + sorted[++s] = arr[i]; + } + for (int i = 1; i <= m; i++) { + if (ques[i][0] == 3) { + sorted[++s] = ques[i][2]; + } else if (ques[i][0] != 2) { + sorted[++s] = ques[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 <= n; i++) { + arr[i] = kth(arr[i]); + add(i, 1); + } + sorted[0] = -INF; + sorted[s + 1] = INF; + } + + 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; i <= n; i++) { + in.nextToken(); + arr[i] = (int) in.nval; + } + for (int i = 1; i <= m; i++) { + in.nextToken(); + ques[i][0] = (int) in.nval; + in.nextToken(); + ques[i][1] = (int) in.nval; + in.nextToken(); + ques[i][2] = (int) in.nval; + if (ques[i][0] != 3) { + in.nextToken(); + ques[i][3] = (int) in.nval; + } + } + prepare(); + for (int i = 1; i <= m; i++) { + if (ques[i][0] == 1) { + out.println(findRank(ques[i][1], ques[i][2], kth(ques[i][3]))); + } else if (ques[i][0] == 2) { + out.println(sorted[findNumber(ques[i][1], ques[i][2], ques[i][3])]); + } else if (ques[i][0] == 3) { + add(ques[i][1], -1); + arr[ques[i][1]] = kth(ques[i][2]); + add(ques[i][1], 1); + } else if (ques[i][0] == 4) { + out.println(sorted[findLast(ques[i][1], ques[i][2], kth(ques[i][3]))]); + } else { + out.println(sorted[findNext(ques[i][1], ques[i][2], kth(ques[i][3]))]); + } + } + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class160/Code01_NestedTree2.java b/src/class160/Code01_NestedTree2.java new file mode 100644 index 000000000..a7c32d7fc --- /dev/null +++ b/src/class160/Code01_NestedTree2.java @@ -0,0 +1,213 @@ +package class160; + +// 树套树,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P3380 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 50001; +//const int MAXT = MAXN * 160; +//const int INF = INT_MAX; +//int n,m,s; +//int arr[MAXN]; +//int ques[MAXN][4]; +//int sorted[MAXN*2]; +//int root[MAXN]; +//int sum[MAXT]; +//int ls[MAXT]; +//int rs[MAXT]; +//int cntt; +//int pos[MAXN]; +//int pre[MAXN]; +//int cntpos,cntpre; +// +//int kth(int num){ +// int l=1,r=s; +// while(l<=r){ +// int mid=(l+r)>>1; +// if(sorted[mid]==num) return mid; +// if(sorted[mid]>1; +// if(idx<=mid) ls[i]=add(idx,v,L,mid,ls[i]); +// else rs[i]=add(idx,v,mid+1,R,rs[i]); +// up(i); +// } +// return i; +//} +// +//void add(int i,int v){ +// for(int j=i;j<=n;j+=lowbit(j)){ +// root[j]=add(arr[i],v,1,s,root[j]); +// } +//} +// +//int queryNumber(int k,int L,int R){ +// if(L==R) return L; +// int mid=(L+R)>>1; +// int leftsum=0; +// for(int i=1;i<=cntpos;i++){ +// leftsum+=sum[ls[pos[i]]]; +// } +// for(int i=1;i<=cntpre;i++){ +// leftsum-=sum[ls[pre[i]]]; +// } +// if(k<=leftsum){ +// for(int i=1;i<=cntpos;i++){ +// pos[i]=ls[pos[i]]; +// } +// for(int i=1;i<=cntpre;i++){ +// pre[i]=ls[pre[i]]; +// } +// return queryNumber(k,L,mid); +// } else { +// for(int i=1;i<=cntpos;i++){ +// pos[i]=rs[pos[i]]; +// } +// for(int i=1;i<=cntpre;i++){ +// pre[i]=rs[pre[i]]; +// } +// return queryNumber(k-leftsum,mid+1,R); +// } +//} +// +//int findNumber(int L,int R,int k){ +// cntpos=cntpre=0; +// for(int i=R;i>0;i-=lowbit(i)){ +// pos[++cntpos]=root[i]; +// } +// for(int i=L-1;i>0;i-=lowbit(i)){ +// pre[++cntpre]=root[i]; +// } +// return queryNumber(k,1,s); +//} +// +//int queryRank(int idx,int L,int R){ +// if(L==R) return 0; +// int mid=(L+R)>>1; +// if(idx<=mid){ +// for(int i=1;i<=cntpos;i++){ +// pos[i]=ls[pos[i]]; +// } +// for(int i=1;i<=cntpre;i++){ +// pre[i]=ls[pre[i]]; +// } +// return queryRank(idx,L,mid); +// } else { +// int leftsum=0; +// for(int i=1;i<=cntpos;i++){ +// leftsum+=sum[ls[pos[i]]]; +// pos[i]=rs[pos[i]]; +// } +// for(int i=1;i<=cntpre;i++){ +// leftsum-=sum[ls[pre[i]]]; +// pre[i]=rs[pre[i]]; +// } +// return leftsum+queryRank(idx,mid+1,R); +// } +//} +// +//int findRank(int L,int R,int val){ +// cntpos=cntpre=0; +// for(int i=R;i>0;i-=lowbit(i)){ +// pos[++cntpos]=root[i]; +// } +// for(int i=L-1;i>0;i-=lowbit(i)){ +// pre[++cntpre]=root[i]; +// } +// return queryRank(val,1,s)+1; +//} +// +//int findLast(int L,int R,int k){ +// int rk=findRank(L,R,k); +// if(rk==1) return 0; +// return findNumber(L,R,rk-1); +//} +// +//int findNext(int L,int R,int k){ +// if(k==s) return s+1; +// int rk=findRank(L,R,k+1); +// if(rk==R-L+2) return s+1; +// return findNumber(L,R,rk); +//} +// +//void prepare(){ +// s=0; +// for(int i=1;i<=n;i++){ +// sorted[++s]=arr[i]; +// } +// for(int i=1;i<=m;i++){ +// if(ques[i][0]==3){ +// sorted[++s]=ques[i][2]; +// } else if(ques[i][0]!=2){ +// sorted[++s]=ques[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<=n;i++){ +// arr[i]=kth(arr[i]); +// add(i,1); +// } +// sorted[0]=-INF; +// sorted[s+1]=INF; +//} +// +//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>>ques[i][0]>>ques[i][1]>>ques[i][2]; +// if(ques[i][0]!=3){ +// cin>>ques[i][3]; +// } +// } +// prepare(); +// for(int i=1;i<=m;i++){ +// if(ques[i][0]==1){ +// cout< Date: Sat, 8 Feb 2025 17:45:34 +0800 Subject: [PATCH 0675/2029] modify code --- ...NestedTree1.java => Code01_IndextreeWithSegmenttree1.java} | 4 ++-- ...NestedTree2.java => Code01_IndextreeWithSegmenttree2.java} | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename src/class160/{Code01_NestedTree1.java => Code01_IndextreeWithSegmenttree1.java} (98%) rename src/class160/{Code01_NestedTree2.java => Code01_IndextreeWithSegmenttree2.java} (99%) diff --git a/src/class160/Code01_NestedTree1.java b/src/class160/Code01_IndextreeWithSegmenttree1.java similarity index 98% rename from src/class160/Code01_NestedTree1.java rename to src/class160/Code01_IndextreeWithSegmenttree1.java index 75ccb5fc8..ff327b8ac 100644 --- a/src/class160/Code01_NestedTree1.java +++ b/src/class160/Code01_IndextreeWithSegmenttree1.java @@ -1,6 +1,6 @@ package class160; -// 树套树,java版 +// 树状数组套线段树,java版 // 测试链接 : https://www.luogu.com.cn/problem/P3380 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -12,7 +12,7 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class Code01_NestedTree1 { +public class Code01_IndextreeWithSegmenttree1 { public static int MAXN = 50001; diff --git a/src/class160/Code01_NestedTree2.java b/src/class160/Code01_IndextreeWithSegmenttree2.java similarity index 99% rename from src/class160/Code01_NestedTree2.java rename to src/class160/Code01_IndextreeWithSegmenttree2.java index a7c32d7fc..28ef4e6d2 100644 --- a/src/class160/Code01_NestedTree2.java +++ b/src/class160/Code01_IndextreeWithSegmenttree2.java @@ -1,6 +1,6 @@ package class160; -// 树套树,C++版 +// 树状数组套线段树,C++版 // 测试链接 : https://www.luogu.com.cn/problem/P3380 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From 2545d82d2953cc5fe33d32b152349d0ca0d51207 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 8 Feb 2025 17:58:01 +0800 Subject: [PATCH 0676/2029] modify code --- ...treeWithSegmenttree1.java => Code01_NestedTree1.java} | 4 ++-- ...treeWithSegmenttree2.java => Code01_NestedTree2.java} | 2 +- src/class160/Code02_LuckAndLove1.java | 9 +++++++++ 3 files changed, 12 insertions(+), 3 deletions(-) rename src/class160/{Code01_IndextreeWithSegmenttree1.java => Code01_NestedTree1.java} (98%) rename src/class160/{Code01_IndextreeWithSegmenttree2.java => Code01_NestedTree2.java} (99%) create mode 100644 src/class160/Code02_LuckAndLove1.java diff --git a/src/class160/Code01_IndextreeWithSegmenttree1.java b/src/class160/Code01_NestedTree1.java similarity index 98% rename from src/class160/Code01_IndextreeWithSegmenttree1.java rename to src/class160/Code01_NestedTree1.java index ff327b8ac..75ccb5fc8 100644 --- a/src/class160/Code01_IndextreeWithSegmenttree1.java +++ b/src/class160/Code01_NestedTree1.java @@ -1,6 +1,6 @@ package class160; -// 树状数组套线段树,java版 +// 树套树,java版 // 测试链接 : https://www.luogu.com.cn/problem/P3380 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -12,7 +12,7 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class Code01_IndextreeWithSegmenttree1 { +public class Code01_NestedTree1 { public static int MAXN = 50001; diff --git a/src/class160/Code01_IndextreeWithSegmenttree2.java b/src/class160/Code01_NestedTree2.java similarity index 99% rename from src/class160/Code01_IndextreeWithSegmenttree2.java rename to src/class160/Code01_NestedTree2.java index 28ef4e6d2..a7c32d7fc 100644 --- a/src/class160/Code01_IndextreeWithSegmenttree2.java +++ b/src/class160/Code01_NestedTree2.java @@ -1,6 +1,6 @@ package class160; -// 树状数组套线段树,C++版 +// 树套树,C++版 // 测试链接 : https://www.luogu.com.cn/problem/P3380 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class160/Code02_LuckAndLove1.java b/src/class160/Code02_LuckAndLove1.java new file mode 100644 index 000000000..b61c28932 --- /dev/null +++ b/src/class160/Code02_LuckAndLove1.java @@ -0,0 +1,9 @@ +package class160; + +// 线段树套线段树,java版 +// 测试链接 : https://acm.hdu.edu.cn/showproblem.php?pid=1823 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +public class Code02_LuckAndLove1 { + +} From 2978f84a27cf8c1a866d644a8f32b7061c738cfa Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 8 Feb 2025 21:39:02 +0800 Subject: [PATCH 0677/2029] modify code --- .../Code01_SegmentTreeWithSegmentTree1.java | 180 ++++++++++++++++++ .../Code01_SegmentTreeWithSegmentTree2.java | 126 ++++++++++++ ... => Code02_IndexTreeWithSegmentTree1.java} | 4 +- ... => Code02_IndexTreeWithSegmentTree2.java} | 2 +- src/class160/Code02_LuckAndLove1.java | 9 - 5 files changed, 309 insertions(+), 12 deletions(-) create mode 100644 src/class160/Code01_SegmentTreeWithSegmentTree1.java create mode 100644 src/class160/Code01_SegmentTreeWithSegmentTree2.java rename src/class160/{Code01_NestedTree1.java => Code02_IndexTreeWithSegmentTree1.java} (98%) rename src/class160/{Code01_NestedTree2.java => Code02_IndexTreeWithSegmentTree2.java} (99%) delete mode 100644 src/class160/Code02_LuckAndLove1.java diff --git a/src/class160/Code01_SegmentTreeWithSegmentTree1.java b/src/class160/Code01_SegmentTreeWithSegmentTree1.java new file mode 100644 index 000000000..2898ce5af --- /dev/null +++ b/src/class160/Code01_SegmentTreeWithSegmentTree1.java @@ -0,0 +1,180 @@ +package class160; + +// 线段树套线段树,java版 +// 测试链接 : https://acm.hdu.edu.cn/showproblem.php?pid=1823 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.util.StringTokenizer; + +public class Code01_SegmentTreeWithSegmentTree1 { + + public static int MAXH = 101; + + public static int MAXA = 1001; + + public static int n = 1000, m; + + public static int[][] tree = new int[MAXH << 2][MAXA << 2]; + + public static void ybuild(int yl, int yr, int xi, int yi) { + tree[xi][yi] = -1; + if (yl < yr) { + int mid = (yl + yr) / 2; + ybuild(yl, mid, xi, yi << 1); + ybuild(mid + 1, yr, xi, yi << 1 | 1); + } + } + + public static void build(int xl, int xr, int xi) { + ybuild(0, n, xi, 1); + if (xl < xr) { + int mid = (xl + xr) / 2; + build(xl, mid, xi << 1); + build(mid + 1, xr, xi << 1 | 1); + } + } + + public static void yupdate(int joby, int jobv, int yl, int yr, int xi, int yi) { + if (yl == yr) { + tree[xi][yi] = Math.max(tree[xi][yi], jobv); + } else { + int mid = (yl + yr) / 2; + if (joby <= mid) { + yupdate(joby, jobv, yl, mid, xi, yi << 1); + } else { + yupdate(joby, jobv, mid + 1, yr, xi, yi << 1 | 1); + } + tree[xi][yi] = Math.max(tree[xi][yi << 1], tree[xi][yi << 1 | 1]); + } + } + + public static void update(int jobx, int joby, int jobv, int xl, int xr, int xi) { + yupdate(joby, jobv, 0, n, xi, 1); + if (xl < xr) { + int mid = (xl + xr) / 2; + if (jobx <= mid) { + update(jobx, joby, jobv, xl, mid, xi << 1); + } else { + update(jobx, joby, jobv, mid + 1, xr, xi << 1 | 1); + } + } + } + + public static int yquery(int jobyl, int jobyr, int yl, int yr, int xi, int yi) { + if (jobyl <= yl && yr <= jobyr) { + return tree[xi][yi]; + } + int mid = (yl + yr) / 2; + int ans = -1; + if (jobyl <= mid) { + ans = yquery(jobyl, jobyr, yl, mid, xi, yi << 1); + + } + if (jobyr > mid) { + ans = Math.max(ans, yquery(jobyl, jobyr, mid + 1, yr, xi, yi << 1 | 1)); + } + return ans; + } + + public static int query(int jobxl, int jobxr, int jobyl, int jobyr, int xl, int xr, int xi) { + if (jobxl <= xl && xr <= jobxr) { + return yquery(jobyl, jobyr, 0, n, xi, 1); + } + int mid = (xl + xr) / 2; + int ans = -1; + if (jobxl <= mid) { + ans = query(jobxl, jobxr, jobyl, jobyr, xl, mid, xi << 1); + } + if (jobxr > mid) { + ans = Math.max(ans, query(jobxl, jobxr, jobyl, jobyr, mid + 1, xr, xi << 1 | 1)); + } + return ans; + } + + public static void main(String[] args) { + Kattio io = new Kattio(); + m = io.nextInt(); + String op; + int a, b, c, d; + while (m != 0) { + build(100, 200, 1); + for (int i = 1; i <= m; i++) { + op = io.next(); + if (op.equals("I")) { + a = io.nextInt(); + b = (int) (io.nextDouble() * 10); + c = (int) (io.nextDouble() * 10); + update(a, b, c, 100, 200, 1); + } else { + a = io.nextInt(); + b = io.nextInt(); + c = (int) (io.nextDouble() * 10); + d = (int) (io.nextDouble() * 10); + int xl = Math.min(a, b); + int xr = Math.max(a, b); + int yl = Math.min(c, d); + int yr = Math.max(c, d); + int ans = query(xl, xr, yl, yr, 100, 200, 1); + if (ans == -1) { + io.println(ans); + } else { + io.println(((double) ans) / 10); + } + } + } + m = io.nextInt(); + } + io.flush(); + io.close(); + } + + // 读写工具类 + public static class Kattio extends PrintWriter { + private BufferedReader r; + private StringTokenizer st; + + public Kattio() { + this(System.in, System.out); + } + + public Kattio(InputStream i, OutputStream o) { + super(o); + r = new BufferedReader(new InputStreamReader(i)); + } + + public Kattio(String intput, String output) throws IOException { + super(output); + r = new BufferedReader(new FileReader(intput)); + } + + public String next() { + try { + while (st == null || !st.hasMoreTokens()) + st = new StringTokenizer(r.readLine()); + return st.nextToken(); + } catch (Exception e) { + } + return null; + } + + public int nextInt() { + return Integer.parseInt(next()); + } + + public double nextDouble() { + return Double.parseDouble(next()); + } + + public long nextLong() { + return Long.parseLong(next()); + } + } + +} diff --git a/src/class160/Code01_SegmentTreeWithSegmentTree2.java b/src/class160/Code01_SegmentTreeWithSegmentTree2.java new file mode 100644 index 000000000..b8bc5a2d5 --- /dev/null +++ b/src/class160/Code01_SegmentTreeWithSegmentTree2.java @@ -0,0 +1,126 @@ +package class160; + +// 线段树套线段树,C++版 +// 测试链接 : https://acm.hdu.edu.cn/showproblem.php?pid=1823 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXH = 101; +//const int MAXA = 1001; +//int n = 1000, m; +//int tree[MAXH << 2][MAXA << 2]; +// +//void ybuild(int yl, int yr, int xi, int yi) { +// tree[xi][yi] = -1; +// if (yl < yr) { +// int mid = (yl + yr) >> 1; +// ybuild(yl, mid, xi, yi << 1); +// ybuild(mid + 1, yr, xi, yi << 1 | 1); +// } +//} +// +//void build(int xl, int xr, int xi) { +// ybuild(0, n, xi, 1); +// if (xl < xr) { +// int mid = (xl + xr) >> 1; +// build(xl, mid, xi << 1); +// build(mid + 1, xr, xi << 1 | 1); +// } +//} +// +//void yupdate(int joby, int jobv, int yl, int yr, int xi, int yi) { +// if (yl == yr) { +// tree[xi][yi] = max(tree[xi][yi], jobv); +// } else { +// int mid = (yl + yr) >> 1; +// if (joby <= mid) { +// yupdate(joby, jobv, yl, mid, xi, yi << 1); +// } else { +// yupdate(joby, jobv, mid + 1, yr, xi, yi << 1 | 1); +// } +// tree[xi][yi] = max(tree[xi][yi << 1], tree[xi][(yi << 1) | 1]); +// } +//} +// +//void update(int jobx, int joby, int jobv, int xl, int xr, int xi) { +// yupdate(joby, jobv, 0, n, xi, 1); +// if (xl < xr) { +// int mid = (xl + xr) >> 1; +// if (jobx <= mid) { +// update(jobx, joby, jobv, xl, mid, xi << 1); +// } else { +// update(jobx, joby, jobv, mid + 1, xr, xi << 1 | 1); +// } +// } +//} +// +//int yquery(int jobyl, int jobyr, int yl, int yr, int xi, int yi) { +// if (jobyl <= yl && yr <= jobyr) { +// return tree[xi][yi]; +// } +// int mid = (yl + yr) >> 1; +// int ans = -1; +// if (jobyl <= mid) { +// ans = max(ans, yquery(jobyl, jobyr, yl, mid, xi, yi << 1)); +// } +// if (jobyr > mid) { +// ans = max(ans, yquery(jobyl, jobyr, mid + 1, yr, xi, (yi << 1) | 1)); +// } +// return ans; +//} +// +//int query(int jobxl, int jobxr, int jobyl, int jobyr, int xl, int xr, int xi) { +// if (jobxl <= xl && xr <= jobxr) { +// return yquery(jobyl, jobyr, 0, n, xi, 1); +// } +// int mid = (xl + xr) >> 1; +// int ans = -1; +// if (jobxl <= mid) { +// ans = max(ans, query(jobxl, jobxr, jobyl, jobyr, xl, mid, xi << 1)); +// } +// if (jobxr > mid) { +// ans = max(ans, query(jobxl, jobxr, jobyl, jobyr, mid + 1, xr, (xi << 1) | 1)); +// } +// return ans; +//} +// +//int main() { +// scanf("%d", &m); +// while(m != 0) { +// build(100, 200, 1); +// for (int i = 0; i < m; i++) { +// char op[2]; +// scanf("%s", op); +// if (op[0] == 'I') { +// int a; +// double bd, cd; +// scanf("%d %lf %lf", &a, &bd, &cd); +// int b = (int)(bd * 10); +// int c = (int)(cd * 10); +// update(a, b, c, 100, 200, 1); +// } else { +// int a, b; +// double cd, dd; +// scanf("%d %d %lf %lf", &a, &b, &cd, &dd); +// int c = (int)(cd * 10); +// int d = (int)(dd * 10); +// int xl = min(a, b); +// int xr = max(a, b); +// int yl = min(c, d); +// int yr = max(c, d); +// int ans = query(xl, xr, yl, yr, 100, 200, 1); +// if (ans == -1) { +// printf("-1\n"); +// } else { +// printf("%.1f\n", ans / 10.0); +// } +// } +// } +// scanf("%d", &m); +// } +// return 0; +//} \ No newline at end of file diff --git a/src/class160/Code01_NestedTree1.java b/src/class160/Code02_IndexTreeWithSegmentTree1.java similarity index 98% rename from src/class160/Code01_NestedTree1.java rename to src/class160/Code02_IndexTreeWithSegmentTree1.java index 75ccb5fc8..b8b79a7d4 100644 --- a/src/class160/Code01_NestedTree1.java +++ b/src/class160/Code02_IndexTreeWithSegmentTree1.java @@ -1,6 +1,6 @@ package class160; -// 树套树,java版 +// 树状数组套线段树,java版 // 测试链接 : https://www.luogu.com.cn/problem/P3380 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -12,7 +12,7 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class Code01_NestedTree1 { +public class Code02_IndexTreeWithSegmentTree1 { public static int MAXN = 50001; diff --git a/src/class160/Code01_NestedTree2.java b/src/class160/Code02_IndexTreeWithSegmentTree2.java similarity index 99% rename from src/class160/Code01_NestedTree2.java rename to src/class160/Code02_IndexTreeWithSegmentTree2.java index a7c32d7fc..28ef4e6d2 100644 --- a/src/class160/Code01_NestedTree2.java +++ b/src/class160/Code02_IndexTreeWithSegmentTree2.java @@ -1,6 +1,6 @@ package class160; -// 树套树,C++版 +// 树状数组套线段树,C++版 // 测试链接 : https://www.luogu.com.cn/problem/P3380 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class160/Code02_LuckAndLove1.java b/src/class160/Code02_LuckAndLove1.java deleted file mode 100644 index b61c28932..000000000 --- a/src/class160/Code02_LuckAndLove1.java +++ /dev/null @@ -1,9 +0,0 @@ -package class160; - -// 线段树套线段树,java版 -// 测试链接 : https://acm.hdu.edu.cn/showproblem.php?pid=1823 -// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 - -public class Code02_LuckAndLove1 { - -} From 3bcf3a9416ab060416f6e51b4a577e5bdf850822 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 10 Feb 2025 23:51:28 +0800 Subject: [PATCH 0678/2029] modify code --- src/class160/Code03_QueryKthMaximum1.java | 193 ++++++++++++++++++++++ src/class160/Code03_QueryKthMaximum2.java | 147 ++++++++++++++++ 2 files changed, 340 insertions(+) create mode 100644 src/class160/Code03_QueryKthMaximum1.java create mode 100644 src/class160/Code03_QueryKthMaximum2.java diff --git a/src/class160/Code03_QueryKthMaximum1.java b/src/class160/Code03_QueryKthMaximum1.java new file mode 100644 index 000000000..e891d9695 --- /dev/null +++ b/src/class160/Code03_QueryKthMaximum1.java @@ -0,0 +1,193 @@ +package class160; + +// K大数查询,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P3332 +// 提交以下的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_QueryKthMaximum1 { + + public static int MAXN = 50001; + + public static int MAXT = MAXN * 230; + + public static int n, m, s; + + public static int[][] ques = new int[MAXN][4]; + + public static int[] sorted = new int[MAXN]; + + public static int[] root = new int[MAXN << 2]; + + public static int[] left = new int[MAXT]; + + public static int[] right = new int[MAXT]; + + public static long[] sum = new long[MAXT]; + + public static int[] lazy = new int[MAXT]; + + public static int cntt; + + 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 up(int i) { + sum[i] = sum[left[i]] + sum[right[i]]; + } + + public static void down(int i, int ln, int rn) { + if (lazy[i] != 0) { + if (left[i] == 0) { + left[i] = ++cntt; + } + if (right[i] == 0) { + right[i] = ++cntt; + } + sum[left[i]] += lazy[i] * ln; + lazy[left[i]] += lazy[i]; + sum[right[i]] += lazy[i] * rn; + lazy[right[i]] += lazy[i]; + lazy[i] = 0; + } + } + + public static int update(int jobl, int jobr, int l, int r, int i) { + if (i == 0) { + i = ++cntt; + } + if (jobl <= l && r <= jobr) { + sum[i] += r - l + 1; + lazy[i]++; + } else { + int mid = (l + r) / 2; + down(i, mid - l + 1, r - mid); + if (jobl <= mid) { + left[i] = update(jobl, jobr, l, mid, left[i]); + } + if (jobr > mid) { + right[i] = update(jobl, jobr, mid + 1, r, right[i]); + } + up(i); + } + return i; + } + + public static long querySum(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) / 2; + down(i, mid - l + 1, r - mid); + long ans = 0; + if (jobl <= mid) { + ans += querySum(jobl, jobr, l, mid, left[i]); + } + if (jobr > mid) { + ans += querySum(jobl, jobr, mid + 1, r, right[i]); + } + return ans; + } + + public static void add(int jobl, int jobr, int jobk, int l, int r, int i) { + root[i] = update(jobl, jobr, 1, n, root[i]); + if (l < r) { + int mid = (l + r) / 2; + if (jobk <= mid) { + add(jobl, jobr, jobk, l, mid, i << 1); + } else { + add(jobl, jobr, jobk, mid + 1, r, i << 1 | 1); + } + } + } + + public static int query(int jobl, int jobr, long jobk, int l, int r, int i) { + if (l == r) { + return l; + } + int mid = (l + r) / 2; + long rightsum = querySum(jobl, jobr, 1, n, root[i << 1 | 1]); + if (jobk > rightsum) { + return query(jobl, jobr, jobk - rightsum, l, mid, i << 1); + } else { + return query(jobl, jobr, jobk, mid + 1, r, i << 1 | 1); + } + } + + public static void prepare() { + s = 0; + for (int i = 1; i <= m; i++) { + if (ques[i][0] == 1) { + sorted[++s] = ques[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 (ques[i][0] == 1) { + ques[i][3] = kth(ques[i][3]); + } + } + } + + 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; i <= m; i++) { + in.nextToken(); + ques[i][0] = (int) in.nval; + in.nextToken(); + ques[i][1] = (int) in.nval; + in.nextToken(); + ques[i][2] = (int) in.nval; + in.nextToken(); + ques[i][3] = (int) in.nval; + } + prepare(); + for (int i = 1; i <= m; i++) { + if (ques[i][0] == 1) { + add(ques[i][1], ques[i][2], ques[i][3], 1, s, 1); + } else { + int idx = query(ques[i][1], ques[i][2], ques[i][3], 1, s, 1); + out.println(sorted[idx]); + } + } + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class160/Code03_QueryKthMaximum2.java b/src/class160/Code03_QueryKthMaximum2.java new file mode 100644 index 000000000..8fa2233c1 --- /dev/null +++ b/src/class160/Code03_QueryKthMaximum2.java @@ -0,0 +1,147 @@ +package class160; + +// K大数查询,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P3332 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 50001; +//const int MAXT = MAXN * 230; +//int n, m, s; +//int ques[MAXN][4]; +//int sorted[MAXN]; +//int root[MAXN << 2]; +//int ls[MAXT]; +//int rs[MAXT]; +//long long sum[MAXT]; +//int lazy[MAXT]; +//int cntt; +// +//int kth(int num) { +// int l = 1, r = s; +// while (l <= r) { +// int mid = (l + r) >> 1; +// if (sorted[mid] == num) { +// return mid; +// } else if (sorted[mid] < num) { +// l = mid + 1; +// } else { +// r = mid - 1; +// } +// } +// return -1; +//} +// +//void up(int i) { +// sum[i] = sum[ls[i]] + sum[rs[i]]; +//} +// +//void down(int i, int ln, int rn) { +// if (lazy[i]) { +// if (!ls[i]) ls[i] = ++cntt; +// if (!rs[i]) rs[i] = ++cntt; +// sum[ls[i]] += 1LL * lazy[i] * ln; +// lazy[ls[i]] += lazy[i]; +// sum[rs[i]] += 1LL * lazy[i] * rn; +// lazy[rs[i]] += lazy[i]; +// lazy[i] = 0; +// } +//} +// +//int update(int jobl, int jobr, int l, int r, int i) { +// if (!i) i = ++cntt; +// if (jobl <= l && r <= jobr) { +// sum[i] += (long long)(r - l + 1); +// lazy[i]++; +// } else { +// int mid = (l + r) >> 1; +// down(i, mid - l + 1, r - mid); +// if (jobl <= mid) ls[i] = update(jobl, jobr, l, mid, ls[i]); +// if (jobr > mid) rs[i] = update(jobl, jobr, mid + 1, r, rs[i]); +// up(i); +// } +// return i; +//} +// +//long long querySum(int jobl, int jobr, int l, int r, int i) { +// if (!i) return 0; +// if (jobl <= l && r <= jobr) { +// return sum[i]; +// } +// int mid = (l + r) >> 1; +// down(i, mid - l + 1, r - mid); +// long long ans = 0; +// if (jobl <= mid) ans += querySum(jobl, jobr, l, mid, ls[i]); +// if (jobr > mid) ans += querySum(jobl, jobr, mid + 1, r, rs[i]); +// return ans; +//} +// +//void add(int jobl, int jobr, int jobk, int l, int r, int i) { +// root[i] = update(jobl, jobr, 1, n, root[i]); +// if (l < r) { +// int mid = (l + r) >> 1; +// if (jobk <= mid) { +// add(jobl, jobr, jobk, l, mid, i << 1); +// } else { +// add(jobl, jobr, jobk, mid + 1, r, i << 1 | 1); +// } +// } +//} +// +//int query(int jobl, int jobr, long long jobk, int l, int r, int i) { +// if (l == r) { +// return l; +// } +// int mid = (l + r) >> 1; +// long long rightsum = querySum(jobl, jobr, 1, n, root[i << 1 | 1]); +// if (jobk > rightsum) { +// return query(jobl, jobr, jobk - rightsum, l, mid, i << 1); +// } else { +// return query(jobl, jobr, jobk, mid + 1, r, i << 1 | 1); +// } +//} +// +//void prepare() { +// s = 0; +// for (int i = 1; i <= m; i++) { +// if (ques[i][0] == 1) { +// sorted[++s] = ques[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 (ques[i][0] == 1) { +// ques[i][3] = kth(ques[i][3]); +// } +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1; i <= m; i++) { +// cin >> ques[i][0] >> ques[i][1] >> ques[i][2] >> ques[i][3]; +// } +// prepare(); +// for (int i = 1; i <= m; i++) { +// if (ques[i][0] == 1) { +// add(ques[i][1], ques[i][2], ques[i][3], 1, s, 1); +// } else { +// int idx = query(ques[i][1], ques[i][2], ques[i][3], 1, s, 1); +// cout << sorted[idx] << "\n"; +// } +// } +// return 0; +//} \ No newline at end of file From b122c52e344173959cbdcd0feae6faf41558fa1a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 10 Feb 2025 23:59:40 +0800 Subject: [PATCH 0679/2029] modify code --- src/class160/Code03_QueryKthMaximum1.java | 6 +++--- src/class160/Code03_QueryKthMaximum2.java | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/class160/Code03_QueryKthMaximum1.java b/src/class160/Code03_QueryKthMaximum1.java index e891d9695..7fa344a7e 100644 --- a/src/class160/Code03_QueryKthMaximum1.java +++ b/src/class160/Code03_QueryKthMaximum1.java @@ -24,7 +24,7 @@ public class Code03_QueryKthMaximum1 { public static int[] sorted = new int[MAXN]; - public static int[] root = new int[MAXN << 2]; + public static int[] outer = new int[MAXN << 2]; public static int[] left = new int[MAXT]; @@ -112,7 +112,7 @@ public static long querySum(int jobl, int jobr, int l, int r, int i) { } public static void add(int jobl, int jobr, int jobk, int l, int r, int i) { - root[i] = update(jobl, jobr, 1, n, root[i]); + outer[i] = update(jobl, jobr, 1, n, outer[i]); if (l < r) { int mid = (l + r) / 2; if (jobk <= mid) { @@ -128,7 +128,7 @@ public static int query(int jobl, int jobr, long jobk, int l, int r, int i) { return l; } int mid = (l + r) / 2; - long rightsum = querySum(jobl, jobr, 1, n, root[i << 1 | 1]); + long rightsum = querySum(jobl, jobr, 1, n, outer[i << 1 | 1]); if (jobk > rightsum) { return query(jobl, jobr, jobk - rightsum, l, mid, i << 1); } else { diff --git a/src/class160/Code03_QueryKthMaximum2.java b/src/class160/Code03_QueryKthMaximum2.java index 8fa2233c1..797f39e8e 100644 --- a/src/class160/Code03_QueryKthMaximum2.java +++ b/src/class160/Code03_QueryKthMaximum2.java @@ -14,7 +14,7 @@ //int n, m, s; //int ques[MAXN][4]; //int sorted[MAXN]; -//int root[MAXN << 2]; +//int outer[MAXN << 2]; //int ls[MAXT]; //int rs[MAXT]; //long long sum[MAXT]; @@ -81,7 +81,7 @@ //} // //void add(int jobl, int jobr, int jobk, int l, int r, int i) { -// root[i] = update(jobl, jobr, 1, n, root[i]); +// outer[i] = update(jobl, jobr, 1, n, outer[i]); // if (l < r) { // int mid = (l + r) >> 1; // if (jobk <= mid) { @@ -97,7 +97,7 @@ // return l; // } // int mid = (l + r) >> 1; -// long long rightsum = querySum(jobl, jobr, 1, n, root[i << 1 | 1]); +// long long rightsum = querySum(jobl, jobr, 1, n, outer[i << 1 | 1]); // if (jobk > rightsum) { // return query(jobl, jobr, jobk - rightsum, l, mid, i << 1); // } else { From 1ba7a2a034606868c98ec477f0bcbbd2ed9f652b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 14 Feb 2025 17:24:24 +0800 Subject: [PATCH 0680/2029] modify code --- src/class160/Code04_NetworkManagement1.java | 356 ++++++++++++++++++++ src/class160/Code04_NetworkManagement2.java | 189 +++++++++++ 2 files changed, 545 insertions(+) create mode 100644 src/class160/Code04_NetworkManagement1.java create mode 100644 src/class160/Code04_NetworkManagement2.java diff --git a/src/class160/Code04_NetworkManagement1.java b/src/class160/Code04_NetworkManagement1.java new file mode 100644 index 000000000..3838c132a --- /dev/null +++ b/src/class160/Code04_NetworkManagement1.java @@ -0,0 +1,356 @@ +package class160; + +// 网络管理,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P4175 +// 提交以下的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 Code04_NetworkManagement1 { + + public static int MAXN = 100001; + + public static int MAXT = MAXN * 200; + + public static int MAXH = 20; + + public static int n, m, s; + + public static int[] arr = new int[MAXN]; + + public static int[][] ques = new int[MAXN][3]; + + public static int[] sorted = new int[MAXN << 1]; + + // 链式前向星需要 + 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[] root = new int[MAXN]; + + public static int[] left = new int[MAXT]; + + public static int[] right = new int[MAXT]; + + public static int[] sum = new int[MAXT]; + + public static int cntt = 0; + + // 树上倍增需要 + public static int[] deep = new int[MAXN]; + + public static int[] size = new int[MAXN]; + + public static int[] dfn = new int[MAXN]; + + public static int[][] stjump = new int[MAXN][MAXH]; + + public static int cntd = 0; + + public static int[] pos = new int[MAXN]; + + public static int[] pre = new int[MAXN]; + + public static int cntpos; + + public static int cntpre; + + 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 = 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 int lowbit(int i) { + return i & -i; + } + + public static void up(int i) { + sum[i] = sum[left[i]] + sum[right[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] += jobv; + } else { + int mid = (l + r) / 2; + if (jobi <= mid) { + left[i] = add(jobi, jobv, l, mid, left[i]); + } else { + right[i] = add(jobi, jobv, mid + 1, r, right[i]); + } + up(i); + } + return i; + } + + public static void add(int i, int kth, int val) { + for (; i <= n; i += lowbit(i)) { + root[i] = add(kth, val, 1, s, root[i]); + } + } + + public static int queryNumber(int jobk, int l, int r) { + if (l == r) { + return l; + } + int mid = (l + r) / 2; + int leftsum = 0; + for (int i = 1; i <= cntpos; i++) { + leftsum += sum[left[pos[i]]]; + } + for (int i = 1; i <= cntpre; i++) { + leftsum -= sum[left[pre[i]]]; + } + if (jobk <= leftsum) { + for (int i = 1; i <= cntpos; i++) { + pos[i] = left[pos[i]]; + } + for (int i = 1; i <= cntpre; i++) { + pre[i] = left[pre[i]]; + } + return queryNumber(jobk, l, mid); + } else { + for (int i = 1; i <= cntpos; i++) { + pos[i] = right[pos[i]]; + } + for (int i = 1; i <= cntpre; i++) { + pre[i] = right[pre[i]]; + } + return queryNumber(jobk - leftsum, mid + 1, r); + } + } + + // dfs1是递归版,java版本提交会爆栈,C++版本不会爆栈 + public static void dfs1(int u, int fa) { + deep[u] = deep[fa] + 1; + size[u] = 1; + dfn[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); + } + } + for (int e = head[u]; e > 0; e = next[e]) { + if (to[e] != fa) { + size[u] += size[to[e]]; + } + } + } + + // dfs迭代版,都可以通过 + // 讲解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) { + deep[u] = deep[f] + 1; + size[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) { + size[u] += size[to[e]]; + } + } + } + } + } + + public static int lca(int a, int b) { + if (deep[a] < deep[b]) { + int tmp = a; + a = b; + b = tmp; + } + for (int p = MAXH - 1; p >= 0; p--) { + if (deep[stjump[a][p]] >= deep[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 prepare() { + s = 0; + for (int i = 1; i <= n; i++) { + sorted[++s] = arr[i]; + } + for (int i = 1; i <= m; i++) { + if (ques[i][0] == 0) { + sorted[++s] = ques[i][2]; + } + } + 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 <= n; i++) { + arr[i] = kth(arr[i]); + } + dfs2(); + for (int i = 1; i <= n; i++) { + add(dfn[i], arr[i], 1); + add(dfn[i] + size[i], arr[i], -1); + } + } + + public static void change(int i, int v) { + add(dfn[i], arr[i], -1); + add(dfn[i] + size[i], arr[i], 1); + arr[i] = kth(v); + add(dfn[i], arr[i], 1); + add(dfn[i] + size[i], arr[i], -1); + } + + public static int query(int x, int y, int k) { + int lca = lca(x, y); + int lcafa = stjump[lca][0]; + int num = deep[x] + deep[y] - deep[lca] - deep[lcafa]; + if (num < k) { + return -1; + } + cntpos = cntpre = 0; + for (int i = dfn[x]; i > 0; i -= lowbit(i)) { + pos[++cntpos] = root[i]; + } + for (int i = dfn[y]; i > 0; i -= lowbit(i)) { + pos[++cntpos] = root[i]; + } + for (int i = dfn[lca]; i > 0; i -= lowbit(i)) { + pre[++cntpre] = root[i]; + } + for (int i = dfn[lcafa]; i > 0; i -= lowbit(i)) { + pre[++cntpre] = root[i]; + } + return queryNumber(num - k + 1, 1, s); + } + + 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; i <= n; i++) { + in.nextToken(); + arr[i] = (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(); + ques[i][0] = (int) in.nval; + in.nextToken(); + ques[i][1] = (int) in.nval; + in.nextToken(); + ques[i][2] = (int) in.nval; + } + prepare(); + for (int i = 1; i <= m; i++) { + if (ques[i][0] == 0) { + change(ques[i][1], ques[i][2]); + } else { + int ans = query(ques[i][1], ques[i][2], ques[i][0]); + if (ans == -1) { + out.println("invalid request!"); + } else { + out.println(sorted[ans]); + } + } + } + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class160/Code04_NetworkManagement2.java b/src/class160/Code04_NetworkManagement2.java new file mode 100644 index 000000000..e37efee61 --- /dev/null +++ b/src/class160/Code04_NetworkManagement2.java @@ -0,0 +1,189 @@ +package class160; + +// 网络管理,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P4175 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +//const int MAXT = MAXN * 200; +//const int MAXH = 20; +//int n, m, s; +// +//int arr[MAXN]; +//int ques[MAXN][3]; +//int sorted[MAXN << 1]; +// +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int cntg; +// +//int root[MAXN]; +//int ls[MAXT]; +//int rs[MAXT]; +//int sum[MAXT]; +//int cntt; +// +//int deep[MAXN]; +//int size[MAXN]; +//int dfn[MAXN]; +//int stjump[MAXN][MAXH]; +//int cntd; +// +//int pos[MAXN]; +//int pre[MAXN]; +//int cntpos, cntpre; +// +//void addEdge(int u, int v) { +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// head[u] = cntg; +//} +// +//int kth(int num) { +// int ls = 1, rs = s, mid; +// while (ls <= rs) { +// mid = (ls + rs) / 2; +// if (sorted[mid] == num) return mid; +// else if (sorted[mid] < num) ls = mid + 1; +// else rs = mid - 1; +// } +// return -1; +//} +// +//int lowbit(int i) { +// return i & -i; +//} +// +//void up(int i) { +// sum[i] = sum[ls[i]] + sum[rs[i]]; +//} +// +//int add(int jobi, int jobv, int l, int r, int i) { +// if (i == 0) i = ++cntt; +// if (l == r) sum[i] += jobv; +// else { +// int mid = (l + r) / 2; +// if (jobi <= mid) ls[i] = add(jobi, jobv, l, mid, ls[i]); +// else rs[i] = add(jobi, jobv, mid + 1, r, rs[i]); +// up(i); +// } +// return i; +//} +// +//void add(int i, int kth, int val) { +// for (; i <= n; i += lowbit(i)) root[i] = add(kth, val, 1, s, root[i]); +//} +// +//int queryNumber(int jobk, int l, int r) { +// if (l == r) return l; +// int mid = (l + r) / 2; +// int leftsum = 0; +// for (int i = 1; i <= cntpos; i++) leftsum += sum[ls[pos[i]]]; +// for (int i = 1; i <= cntpre; i++) leftsum -= sum[ls[pre[i]]]; +// if (jobk <= leftsum) { +// for (int i = 1; i <= cntpos; i++) pos[i] = ls[pos[i]]; +// for (int i = 1; i <= cntpre; i++) pre[i] = ls[pre[i]]; +// return queryNumber(jobk, l, mid); +// } else { +// for (int i = 1; i <= cntpos; i++) pos[i] = rs[pos[i]]; +// for (int i = 1; i <= cntpre; i++) pre[i] = rs[pre[i]]; +// return queryNumber(jobk - leftsum, mid + 1, r); +// } +//} +// +//void dfs(int u, int fa) { +// deep[u] = deep[fa] + 1; +// size[u] = 1; +// dfn[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; e = nxt[e]) { +// 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]]; +// } +//} +// +//int lca(int a, int b) { +// if (deep[a] < deep[b]) swap(a, b); +// for (int p = MAXH - 1; p >= 0; p--) { +// if (deep[stjump[a][p]] >= deep[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 prepare() { +// s = 0; +// for (int i = 1; i <= n; i++) sorted[++s] = arr[i]; +// for (int i = 1; i <= m; i++) if (ques[i][0] == 0) sorted[++s] = ques[i][2]; +// sort(sorted + 1, sorted + s + 1); +// s = unique(sorted + 1, sorted + s + 1) - sorted - 1; +// for (int i = 1; i <= n; i++) arr[i] = kth(arr[i]); +// dfs(1, 0); +// for (int i = 1; i <= n; i++) { +// add(dfn[i], arr[i], 1); +// add(dfn[i] + size[i], arr[i], -1); +// } +//} +// +//void change(int i, int v) { +// add(dfn[i], arr[i], -1); +// add(dfn[i] + size[i], arr[i], 1); +// arr[i] = kth(v); +// add(dfn[i], arr[i], 1); +// add(dfn[i] + size[i], arr[i], -1); +//} +// +//int query(int x, int y, int k) { +// int xylca = lca(x, y); +// int lcafa = stjump[xylca][0]; +// int num = deep[x] + deep[y] - deep[xylca] - deep[lcafa]; +// if (num < k) return -1; +// cntpos = cntpre = 0; +// for (int i = dfn[x]; i; i -= lowbit(i)) pos[++cntpos] = root[i]; +// for (int i = dfn[y]; i; i -= lowbit(i)) pos[++cntpos] = root[i]; +// for (int i = dfn[xylca]; i; i -= lowbit(i)) pre[++cntpre] = root[i]; +// for (int i = dfn[lcafa]; i; i -= lowbit(i)) pre[++cntpre] = root[i]; +// return queryNumber(num - k + 1, 1, s); +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(0); +// 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); +// } +// for (int i = 1; i <= m; i++) cin >> ques[i][0] >> ques[i][1] >> ques[i][2]; +// prepare(); +// for (int i = 1; i <= m; i++) { +// if (ques[i][0] == 0) { +// change(ques[i][1], ques[i][2]); +// } else { +// int ans = query(ques[i][1], ques[i][2], ques[i][0]); +// if(ans == -1) { +// cout << "invalid request!" << "\n"; +// } else { +// cout << sorted[ans] << "\n"; +// } +// } +// } +// return 0; +//} \ No newline at end of file From 9f24d27baefea9c2a99342be05814130c63dceef Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 14 Feb 2025 17:25:51 +0800 Subject: [PATCH 0681/2029] modify code --- src/class160/Code04_NetworkManagement1.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/class160/Code04_NetworkManagement1.java b/src/class160/Code04_NetworkManagement1.java index 3838c132a..3b0a9719d 100644 --- a/src/class160/Code04_NetworkManagement1.java +++ b/src/class160/Code04_NetworkManagement1.java @@ -59,6 +59,7 @@ public class Code04_NetworkManagement1 { public static int cntd = 0; + // 查询信息需要,所有pos版本的信息和 - 所有pre版本的信息和 public static int[] pos = new int[MAXN]; public static int[] pre = new int[MAXN]; From 15696cbcbc07d0b9144bac80540224855bacb050 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 14 Feb 2025 17:33:45 +0800 Subject: [PATCH 0682/2029] modify code --- src/class160/Code04_NetworkManagement1.java | 6 +++--- src/class160/Code04_NetworkManagement2.java | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/class160/Code04_NetworkManagement1.java b/src/class160/Code04_NetworkManagement1.java index 3b0a9719d..79e221f9d 100644 --- a/src/class160/Code04_NetworkManagement1.java +++ b/src/class160/Code04_NetworkManagement1.java @@ -14,11 +14,11 @@ public class Code04_NetworkManagement1 { - public static int MAXN = 100001; + public static int MAXN = 80001; - public static int MAXT = MAXN * 200; + public static int MAXT = MAXN * 110; - public static int MAXH = 20; + public static int MAXH = 18; public static int n, m, s; diff --git a/src/class160/Code04_NetworkManagement2.java b/src/class160/Code04_NetworkManagement2.java index e37efee61..b8d014477 100644 --- a/src/class160/Code04_NetworkManagement2.java +++ b/src/class160/Code04_NetworkManagement2.java @@ -9,9 +9,9 @@ // //using namespace std; // -//const int MAXN = 100001; -//const int MAXT = MAXN * 200; -//const int MAXH = 20; +//const int MAXN = 80001; +//const int MAXT = MAXN * 110; +//const int MAXH = 18; //int n, m, s; // //int arr[MAXN]; From e725135805c8b308213c0be6ec675d1ecd14e77f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 14 Feb 2025 17:54:46 +0800 Subject: [PATCH 0683/2029] modify code --- .../Code02_IndexTreeWithSegmentTree1.java | 6 +- .../Code02_IndexTreeWithSegmentTree2.java | 255 ++++++++---------- src/class160/Code03_QueryKthMaximum2.java | 1 + src/class160/Code04_NetworkManagement1.java | 6 +- src/class160/Code04_NetworkManagement2.java | 8 +- 5 files changed, 113 insertions(+), 163 deletions(-) diff --git a/src/class160/Code02_IndexTreeWithSegmentTree1.java b/src/class160/Code02_IndexTreeWithSegmentTree1.java index b8b79a7d4..5668779b6 100644 --- a/src/class160/Code02_IndexTreeWithSegmentTree1.java +++ b/src/class160/Code02_IndexTreeWithSegmentTree1.java @@ -66,10 +66,6 @@ public static int lowbit(int i) { return i & -i; } - public static void up(int i) { - sum[i] = sum[left[i]] + sum[right[i]]; - } - public static int add(int jobi, int jobv, int l, int r, int i) { if (i == 0) { i = ++cntt; @@ -83,7 +79,7 @@ public static int add(int jobi, int jobv, int l, int r, int i) { } else { right[i] = add(jobi, jobv, mid + 1, r, right[i]); } - up(i); + sum[i] = sum[left[i]] + sum[right[i]]; } return i; } diff --git a/src/class160/Code02_IndexTreeWithSegmentTree2.java b/src/class160/Code02_IndexTreeWithSegmentTree2.java index 28ef4e6d2..89bcac3e9 100644 --- a/src/class160/Code02_IndexTreeWithSegmentTree2.java +++ b/src/class160/Code02_IndexTreeWithSegmentTree2.java @@ -12,201 +12,162 @@ //const int MAXN = 50001; //const int MAXT = MAXN * 160; //const int INF = INT_MAX; -//int n,m,s; +//int n, m, s; //int arr[MAXN]; //int ques[MAXN][4]; -//int sorted[MAXN*2]; +//int sorted[MAXN * 2]; +// //int root[MAXN]; //int sum[MAXT]; //int ls[MAXT]; //int rs[MAXT]; //int cntt; +// //int pos[MAXN]; //int pre[MAXN]; -//int cntpos,cntpre; -// -//int kth(int num){ -// int l=1,r=s; -// while(l<=r){ -// int mid=(l+r)>>1; -// if(sorted[mid]==num) return mid; -// if(sorted[mid]> 1; +// if (sorted[mid] == num) return mid; +// if (sorted[mid] < num) l = mid + 1; +// else r = mid - 1; // } // return -1; //} // -//int lowbit(int x){ -// return x&(-x); +//int lowbit(int i) { +// return i & -i; //} // -//void up(int i){ -// sum[i]=sum[ls[i]]+sum[rs[i]]; -//} -// -//int add(int idx,int v,int L,int R,int i){ -// if(!i) i=++cntt; -// if(L==R){ -// sum[i]+=v; +//int add(int jobi, int jobv, int l, int r, int i) { +// if (!i) i = ++cntt; +// if (l == r) { +// sum[i] += jobv; // } else { -// int mid=(L+R)>>1; -// if(idx<=mid) ls[i]=add(idx,v,L,mid,ls[i]); -// else rs[i]=add(idx,v,mid+1,R,rs[i]); -// up(i); +// int mid = (l + r) >> 1; +// if (jobi <= mid) ls[i] = add(jobi, jobv, l, mid, ls[i]); +// else rs[i] = add(jobi, jobv, mid + 1, r, rs[i]); +// sum[i] = sum[ls[i]] + sum[rs[i]]; // } // return i; //} // -//void add(int i,int v){ -// for(int j=i;j<=n;j+=lowbit(j)){ -// root[j]=add(arr[i],v,1,s,root[j]); +//void add(int i, int v) { +// for (int j = i; j <= n; j += lowbit(j)) { +// root[j] = add(arr[i], v, 1, s, root[j]); // } //} // -//int queryNumber(int k,int L,int R){ -// if(L==R) return L; -// int mid=(L+R)>>1; -// int leftsum=0; -// for(int i=1;i<=cntpos;i++){ -// leftsum+=sum[ls[pos[i]]]; -// } -// for(int i=1;i<=cntpre;i++){ -// leftsum-=sum[ls[pre[i]]]; -// } -// if(k<=leftsum){ -// for(int i=1;i<=cntpos;i++){ -// pos[i]=ls[pos[i]]; -// } -// for(int i=1;i<=cntpre;i++){ -// pre[i]=ls[pre[i]]; -// } -// return queryNumber(k,L,mid); +//int queryNumber(int jobk, int l, int r) { +// if (l == r) return l; +// int mid = (l + r) >> 1; +// int leftsum = 0; +// for (int i = 1; i <= cntpos; i++) leftsum += sum[ls[pos[i]]]; +// for (int i = 1; i <= cntpre; i++) leftsum -= sum[ls[pre[i]]]; +// +// if (jobk <= leftsum) { +// for (int i = 1; i <= cntpos; i++) pos[i] = ls[pos[i]]; +// for (int i = 1; i <= cntpre; i++) pre[i] = ls[pre[i]]; +// return queryNumber(jobk, l, mid); // } else { -// for(int i=1;i<=cntpos;i++){ -// pos[i]=rs[pos[i]]; -// } -// for(int i=1;i<=cntpre;i++){ -// pre[i]=rs[pre[i]]; -// } -// return queryNumber(k-leftsum,mid+1,R); +// for (int i = 1; i <= cntpos; i++) pos[i] = rs[pos[i]]; +// for (int i = 1; i <= cntpre; i++) pre[i] = rs[pre[i]]; +// return queryNumber(jobk - leftsum, mid + 1, r); // } //} // -//int findNumber(int L,int R,int k){ -// cntpos=cntpre=0; -// for(int i=R;i>0;i-=lowbit(i)){ -// pos[++cntpos]=root[i]; -// } -// for(int i=L-1;i>0;i-=lowbit(i)){ -// pre[++cntpre]=root[i]; -// } -// return queryNumber(k,1,s); +//int findNumber(int l, int r, int k) { +// cntpos = cntpre = 0; +// for (int i = r; i > 0; i -= lowbit(i)) pos[++cntpos] = root[i]; +// for (int i = l - 1; i > 0; i -= lowbit(i)) pre[++cntpre] = root[i]; +// return queryNumber(k, 1, s); //} // -//int queryRank(int idx,int L,int R){ -// if(L==R) return 0; -// int mid=(L+R)>>1; -// if(idx<=mid){ -// for(int i=1;i<=cntpos;i++){ -// pos[i]=ls[pos[i]]; -// } -// for(int i=1;i<=cntpre;i++){ -// pre[i]=ls[pre[i]]; -// } -// return queryRank(idx,L,mid); +//int queryRank(int jobi, int l, int r) { +// if (l == r) return 0; +// int mid = (l + r) >> 1; +// if (jobi <= mid) { +// for (int i = 1; i <= cntpos; i++) pos[i] = ls[pos[i]]; +// for (int i = 1; i <= cntpre; i++) pre[i] = ls[pre[i]]; +// return queryRank(jobi, l, mid); // } else { -// int leftsum=0; -// for(int i=1;i<=cntpos;i++){ -// leftsum+=sum[ls[pos[i]]]; -// pos[i]=rs[pos[i]]; +// int leftsum = 0; +// for (int i = 1; i <= cntpos; i++) { +// leftsum += sum[ls[pos[i]]]; +// pos[i] = rs[pos[i]]; // } -// for(int i=1;i<=cntpre;i++){ -// leftsum-=sum[ls[pre[i]]]; -// pre[i]=rs[pre[i]]; +// for (int i = 1; i <= cntpre; i++) { +// leftsum -= sum[ls[pre[i]]]; +// pre[i] = rs[pre[i]]; // } -// return leftsum+queryRank(idx,mid+1,R); +// return leftsum + queryRank(jobi, mid + 1, r); // } //} // -//int findRank(int L,int R,int val){ -// cntpos=cntpre=0; -// for(int i=R;i>0;i-=lowbit(i)){ -// pos[++cntpos]=root[i]; -// } -// for(int i=L-1;i>0;i-=lowbit(i)){ -// pre[++cntpre]=root[i]; -// } -// return queryRank(val,1,s)+1; +//int findRank(int l, int r, int k) { +// cntpos = cntpre = 0; +// for (int i = r; i > 0; i -= lowbit(i)) pos[++cntpos] = root[i]; +// for (int i = l - 1; i > 0; i -= lowbit(i)) pre[++cntpre] = root[i]; +// return queryRank(k, 1, s) + 1; //} // -//int findLast(int L,int R,int k){ -// int rk=findRank(L,R,k); -// if(rk==1) return 0; -// return findNumber(L,R,rk-1); +//int findLast(int l, int r, int k) { +// int rk = findRank(l, r, k); +// return (rk == 1) ? 0 : findNumber(l, r, rk - 1); //} // -//int findNext(int L,int R,int k){ -// if(k==s) return s+1; -// int rk=findRank(L,R,k+1); -// if(rk==R-L+2) return s+1; -// return findNumber(L,R,rk); +//int findNext(int l, int r, int k) { +// if (k == s) return s + 1; +// int rk = findRank(l, r, k + 1); +// return (rk == r - l + 2) ? s + 1 : findNumber(l, r, rk); //} // -//void prepare(){ -// s=0; -// for(int i=1;i<=n;i++){ -// sorted[++s]=arr[i]; -// } -// for(int i=1;i<=m;i++){ -// if(ques[i][0]==3){ -// sorted[++s]=ques[i][2]; -// } else if(ques[i][0]!=2){ -// sorted[++s]=ques[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<=n;i++){ -// arr[i]=kth(arr[i]); -// add(i,1); -// } -// sorted[0]=-INF; -// sorted[s+1]=INF; +//void prepare() { +// s = 0; +// for (int i = 1; i <= n; i++) sorted[++s] = arr[i]; +// for (int i = 1; i <= m; i++) { +// if (ques[i][0] == 3) sorted[++s] = ques[i][2]; +// else if (ques[i][0] != 2) sorted[++s] = ques[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 <= n; i++) { +// arr[i] = kth(arr[i]); +// add(i, 1); +// } +// sorted[0] = -INF; +// sorted[s + 1] = INF; //} // -//int main(){ +//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>>ques[i][0]>>ques[i][1]>>ques[i][2]; -// if(ques[i][0]!=3){ -// cin>>ques[i][3]; -// } +// cin >> n >> m; +// for (int i = 1; i <= n; i++) cin >> arr[i]; +// for (int i = 1; i <= m; i++) { +// cin >> ques[i][0] >> ques[i][1] >> ques[i][2]; +// if (ques[i][0] != 3) cin >> ques[i][3]; // } // prepare(); -// for(int i=1;i<=m;i++){ -// if(ques[i][0]==1){ -// cout<> n >> m; // for (int i = 1; i <= n; i++) cin >> arr[i]; // for (int i = 1, u, v; i < n; i++) { From cea63516cc926ac1e814ed3e41c32b960a924d6e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 15 Feb 2025 20:07:25 +0800 Subject: [PATCH 0684/2029] modify code --- ...ode03_QueryKthMaximum1.java => Code02_QueryKthMaximum1.java} | 2 +- ...ode03_QueryKthMaximum2.java => Code02_QueryKthMaximum2.java} | 0 ...hSegmentTree1.java => Code03_IndexTreeWithSegmentTree1.java} | 2 +- ...hSegmentTree2.java => Code03_IndexTreeWithSegmentTree2.java} | 0 ...4_NetworkManagement1.java => Code05_NetworkManagement1.java} | 2 +- ...4_NetworkManagement2.java => Code05_NetworkManagement2.java} | 0 6 files changed, 3 insertions(+), 3 deletions(-) rename src/class160/{Code03_QueryKthMaximum1.java => Code02_QueryKthMaximum1.java} (99%) rename src/class160/{Code03_QueryKthMaximum2.java => Code02_QueryKthMaximum2.java} (100%) rename src/class160/{Code02_IndexTreeWithSegmentTree1.java => Code03_IndexTreeWithSegmentTree1.java} (99%) rename src/class160/{Code02_IndexTreeWithSegmentTree2.java => Code03_IndexTreeWithSegmentTree2.java} (100%) rename src/class160/{Code04_NetworkManagement1.java => Code05_NetworkManagement1.java} (99%) rename src/class160/{Code04_NetworkManagement2.java => Code05_NetworkManagement2.java} (100%) diff --git a/src/class160/Code03_QueryKthMaximum1.java b/src/class160/Code02_QueryKthMaximum1.java similarity index 99% rename from src/class160/Code03_QueryKthMaximum1.java rename to src/class160/Code02_QueryKthMaximum1.java index 7fa344a7e..b22ab5622 100644 --- a/src/class160/Code03_QueryKthMaximum1.java +++ b/src/class160/Code02_QueryKthMaximum1.java @@ -12,7 +12,7 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class Code03_QueryKthMaximum1 { +public class Code02_QueryKthMaximum1 { public static int MAXN = 50001; diff --git a/src/class160/Code03_QueryKthMaximum2.java b/src/class160/Code02_QueryKthMaximum2.java similarity index 100% rename from src/class160/Code03_QueryKthMaximum2.java rename to src/class160/Code02_QueryKthMaximum2.java diff --git a/src/class160/Code02_IndexTreeWithSegmentTree1.java b/src/class160/Code03_IndexTreeWithSegmentTree1.java similarity index 99% rename from src/class160/Code02_IndexTreeWithSegmentTree1.java rename to src/class160/Code03_IndexTreeWithSegmentTree1.java index 5668779b6..daf93c7b5 100644 --- a/src/class160/Code02_IndexTreeWithSegmentTree1.java +++ b/src/class160/Code03_IndexTreeWithSegmentTree1.java @@ -12,7 +12,7 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class Code02_IndexTreeWithSegmentTree1 { +public class Code03_IndexTreeWithSegmentTree1 { public static int MAXN = 50001; diff --git a/src/class160/Code02_IndexTreeWithSegmentTree2.java b/src/class160/Code03_IndexTreeWithSegmentTree2.java similarity index 100% rename from src/class160/Code02_IndexTreeWithSegmentTree2.java rename to src/class160/Code03_IndexTreeWithSegmentTree2.java diff --git a/src/class160/Code04_NetworkManagement1.java b/src/class160/Code05_NetworkManagement1.java similarity index 99% rename from src/class160/Code04_NetworkManagement1.java rename to src/class160/Code05_NetworkManagement1.java index 1f431d142..eafceab1f 100644 --- a/src/class160/Code04_NetworkManagement1.java +++ b/src/class160/Code05_NetworkManagement1.java @@ -12,7 +12,7 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class Code04_NetworkManagement1 { +public class Code05_NetworkManagement1 { public static int MAXN = 80001; diff --git a/src/class160/Code04_NetworkManagement2.java b/src/class160/Code05_NetworkManagement2.java similarity index 100% rename from src/class160/Code04_NetworkManagement2.java rename to src/class160/Code05_NetworkManagement2.java From 789bf1d4995f56da3e096c02cdf0e0f8da1082e5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 15 Feb 2025 21:51:15 +0800 Subject: [PATCH 0685/2029] modify code --- src/class160/Code04_LineUp1.java | 188 +++++++++++++++++++++++++++++++ src/class160/Code04_LineUp2.java | 121 ++++++++++++++++++++ 2 files changed, 309 insertions(+) create mode 100644 src/class160/Code04_LineUp1.java create mode 100644 src/class160/Code04_LineUp2.java diff --git a/src/class160/Code04_LineUp1.java b/src/class160/Code04_LineUp1.java new file mode 100644 index 000000000..23001bcd6 --- /dev/null +++ b/src/class160/Code04_LineUp1.java @@ -0,0 +1,188 @@ +package class160; + +// 排队,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P1975 +// 提交以下的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 Code04_LineUp1 { + + public static int MAXN = 20001; + + public static int MAXT = MAXN * 80; + + public static int INF = 1000000001; + + public static int n, m, s; + + public static int[] arr = new int[MAXN]; + + public static int[] sorted = new int[MAXN + 2]; + + public static int[] root = new int[MAXN]; + + public static int[] left = new int[MAXT]; + + public static int[] right = new int[MAXT]; + + public static int[] sum = new int[MAXT]; + + public static int cnt = 0; + + public static int ans = 0; + + 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 int lowbit(int i) { + return i & -i; + } + + public static int add(int jobi, int jobv, int l, int r, int i) { + if (i == 0) { + i = ++cnt; + } + if (l == r) { + sum[i] += jobv; + } else { + int mid = (l + r) / 2; + if (jobi <= mid) { + left[i] = add(jobi, jobv, l, mid, left[i]); + } else { + right[i] = add(jobi, jobv, mid + 1, r, right[i]); + } + sum[i] = sum[left[i]] + sum[right[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) / 2; + int ans = 0; + if (jobl <= mid) { + ans += query(jobl, jobr, l, mid, left[i]); + } + if (jobr > mid) { + ans += query(jobl, jobr, mid + 1, r, right[i]); + } + return ans; + } + + public static void insert(int i, int v) { + for (int j = i; j <= n; j += lowbit(j)) { + root[j] = add(arr[i], v, 1, s, root[j]); + } + } + + public static int queryCnt(int al, int ar, int numl, int numr) { + int ans = 0; + for (int i = ar; i > 0; i -= lowbit(i)) { + ans += query(numl, numr, 1, s, root[i]); + } + for (int i = al - 1; i > 0; i -= lowbit(i)) { + ans -= query(numl, numr, 1, s, root[i]); + } + return ans; + } + + public static void prepare() { + s = 0; + for (int i = 1; i <= n; i++) { + sorted[++s] = arr[i]; + } + sorted[++s] = -INF; + sorted[++s] = INF; + 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 <= n; i++) { + arr[i] = kth(arr[i]); + insert(i, 1); + } + } + + public static void compute(int a, int b) { + ans -= queryCnt(a + 1, b - 1, 1, arr[a] - 1); + ans += queryCnt(a + 1, b - 1, arr[a] + 1, s); + ans -= queryCnt(a + 1, b - 1, arr[b] + 1, s); + ans += queryCnt(a + 1, b - 1, 1, arr[b] - 1); + if (arr[a] < arr[b]) { + ans++; + } else if (arr[a] > arr[b]) { + ans--; + } + insert(a, -1); + insert(b, -1); + int tmp = arr[a]; + arr[a] = arr[b]; + arr[b] = tmp; + insert(a, 1); + insert(b, 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)); + in.nextToken(); + n = (int) in.nval; + for (int i = 1; i <= n; i++) { + in.nextToken(); + arr[i] = (int) in.nval; + } + prepare(); + for (int i = 2; i <= n; i++) { + ans += queryCnt(1, i - 1, arr[i] + 1, s); + } + out.println(ans); + in.nextToken(); + m = (int) in.nval; + for (int i = 1, a, b; i <= m; i++) { + in.nextToken(); + a = (int) in.nval; + in.nextToken(); + b = (int) in.nval; + if (a > b) { + int tmp = a; + a = b; + b = tmp; + } + compute(a, b); + out.println(ans); + } + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class160/Code04_LineUp2.java b/src/class160/Code04_LineUp2.java new file mode 100644 index 000000000..a941c58f9 --- /dev/null +++ b/src/class160/Code04_LineUp2.java @@ -0,0 +1,121 @@ +package class160; + +// 排队,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P1975 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 20001; +//const int MAXT = MAXN * 80; +//const int INF = 1000000001; +//int n, m, s; +//int arr[MAXN]; +//int sorted[MAXN + 2]; +//int root[MAXN]; +//int ls[MAXT]; +//int rs[MAXT]; +//int sum[MAXT]; +//int cnt = 0; +//int ans = 0; +// +//int kth(int num) { +// int l = 1, r = s, mid; +// while (l <= r) { +// mid = (l + r) / 2; +// if (sorted[mid] == num) return mid; +// else if (sorted[mid] < num) l = mid + 1; +// else r = mid - 1; +// } +// return -1; +//} +// +//int lowbit(int i) { +// return i & -i; +//} +// +//int add(int jobi, int jobv, int l, int r, int i) { +// if (i == 0) i = ++cnt; +// if (l == r) sum[i] += jobv; +// else { +// int mid = (l + r) / 2; +// if (jobi <= mid) ls[i] = add(jobi, jobv, l, mid, ls[i]); +// else rs[i] = add(jobi, jobv, 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) / 2, res = 0; +// if (jobl <= mid) res += query(jobl, jobr, l, mid, ls[i]); +// if (jobr > mid) res += query(jobl, jobr, mid + 1, r, rs[i]); +// return res; +//} +// +//void insert(int i, int v) { +// for (int j = i; j <= n; j += lowbit(j)) { +// root[j] = add(arr[i], v, 1, s, root[j]); +// } +//} +// +//int queryCnt(int al, int ar, int numl, int numr) { +// int res = 0; +// for (int i = ar; i > 0; i -= lowbit(i)) res += query(numl, numr, 1, s, root[i]); +// for (int i = al - 1; i > 0; i -= lowbit(i)) res -= query(numl, numr, 1, s, root[i]); +// return res; +//} +// +//void prepare() { +// s = 0; +// for (int i = 1; i <= n; i++) sorted[++s] = arr[i]; +// sorted[++s] = -INF; +// sorted[++s] = INF; +// 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 <= n; i++) { +// arr[i] = kth(arr[i]); +// insert(i, 1); +// } +//} +// +//void compute(int a, int b) { +// ans -= queryCnt(a + 1, b - 1, 1, arr[a] - 1); +// ans += queryCnt(a + 1, b - 1, arr[a] + 1, s); +// ans -= queryCnt(a + 1, b - 1, arr[b] + 1, s); +// ans += queryCnt(a + 1, b - 1, 1, arr[b] - 1); +// if (arr[a] < arr[b]) ans++; +// else if (arr[a] > arr[b]) ans--; +// insert(a, -1); +// insert(b, -1); +// swap(arr[a], arr[b]); +// insert(a, 1); +// insert(b, 1); +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n; +// for (int i = 1; i <= n; i++) cin >> arr[i]; +// prepare(); +// for (int i = 2; i <= n; i++) ans += queryCnt(1, i - 1, arr[i] + 1, s); +// cout << ans << '\n'; +// cin >> m; +// for (int i = 1, a, b; i <= m; i++) { +// cin >> a >> b; +// if (a > b) swap(a, b); +// compute(a, b); +// cout << ans << '\n'; +// } +// return 0; +//} \ No newline at end of file From d4d1be6bad16dc517c08a3355444356360a743aa Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 15 Feb 2025 22:25:09 +0800 Subject: [PATCH 0686/2029] modify code --- .../Code03_IndexTreeWithSegmentTree1.java | 16 +++++++--------- .../Code03_IndexTreeWithSegmentTree2.java | 17 +++++++---------- 2 files changed, 14 insertions(+), 19 deletions(-) diff --git a/src/class160/Code03_IndexTreeWithSegmentTree1.java b/src/class160/Code03_IndexTreeWithSegmentTree1.java index daf93c7b5..ed04e2d14 100644 --- a/src/class160/Code03_IndexTreeWithSegmentTree1.java +++ b/src/class160/Code03_IndexTreeWithSegmentTree1.java @@ -129,7 +129,7 @@ public static int findNumber(int l, int r, int k) { for (int i = l - 1; i > 0; i -= lowbit(i)) { pre[++cntpre] = root[i]; } - return queryNumber(k, 1, s); + return sorted[queryNumber(k, 1, s)]; } public static int queryRank(int jobk, int l, int r) { @@ -173,18 +173,18 @@ public static int findRank(int l, int r, int k) { public static int findLast(int l, int r, int k) { int rank = findRank(l, r, k); if (rank == 1) { - return 0; + return -INF; } return findNumber(l, r, rank - 1); } public static int findNext(int l, int r, int k) { if (k == s) { - return s + 1; + return INF; } int rank = findRank(l, r, k + 1); if (rank == r - l + 2) { - return s + 1; + return INF; } return findNumber(l, r, rank); } @@ -213,8 +213,6 @@ public static void prepare() { arr[i] = kth(arr[i]); add(i, 1); } - sorted[0] = -INF; - sorted[s + 1] = INF; } public static void main(String[] args) throws IOException { @@ -246,15 +244,15 @@ public static void main(String[] args) throws IOException { if (ques[i][0] == 1) { out.println(findRank(ques[i][1], ques[i][2], kth(ques[i][3]))); } else if (ques[i][0] == 2) { - out.println(sorted[findNumber(ques[i][1], ques[i][2], ques[i][3])]); + out.println(findNumber(ques[i][1], ques[i][2], ques[i][3])); } else if (ques[i][0] == 3) { add(ques[i][1], -1); arr[ques[i][1]] = kth(ques[i][2]); add(ques[i][1], 1); } else if (ques[i][0] == 4) { - out.println(sorted[findLast(ques[i][1], ques[i][2], kth(ques[i][3]))]); + out.println(findLast(ques[i][1], ques[i][2], kth(ques[i][3]))); } else { - out.println(sorted[findNext(ques[i][1], ques[i][2], kth(ques[i][3]))]); + out.println(findNext(ques[i][1], ques[i][2], kth(ques[i][3]))); } } out.flush(); diff --git a/src/class160/Code03_IndexTreeWithSegmentTree2.java b/src/class160/Code03_IndexTreeWithSegmentTree2.java index 89bcac3e9..e692fe066 100644 --- a/src/class160/Code03_IndexTreeWithSegmentTree2.java +++ b/src/class160/Code03_IndexTreeWithSegmentTree2.java @@ -67,7 +67,6 @@ // int leftsum = 0; // for (int i = 1; i <= cntpos; i++) leftsum += sum[ls[pos[i]]]; // for (int i = 1; i <= cntpre; i++) leftsum -= sum[ls[pre[i]]]; -// // if (jobk <= leftsum) { // for (int i = 1; i <= cntpos; i++) pos[i] = ls[pos[i]]; // for (int i = 1; i <= cntpre; i++) pre[i] = ls[pre[i]]; @@ -83,7 +82,7 @@ // cntpos = cntpre = 0; // for (int i = r; i > 0; i -= lowbit(i)) pos[++cntpos] = root[i]; // for (int i = l - 1; i > 0; i -= lowbit(i)) pre[++cntpre] = root[i]; -// return queryNumber(k, 1, s); +// return sorted[queryNumber(k, 1, s)]; //} // //int queryRank(int jobi, int l, int r) { @@ -116,13 +115,13 @@ // //int findLast(int l, int r, int k) { // int rk = findRank(l, r, k); -// return (rk == 1) ? 0 : findNumber(l, r, rk - 1); +// return (rk == 1) ? -INF : findNumber(l, r, rk - 1); //} // //int findNext(int l, int r, int k) { -// if (k == s) return s + 1; +// if (k == s) return INF; // int rk = findRank(l, r, k + 1); -// return (rk == r - l + 2) ? s + 1 : findNumber(l, r, rk); +// return (rk == r - l + 2) ? INF : findNumber(l, r, rk); //} // //void prepare() { @@ -141,8 +140,6 @@ // arr[i] = kth(arr[i]); // add(i, 1); // } -// sorted[0] = -INF; -// sorted[s + 1] = INF; //} // //int main() { @@ -159,15 +156,15 @@ // if (ques[i][0] == 1) { // cout << findRank(ques[i][1], ques[i][2], kth(ques[i][3])) << "\n"; // } else if (ques[i][0] == 2) { -// cout << sorted[findNumber(ques[i][1], ques[i][2], ques[i][3])] << "\n"; +// cout << findNumber(ques[i][1], ques[i][2], ques[i][3]) << "\n"; // } else if (ques[i][0] == 3) { // add(ques[i][1], -1); // arr[ques[i][1]] = kth(ques[i][2]); // add(ques[i][1], 1); // } else if (ques[i][0] == 4) { -// cout << sorted[findLast(ques[i][1], ques[i][2], kth(ques[i][3]))] << "\n"; +// cout << findLast(ques[i][1], ques[i][2], kth(ques[i][3])) << "\n"; // } else { -// cout << sorted[findNext(ques[i][1], ques[i][2], kth(ques[i][3]))] << "\n"; +// cout << findNext(ques[i][1], ques[i][2], kth(ques[i][3])) << "\n"; // } // } // return 0; From 1c2a0e2677619995d728dcb884359a1baf7ec0af Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 17 Feb 2025 13:28:34 +0800 Subject: [PATCH 0687/2029] modify code --- ...SegmentTree1.java => Code01_SegmentWithSegment1.java} | 2 +- ...SegmentTree2.java => Code01_SegmentWithSegment2.java} | 0 src/class160/Code03_SegmentWithBalanced1.java | 9 +++++++++ ...thSegmentTree1.java => Code04_IndexWithSegment1.java} | 2 +- ...thSegmentTree2.java => Code04_IndexWithSegment2.java} | 0 .../{Code04_LineUp1.java => Code05_LineUp1.java} | 2 +- .../{Code04_LineUp2.java => Code05_LineUp2.java} | 0 ...rkManagement1.java => Code06_NetworkManagement1.java} | 2 +- ...rkManagement2.java => Code06_NetworkManagement2.java} | 0 9 files changed, 13 insertions(+), 4 deletions(-) rename src/class160/{Code01_SegmentTreeWithSegmentTree1.java => Code01_SegmentWithSegment1.java} (98%) rename src/class160/{Code01_SegmentTreeWithSegmentTree2.java => Code01_SegmentWithSegment2.java} (100%) create mode 100644 src/class160/Code03_SegmentWithBalanced1.java rename src/class160/{Code03_IndexTreeWithSegmentTree1.java => Code04_IndexWithSegment1.java} (99%) rename src/class160/{Code03_IndexTreeWithSegmentTree2.java => Code04_IndexWithSegment2.java} (100%) rename src/class160/{Code04_LineUp1.java => Code05_LineUp1.java} (99%) rename src/class160/{Code04_LineUp2.java => Code05_LineUp2.java} (100%) rename src/class160/{Code05_NetworkManagement1.java => Code06_NetworkManagement1.java} (99%) rename src/class160/{Code05_NetworkManagement2.java => Code06_NetworkManagement2.java} (100%) diff --git a/src/class160/Code01_SegmentTreeWithSegmentTree1.java b/src/class160/Code01_SegmentWithSegment1.java similarity index 98% rename from src/class160/Code01_SegmentTreeWithSegmentTree1.java rename to src/class160/Code01_SegmentWithSegment1.java index 2898ce5af..0e8a2cf60 100644 --- a/src/class160/Code01_SegmentTreeWithSegmentTree1.java +++ b/src/class160/Code01_SegmentWithSegment1.java @@ -13,7 +13,7 @@ import java.io.PrintWriter; import java.util.StringTokenizer; -public class Code01_SegmentTreeWithSegmentTree1 { +public class Code01_SegmentWithSegment1 { public static int MAXH = 101; diff --git a/src/class160/Code01_SegmentTreeWithSegmentTree2.java b/src/class160/Code01_SegmentWithSegment2.java similarity index 100% rename from src/class160/Code01_SegmentTreeWithSegmentTree2.java rename to src/class160/Code01_SegmentWithSegment2.java diff --git a/src/class160/Code03_SegmentWithBalanced1.java b/src/class160/Code03_SegmentWithBalanced1.java new file mode 100644 index 000000000..43addba20 --- /dev/null +++ b/src/class160/Code03_SegmentWithBalanced1.java @@ -0,0 +1,9 @@ +package class160; + +// 线段树套平衡树,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P3380 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +public class Code03_SegmentWithBalanced1 { + +} diff --git a/src/class160/Code03_IndexTreeWithSegmentTree1.java b/src/class160/Code04_IndexWithSegment1.java similarity index 99% rename from src/class160/Code03_IndexTreeWithSegmentTree1.java rename to src/class160/Code04_IndexWithSegment1.java index ed04e2d14..29b5f69dc 100644 --- a/src/class160/Code03_IndexTreeWithSegmentTree1.java +++ b/src/class160/Code04_IndexWithSegment1.java @@ -12,7 +12,7 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class Code03_IndexTreeWithSegmentTree1 { +public class Code04_IndexWithSegment1 { public static int MAXN = 50001; diff --git a/src/class160/Code03_IndexTreeWithSegmentTree2.java b/src/class160/Code04_IndexWithSegment2.java similarity index 100% rename from src/class160/Code03_IndexTreeWithSegmentTree2.java rename to src/class160/Code04_IndexWithSegment2.java diff --git a/src/class160/Code04_LineUp1.java b/src/class160/Code05_LineUp1.java similarity index 99% rename from src/class160/Code04_LineUp1.java rename to src/class160/Code05_LineUp1.java index 23001bcd6..4c03c4887 100644 --- a/src/class160/Code04_LineUp1.java +++ b/src/class160/Code05_LineUp1.java @@ -12,7 +12,7 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class Code04_LineUp1 { +public class Code05_LineUp1 { public static int MAXN = 20001; diff --git a/src/class160/Code04_LineUp2.java b/src/class160/Code05_LineUp2.java similarity index 100% rename from src/class160/Code04_LineUp2.java rename to src/class160/Code05_LineUp2.java diff --git a/src/class160/Code05_NetworkManagement1.java b/src/class160/Code06_NetworkManagement1.java similarity index 99% rename from src/class160/Code05_NetworkManagement1.java rename to src/class160/Code06_NetworkManagement1.java index eafceab1f..6322abb3c 100644 --- a/src/class160/Code05_NetworkManagement1.java +++ b/src/class160/Code06_NetworkManagement1.java @@ -12,7 +12,7 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class Code05_NetworkManagement1 { +public class Code06_NetworkManagement1 { public static int MAXN = 80001; diff --git a/src/class160/Code05_NetworkManagement2.java b/src/class160/Code06_NetworkManagement2.java similarity index 100% rename from src/class160/Code05_NetworkManagement2.java rename to src/class160/Code06_NetworkManagement2.java From ea3116118096a00ed36f67ab366d60551f310d84 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 17 Feb 2025 17:01:19 +0800 Subject: [PATCH 0688/2029] modify code --- src/class160/Code02_QueryKthMaximum1.java | 6 +- src/class160/Code02_QueryKthMaximum2.java | 6 +- src/class160/Code03_SegmentWithBalanced1.java | 310 ++++++++++++++++++ 3 files changed, 316 insertions(+), 6 deletions(-) diff --git a/src/class160/Code02_QueryKthMaximum1.java b/src/class160/Code02_QueryKthMaximum1.java index b22ab5622..0acf61836 100644 --- a/src/class160/Code02_QueryKthMaximum1.java +++ b/src/class160/Code02_QueryKthMaximum1.java @@ -24,7 +24,7 @@ public class Code02_QueryKthMaximum1 { public static int[] sorted = new int[MAXN]; - public static int[] outer = new int[MAXN << 2]; + public static int[] root = new int[MAXN << 2]; public static int[] left = new int[MAXT]; @@ -112,7 +112,7 @@ public static long querySum(int jobl, int jobr, int l, int r, int i) { } public static void add(int jobl, int jobr, int jobk, int l, int r, int i) { - outer[i] = update(jobl, jobr, 1, n, outer[i]); + root[i] = update(jobl, jobr, 1, n, root[i]); if (l < r) { int mid = (l + r) / 2; if (jobk <= mid) { @@ -128,7 +128,7 @@ public static int query(int jobl, int jobr, long jobk, int l, int r, int i) { return l; } int mid = (l + r) / 2; - long rightsum = querySum(jobl, jobr, 1, n, outer[i << 1 | 1]); + long rightsum = querySum(jobl, jobr, 1, n, root[i << 1 | 1]); if (jobk > rightsum) { return query(jobl, jobr, jobk - rightsum, l, mid, i << 1); } else { diff --git a/src/class160/Code02_QueryKthMaximum2.java b/src/class160/Code02_QueryKthMaximum2.java index 39d17cb50..60c74019a 100644 --- a/src/class160/Code02_QueryKthMaximum2.java +++ b/src/class160/Code02_QueryKthMaximum2.java @@ -15,7 +15,7 @@ //int ques[MAXN][4]; //int sorted[MAXN]; // -//int outer[MAXN << 2]; +//int root[MAXN << 2]; //int ls[MAXT]; //int rs[MAXT]; //long long sum[MAXT]; @@ -82,7 +82,7 @@ //} // //void add(int jobl, int jobr, int jobk, int l, int r, int i) { -// outer[i] = update(jobl, jobr, 1, n, outer[i]); +// root[i] = update(jobl, jobr, 1, n, root[i]); // if (l < r) { // int mid = (l + r) >> 1; // if (jobk <= mid) { @@ -98,7 +98,7 @@ // return l; // } // int mid = (l + r) >> 1; -// long long rightsum = querySum(jobl, jobr, 1, n, outer[i << 1 | 1]); +// long long rightsum = querySum(jobl, jobr, 1, n, root[i << 1 | 1]); // if (jobk > rightsum) { // return query(jobl, jobr, jobk - rightsum, l, mid, i << 1); // } else { diff --git a/src/class160/Code03_SegmentWithBalanced1.java b/src/class160/Code03_SegmentWithBalanced1.java index 43addba20..19c35c5cc 100644 --- a/src/class160/Code03_SegmentWithBalanced1.java +++ b/src/class160/Code03_SegmentWithBalanced1.java @@ -4,6 +4,316 @@ // 测试链接 : https://www.luogu.com.cn/problem/P3380 // 提交以下的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 Code03_SegmentWithBalanced1 { + public static int MAXN = 50001; + public static int MAXT = MAXN * 40; + public static int INF = Integer.MAX_VALUE; + public static double ALPHA = 0.7; + public static int n, m; + + // 原始数组 + public static int[] arr = new int[MAXN]; + + // 线段树维护的替罪羊树根节点编号 + public static int[] root = new int[MAXN << 2]; + + // 替罪羊树需要 + public static int[] key = new int[MAXT]; + public static int[] count = new int[MAXT]; + public static int[] left = new int[MAXT]; + public static int[] right = new int[MAXT]; + public static int[] size = new int[MAXT]; + public static int[] diff = new int[MAXT]; + public static int cnt = 0; + + // rebuild用到的中序收集数组 + public static int[] collect = new int[MAXT]; + public static int ci; + + // 最上方的失衡点、失衡点的父节点、失衡点的方向 + public static int top, father, side; + + public static int init(int num) { + key[++cnt] = num; + left[cnt] = right[cnt] = 0; + count[cnt] = size[cnt] = diff[cnt] = 1; + return cnt; + } + + public static void up(int i) { + size[i] = size[left[i]] + size[right[i]] + count[i]; + diff[i] = diff[left[i]] + diff[right[i]] + (count[i] > 0 ? 1 : 0); + } + + public static void inorder(int i) { + if (i != 0) { + inorder(left[i]); + if (count[i] > 0) { + collect[++ci] = i; + } + inorder(right[i]); + } + } + + public static int build(int l, int r) { + if (l > r) { + return 0; + } + int m = (l + r) >> 1; + int h = collect[m]; + left[h] = build(l, m - 1); + right[h] = build(m + 1, r); + up(h); + return h; + } + + public static int rebuild(int i) { + if (top != 0) { + ci = 0; + inorder(top); + if (ci > 0) { + if (father == 0) { + i = build(1, ci); + } else if (side == 1) { + left[father] = build(1, ci); + } else { + right[father] = build(1, ci); + } + } + } + return i; + } + + public static boolean balance(int i) { + if (i == 0) { + return true; + } + return ALPHA * diff[i] >= Math.max(diff[left[i]], diff[right[i]]); + } + + public static int insert(int num, int i, int f, int s) { + if (i == 0) { + i = init(num); + } else { + if (key[i] == num) { + count[i]++; + } else if (key[i] > num) { + left[i] = insert(num, left[i], i, 1); + } else { + right[i] = insert(num, right[i], i, 2); + } + up(i); + if (!balance(i)) { + top = i; + father = f; + side = s; + } + } + return i; + } + + public static int insert(int num, int i) { + top = father = side = 0; + i = insert(num, i, 0, 0); + i = rebuild(i); + return i; + } + + public static int querySmall(int num, int i) { + if (i == 0) { + return 0; + } + if (key[i] >= num) { + return querySmall(num, left[i]); + } else { + return size[left[i]] + count[i] + querySmall(num, right[i]); + } + } + + public static int queryIndex(int index, int i) { + int leftsize = size[left[i]]; + if (leftsize >= index) { + return queryIndex(index, left[i]); + } else if (leftsize + count[i] < index) { + return queryIndex(index - leftsize - count[i], right[i]); + } else { + return key[i]; + } + } + + public static int queryPre(int num, int i) { + int kth = querySmall(num, i) + 1; + if (kth == 1) { + return -INF; + } else { + return queryIndex(kth - 1, i); + } + } + + public static int queryPost(int num, int i) { + int kth = querySmall(num + 1, i); + if (kth == size[i]) { + return INF; + } else { + return queryIndex(kth + 1, i); + } + } + + public static void remove(int num, int i, int f, int s) { + if (key[i] == num) { + count[i]--; + } else if (key[i] > num) { + remove(num, left[i], i, 1); + } else { + remove(num, right[i], i, 2); + } + up(i); + if (!balance(i)) { + top = i; + father = f; + side = s; + } + } + + public static int remove(int num, int i) { + if (querySmall(num, i) != querySmall(num + 1, i)) { + top = father = side = 0; + remove(num, i, 0, 0); + i = rebuild(i); + } + return i; + } + + public static void build(int l, int r, int i) { + for (int j = l; j <= r; j++) { + root[i] = insert(arr[j], root[i]); + } + if (l < r) { + int mid = (l + r) >> 1; + build(l, mid, i << 1); + build(mid + 1, r, i << 1 | 1); + } + } + + public static void update(int jobi, int jobv, int l, int r, int i) { + root[i] = remove(arr[jobi], root[i]); + root[i] = insert(jobv, root[i]); + if (l < r) { + 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); + } + } + } + + public static int small(int jobl, int jobr, int jobv, int l, int r, int i) { + if (jobl <= l && r <= jobr) { + return querySmall(jobv, root[i]); + } + int mid = (l + r) >> 1; + int ans = 0; + if (jobl <= mid) { + ans += small(jobl, jobr, jobv, l, mid, i << 1); + } + if (jobr > mid) { + ans += small(jobl, jobr, jobv, mid + 1, r, i << 1 | 1); + } + return ans; + } + + public static int number(int jobl, int jobr, int jobk) { + int L = 0, R = 100000000, mid, ans = 0; + while (L <= R) { + mid = (L + R) >> 1; + if (small(jobl, jobr, mid + 1, 1, n, 1) >= jobk) { + ans = mid; + R = mid - 1; + } else { + L = mid + 1; + } + } + return ans; + } + + public static int pre(int jobl, int jobr, int jobv, int l, int r, int i) { + if (jobl <= l && r <= jobr) { + return queryPre(jobv, root[i]); + } + int mid = (l + r) >> 1; + int ans = -INF; + if (jobl <= mid) { + ans = Math.max(ans, pre(jobl, jobr, jobv, l, mid, i << 1)); + } + if (jobr > mid) { + ans = Math.max(ans, pre(jobl, jobr, jobv, mid + 1, r, i << 1 | 1)); + } + return ans; + } + + public static int post(int jobl, int jobr, int jobv, int l, int r, int i) { + if (jobl <= l && r <= jobr) { + return queryPost(jobv, root[i]); + } + int mid = (l + r) >> 1; + int ans = INF; + if (jobl <= mid) { + ans = Math.min(ans, post(jobl, jobr, jobv, l, mid, i << 1)); + } + if (jobr > mid) { + ans = Math.min(ans, post(jobl, jobr, jobv, mid + 1, r, i << 1 | 1)); + } + return ans; + } + + 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; i <= n; i++) { + in.nextToken(); + arr[i] = (int) in.nval; + } + build(1, n, 1); + for (int i = 1, op, x, y, z; i <= m; i++) { + in.nextToken(); + op = (int) in.nval; + in.nextToken(); + x = (int) in.nval; + in.nextToken(); + y = (int) in.nval; + if (op == 3) { + update(x, y, 1, n, 1); + arr[x] = y; + } else { + in.nextToken(); + z = (int) in.nval; + if (op == 1) { + out.println(small(x, y, z, 1, n, 1) + 1); + } else if (op == 2) { + out.println(number(x, y, z)); + } else if (op == 4) { + out.println(pre(x, y, z, 1, n, 1)); + } else { + out.println(post(x, y, z, 1, n, 1)); + } + } + } + out.flush(); + out.close(); + br.close(); + } } From b07763c66ced0fcb44a0982e8f0cd3bff9215e55 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 17 Feb 2025 17:37:42 +0800 Subject: [PATCH 0689/2029] modify code --- src/class160/Code03_SegmentWithBalanced1.java | 51 ++-- src/class160/Code03_SegmentWithBalanced2.java | 238 ++++++++++++++++++ 2 files changed, 262 insertions(+), 27 deletions(-) create mode 100644 src/class160/Code03_SegmentWithBalanced2.java diff --git a/src/class160/Code03_SegmentWithBalanced1.java b/src/class160/Code03_SegmentWithBalanced1.java index 19c35c5cc..e16062c2f 100644 --- a/src/class160/Code03_SegmentWithBalanced1.java +++ b/src/class160/Code03_SegmentWithBalanced1.java @@ -27,7 +27,7 @@ public class Code03_SegmentWithBalanced1 { // 替罪羊树需要 public static int[] key = new int[MAXT]; - public static int[] count = new int[MAXT]; + public static int[] cnts = new int[MAXT]; public static int[] left = new int[MAXT]; public static int[] right = new int[MAXT]; public static int[] size = new int[MAXT]; @@ -44,19 +44,19 @@ public class Code03_SegmentWithBalanced1 { public static int init(int num) { key[++cnt] = num; left[cnt] = right[cnt] = 0; - count[cnt] = size[cnt] = diff[cnt] = 1; + cnts[cnt] = size[cnt] = diff[cnt] = 1; return cnt; } public static void up(int i) { - size[i] = size[left[i]] + size[right[i]] + count[i]; - diff[i] = diff[left[i]] + diff[right[i]] + (count[i] > 0 ? 1 : 0); + size[i] = size[left[i]] + size[right[i]] + cnts[i]; + diff[i] = diff[left[i]] + diff[right[i]] + (cnts[i] > 0 ? 1 : 0); } public static void inorder(int i) { if (i != 0) { inorder(left[i]); - if (count[i] > 0) { + if (cnts[i] > 0) { collect[++ci] = i; } inorder(right[i]); @@ -93,22 +93,19 @@ public static int rebuild(int i) { } public static boolean balance(int i) { - if (i == 0) { - return true; - } - return ALPHA * diff[i] >= Math.max(diff[left[i]], diff[right[i]]); + return i == 0 || ALPHA * diff[i] >= Math.max(diff[left[i]], diff[right[i]]); } - public static int insert(int num, int i, int f, int s) { + public static int insertNumber(int num, int i, int f, int s) { if (i == 0) { i = init(num); } else { if (key[i] == num) { - count[i]++; + cnts[i]++; } else if (key[i] > num) { - left[i] = insert(num, left[i], i, 1); + left[i] = insertNumber(num, left[i], i, 1); } else { - right[i] = insert(num, right[i], i, 2); + right[i] = insertNumber(num, right[i], i, 2); } up(i); if (!balance(i)) { @@ -120,9 +117,9 @@ public static int insert(int num, int i, int f, int s) { return i; } - public static int insert(int num, int i) { + public static int insertNumber(int num, int i) { top = father = side = 0; - i = insert(num, i, 0, 0); + i = insertNumber(num, i, 0, 0); i = rebuild(i); return i; } @@ -134,7 +131,7 @@ public static int querySmall(int num, int i) { if (key[i] >= num) { return querySmall(num, left[i]); } else { - return size[left[i]] + count[i] + querySmall(num, right[i]); + return size[left[i]] + cnts[i] + querySmall(num, right[i]); } } @@ -142,8 +139,8 @@ public static int queryIndex(int index, int i) { int leftsize = size[left[i]]; if (leftsize >= index) { return queryIndex(index, left[i]); - } else if (leftsize + count[i] < index) { - return queryIndex(index - leftsize - count[i], right[i]); + } else if (leftsize + cnts[i] < index) { + return queryIndex(index - leftsize - cnts[i], right[i]); } else { return key[i]; } @@ -167,13 +164,13 @@ public static int queryPost(int num, int i) { } } - public static void remove(int num, int i, int f, int s) { + public static void removeNumber(int num, int i, int f, int s) { if (key[i] == num) { - count[i]--; + cnts[i]--; } else if (key[i] > num) { - remove(num, left[i], i, 1); + removeNumber(num, left[i], i, 1); } else { - remove(num, right[i], i, 2); + removeNumber(num, right[i], i, 2); } up(i); if (!balance(i)) { @@ -183,10 +180,10 @@ public static void remove(int num, int i, int f, int s) { } } - public static int remove(int num, int i) { + public static int removeNumber(int num, int i) { if (querySmall(num, i) != querySmall(num + 1, i)) { top = father = side = 0; - remove(num, i, 0, 0); + removeNumber(num, i, 0, 0); i = rebuild(i); } return i; @@ -194,7 +191,7 @@ public static int remove(int num, int i) { public static void build(int l, int r, int i) { for (int j = l; j <= r; j++) { - root[i] = insert(arr[j], root[i]); + root[i] = insertNumber(arr[j], root[i]); } if (l < r) { int mid = (l + r) >> 1; @@ -204,8 +201,8 @@ public static void build(int l, int r, int i) { } public static void update(int jobi, int jobv, int l, int r, int i) { - root[i] = remove(arr[jobi], root[i]); - root[i] = insert(jobv, root[i]); + root[i] = removeNumber(arr[jobi], root[i]); + root[i] = insertNumber(jobv, root[i]); if (l < r) { int mid = (l + r) >> 1; if (jobi <= mid) { diff --git a/src/class160/Code03_SegmentWithBalanced2.java b/src/class160/Code03_SegmentWithBalanced2.java new file mode 100644 index 000000000..063f81896 --- /dev/null +++ b/src/class160/Code03_SegmentWithBalanced2.java @@ -0,0 +1,238 @@ +package class160; + +// 线段树套平衡树,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P3380 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 50001; +//const int MAXT = MAXN * 40; +//const int INF = INT_MAX; +//double ALPHA = 0.7; +//int n, m; +//int arr[MAXN]; +//int root[MAXN << 2]; +//int key[MAXT]; +//int cnts[MAXT]; +//int ls[MAXT]; +//int rs[MAXT]; +//int siz[MAXT]; +//int diff[MAXT]; +//int cnt; +//int collect[MAXT]; +//int ci; +//int top, father, side; +// +//int init(int num) { +// key[++cnt] = num; +// ls[cnt] = rs[cnt] = 0; +// cnts[cnt] = siz[cnt] = diff[cnt] = 1; +// return cnt; +//} +// +//void up(int i) { +// siz[i] = siz[ls[i]] + siz[rs[i]] + cnts[i]; +// diff[i] = diff[ls[i]] + diff[rs[i]] + (cnts[i] > 0 ? 1 : 0); +//} +// +//void inorder(int i) { +// if (i) { +// inorder(ls[i]); +// if (cnts[i] > 0) collect[++ci] = i; +// inorder(rs[i]); +// } +//} +// +//int build(int l, int r) { +// if (l > r) return 0; +// int mid = (l + r) >> 1; +// int h = collect[mid]; +// ls[h] = build(l, mid - 1); +// rs[h] = build(mid + 1, r); +// up(h); +// return h; +//} +// +//int rebuild(int i) { +// if (top) { +// ci = 0; +// inorder(top); +// if (ci > 0) { +// if (father == 0) { +// i = build(1, ci); +// } else if (side == 1) { +// ls[father] = build(1, ci); +// } else { +// rs[father] = build(1, ci); +// } +// } +// } +// return i; +//} +// +//bool balance(int i) { +// return i == 0 || ALPHA * diff[i] >= max(diff[ls[i]], diff[rs[i]]); +//} +// +//int insertNumber(int num, int i, int f, int s) { +// if (!i) { +// i = init(num); +// } else { +// if (key[i] == num) { +// cnts[i]++; +// } else if (key[i] > num) { +// ls[i] = insertNumber(num, ls[i], i, 1); +// } else { +// rs[i] = insertNumber(num, rs[i], i, 2); +// } +// up(i); +// if (!balance(i)) { +// top = i; +// father = f; +// side = s; +// } +// } +// return i; +//} +// +//int insertNumber(int num, int i) { +// top = father = side = 0; +// i = insertNumber(num, i, 0, 0); +// i = rebuild(i); +// return i; +//} +// +//int querySmall(int num, int i) { +// if (!i) return 0; +// if (key[i] >= num) return querySmall(num, ls[i]); +// return siz[ls[i]] + cnts[i] + querySmall(num, rs[i]); +//} +// +//int queryIndex(int index, int i) { +// int leftsize = siz[ls[i]]; +// if (leftsize >= index) { +// return queryIndex(index, ls[i]); +// } else if (leftsize + cnts[i] < index) { +// return queryIndex(index - leftsize - cnts[i], rs[i]); +// } +// return key[i]; +//} +// +//int queryPre(int num, int i) { +// int kth = querySmall(num, i) + 1; +// if (kth == 1) return -INF; +// return queryIndex(kth - 1, i); +//} +// +//int queryPost(int num, int i) { +// int kth = querySmall(num + 1, i); +// if (kth == siz[i]) return INF; +// return queryIndex(kth + 1, i); +//} +// +//void removeNumber(int num, int i, int f, int s) { +// if (key[i] == num) { +// cnts[i]--; +// } else if (key[i] > num) { +// removeNumber(num, ls[i], i, 1); +// } else { +// removeNumber(num, rs[i], i, 2); +// } +// up(i); +// if (!balance(i)) { +// top = i; +// father = f; +// side = s; +// } +//} +// +//int removeNumber(int num, int i) { +// if (querySmall(num, i) != querySmall(num + 1, i)) { +// top = father = side = 0; +// removeNumber(num, i, 0, 0); +// i = rebuild(i); +// } +// return i; +//} +// +//void build(int l, int r, int i) { +// for (int j = l; j <= r; j++) root[i] = insertNumber(arr[j], root[i]); +// if (l < r) { +// int mid = (l + r) >> 1; +// build(l, mid, i << 1); +// build(mid + 1, r, i << 1 | 1); +// } +//} +// +//void update(int jobi, int jobv, int l, int r, int i) { +// root[i] = removeNumber(arr[jobi], root[i]); +// root[i] = insertNumber(jobv, root[i]); +// if (l < r) { +// 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); +// } +//} +// +//int small(int jobl, int jobr, int jobv, int l, int r, int i) { +// if (jobl <= l && r <= jobr) return querySmall(jobv, root[i]); +// int mid = (l + r) >> 1, ans = 0; +// if (jobl <= mid) ans += small(jobl, jobr, jobv, l, mid, i << 1); +// if (jobr > mid) ans += small(jobl, jobr, jobv, mid + 1, r, i << 1 | 1); +// return ans; +//} +// +//int number(int jobl, int jobr, int jobk) { +// int l = 0, r = 100000000, mid, ans = 0; +// while (l <= r) { +// mid = (l + r) >> 1; +// if (small(jobl, jobr, mid + 1, 1, n, 1) >= jobk) { +// ans = mid; +// r = mid - 1; +// } else { +// l = mid + 1; +// } +// } +// return ans; +//} +// +//int pre(int jobl, int jobr, int jobv, int l, int r, int i) { +// if (jobl <= l && r <= jobr) return queryPre(jobv, root[i]); +// int mid = (l + r) >> 1, ans = -INF; +// if (jobl <= mid) ans = max(ans, pre(jobl, jobr, jobv, l, mid, i << 1)); +// if (jobr > mid) ans = max(ans, pre(jobl, jobr, jobv, mid + 1, r, i << 1 | 1)); +// return ans; +//} +// +//int post(int jobl, int jobr, int jobv, int l, int r, int i) { +// if (jobl <= l && r <= jobr) return queryPost(jobv, root[i]); +// int mid = (l + r) >> 1, ans = INF; +// if (jobl <= mid) ans = min(ans, post(jobl, jobr, jobv, l, mid, i << 1)); +// if (jobr > mid) ans = min(ans, post(jobl, jobr, jobv, mid + 1, r, i << 1 | 1)); +// 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]; +// build(1,n,1); +// for(int i=1,op,x,y,z;i<=m;i++){ +// cin >> op >> x >> y; +// if(op==3){ +// update(x,y,1,n,1); +// arr[x]=y; +// } else { +// cin >> z; +// if(op==1) cout << small(x,y,z,1,n,1)+1 << "\n"; +// else if(op==2) cout << number(x,y,z) << "\n"; +// else if(op==4) cout << pre(x,y,z,1,n,1) << "\n"; +// else cout << post(x,y,z,1,n,1) << "\n"; +// } +// } +// return 0; +//} \ No newline at end of file From 6b588bb98f2cd85a32e6772d1e075b319a4730cb Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 17 Feb 2025 17:55:27 +0800 Subject: [PATCH 0690/2029] modify code --- src/class160/Code03_SegmentWithBalanced2.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/class160/Code03_SegmentWithBalanced2.java b/src/class160/Code03_SegmentWithBalanced2.java index 063f81896..13078eb6b 100644 --- a/src/class160/Code03_SegmentWithBalanced2.java +++ b/src/class160/Code03_SegmentWithBalanced2.java @@ -1,8 +1,9 @@ package class160; -// 线段树套平衡树,java版 +// 线段树套平衡树,C++版 // 测试链接 : https://www.luogu.com.cn/problem/P3380 -// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 //#include // From aa58efcb5dd948b9c871c47f61a7ee4fc5666b9f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 18 Feb 2025 14:52:11 +0800 Subject: [PATCH 0691/2029] modify code --- src/class160/Code01_SegmentWithSegment1.java | 74 ++++----- src/class160/Code01_SegmentWithSegment2.java | 74 ++++----- src/class160/Code02_QueryKthMaximum1.java | 32 ++-- src/class160/Code02_QueryKthMaximum2.java | 32 ++-- src/class160/Code03_SegmentWithBalanced1.java | 95 ++++++----- src/class160/Code03_SegmentWithBalanced2.java | 84 +++++----- src/class160/Code04_IndexWithSegment1.java | 82 ++++----- src/class160/Code04_IndexWithSegment2.java | 74 ++++----- src/class160/Code05_LineUp1.java | 30 ++-- src/class160/Code05_LineUp2.java | 55 +++--- src/class160/Code06_NetworkManagement1.java | 156 +++++++++--------- src/class160/Code06_NetworkManagement2.java | 100 +++++------ 12 files changed, 459 insertions(+), 429 deletions(-) diff --git a/src/class160/Code01_SegmentWithSegment1.java b/src/class160/Code01_SegmentWithSegment1.java index 0e8a2cf60..a5ff8220f 100644 --- a/src/class160/Code01_SegmentWithSegment1.java +++ b/src/class160/Code01_SegmentWithSegment1.java @@ -23,77 +23,77 @@ public class Code01_SegmentWithSegment1 { public static int[][] tree = new int[MAXH << 2][MAXA << 2]; - public static void ybuild(int yl, int yr, int xi, int yi) { + public static void innerBuild(int yl, int yr, int xi, int yi) { tree[xi][yi] = -1; if (yl < yr) { int mid = (yl + yr) / 2; - ybuild(yl, mid, xi, yi << 1); - ybuild(mid + 1, yr, xi, yi << 1 | 1); + innerBuild(yl, mid, xi, yi << 1); + innerBuild(mid + 1, yr, xi, yi << 1 | 1); } } - public static void build(int xl, int xr, int xi) { - ybuild(0, n, xi, 1); - if (xl < xr) { - int mid = (xl + xr) / 2; - build(xl, mid, xi << 1); - build(mid + 1, xr, xi << 1 | 1); - } - } - - public static void yupdate(int joby, int jobv, int yl, int yr, int xi, int yi) { + public static void innerUpdate(int joby, int jobv, int yl, int yr, int xi, int yi) { if (yl == yr) { tree[xi][yi] = Math.max(tree[xi][yi], jobv); } else { int mid = (yl + yr) / 2; if (joby <= mid) { - yupdate(joby, jobv, yl, mid, xi, yi << 1); + innerUpdate(joby, jobv, yl, mid, xi, yi << 1); } else { - yupdate(joby, jobv, mid + 1, yr, xi, yi << 1 | 1); + innerUpdate(joby, jobv, mid + 1, yr, xi, yi << 1 | 1); } tree[xi][yi] = Math.max(tree[xi][yi << 1], tree[xi][yi << 1 | 1]); } } - public static void update(int jobx, int joby, int jobv, int xl, int xr, int xi) { - yupdate(joby, jobv, 0, n, xi, 1); - if (xl < xr) { - int mid = (xl + xr) / 2; - if (jobx <= mid) { - update(jobx, joby, jobv, xl, mid, xi << 1); - } else { - update(jobx, joby, jobv, mid + 1, xr, xi << 1 | 1); - } - } - } - - public static int yquery(int jobyl, int jobyr, int yl, int yr, int xi, int yi) { + public static int innerQuery(int jobyl, int jobyr, int yl, int yr, int xi, int yi) { if (jobyl <= yl && yr <= jobyr) { return tree[xi][yi]; } int mid = (yl + yr) / 2; int ans = -1; if (jobyl <= mid) { - ans = yquery(jobyl, jobyr, yl, mid, xi, yi << 1); + ans = innerQuery(jobyl, jobyr, yl, mid, xi, yi << 1); } if (jobyr > mid) { - ans = Math.max(ans, yquery(jobyl, jobyr, mid + 1, yr, xi, yi << 1 | 1)); + ans = Math.max(ans, innerQuery(jobyl, jobyr, mid + 1, yr, xi, yi << 1 | 1)); } return ans; } - public static int query(int jobxl, int jobxr, int jobyl, int jobyr, int xl, int xr, int xi) { + public static void outerBuild(int xl, int xr, int xi) { + innerBuild(0, n, xi, 1); + if (xl < xr) { + int mid = (xl + xr) / 2; + outerBuild(xl, mid, xi << 1); + outerBuild(mid + 1, xr, xi << 1 | 1); + } + } + + public static void outerUpdate(int jobx, int joby, int jobv, int xl, int xr, int xi) { + innerUpdate(joby, jobv, 0, n, xi, 1); + if (xl < xr) { + int mid = (xl + xr) / 2; + if (jobx <= mid) { + outerUpdate(jobx, joby, jobv, xl, mid, xi << 1); + } else { + outerUpdate(jobx, joby, jobv, mid + 1, xr, xi << 1 | 1); + } + } + } + + public static int outerQuery(int jobxl, int jobxr, int jobyl, int jobyr, int xl, int xr, int xi) { if (jobxl <= xl && xr <= jobxr) { - return yquery(jobyl, jobyr, 0, n, xi, 1); + return innerQuery(jobyl, jobyr, 0, n, xi, 1); } int mid = (xl + xr) / 2; int ans = -1; if (jobxl <= mid) { - ans = query(jobxl, jobxr, jobyl, jobyr, xl, mid, xi << 1); + ans = outerQuery(jobxl, jobxr, jobyl, jobyr, xl, mid, xi << 1); } if (jobxr > mid) { - ans = Math.max(ans, query(jobxl, jobxr, jobyl, jobyr, mid + 1, xr, xi << 1 | 1)); + ans = Math.max(ans, outerQuery(jobxl, jobxr, jobyl, jobyr, mid + 1, xr, xi << 1 | 1)); } return ans; } @@ -104,14 +104,14 @@ public static void main(String[] args) { String op; int a, b, c, d; while (m != 0) { - build(100, 200, 1); + outerBuild(100, 200, 1); for (int i = 1; i <= m; i++) { op = io.next(); if (op.equals("I")) { a = io.nextInt(); b = (int) (io.nextDouble() * 10); c = (int) (io.nextDouble() * 10); - update(a, b, c, 100, 200, 1); + outerUpdate(a, b, c, 100, 200, 1); } else { a = io.nextInt(); b = io.nextInt(); @@ -121,7 +121,7 @@ public static void main(String[] args) { int xr = Math.max(a, b); int yl = Math.min(c, d); int yr = Math.max(c, d); - int ans = query(xl, xr, yl, yr, 100, 200, 1); + int ans = outerQuery(xl, xr, yl, yr, 100, 200, 1); if (ans == -1) { io.println(ans); } else { diff --git a/src/class160/Code01_SegmentWithSegment2.java b/src/class160/Code01_SegmentWithSegment2.java index b8bc5a2d5..e0b19f8fa 100644 --- a/src/class160/Code01_SegmentWithSegment2.java +++ b/src/class160/Code01_SegmentWithSegment2.java @@ -14,76 +14,76 @@ //int n = 1000, m; //int tree[MAXH << 2][MAXA << 2]; // -//void ybuild(int yl, int yr, int xi, int yi) { +//void innerBuild(int yl, int yr, int xi, int yi) { // tree[xi][yi] = -1; // if (yl < yr) { // int mid = (yl + yr) >> 1; -// ybuild(yl, mid, xi, yi << 1); -// ybuild(mid + 1, yr, xi, yi << 1 | 1); +// innerBuild(yl, mid, xi, yi << 1); +// innerBuild(mid + 1, yr, xi, yi << 1 | 1); // } //} // -//void build(int xl, int xr, int xi) { -// ybuild(0, n, xi, 1); -// if (xl < xr) { -// int mid = (xl + xr) >> 1; -// build(xl, mid, xi << 1); -// build(mid + 1, xr, xi << 1 | 1); -// } -//} -// -//void yupdate(int joby, int jobv, int yl, int yr, int xi, int yi) { +//void innerUpdate(int joby, int jobv, int yl, int yr, int xi, int yi) { // if (yl == yr) { // tree[xi][yi] = max(tree[xi][yi], jobv); // } else { // int mid = (yl + yr) >> 1; // if (joby <= mid) { -// yupdate(joby, jobv, yl, mid, xi, yi << 1); +// innerUpdate(joby, jobv, yl, mid, xi, yi << 1); // } else { -// yupdate(joby, jobv, mid + 1, yr, xi, yi << 1 | 1); +// innerUpdate(joby, jobv, mid + 1, yr, xi, yi << 1 | 1); // } // tree[xi][yi] = max(tree[xi][yi << 1], tree[xi][(yi << 1) | 1]); // } //} // -//void update(int jobx, int joby, int jobv, int xl, int xr, int xi) { -// yupdate(joby, jobv, 0, n, xi, 1); -// if (xl < xr) { -// int mid = (xl + xr) >> 1; -// if (jobx <= mid) { -// update(jobx, joby, jobv, xl, mid, xi << 1); -// } else { -// update(jobx, joby, jobv, mid + 1, xr, xi << 1 | 1); -// } -// } -//} -// -//int yquery(int jobyl, int jobyr, int yl, int yr, int xi, int yi) { +//int innerQuery(int jobyl, int jobyr, int yl, int yr, int xi, int yi) { // if (jobyl <= yl && yr <= jobyr) { // return tree[xi][yi]; // } // int mid = (yl + yr) >> 1; // int ans = -1; // if (jobyl <= mid) { -// ans = max(ans, yquery(jobyl, jobyr, yl, mid, xi, yi << 1)); +// ans = max(ans, innerQuery(jobyl, jobyr, yl, mid, xi, yi << 1)); // } // if (jobyr > mid) { -// ans = max(ans, yquery(jobyl, jobyr, mid + 1, yr, xi, (yi << 1) | 1)); +// ans = max(ans, innerQuery(jobyl, jobyr, mid + 1, yr, xi, (yi << 1) | 1)); // } // return ans; //} // -//int query(int jobxl, int jobxr, int jobyl, int jobyr, int xl, int xr, int xi) { +//void outerBuild(int xl, int xr, int xi) { +// innerBuild(0, n, xi, 1); +// if (xl < xr) { +// int mid = (xl + xr) >> 1; +// outerBuild(xl, mid, xi << 1); +// outerBuild(mid + 1, xr, xi << 1 | 1); +// } +//} +// +//void outerUpdate(int jobx, int joby, int jobv, int xl, int xr, int xi) { +// innerUpdate(joby, jobv, 0, n, xi, 1); +// if (xl < xr) { +// int mid = (xl + xr) >> 1; +// if (jobx <= mid) { +// outerUpdate(jobx, joby, jobv, xl, mid, xi << 1); +// } else { +// outerUpdate(jobx, joby, jobv, mid + 1, xr, xi << 1 | 1); +// } +// } +//} +// +//int outerQuery(int jobxl, int jobxr, int jobyl, int jobyr, int xl, int xr, int xi) { // if (jobxl <= xl && xr <= jobxr) { -// return yquery(jobyl, jobyr, 0, n, xi, 1); +// return innerQuery(jobyl, jobyr, 0, n, xi, 1); // } // int mid = (xl + xr) >> 1; // int ans = -1; // if (jobxl <= mid) { -// ans = max(ans, query(jobxl, jobxr, jobyl, jobyr, xl, mid, xi << 1)); +// ans = max(ans, outerQuery(jobxl, jobxr, jobyl, jobyr, xl, mid, xi << 1)); // } // if (jobxr > mid) { -// ans = max(ans, query(jobxl, jobxr, jobyl, jobyr, mid + 1, xr, (xi << 1) | 1)); +// ans = max(ans, outerQuery(jobxl, jobxr, jobyl, jobyr, mid + 1, xr, (xi << 1) | 1)); // } // return ans; //} @@ -91,7 +91,7 @@ //int main() { // scanf("%d", &m); // while(m != 0) { -// build(100, 200, 1); +// outerBuild(100, 200, 1); // for (int i = 0; i < m; i++) { // char op[2]; // scanf("%s", op); @@ -101,7 +101,7 @@ // scanf("%d %lf %lf", &a, &bd, &cd); // int b = (int)(bd * 10); // int c = (int)(cd * 10); -// update(a, b, c, 100, 200, 1); +// outerUpdate(a, b, c, 100, 200, 1); // } else { // int a, b; // double cd, dd; @@ -112,7 +112,7 @@ // int xr = max(a, b); // int yl = min(c, d); // int yr = max(c, d); -// int ans = query(xl, xr, yl, yr, 100, 200, 1); +// int ans = outerQuery(xl, xr, yl, yr, 100, 200, 1); // if (ans == -1) { // printf("-1\n"); // } else { diff --git a/src/class160/Code02_QueryKthMaximum1.java b/src/class160/Code02_QueryKthMaximum1.java index 0acf61836..688a487f5 100644 --- a/src/class160/Code02_QueryKthMaximum1.java +++ b/src/class160/Code02_QueryKthMaximum1.java @@ -71,7 +71,7 @@ public static void down(int i, int ln, int rn) { } } - public static int update(int jobl, int jobr, int l, int r, int i) { + public static int innerAdd(int jobl, int jobr, int l, int r, int i) { if (i == 0) { i = ++cntt; } @@ -82,17 +82,17 @@ public static int update(int jobl, int jobr, int l, int r, int i) { int mid = (l + r) / 2; down(i, mid - l + 1, r - mid); if (jobl <= mid) { - left[i] = update(jobl, jobr, l, mid, left[i]); + left[i] = innerAdd(jobl, jobr, l, mid, left[i]); } if (jobr > mid) { - right[i] = update(jobl, jobr, mid + 1, r, right[i]); + right[i] = innerAdd(jobl, jobr, mid + 1, r, right[i]); } up(i); } return i; } - public static long querySum(int jobl, int jobr, int l, int r, int i) { + public static long innerQuery(int jobl, int jobr, int l, int r, int i) { if (i == 0) { return 0; } @@ -103,36 +103,36 @@ public static long querySum(int jobl, int jobr, int l, int r, int i) { down(i, mid - l + 1, r - mid); long ans = 0; if (jobl <= mid) { - ans += querySum(jobl, jobr, l, mid, left[i]); + ans += innerQuery(jobl, jobr, l, mid, left[i]); } if (jobr > mid) { - ans += querySum(jobl, jobr, mid + 1, r, right[i]); + ans += innerQuery(jobl, jobr, mid + 1, r, right[i]); } return ans; } - public static void add(int jobl, int jobr, int jobk, int l, int r, int i) { - root[i] = update(jobl, jobr, 1, n, root[i]); + public static void outerAdd(int jobl, int jobr, int jobk, int l, int r, int i) { + root[i] = innerAdd(jobl, jobr, 1, n, root[i]); if (l < r) { int mid = (l + r) / 2; if (jobk <= mid) { - add(jobl, jobr, jobk, l, mid, i << 1); + outerAdd(jobl, jobr, jobk, l, mid, i << 1); } else { - add(jobl, jobr, jobk, mid + 1, r, i << 1 | 1); + outerAdd(jobl, jobr, jobk, mid + 1, r, i << 1 | 1); } } } - public static int query(int jobl, int jobr, long jobk, int l, int r, int i) { + public static int outerQuery(int jobl, int jobr, long jobk, int l, int r, int i) { if (l == r) { return l; } int mid = (l + r) / 2; - long rightsum = querySum(jobl, jobr, 1, n, root[i << 1 | 1]); + long rightsum = innerQuery(jobl, jobr, 1, n, root[i << 1 | 1]); if (jobk > rightsum) { - return query(jobl, jobr, jobk - rightsum, l, mid, i << 1); + return outerQuery(jobl, jobr, jobk - rightsum, l, mid, i << 1); } else { - return query(jobl, jobr, jobk, mid + 1, r, i << 1 | 1); + return outerQuery(jobl, jobr, jobk, mid + 1, r, i << 1 | 1); } } @@ -179,9 +179,9 @@ public static void main(String[] args) throws IOException { prepare(); for (int i = 1; i <= m; i++) { if (ques[i][0] == 1) { - add(ques[i][1], ques[i][2], ques[i][3], 1, s, 1); + outerAdd(ques[i][1], ques[i][2], ques[i][3], 1, s, 1); } else { - int idx = query(ques[i][1], ques[i][2], ques[i][3], 1, s, 1); + int idx = outerQuery(ques[i][1], ques[i][2], ques[i][3], 1, s, 1); out.println(sorted[idx]); } } diff --git a/src/class160/Code02_QueryKthMaximum2.java b/src/class160/Code02_QueryKthMaximum2.java index 60c74019a..c4d45feac 100644 --- a/src/class160/Code02_QueryKthMaximum2.java +++ b/src/class160/Code02_QueryKthMaximum2.java @@ -53,7 +53,7 @@ // } //} // -//int update(int jobl, int jobr, int l, int r, int i) { +//int innerAdd(int jobl, int jobr, int l, int r, int i) { // if (!i) i = ++cntt; // if (jobl <= l && r <= jobr) { // sum[i] += (long long)(r - l + 1); @@ -61,14 +61,14 @@ // } else { // int mid = (l + r) >> 1; // down(i, mid - l + 1, r - mid); -// if (jobl <= mid) ls[i] = update(jobl, jobr, l, mid, ls[i]); -// if (jobr > mid) rs[i] = update(jobl, jobr, mid + 1, r, rs[i]); +// if (jobl <= mid) ls[i] = innerAdd(jobl, jobr, l, mid, ls[i]); +// if (jobr > mid) rs[i] = innerAdd(jobl, jobr, mid + 1, r, rs[i]); // up(i); // } // return i; //} // -//long long querySum(int jobl, int jobr, int l, int r, int i) { +//long long innerQuery(int jobl, int jobr, int l, int r, int i) { // if (!i) return 0; // if (jobl <= l && r <= jobr) { // return sum[i]; @@ -76,33 +76,33 @@ // int mid = (l + r) >> 1; // down(i, mid - l + 1, r - mid); // long long ans = 0; -// if (jobl <= mid) ans += querySum(jobl, jobr, l, mid, ls[i]); -// if (jobr > mid) ans += querySum(jobl, jobr, mid + 1, r, rs[i]); +// if (jobl <= mid) ans += innerQuery(jobl, jobr, l, mid, ls[i]); +// if (jobr > mid) ans += innerQuery(jobl, jobr, mid + 1, r, rs[i]); // return ans; //} // -//void add(int jobl, int jobr, int jobk, int l, int r, int i) { -// root[i] = update(jobl, jobr, 1, n, root[i]); +//void outerAdd(int jobl, int jobr, int jobk, int l, int r, int i) { +// root[i] = innerAdd(jobl, jobr, 1, n, root[i]); // if (l < r) { // int mid = (l + r) >> 1; // if (jobk <= mid) { -// add(jobl, jobr, jobk, l, mid, i << 1); +// outerAdd(jobl, jobr, jobk, l, mid, i << 1); // } else { -// add(jobl, jobr, jobk, mid + 1, r, i << 1 | 1); +// outerAdd(jobl, jobr, jobk, mid + 1, r, i << 1 | 1); // } // } //} // -//int query(int jobl, int jobr, long long jobk, int l, int r, int i) { +//int outerQuery(int jobl, int jobr, long long jobk, int l, int r, int i) { // if (l == r) { // return l; // } // int mid = (l + r) >> 1; -// long long rightsum = querySum(jobl, jobr, 1, n, root[i << 1 | 1]); +// long long rightsum = innerQuery(jobl, jobr, 1, n, root[i << 1 | 1]); // if (jobk > rightsum) { -// return query(jobl, jobr, jobk - rightsum, l, mid, i << 1); +// return outerQuery(jobl, jobr, jobk - rightsum, l, mid, i << 1); // } else { -// return query(jobl, jobr, jobk, mid + 1, r, i << 1 | 1); +// return outerQuery(jobl, jobr, jobk, mid + 1, r, i << 1 | 1); // } //} // @@ -138,9 +138,9 @@ // prepare(); // for (int i = 1; i <= m; i++) { // if (ques[i][0] == 1) { -// add(ques[i][1], ques[i][2], ques[i][3], 1, s, 1); +// outerAdd(ques[i][1], ques[i][2], ques[i][3], 1, s, 1); // } else { -// int idx = query(ques[i][1], ques[i][2], ques[i][3], 1, s, 1); +// int idx = outerQuery(ques[i][1], ques[i][2], ques[i][3], 1, s, 1); // cout << sorted[idx] << "\n"; // } // } diff --git a/src/class160/Code03_SegmentWithBalanced1.java b/src/class160/Code03_SegmentWithBalanced1.java index e16062c2f..608353819 100644 --- a/src/class160/Code03_SegmentWithBalanced1.java +++ b/src/class160/Code03_SegmentWithBalanced1.java @@ -14,9 +14,13 @@ public class Code03_SegmentWithBalanced1 { public static int MAXN = 50001; + public static int MAXT = MAXN * 40; + public static int INF = Integer.MAX_VALUE; + public static double ALPHA = 0.7; + public static int n, m; // 原始数组 @@ -27,15 +31,22 @@ public class Code03_SegmentWithBalanced1 { // 替罪羊树需要 public static int[] key = new int[MAXT]; + public static int[] cnts = new int[MAXT]; + public static int[] left = new int[MAXT]; + public static int[] right = new int[MAXT]; + public static int[] size = new int[MAXT]; + public static int[] diff = new int[MAXT]; + public static int cnt = 0; // rebuild用到的中序收集数组 public static int[] collect = new int[MAXT]; + public static int ci; // 最上方的失衡点、失衡点的父节点、失衡点的方向 @@ -53,6 +64,10 @@ public static void up(int i) { diff[i] = diff[left[i]] + diff[right[i]] + (cnts[i] > 0 ? 1 : 0); } + public static boolean balance(int i) { + return i == 0 || ALPHA * diff[i] >= Math.max(diff[left[i]], diff[right[i]]); + } + public static void inorder(int i) { if (i != 0) { inorder(left[i]); @@ -63,49 +78,45 @@ public static void inorder(int i) { } } - public static int build(int l, int r) { + public static int innerBuild(int l, int r) { if (l > r) { return 0; } int m = (l + r) >> 1; int h = collect[m]; - left[h] = build(l, m - 1); - right[h] = build(m + 1, r); + left[h] = innerBuild(l, m - 1); + right[h] = innerBuild(m + 1, r); up(h); return h; } - public static int rebuild(int i) { + public static int innerRebuild(int i) { if (top != 0) { ci = 0; inorder(top); if (ci > 0) { if (father == 0) { - i = build(1, ci); + i = innerBuild(1, ci); } else if (side == 1) { - left[father] = build(1, ci); + left[father] = innerBuild(1, ci); } else { - right[father] = build(1, ci); + right[father] = innerBuild(1, ci); } } } return i; } - public static boolean balance(int i) { - return i == 0 || ALPHA * diff[i] >= Math.max(diff[left[i]], diff[right[i]]); - } - - public static int insertNumber(int num, int i, int f, int s) { + public static int innerInsert(int num, int i, int f, int s) { if (i == 0) { i = init(num); } else { if (key[i] == num) { cnts[i]++; } else if (key[i] > num) { - left[i] = insertNumber(num, left[i], i, 1); + left[i] = innerInsert(num, left[i], i, 1); } else { - right[i] = insertNumber(num, right[i], i, 2); + right[i] = innerInsert(num, right[i], i, 2); } up(i); if (!balance(i)) { @@ -117,60 +128,60 @@ public static int insertNumber(int num, int i, int f, int s) { return i; } - public static int insertNumber(int num, int i) { + public static int innerInsert(int num, int i) { top = father = side = 0; - i = insertNumber(num, i, 0, 0); - i = rebuild(i); + i = innerInsert(num, i, 0, 0); + i = innerRebuild(i); return i; } - public static int querySmall(int num, int i) { + public static int innerSmall(int num, int i) { if (i == 0) { return 0; } if (key[i] >= num) { - return querySmall(num, left[i]); + return innerSmall(num, left[i]); } else { - return size[left[i]] + cnts[i] + querySmall(num, right[i]); + return size[left[i]] + cnts[i] + innerSmall(num, right[i]); } } - public static int queryIndex(int index, int i) { + public static int innerIndex(int index, int i) { int leftsize = size[left[i]]; if (leftsize >= index) { - return queryIndex(index, left[i]); + return innerIndex(index, left[i]); } else if (leftsize + cnts[i] < index) { - return queryIndex(index - leftsize - cnts[i], right[i]); + return innerIndex(index - leftsize - cnts[i], right[i]); } else { return key[i]; } } - public static int queryPre(int num, int i) { - int kth = querySmall(num, i) + 1; + public static int innerPre(int num, int i) { + int kth = innerSmall(num, i) + 1; if (kth == 1) { return -INF; } else { - return queryIndex(kth - 1, i); + return innerIndex(kth - 1, i); } } - public static int queryPost(int num, int i) { - int kth = querySmall(num + 1, i); + public static int innerPost(int num, int i) { + int kth = innerSmall(num + 1, i); if (kth == size[i]) { return INF; } else { - return queryIndex(kth + 1, i); + return innerIndex(kth + 1, i); } } - public static void removeNumber(int num, int i, int f, int s) { + public static void innerRemove(int num, int i, int f, int s) { if (key[i] == num) { cnts[i]--; } else if (key[i] > num) { - removeNumber(num, left[i], i, 1); + innerRemove(num, left[i], i, 1); } else { - removeNumber(num, right[i], i, 2); + innerRemove(num, right[i], i, 2); } up(i); if (!balance(i)) { @@ -180,18 +191,18 @@ public static void removeNumber(int num, int i, int f, int s) { } } - public static int removeNumber(int num, int i) { - if (querySmall(num, i) != querySmall(num + 1, i)) { + public static int innerRemove(int num, int i) { + if (innerSmall(num, i) != innerSmall(num + 1, i)) { top = father = side = 0; - removeNumber(num, i, 0, 0); - i = rebuild(i); + innerRemove(num, i, 0, 0); + i = innerRebuild(i); } return i; } public static void build(int l, int r, int i) { for (int j = l; j <= r; j++) { - root[i] = insertNumber(arr[j], root[i]); + root[i] = innerInsert(arr[j], root[i]); } if (l < r) { int mid = (l + r) >> 1; @@ -201,8 +212,8 @@ public static void build(int l, int r, int i) { } public static void update(int jobi, int jobv, int l, int r, int i) { - root[i] = removeNumber(arr[jobi], root[i]); - root[i] = insertNumber(jobv, root[i]); + root[i] = innerRemove(arr[jobi], root[i]); + root[i] = innerInsert(jobv, root[i]); if (l < r) { int mid = (l + r) >> 1; if (jobi <= mid) { @@ -215,7 +226,7 @@ public static void update(int jobi, int jobv, int l, int r, int i) { public static int small(int jobl, int jobr, int jobv, int l, int r, int i) { if (jobl <= l && r <= jobr) { - return querySmall(jobv, root[i]); + return innerSmall(jobv, root[i]); } int mid = (l + r) >> 1; int ans = 0; @@ -244,7 +255,7 @@ public static int number(int jobl, int jobr, int jobk) { public static int pre(int jobl, int jobr, int jobv, int l, int r, int i) { if (jobl <= l && r <= jobr) { - return queryPre(jobv, root[i]); + return innerPre(jobv, root[i]); } int mid = (l + r) >> 1; int ans = -INF; @@ -259,7 +270,7 @@ public static int pre(int jobl, int jobr, int jobv, int l, int r, int i) { public static int post(int jobl, int jobr, int jobv, int l, int r, int i) { if (jobl <= l && r <= jobr) { - return queryPost(jobv, root[i]); + return innerPost(jobv, root[i]); } int mid = (l + r) >> 1; int ans = INF; diff --git a/src/class160/Code03_SegmentWithBalanced2.java b/src/class160/Code03_SegmentWithBalanced2.java index 13078eb6b..6d0a819c7 100644 --- a/src/class160/Code03_SegmentWithBalanced2.java +++ b/src/class160/Code03_SegmentWithBalanced2.java @@ -39,6 +39,10 @@ // diff[i] = diff[ls[i]] + diff[rs[i]] + (cnts[i] > 0 ? 1 : 0); //} // +//bool balance(int i) { +// return i == 0 || ALPHA * diff[i] >= max(diff[ls[i]], diff[rs[i]]); +//} +// //void inorder(int i) { // if (i) { // inorder(ls[i]); @@ -47,47 +51,43 @@ // } //} // -//int build(int l, int r) { +//int innerBuild(int l, int r) { // if (l > r) return 0; // int mid = (l + r) >> 1; // int h = collect[mid]; -// ls[h] = build(l, mid - 1); -// rs[h] = build(mid + 1, r); +// ls[h] = innerBuild(l, mid - 1); +// rs[h] = innerBuild(mid + 1, r); // up(h); // return h; //} // -//int rebuild(int i) { +//int innerRebuild(int i) { // if (top) { // ci = 0; // inorder(top); // if (ci > 0) { // if (father == 0) { -// i = build(1, ci); +// i = innerBuild(1, ci); // } else if (side == 1) { -// ls[father] = build(1, ci); +// ls[father] = innerBuild(1, ci); // } else { -// rs[father] = build(1, ci); +// rs[father] = innerBuild(1, ci); // } // } // } // return i; //} // -//bool balance(int i) { -// return i == 0 || ALPHA * diff[i] >= max(diff[ls[i]], diff[rs[i]]); -//} -// -//int insertNumber(int num, int i, int f, int s) { +//int innerInsert(int num, int i, int f, int s) { // if (!i) { // i = init(num); // } else { // if (key[i] == num) { // cnts[i]++; // } else if (key[i] > num) { -// ls[i] = insertNumber(num, ls[i], i, 1); +// ls[i] = innerInsert(num, ls[i], i, 1); // } else { -// rs[i] = insertNumber(num, rs[i], i, 2); +// rs[i] = innerInsert(num, rs[i], i, 2); // } // up(i); // if (!balance(i)) { @@ -99,48 +99,48 @@ // return i; //} // -//int insertNumber(int num, int i) { +//int innerInsert(int num, int i) { // top = father = side = 0; -// i = insertNumber(num, i, 0, 0); -// i = rebuild(i); +// i = innerInsert(num, i, 0, 0); +// i = innerRebuild(i); // return i; //} // -//int querySmall(int num, int i) { +//int innerSmall(int num, int i) { // if (!i) return 0; -// if (key[i] >= num) return querySmall(num, ls[i]); -// return siz[ls[i]] + cnts[i] + querySmall(num, rs[i]); +// if (key[i] >= num) return innerSmall(num, ls[i]); +// return siz[ls[i]] + cnts[i] + innerSmall(num, rs[i]); //} // -//int queryIndex(int index, int i) { +//int innerIndex(int index, int i) { // int leftsize = siz[ls[i]]; // if (leftsize >= index) { -// return queryIndex(index, ls[i]); +// return innerIndex(index, ls[i]); // } else if (leftsize + cnts[i] < index) { -// return queryIndex(index - leftsize - cnts[i], rs[i]); +// return innerIndex(index - leftsize - cnts[i], rs[i]); // } // return key[i]; //} // -//int queryPre(int num, int i) { -// int kth = querySmall(num, i) + 1; +//int innerPre(int num, int i) { +// int kth = innerSmall(num, i) + 1; // if (kth == 1) return -INF; -// return queryIndex(kth - 1, i); +// return innerIndex(kth - 1, i); //} // -//int queryPost(int num, int i) { -// int kth = querySmall(num + 1, i); +//int innerPost(int num, int i) { +// int kth = innerSmall(num + 1, i); // if (kth == siz[i]) return INF; -// return queryIndex(kth + 1, i); +// return innerIndex(kth + 1, i); //} // -//void removeNumber(int num, int i, int f, int s) { +//void innerRemove(int num, int i, int f, int s) { // if (key[i] == num) { // cnts[i]--; // } else if (key[i] > num) { -// removeNumber(num, ls[i], i, 1); +// innerRemove(num, ls[i], i, 1); // } else { -// removeNumber(num, rs[i], i, 2); +// innerRemove(num, rs[i], i, 2); // } // up(i); // if (!balance(i)) { @@ -150,17 +150,17 @@ // } //} // -//int removeNumber(int num, int i) { -// if (querySmall(num, i) != querySmall(num + 1, i)) { +//int innerRemove(int num, int i) { +// if (innerSmall(num, i) != innerSmall(num + 1, i)) { // top = father = side = 0; -// removeNumber(num, i, 0, 0); -// i = rebuild(i); +// innerRemove(num, i, 0, 0); +// i = innerRebuild(i); // } // return i; //} // //void build(int l, int r, int i) { -// for (int j = l; j <= r; j++) root[i] = insertNumber(arr[j], root[i]); +// for (int j = l; j <= r; j++) root[i] = innerInsert(arr[j], root[i]); // if (l < r) { // int mid = (l + r) >> 1; // build(l, mid, i << 1); @@ -169,8 +169,8 @@ //} // //void update(int jobi, int jobv, int l, int r, int i) { -// root[i] = removeNumber(arr[jobi], root[i]); -// root[i] = insertNumber(jobv, root[i]); +// root[i] = innerRemove(arr[jobi], root[i]); +// root[i] = innerInsert(jobv, root[i]); // if (l < r) { // int mid = (l + r) >> 1; // if (jobi <= mid) update(jobi, jobv, l, mid, i << 1); @@ -179,7 +179,7 @@ //} // //int small(int jobl, int jobr, int jobv, int l, int r, int i) { -// if (jobl <= l && r <= jobr) return querySmall(jobv, root[i]); +// if (jobl <= l && r <= jobr) return innerSmall(jobv, root[i]); // int mid = (l + r) >> 1, ans = 0; // if (jobl <= mid) ans += small(jobl, jobr, jobv, l, mid, i << 1); // if (jobr > mid) ans += small(jobl, jobr, jobv, mid + 1, r, i << 1 | 1); @@ -201,7 +201,7 @@ //} // //int pre(int jobl, int jobr, int jobv, int l, int r, int i) { -// if (jobl <= l && r <= jobr) return queryPre(jobv, root[i]); +// if (jobl <= l && r <= jobr) return innerPre(jobv, root[i]); // int mid = (l + r) >> 1, ans = -INF; // if (jobl <= mid) ans = max(ans, pre(jobl, jobr, jobv, l, mid, i << 1)); // if (jobr > mid) ans = max(ans, pre(jobl, jobr, jobv, mid + 1, r, i << 1 | 1)); @@ -209,7 +209,7 @@ //} // //int post(int jobl, int jobr, int jobv, int l, int r, int i) { -// if (jobl <= l && r <= jobr) return queryPost(jobv, root[i]); +// if (jobl <= l && r <= jobr) return innerPost(jobv, root[i]); // int mid = (l + r) >> 1, ans = INF; // if (jobl <= mid) ans = min(ans, post(jobl, jobr, jobv, l, mid, i << 1)); // if (jobr > mid) ans = min(ans, post(jobl, jobr, jobv, mid + 1, r, i << 1 | 1)); diff --git a/src/class160/Code04_IndexWithSegment1.java b/src/class160/Code04_IndexWithSegment1.java index 29b5f69dc..c1301045f 100644 --- a/src/class160/Code04_IndexWithSegment1.java +++ b/src/class160/Code04_IndexWithSegment1.java @@ -66,7 +66,7 @@ public static int lowbit(int i) { return i & -i; } - public static int add(int jobi, int jobv, int l, int r, int i) { + public static int innerAdd(int jobi, int jobv, int l, int r, int i) { if (i == 0) { i = ++cntt; } @@ -75,22 +75,16 @@ public static int add(int jobi, int jobv, int l, int r, int i) { } else { int mid = (l + r) / 2; if (jobi <= mid) { - left[i] = add(jobi, jobv, l, mid, left[i]); + left[i] = innerAdd(jobi, jobv, l, mid, left[i]); } else { - right[i] = add(jobi, jobv, mid + 1, r, right[i]); + right[i] = innerAdd(jobi, jobv, mid + 1, r, right[i]); } sum[i] = sum[left[i]] + sum[right[i]]; } return i; } - public static void add(int i, int v) { - for (int j = i; j <= n; j += lowbit(j)) { - root[j] = add(arr[i], v, 1, s, root[j]); - } - } - - public static int queryNumber(int jobk, int l, int r) { + public static int innerQuery(int jobk, int l, int r) { if (l == r) { return l; } @@ -109,7 +103,7 @@ public static int queryNumber(int jobk, int l, int r) { for (int i = 1; i <= cntpre; i++) { pre[i] = left[pre[i]]; } - return queryNumber(jobk, l, mid); + return innerQuery(jobk, l, mid); } else { for (int i = 1; i <= cntpos; i++) { pos[i] = right[pos[i]]; @@ -117,22 +111,11 @@ public static int queryNumber(int jobk, int l, int r) { for (int i = 1; i <= cntpre; i++) { pre[i] = right[pre[i]]; } - return queryNumber(jobk - leftsum, mid + 1, r); - } - } - - public static int findNumber(int l, int r, int k) { - cntpos = cntpre = 0; - for (int i = r; i > 0; i -= lowbit(i)) { - pos[++cntpos] = root[i]; - } - for (int i = l - 1; i > 0; i -= lowbit(i)) { - pre[++cntpre] = root[i]; + return innerQuery(jobk - leftsum, mid + 1, r); } - return sorted[queryNumber(k, 1, s)]; } - public static int queryRank(int jobk, int l, int r) { + public static int innerRank(int jobk, int l, int r) { if (l == r) { return 0; } @@ -144,7 +127,7 @@ public static int queryRank(int jobk, int l, int r) { for (int i = 1; i <= cntpre; i++) { pre[i] = left[pre[i]]; } - return queryRank(jobk, l, mid); + return innerRank(jobk, l, mid); } else { int leftsum = 0; for (int i = 1; i <= cntpos; i++) { @@ -155,11 +138,28 @@ public static int queryRank(int jobk, int l, int r) { leftsum -= sum[left[pre[i]]]; pre[i] = right[pre[i]]; } - return leftsum + queryRank(jobk, mid + 1, r); + return leftsum + innerRank(jobk, mid + 1, r); + } + } + + public static void outerAdd(int i, int v) { + for (int j = i; j <= n; j += lowbit(j)) { + root[j] = innerAdd(arr[i], v, 1, s, root[j]); + } + } + + public static int outerQuery(int l, int r, int k) { + cntpos = cntpre = 0; + for (int i = r; i > 0; i -= lowbit(i)) { + pos[++cntpos] = root[i]; + } + for (int i = l - 1; i > 0; i -= lowbit(i)) { + pre[++cntpre] = root[i]; } + return sorted[innerQuery(k, 1, s)]; } - public static int findRank(int l, int r, int k) { + public static int outerRank(int l, int r, int k) { cntpos = cntpre = 0; for (int i = r; i > 0; i -= lowbit(i)) { pos[++cntpos] = root[i]; @@ -167,26 +167,26 @@ public static int findRank(int l, int r, int k) { for (int i = l - 1; i > 0; i -= lowbit(i)) { pre[++cntpre] = root[i]; } - return queryRank(k, 1, s) + 1; + return innerRank(k, 1, s) + 1; } - public static int findLast(int l, int r, int k) { - int rank = findRank(l, r, k); + public static int outerPre(int l, int r, int k) { + int rank = outerRank(l, r, k); if (rank == 1) { return -INF; } - return findNumber(l, r, rank - 1); + return outerQuery(l, r, rank - 1); } - public static int findNext(int l, int r, int k) { + public static int outerPost(int l, int r, int k) { if (k == s) { return INF; } - int rank = findRank(l, r, k + 1); + int rank = outerRank(l, r, k + 1); if (rank == r - l + 2) { return INF; } - return findNumber(l, r, rank); + return outerQuery(l, r, rank); } public static void prepare() { @@ -211,7 +211,7 @@ public static void prepare() { s = len; for (int i = 1; i <= n; i++) { arr[i] = kth(arr[i]); - add(i, 1); + outerAdd(i, 1); } } @@ -242,17 +242,17 @@ public static void main(String[] args) throws IOException { prepare(); for (int i = 1; i <= m; i++) { if (ques[i][0] == 1) { - out.println(findRank(ques[i][1], ques[i][2], kth(ques[i][3]))); + out.println(outerRank(ques[i][1], ques[i][2], kth(ques[i][3]))); } else if (ques[i][0] == 2) { - out.println(findNumber(ques[i][1], ques[i][2], ques[i][3])); + out.println(outerQuery(ques[i][1], ques[i][2], ques[i][3])); } else if (ques[i][0] == 3) { - add(ques[i][1], -1); + outerAdd(ques[i][1], -1); arr[ques[i][1]] = kth(ques[i][2]); - add(ques[i][1], 1); + outerAdd(ques[i][1], 1); } else if (ques[i][0] == 4) { - out.println(findLast(ques[i][1], ques[i][2], kth(ques[i][3]))); + out.println(outerPre(ques[i][1], ques[i][2], kth(ques[i][3]))); } else { - out.println(findNext(ques[i][1], ques[i][2], kth(ques[i][3]))); + out.println(outerPost(ques[i][1], ques[i][2], kth(ques[i][3]))); } } out.flush(); diff --git a/src/class160/Code04_IndexWithSegment2.java b/src/class160/Code04_IndexWithSegment2.java index e692fe066..2e8447e69 100644 --- a/src/class160/Code04_IndexWithSegment2.java +++ b/src/class160/Code04_IndexWithSegment2.java @@ -42,26 +42,20 @@ // return i & -i; //} // -//int add(int jobi, int jobv, int l, int r, int i) { +//int innerAdd(int jobi, int jobv, int l, int r, int i) { // if (!i) i = ++cntt; // if (l == r) { // sum[i] += jobv; // } else { // int mid = (l + r) >> 1; -// if (jobi <= mid) ls[i] = add(jobi, jobv, l, mid, ls[i]); -// else rs[i] = add(jobi, jobv, mid + 1, r, rs[i]); +// if (jobi <= mid) ls[i] = innerAdd(jobi, jobv, l, mid, ls[i]); +// else rs[i] = innerAdd(jobi, jobv, mid + 1, r, rs[i]); // sum[i] = sum[ls[i]] + sum[rs[i]]; // } // return i; //} // -//void add(int i, int v) { -// for (int j = i; j <= n; j += lowbit(j)) { -// root[j] = add(arr[i], v, 1, s, root[j]); -// } -//} -// -//int queryNumber(int jobk, int l, int r) { +//int innerQuery(int jobk, int l, int r) { // if (l == r) return l; // int mid = (l + r) >> 1; // int leftsum = 0; @@ -70,28 +64,21 @@ // if (jobk <= leftsum) { // for (int i = 1; i <= cntpos; i++) pos[i] = ls[pos[i]]; // for (int i = 1; i <= cntpre; i++) pre[i] = ls[pre[i]]; -// return queryNumber(jobk, l, mid); +// return innerQuery(jobk, l, mid); // } else { // for (int i = 1; i <= cntpos; i++) pos[i] = rs[pos[i]]; // for (int i = 1; i <= cntpre; i++) pre[i] = rs[pre[i]]; -// return queryNumber(jobk - leftsum, mid + 1, r); +// return innerQuery(jobk - leftsum, mid + 1, r); // } //} // -//int findNumber(int l, int r, int k) { -// cntpos = cntpre = 0; -// for (int i = r; i > 0; i -= lowbit(i)) pos[++cntpos] = root[i]; -// for (int i = l - 1; i > 0; i -= lowbit(i)) pre[++cntpre] = root[i]; -// return sorted[queryNumber(k, 1, s)]; -//} -// -//int queryRank(int jobi, int l, int r) { +//int innerRank(int jobi, int l, int r) { // if (l == r) return 0; // int mid = (l + r) >> 1; // if (jobi <= mid) { // for (int i = 1; i <= cntpos; i++) pos[i] = ls[pos[i]]; // for (int i = 1; i <= cntpre; i++) pre[i] = ls[pre[i]]; -// return queryRank(jobi, l, mid); +// return innerRank(jobi, l, mid); // } else { // int leftsum = 0; // for (int i = 1; i <= cntpos; i++) { @@ -102,26 +89,39 @@ // leftsum -= sum[ls[pre[i]]]; // pre[i] = rs[pre[i]]; // } -// return leftsum + queryRank(jobi, mid + 1, r); +// return leftsum + innerRank(jobi, mid + 1, r); // } //} // -//int findRank(int l, int r, int k) { +//void outerAdd(int i, int v) { +// for (int j = i; j <= n; j += lowbit(j)) { +// root[j] = innerAdd(arr[i], v, 1, s, root[j]); +// } +//} +// +//int outerQuery(int l, int r, int k) { +// cntpos = cntpre = 0; +// for (int i = r; i > 0; i -= lowbit(i)) pos[++cntpos] = root[i]; +// for (int i = l - 1; i > 0; i -= lowbit(i)) pre[++cntpre] = root[i]; +// return sorted[innerQuery(k, 1, s)]; +//} +// +//int outerRank(int l, int r, int k) { // cntpos = cntpre = 0; // for (int i = r; i > 0; i -= lowbit(i)) pos[++cntpos] = root[i]; // for (int i = l - 1; i > 0; i -= lowbit(i)) pre[++cntpre] = root[i]; -// return queryRank(k, 1, s) + 1; +// return innerRank(k, 1, s) + 1; //} // -//int findLast(int l, int r, int k) { -// int rk = findRank(l, r, k); -// return (rk == 1) ? -INF : findNumber(l, r, rk - 1); +//int outerPre(int l, int r, int k) { +// int rk = outerRank(l, r, k); +// return (rk == 1) ? -INF : outerQuery(l, r, rk - 1); //} // -//int findNext(int l, int r, int k) { +//int outerPost(int l, int r, int k) { // if (k == s) return INF; -// int rk = findRank(l, r, k + 1); -// return (rk == r - l + 2) ? INF : findNumber(l, r, rk); +// int rk = outerRank(l, r, k + 1); +// return (rk == r - l + 2) ? INF : outerQuery(l, r, rk); //} // //void prepare() { @@ -138,7 +138,7 @@ // s = len; // for (int i = 1; i <= n; i++) { // arr[i] = kth(arr[i]); -// add(i, 1); +// outerAdd(i, 1); // } //} // @@ -154,17 +154,17 @@ // prepare(); // for (int i = 1; i <= m; i++) { // if (ques[i][0] == 1) { -// cout << findRank(ques[i][1], ques[i][2], kth(ques[i][3])) << "\n"; +// cout << outerRank(ques[i][1], ques[i][2], kth(ques[i][3])) << "\n"; // } else if (ques[i][0] == 2) { -// cout << findNumber(ques[i][1], ques[i][2], ques[i][3]) << "\n"; +// cout << outerQuery(ques[i][1], ques[i][2], ques[i][3]) << "\n"; // } else if (ques[i][0] == 3) { -// add(ques[i][1], -1); +// outerAdd(ques[i][1], -1); // arr[ques[i][1]] = kth(ques[i][2]); -// add(ques[i][1], 1); +// outerAdd(ques[i][1], 1); // } else if (ques[i][0] == 4) { -// cout << findLast(ques[i][1], ques[i][2], kth(ques[i][3])) << "\n"; +// cout << outerPre(ques[i][1], ques[i][2], kth(ques[i][3])) << "\n"; // } else { -// cout << findNext(ques[i][1], ques[i][2], kth(ques[i][3])) << "\n"; +// cout << outerPost(ques[i][1], ques[i][2], kth(ques[i][3])) << "\n"; // } // } // return 0; diff --git a/src/class160/Code05_LineUp1.java b/src/class160/Code05_LineUp1.java index 4c03c4887..e44b8ea1c 100644 --- a/src/class160/Code05_LineUp1.java +++ b/src/class160/Code05_LineUp1.java @@ -57,7 +57,7 @@ public static int lowbit(int i) { return i & -i; } - public static int add(int jobi, int jobv, int l, int r, int i) { + public static int innerAdd(int jobi, int jobv, int l, int r, int i) { if (i == 0) { i = ++cnt; } @@ -66,16 +66,16 @@ public static int add(int jobi, int jobv, int l, int r, int i) { } else { int mid = (l + r) / 2; if (jobi <= mid) { - left[i] = add(jobi, jobv, l, mid, left[i]); + left[i] = innerAdd(jobi, jobv, l, mid, left[i]); } else { - right[i] = add(jobi, jobv, mid + 1, r, right[i]); + right[i] = innerAdd(jobi, jobv, mid + 1, r, right[i]); } sum[i] = sum[left[i]] + sum[right[i]]; } return i; } - public static int query(int jobl, int jobr, int l, int r, int i) { + public static int innerQuery(int jobl, int jobr, int l, int r, int i) { if (i == 0) { return 0; } @@ -85,27 +85,27 @@ public static int query(int jobl, int jobr, int l, int r, int i) { int mid = (l + r) / 2; int ans = 0; if (jobl <= mid) { - ans += query(jobl, jobr, l, mid, left[i]); + ans += innerQuery(jobl, jobr, l, mid, left[i]); } if (jobr > mid) { - ans += query(jobl, jobr, mid + 1, r, right[i]); + ans += innerQuery(jobl, jobr, mid + 1, r, right[i]); } return ans; } public static void insert(int i, int v) { for (int j = i; j <= n; j += lowbit(j)) { - root[j] = add(arr[i], v, 1, s, root[j]); + root[j] = innerAdd(arr[i], v, 1, s, root[j]); } } - public static int queryCnt(int al, int ar, int numl, int numr) { + public static int query(int al, int ar, int numl, int numr) { int ans = 0; for (int i = ar; i > 0; i -= lowbit(i)) { - ans += query(numl, numr, 1, s, root[i]); + ans += innerQuery(numl, numr, 1, s, root[i]); } for (int i = al - 1; i > 0; i -= lowbit(i)) { - ans -= query(numl, numr, 1, s, root[i]); + ans -= innerQuery(numl, numr, 1, s, root[i]); } return ans; } @@ -132,10 +132,10 @@ public static void prepare() { } public static void compute(int a, int b) { - ans -= queryCnt(a + 1, b - 1, 1, arr[a] - 1); - ans += queryCnt(a + 1, b - 1, arr[a] + 1, s); - ans -= queryCnt(a + 1, b - 1, arr[b] + 1, s); - ans += queryCnt(a + 1, b - 1, 1, arr[b] - 1); + ans -= query(a + 1, b - 1, 1, arr[a] - 1); + ans += query(a + 1, b - 1, arr[a] + 1, s); + ans -= query(a + 1, b - 1, arr[b] + 1, s); + ans += query(a + 1, b - 1, 1, arr[b] - 1); if (arr[a] < arr[b]) { ans++; } else if (arr[a] > arr[b]) { @@ -162,7 +162,7 @@ public static void main(String[] args) throws IOException { } prepare(); for (int i = 2; i <= n; i++) { - ans += queryCnt(1, i - 1, arr[i] + 1, s); + ans += query(1, i - 1, arr[i] + 1, s); } out.println(ans); in.nextToken(); diff --git a/src/class160/Code05_LineUp2.java b/src/class160/Code05_LineUp2.java index a941c58f9..96e22416e 100644 --- a/src/class160/Code05_LineUp2.java +++ b/src/class160/Code05_LineUp2.java @@ -37,38 +37,51 @@ // return i & -i; //} // -//int add(int jobi, int jobv, int l, int r, int i) { +//int innerAdd(int jobi, int jobv, int l, int r, int i) { // if (i == 0) i = ++cnt; -// if (l == r) sum[i] += jobv; -// else { +// if (l == r) { +// sum[i] += jobv; +// } else { // int mid = (l + r) / 2; -// if (jobi <= mid) ls[i] = add(jobi, jobv, l, mid, ls[i]); -// else rs[i] = add(jobi, jobv, mid + 1, r, rs[i]); +// if (jobi <= mid) { +// ls[i] = innerAdd(jobi, jobv, l, mid, ls[i]); +// } else { +// rs[i] = innerAdd(jobi, jobv, 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) { +//int innerQuery(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) / 2, res = 0; -// if (jobl <= mid) res += query(jobl, jobr, l, mid, ls[i]); -// if (jobr > mid) res += query(jobl, jobr, mid + 1, r, rs[i]); -// return res; +// int mid = (l + r) / 2; +// int ans = 0; +// if (jobl <= mid) { +// ans += innerQuery(jobl, jobr, l, mid, ls[i]); +// } +// if (jobr > mid) { +// ans += innerQuery(jobl, jobr, mid + 1, r, rs[i]); +// } +// return ans; //} // //void insert(int i, int v) { // for (int j = i; j <= n; j += lowbit(j)) { -// root[j] = add(arr[i], v, 1, s, root[j]); +// root[j] = innerAdd(arr[i], v, 1, s, root[j]); // } //} // -//int queryCnt(int al, int ar, int numl, int numr) { -// int res = 0; -// for (int i = ar; i > 0; i -= lowbit(i)) res += query(numl, numr, 1, s, root[i]); -// for (int i = al - 1; i > 0; i -= lowbit(i)) res -= query(numl, numr, 1, s, root[i]); -// return res; +//int query(int al, int ar, int numl, int numr) { +// int ans = 0; +// for (int i = ar; i > 0; i -= lowbit(i)) { +// ans += innerQuery(numl, numr, 1, s, root[i]); +// } +// for (int i = al - 1; i > 0; i -= lowbit(i)) { +// ans -= innerQuery(numl, numr, 1, s, root[i]); +// } +// return ans; //} // //void prepare() { @@ -89,10 +102,10 @@ //} // //void compute(int a, int b) { -// ans -= queryCnt(a + 1, b - 1, 1, arr[a] - 1); -// ans += queryCnt(a + 1, b - 1, arr[a] + 1, s); -// ans -= queryCnt(a + 1, b - 1, arr[b] + 1, s); -// ans += queryCnt(a + 1, b - 1, 1, arr[b] - 1); +// ans -= query(a + 1, b - 1, 1, arr[a] - 1); +// ans += query(a + 1, b - 1, arr[a] + 1, s); +// ans -= query(a + 1, b - 1, arr[b] + 1, s); +// ans += query(a + 1, b - 1, 1, arr[b] - 1); // if (arr[a] < arr[b]) ans++; // else if (arr[a] > arr[b]) ans--; // insert(a, -1); @@ -108,7 +121,7 @@ // cin >> n; // for (int i = 1; i <= n; i++) cin >> arr[i]; // prepare(); -// for (int i = 2; i <= n; i++) ans += queryCnt(1, i - 1, arr[i] + 1, s); +// for (int i = 2; i <= n; i++) ans += query(1, i - 1, arr[i] + 1, s); // cout << ans << '\n'; // cin >> m; // for (int i = 1, a, b; i <= m; i++) { diff --git a/src/class160/Code06_NetworkManagement1.java b/src/class160/Code06_NetworkManagement1.java index 6322abb3c..c4fcb17f2 100644 --- a/src/class160/Code06_NetworkManagement1.java +++ b/src/class160/Code06_NetworkManagement1.java @@ -93,61 +93,6 @@ public static int lowbit(int i) { return i & -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] += jobv; - } else { - int mid = (l + r) / 2; - if (jobi <= mid) { - left[i] = add(jobi, jobv, l, mid, left[i]); - } else { - right[i] = add(jobi, jobv, mid + 1, r, right[i]); - } - sum[i] = sum[left[i]] + sum[right[i]]; - } - return i; - } - - public static void add(int i, int kth, int val) { - for (; i <= n; i += lowbit(i)) { - root[i] = add(kth, val, 1, s, root[i]); - } - } - - public static int queryNumber(int jobk, int l, int r) { - if (l == r) { - return l; - } - int mid = (l + r) / 2; - int leftsum = 0; - for (int i = 1; i <= cntpos; i++) { - leftsum += sum[left[pos[i]]]; - } - for (int i = 1; i <= cntpre; i++) { - leftsum -= sum[left[pre[i]]]; - } - if (jobk <= leftsum) { - for (int i = 1; i <= cntpos; i++) { - pos[i] = left[pos[i]]; - } - for (int i = 1; i <= cntpre; i++) { - pre[i] = left[pre[i]]; - } - return queryNumber(jobk, l, mid); - } else { - for (int i = 1; i <= cntpos; i++) { - pos[i] = right[pos[i]]; - } - for (int i = 1; i <= cntpre; i++) { - pre[i] = right[pre[i]]; - } - return queryNumber(jobk - leftsum, mid + 1, r); - } - } - // dfs1是递归版,java版本提交会爆栈,C++版本不会爆栈 public static void dfs1(int u, int fa) { deep[u] = deep[fa] + 1; @@ -245,35 +190,62 @@ public static int lca(int a, int b) { return stjump[a][0]; } - public static void prepare() { - s = 0; - for (int i = 1; i <= n; i++) { - sorted[++s] = arr[i]; + public static int innerAdd(int jobi, int jobv, int l, int r, int i) { + if (i == 0) { + i = ++cntt; } - for (int i = 1; i <= m; i++) { - if (ques[i][0] == 0) { - sorted[++s] = ques[i][2]; + if (l == r) { + sum[i] += jobv; + } else { + int mid = (l + r) / 2; + if (jobi <= mid) { + left[i] = innerAdd(jobi, jobv, l, mid, left[i]); + } else { + right[i] = innerAdd(jobi, jobv, mid + 1, r, right[i]); } + sum[i] = sum[left[i]] + sum[right[i]]; } - 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]; - } + return i; + } + + public static int innerQuery(int jobk, int l, int r) { + if (l == r) { + return l; } - s = len; - for (int i = 1; i <= n; i++) { - arr[i] = kth(arr[i]); + int mid = (l + r) / 2; + int leftsum = 0; + for (int i = 1; i <= cntpos; i++) { + leftsum += sum[left[pos[i]]]; } - dfs2(); - for (int i = 1; i <= n; i++) { - add(dfn[i], arr[i], 1); - add(dfn[i] + size[i], arr[i], -1); + for (int i = 1; i <= cntpre; i++) { + leftsum -= sum[left[pre[i]]]; + } + if (jobk <= leftsum) { + for (int i = 1; i <= cntpos; i++) { + pos[i] = left[pos[i]]; + } + for (int i = 1; i <= cntpre; i++) { + pre[i] = left[pre[i]]; + } + return innerQuery(jobk, l, mid); + } else { + for (int i = 1; i <= cntpos; i++) { + pos[i] = right[pos[i]]; + } + for (int i = 1; i <= cntpre; i++) { + pre[i] = right[pre[i]]; + } + return innerQuery(jobk - leftsum, mid + 1, r); } } - public static void change(int i, int v) { + public static void add(int i, int kth, int val) { + for (; i <= n; i += lowbit(i)) { + root[i] = innerAdd(kth, val, 1, s, root[i]); + } + } + + public static void update(int i, int v) { add(dfn[i], arr[i], -1); add(dfn[i] + size[i], arr[i], 1); arr[i] = kth(v); @@ -301,7 +273,35 @@ public static int query(int x, int y, int k) { for (int i = dfn[lcafa]; i > 0; i -= lowbit(i)) { pre[++cntpre] = root[i]; } - return queryNumber(num - k + 1, 1, s); + return innerQuery(num - k + 1, 1, s); + } + + public static void prepare() { + s = 0; + for (int i = 1; i <= n; i++) { + sorted[++s] = arr[i]; + } + for (int i = 1; i <= m; i++) { + if (ques[i][0] == 0) { + sorted[++s] = ques[i][2]; + } + } + 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 <= n; i++) { + arr[i] = kth(arr[i]); + } + dfs2(); + for (int i = 1; i <= n; i++) { + add(dfn[i], arr[i], 1); + add(dfn[i] + size[i], arr[i], -1); + } } public static void main(String[] args) throws IOException { @@ -335,7 +335,7 @@ public static void main(String[] args) throws IOException { prepare(); for (int i = 1; i <= m; i++) { if (ques[i][0] == 0) { - change(ques[i][1], ques[i][2]); + update(ques[i][1], ques[i][2]); } else { int ans = query(ques[i][1], ques[i][2], ques[i][0]); if (ans == -1) { diff --git a/src/class160/Code06_NetworkManagement2.java b/src/class160/Code06_NetworkManagement2.java index e17f3b50a..c2972d36a 100644 --- a/src/class160/Code06_NetworkManagement2.java +++ b/src/class160/Code06_NetworkManagement2.java @@ -60,39 +60,6 @@ // return i & -i; //} // -//int add(int jobi, int jobv, int l, int r, int i) { -// if (i == 0) i = ++cntt; -// if (l == r) sum[i] += jobv; -// else { -// int mid = (l + r) / 2; -// if (jobi <= mid) ls[i] = add(jobi, jobv, l, mid, ls[i]); -// else rs[i] = add(jobi, jobv, mid + 1, r, rs[i]); -// sum[i] = sum[ls[i]] + sum[rs[i]]; -// } -// return i; -//} -// -//void add(int i, int kth, int val) { -// for (; i <= n; i += lowbit(i)) root[i] = add(kth, val, 1, s, root[i]); -//} -// -//int queryNumber(int jobk, int l, int r) { -// if (l == r) return l; -// int mid = (l + r) / 2; -// int leftsum = 0; -// for (int i = 1; i <= cntpos; i++) leftsum += sum[ls[pos[i]]]; -// for (int i = 1; i <= cntpre; i++) leftsum -= sum[ls[pre[i]]]; -// if (jobk <= leftsum) { -// for (int i = 1; i <= cntpos; i++) pos[i] = ls[pos[i]]; -// for (int i = 1; i <= cntpre; i++) pre[i] = ls[pre[i]]; -// return queryNumber(jobk, l, mid); -// } else { -// for (int i = 1; i <= cntpos; i++) pos[i] = rs[pos[i]]; -// for (int i = 1; i <= cntpre; i++) pre[i] = rs[pre[i]]; -// return queryNumber(jobk - leftsum, mid + 1, r); -// } -//} -// //void dfs(int u, int fa) { // deep[u] = deep[fa] + 1; // size[u] = 1; @@ -122,21 +89,44 @@ // return stjump[a][0]; //} // -//void prepare() { -// s = 0; -// for (int i = 1; i <= n; i++) sorted[++s] = arr[i]; -// for (int i = 1; i <= m; i++) if (ques[i][0] == 0) sorted[++s] = ques[i][2]; -// sort(sorted + 1, sorted + s + 1); -// s = unique(sorted + 1, sorted + s + 1) - sorted - 1; -// for (int i = 1; i <= n; i++) arr[i] = kth(arr[i]); -// dfs(1, 0); -// for (int i = 1; i <= n; i++) { -// add(dfn[i], arr[i], 1); -// add(dfn[i] + size[i], arr[i], -1); +//int innerAdd(int jobi, int jobv, int l, int r, int i) { +// if (i == 0) i = ++cntt; +// if (l == r) { +// sum[i] += jobv; +// } else { +// int mid = (l + r) / 2; +// if (jobi <= mid) { +// ls[i] = innerAdd(jobi, jobv, l, mid, ls[i]); +// } else { +// rs[i] = innerAdd(jobi, jobv, mid + 1, r, rs[i]); +// } +// sum[i] = sum[ls[i]] + sum[rs[i]]; +// } +// return i; +//} +// +//int innerQuery(int jobk, int l, int r) { +// if (l == r) return l; +// int mid = (l + r) / 2; +// int leftsum = 0; +// for (int i = 1; i <= cntpos; i++) leftsum += sum[ls[pos[i]]]; +// for (int i = 1; i <= cntpre; i++) leftsum -= sum[ls[pre[i]]]; +// if (jobk <= leftsum) { +// for (int i = 1; i <= cntpos; i++) pos[i] = ls[pos[i]]; +// for (int i = 1; i <= cntpre; i++) pre[i] = ls[pre[i]]; +// return innerQuery(jobk, l, mid); +// } else { +// for (int i = 1; i <= cntpos; i++) pos[i] = rs[pos[i]]; +// for (int i = 1; i <= cntpre; i++) pre[i] = rs[pre[i]]; +// return innerQuery(jobk - leftsum, mid + 1, r); // } //} // -//void change(int i, int v) { +//void add(int i, int kth, int val) { +// for (; i <= n; i += lowbit(i)) root[i] = innerAdd(kth, val, 1, s, root[i]); +//} +// +//void update(int i, int v) { // add(dfn[i], arr[i], -1); // add(dfn[i] + size[i], arr[i], 1); // arr[i] = kth(v); @@ -154,7 +144,23 @@ // for (int i = dfn[y]; i; i -= lowbit(i)) pos[++cntpos] = root[i]; // for (int i = dfn[xylca]; i; i -= lowbit(i)) pre[++cntpre] = root[i]; // for (int i = dfn[lcafa]; i; i -= lowbit(i)) pre[++cntpre] = root[i]; -// return queryNumber(num - k + 1, 1, s); +// return innerQuery(num - k + 1, 1, s); +//} +// +//void prepare() { +// s = 0; +// for (int i = 1; i <= n; i++) sorted[++s] = arr[i]; +// for (int i = 1; i <= m; i++) { +// if (ques[i][0] == 0) sorted[++s] = ques[i][2]; +// } +// sort(sorted + 1, sorted + s + 1); +// s = unique(sorted + 1, sorted + s + 1) - sorted - 1; +// for (int i = 1; i <= n; i++) arr[i] = kth(arr[i]); +// dfs(1, 0); +// for (int i = 1; i <= n; i++) { +// add(dfn[i], arr[i], 1); +// add(dfn[i] + size[i], arr[i], -1); +// } //} // //int main() { @@ -171,7 +177,7 @@ // prepare(); // for (int i = 1; i <= m; i++) { // if (ques[i][0] == 0) { -// change(ques[i][1], ques[i][2]); +// update(ques[i][1], ques[i][2]); // } else { // int ans = query(ques[i][1], ques[i][2], ques[i][0]); // if(ans == -1) { From ceb76444240e666de86a0905d12d7fde35be22c5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 18 Feb 2025 15:53:34 +0800 Subject: [PATCH 0692/2029] modify code --- src/class160/Code01_SegmentWithSegment1.java | 8 ++++++++ src/class160/Code01_SegmentWithSegment2.java | 8 ++++++++ src/class160/Code02_QueryKthMaximum1.java | 8 +++++++- src/class160/Code02_QueryKthMaximum2.java | 8 +++++++- src/class160/Code03_SegmentWithBalanced1.java | 19 ++++++++++++++----- src/class160/Code03_SegmentWithBalanced2.java | 9 +++++++++ src/class160/Code04_IndexWithSegment1.java | 9 +++++++++ src/class160/Code04_IndexWithSegment2.java | 9 +++++++++ src/class160/Code05_LineUp1.java | 7 +++++++ src/class160/Code05_LineUp2.java | 7 +++++++ src/class160/Code06_NetworkManagement1.java | 7 +++++++ src/class160/Code06_NetworkManagement2.java | 7 +++++++ 12 files changed, 99 insertions(+), 7 deletions(-) diff --git a/src/class160/Code01_SegmentWithSegment1.java b/src/class160/Code01_SegmentWithSegment1.java index a5ff8220f..5fe80ec65 100644 --- a/src/class160/Code01_SegmentWithSegment1.java +++ b/src/class160/Code01_SegmentWithSegment1.java @@ -1,6 +1,14 @@ package class160; // 线段树套线段树,java版 +// 人有三种属性,身高、活泼度、缘分值 +// 身高为int类型,活泼度和缘分值为小数点后最多1位的double类型 +// 实现一种结构,提供如下两种类型的操作 +// 操作 I a b c : 加入一个人,身高为a,活泼度为b,缘分值为c +// 操作 Q a b c d : 查询身高范围[a,b],活泼度范围[c,d],所有人中的缘分最大值 +// 注意操作Q,如果a > b需要交换,如果c > d需要交换 +// 100 <= 身高 <= 200 +// 0.0 <= 活泼度、缘分值 <= 100.0 // 测试链接 : https://acm.hdu.edu.cn/showproblem.php?pid=1823 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class160/Code01_SegmentWithSegment2.java b/src/class160/Code01_SegmentWithSegment2.java index e0b19f8fa..160ae0774 100644 --- a/src/class160/Code01_SegmentWithSegment2.java +++ b/src/class160/Code01_SegmentWithSegment2.java @@ -1,6 +1,14 @@ package class160; // 线段树套线段树,C++版 +// 人有三种属性,身高、活泼度、缘分值 +// 身高为int类型,活泼度和缘分值为小数点后最多1位的double类型 +// 实现一种结构,提供如下两种类型的操作 +// 操作 I a b c : 加入一个人,身高为a,活泼度为b,缘分值为c +// 操作 Q a b c d : 查询身高范围[a,b],活泼度范围[c,d],所有人中的缘分最大值 +// 注意操作Q,如果a > b需要交换,如果c > d需要交换 +// 100 <= 身高 <= 200 +// 0.0 <= 活泼度、缘分值 <= 100.0 // 测试链接 : https://acm.hdu.edu.cn/showproblem.php?pid=1823 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class160/Code02_QueryKthMaximum1.java b/src/class160/Code02_QueryKthMaximum1.java index 688a487f5..3e54faee6 100644 --- a/src/class160/Code02_QueryKthMaximum1.java +++ b/src/class160/Code02_QueryKthMaximum1.java @@ -1,6 +1,12 @@ package class160; -// K大数查询,java版 +// k大数查询,java版 +// 初始时有n个空集合,编号1~n,实现如下两种类型的操作,操作一共发生m次 +// 操作 1 l r v : 数字v放入编号范围[l,r]的每一个集合中 +// 操作 2 l r k : 编号范围[l,r]的所有集合,如果生成不去重的并集,返回第k大的数字 +// 1 <= n、m <= 5 * 10^4 +// 1 <= v <= n +// 1 <= k < 2^63,题目保证第k大的数字一定存在 // 测试链接 : https://www.luogu.com.cn/problem/P3332 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class160/Code02_QueryKthMaximum2.java b/src/class160/Code02_QueryKthMaximum2.java index c4d45feac..12963cb0f 100644 --- a/src/class160/Code02_QueryKthMaximum2.java +++ b/src/class160/Code02_QueryKthMaximum2.java @@ -1,6 +1,12 @@ package class160; -// K大数查询,C++版 +// k大数查询,C++版 +// 初始时有n个空集合,编号1~n,实现如下两种类型的操作,操作一共发生m次 +// 操作 1 l r v : 数字v放入编号范围[l,r]的每一个集合中 +// 操作 2 l r k : 编号范围[l,r]的所有集合,如果生成不去重的并集,返回第k大的数字 +// 1 <= n、m <= 5 * 10^4 +// 1 <= v <= n +// 1 <= k < 2^63,题目保证第k大的数字一定存在 // 测试链接 : https://www.luogu.com.cn/problem/P3332 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class160/Code03_SegmentWithBalanced1.java b/src/class160/Code03_SegmentWithBalanced1.java index 608353819..21285c3f8 100644 --- a/src/class160/Code03_SegmentWithBalanced1.java +++ b/src/class160/Code03_SegmentWithBalanced1.java @@ -1,6 +1,15 @@ package class160; // 线段树套平衡树,java版 +// 给定一个长度为n的数组arr,下标1~n +// 每条操作都是如下5种类型中的一种,一共进行m次操作 +// 操作 1 x y z : 查询数字z在arr[x..y]中的排名 +// 操作 2 x y z : 查询arr[x..y]中排第z名的数字 +// 操作 3 x y : arr中x位置的数字改成y +// 操作 4 x y z : 查询数字z在arr[x..y]中的前驱,不存在返回-2147483647 +// 操作 5 x y z : 查询数字z在arr[x..y]中的后继,不存在返回+2147483647 +// 1 <= n、m <= 5 * 10^4 +// 数组中的值永远在[0, 10^8]范围内 // 测试链接 : https://www.luogu.com.cn/problem/P3380 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -240,14 +249,14 @@ public static int small(int jobl, int jobr, int jobv, int l, int r, int i) { } public static int number(int jobl, int jobr, int jobk) { - int L = 0, R = 100000000, mid, ans = 0; - while (L <= R) { - mid = (L + R) >> 1; + int l = 0, r = 100000000, mid, ans = 0; + while (l <= r) { + mid = (l + r) >> 1; if (small(jobl, jobr, mid + 1, 1, n, 1) >= jobk) { ans = mid; - R = mid - 1; + r = mid - 1; } else { - L = mid + 1; + l = mid + 1; } } return ans; diff --git a/src/class160/Code03_SegmentWithBalanced2.java b/src/class160/Code03_SegmentWithBalanced2.java index 6d0a819c7..2a3b47b49 100644 --- a/src/class160/Code03_SegmentWithBalanced2.java +++ b/src/class160/Code03_SegmentWithBalanced2.java @@ -1,6 +1,15 @@ package class160; // 线段树套平衡树,C++版 +// 给定一个长度为n的数组arr,下标1~n +// 每条操作都是如下5种类型中的一种,一共进行m次操作 +// 操作 1 x y z : 查询数字z在arr[x..y]中的排名 +// 操作 2 x y z : 查询arr[x..y]中排第z名的数字 +// 操作 3 x y : arr中x位置的数字改成y +// 操作 4 x y z : 查询数字z在arr[x..y]中的前驱,不存在返回-2147483647 +// 操作 5 x y z : 查询数字z在arr[x..y]中的后继,不存在返回+2147483647 +// 1 <= n、m <= 5 * 10^4 +// 数组中的值永远在[0, 10^8]范围内 // 测试链接 : https://www.luogu.com.cn/problem/P3380 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class160/Code04_IndexWithSegment1.java b/src/class160/Code04_IndexWithSegment1.java index c1301045f..af99c995f 100644 --- a/src/class160/Code04_IndexWithSegment1.java +++ b/src/class160/Code04_IndexWithSegment1.java @@ -1,6 +1,15 @@ package class160; // 树状数组套线段树,java版 +// 给定一个长度为n的数组arr,下标1~n +// 每条操作都是如下5种类型中的一种,一共进行m次操作 +// 操作 1 x y z : 查询数字z在arr[x..y]中的排名 +// 操作 2 x y z : 查询arr[x..y]中排第z名的数字 +// 操作 3 x y : arr中x位置的数字改成y +// 操作 4 x y z : 查询数字z在arr[x..y]中的前驱,不存在返回-2147483647 +// 操作 5 x y z : 查询数字z在arr[x..y]中的后继,不存在返回+2147483647 +// 1 <= n、m <= 5 * 10^4 +// 数组中的值永远在[0, 10^8]范围内 // 测试链接 : https://www.luogu.com.cn/problem/P3380 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class160/Code04_IndexWithSegment2.java b/src/class160/Code04_IndexWithSegment2.java index 2e8447e69..69b6be34b 100644 --- a/src/class160/Code04_IndexWithSegment2.java +++ b/src/class160/Code04_IndexWithSegment2.java @@ -1,6 +1,15 @@ package class160; // 树状数组套线段树,C++版 +// 给定一个长度为n的数组arr,下标1~n +// 每条操作都是如下5种类型中的一种,一共进行m次操作 +// 操作 1 x y z : 查询数字z在arr[x..y]中的排名 +// 操作 2 x y z : 查询arr[x..y]中排第z名的数字 +// 操作 3 x y : arr中x位置的数字改成y +// 操作 4 x y z : 查询数字z在arr[x..y]中的前驱,不存在返回-2147483647 +// 操作 5 x y z : 查询数字z在arr[x..y]中的后继,不存在返回+2147483647 +// 1 <= n、m <= 5 * 10^4 +// 数组中的值永远在[0, 10^8]范围内 // 测试链接 : https://www.luogu.com.cn/problem/P3380 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class160/Code05_LineUp1.java b/src/class160/Code05_LineUp1.java index e44b8ea1c..72bc1d237 100644 --- a/src/class160/Code05_LineUp1.java +++ b/src/class160/Code05_LineUp1.java @@ -1,6 +1,13 @@ package class160; // 排队,java版 +// 给定一个长度为n的数组arr,下标1~n +// 如果有i < j,并且arr[i] > arr[j],那么(i,j)就叫做一个逆序对 +// 首先打印原始arr中有多少逆序对,然后进行如下类型的操作,一共发生m次 +// 操作 a b : 交换arr中a位置的数和b位置的数,打印数组中逆序对的数量 +// 1 <= n <= 2 * 10^4 +// 1 <= m <= 2 * 10^3 +// 1 <= arr[i] <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P1975 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class160/Code05_LineUp2.java b/src/class160/Code05_LineUp2.java index 96e22416e..e52766dab 100644 --- a/src/class160/Code05_LineUp2.java +++ b/src/class160/Code05_LineUp2.java @@ -1,6 +1,13 @@ package class160; // 排队,C++版 +// 给定一个长度为n的数组arr,下标1~n +// 如果有i < j,并且arr[i] > arr[j],那么(i,j)就叫做一个逆序对 +// 首先打印原始arr中有多少逆序对,然后进行如下类型的操作,一共发生m次 +// 操作 a b : 交换arr中a位置的数和b位置的数,打印数组中逆序对的数量 +// 1 <= n <= 2 * 10^4 +// 1 <= m <= 2 * 10^3 +// 1 <= arr[i] <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P1975 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class160/Code06_NetworkManagement1.java b/src/class160/Code06_NetworkManagement1.java index c4fcb17f2..83e721266 100644 --- a/src/class160/Code06_NetworkManagement1.java +++ b/src/class160/Code06_NetworkManagement1.java @@ -1,6 +1,13 @@ package class160; // 网络管理,java版 +// 一共有n个点,编号1~n,每个点给定点权,给定n-1条边,所有点连成一棵树 +// 实现如下类型的操作,操作一共发生m次 +// 操作 0 x y : x号点的点权变成y +// 操作 k x y : 保证k > 0,点x到点y的路径上,打印第k大的值 +// 如果路径上不够k个点,打印"invalid request!" +// 1 <= n、m <= 8 * 10^4 +// 点权 <= 10^8 // 测试链接 : https://www.luogu.com.cn/problem/P4175 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class160/Code06_NetworkManagement2.java b/src/class160/Code06_NetworkManagement2.java index c2972d36a..7e2eb432a 100644 --- a/src/class160/Code06_NetworkManagement2.java +++ b/src/class160/Code06_NetworkManagement2.java @@ -1,6 +1,13 @@ package class160; // 网络管理,C++版 +// 一共有n个点,编号1~n,每个点给定点权,给定n-1条边,所有点连成一棵树 +// 实现如下类型的操作,操作一共发生m次 +// 操作 0 x y : x号点的点权变成y +// 操作 k x y : 保证k > 0,点x到点y的路径上,打印第k大的值 +// 如果路径上不够k个点,打印"invalid request!" +// 1 <= n、m <= 8 * 10^4 +// 点权 <= 10^8 // 测试链接 : https://www.luogu.com.cn/problem/P4175 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From 60e3846add10a262e17a561833546716c2163ec4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 18 Feb 2025 16:25:09 +0800 Subject: [PATCH 0693/2029] modify code --- src/class160/Code02_QueryKthMaximum1.java | 8 ++++---- src/class160/Code02_QueryKthMaximum2.java | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/class160/Code02_QueryKthMaximum1.java b/src/class160/Code02_QueryKthMaximum1.java index 3e54faee6..807b3a535 100644 --- a/src/class160/Code02_QueryKthMaximum1.java +++ b/src/class160/Code02_QueryKthMaximum1.java @@ -40,7 +40,7 @@ public class Code02_QueryKthMaximum1 { public static int[] lazy = new int[MAXT]; - public static int cntt; + public static int cnt; public static int kth(int num) { int left = 1, right = s, mid; @@ -64,10 +64,10 @@ public static void up(int i) { public static void down(int i, int ln, int rn) { if (lazy[i] != 0) { if (left[i] == 0) { - left[i] = ++cntt; + left[i] = ++cnt; } if (right[i] == 0) { - right[i] = ++cntt; + right[i] = ++cnt; } sum[left[i]] += lazy[i] * ln; lazy[left[i]] += lazy[i]; @@ -79,7 +79,7 @@ public static void down(int i, int ln, int rn) { public static int innerAdd(int jobl, int jobr, int l, int r, int i) { if (i == 0) { - i = ++cntt; + i = ++cnt; } if (jobl <= l && r <= jobr) { sum[i] += r - l + 1; diff --git a/src/class160/Code02_QueryKthMaximum2.java b/src/class160/Code02_QueryKthMaximum2.java index 12963cb0f..78f55130a 100644 --- a/src/class160/Code02_QueryKthMaximum2.java +++ b/src/class160/Code02_QueryKthMaximum2.java @@ -26,7 +26,7 @@ //int rs[MAXT]; //long long sum[MAXT]; //int lazy[MAXT]; -//int cntt; +//int cnt; // //int kth(int num) { // int l = 1, r = s; @@ -49,8 +49,8 @@ // //void down(int i, int ln, int rn) { // if (lazy[i]) { -// if (!ls[i]) ls[i] = ++cntt; -// if (!rs[i]) rs[i] = ++cntt; +// if (!ls[i]) ls[i] = ++cnt; +// if (!rs[i]) rs[i] = ++cnt; // sum[ls[i]] += 1LL * lazy[i] * ln; // lazy[ls[i]] += lazy[i]; // sum[rs[i]] += 1LL * lazy[i] * rn; @@ -60,7 +60,7 @@ //} // //int innerAdd(int jobl, int jobr, int l, int r, int i) { -// if (!i) i = ++cntt; +// if (!i) i = ++cnt; // if (jobl <= l && r <= jobr) { // sum[i] += (long long)(r - l + 1); // lazy[i]++; From 07888734dfe4781b7d80d2b2ad80b3299325dafa Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 19 Feb 2025 14:34:07 +0800 Subject: [PATCH 0694/2029] modify code --- src/class160/Code01_SegmentWithSegment1.java | 28 ++++++------ src/class160/Code01_SegmentWithSegment2.java | 45 +++++++++----------- 2 files changed, 35 insertions(+), 38 deletions(-) diff --git a/src/class160/Code01_SegmentWithSegment1.java b/src/class160/Code01_SegmentWithSegment1.java index 5fe80ec65..8a8907837 100644 --- a/src/class160/Code01_SegmentWithSegment1.java +++ b/src/class160/Code01_SegmentWithSegment1.java @@ -23,13 +23,13 @@ public class Code01_SegmentWithSegment1 { - public static int MAXH = 101; + public static int n = 101; - public static int MAXA = 1001; + public static int m = 1001; - public static int n = 1000, m; + public static int MINX = 100, MAXX = 200, MINY = 0, MAXY = 1000; - public static int[][] tree = new int[MAXH << 2][MAXA << 2]; + public static int[][] tree = new int[n << 2][m << 2]; public static void innerBuild(int yl, int yr, int xi, int yi) { tree[xi][yi] = -1; @@ -71,7 +71,7 @@ public static int innerQuery(int jobyl, int jobyr, int yl, int yr, int xi, int y } public static void outerBuild(int xl, int xr, int xi) { - innerBuild(0, n, xi, 1); + innerBuild(MINY, MAXY, xi, 1); if (xl < xr) { int mid = (xl + xr) / 2; outerBuild(xl, mid, xi << 1); @@ -80,7 +80,7 @@ public static void outerBuild(int xl, int xr, int xi) { } public static void outerUpdate(int jobx, int joby, int jobv, int xl, int xr, int xi) { - innerUpdate(joby, jobv, 0, n, xi, 1); + innerUpdate(joby, jobv, MINY, MAXY, xi, 1); if (xl < xr) { int mid = (xl + xr) / 2; if (jobx <= mid) { @@ -93,7 +93,7 @@ public static void outerUpdate(int jobx, int joby, int jobv, int xl, int xr, int public static int outerQuery(int jobxl, int jobxr, int jobyl, int jobyr, int xl, int xr, int xi) { if (jobxl <= xl && xr <= jobxr) { - return innerQuery(jobyl, jobyr, 0, n, xi, 1); + return innerQuery(jobyl, jobyr, MINY, MAXY, xi, 1); } int mid = (xl + xr) / 2; int ans = -1; @@ -108,18 +108,18 @@ public static int outerQuery(int jobxl, int jobxr, int jobyl, int jobyr, int xl, public static void main(String[] args) { Kattio io = new Kattio(); - m = io.nextInt(); + int q = io.nextInt(); String op; int a, b, c, d; - while (m != 0) { - outerBuild(100, 200, 1); - for (int i = 1; i <= m; i++) { + while (q != 0) { + outerBuild(MINX, MAXX, 1); + for (int i = 1; i <= q; i++) { op = io.next(); if (op.equals("I")) { a = io.nextInt(); b = (int) (io.nextDouble() * 10); c = (int) (io.nextDouble() * 10); - outerUpdate(a, b, c, 100, 200, 1); + outerUpdate(a, b, c, MINX, MAXX, 1); } else { a = io.nextInt(); b = io.nextInt(); @@ -129,7 +129,7 @@ public static void main(String[] args) { int xr = Math.max(a, b); int yl = Math.min(c, d); int yr = Math.max(c, d); - int ans = outerQuery(xl, xr, yl, yr, 100, 200, 1); + int ans = outerQuery(xl, xr, yl, yr, MINX, MAXX, 1); if (ans == -1) { io.println(ans); } else { @@ -137,7 +137,7 @@ public static void main(String[] args) { } } } - m = io.nextInt(); + q = io.nextInt(); } io.flush(); io.close(); diff --git a/src/class160/Code01_SegmentWithSegment2.java b/src/class160/Code01_SegmentWithSegment2.java index 160ae0774..44b127100 100644 --- a/src/class160/Code01_SegmentWithSegment2.java +++ b/src/class160/Code01_SegmentWithSegment2.java @@ -17,10 +17,10 @@ // //using namespace std; // -//const int MAXH = 101; -//const int MAXA = 1001; -//int n = 1000, m; -//int tree[MAXH << 2][MAXA << 2]; +//const int n = 101; +//const int m = 1001; +//int MINX = 100, MAXX = 200, MINY = 0, MAXY = 1000; +//int tree[n << 2][m << 2]; // //void innerBuild(int yl, int yr, int xi, int yi) { // tree[xi][yi] = -1; @@ -61,7 +61,7 @@ //} // //void outerBuild(int xl, int xr, int xi) { -// innerBuild(0, n, xi, 1); +// innerBuild(MINY, MAXY, xi, 1); // if (xl < xr) { // int mid = (xl + xr) >> 1; // outerBuild(xl, mid, xi << 1); @@ -70,7 +70,7 @@ //} // //void outerUpdate(int jobx, int joby, int jobv, int xl, int xr, int xi) { -// innerUpdate(joby, jobv, 0, n, xi, 1); +// innerUpdate(joby, jobv, MINY, MAXY, xi, 1); // if (xl < xr) { // int mid = (xl + xr) >> 1; // if (jobx <= mid) { @@ -83,7 +83,7 @@ // //int outerQuery(int jobxl, int jobxr, int jobyl, int jobyr, int xl, int xr, int xi) { // if (jobxl <= xl && xr <= jobxr) { -// return innerQuery(jobyl, jobyr, 0, n, xi, 1); +// return innerQuery(jobyl, jobyr, MINY, MAXY, xi, 1); // } // int mid = (xl + xr) >> 1; // int ans = -1; @@ -97,30 +97,27 @@ //} // //int main() { -// scanf("%d", &m); -// while(m != 0) { -// outerBuild(100, 200, 1); -// for (int i = 0; i < m; i++) { +// int q; +// scanf("%d", &q); +// while(q != 0) { +// outerBuild(MINX, MAXX, 1); +// for (int i = 0; i < q; i++) { // char op[2]; // scanf("%s", op); // if (op[0] == 'I') { // int a; -// double bd, cd; -// scanf("%d %lf %lf", &a, &bd, &cd); -// int b = (int)(bd * 10); -// int c = (int)(cd * 10); -// outerUpdate(a, b, c, 100, 200, 1); +// double b, c; +// scanf("%d %lf %lf", &a, &b, &c); +// outerUpdate(a, (int)(b * 10), (int)(c * 10), MINX, MAXX, 1); // } else { // int a, b; -// double cd, dd; -// scanf("%d %d %lf %lf", &a, &b, &cd, &dd); -// int c = (int)(cd * 10); -// int d = (int)(dd * 10); +// double c, d; +// scanf("%d %d %lf %lf", &a, &b, &c, &d); // int xl = min(a, b); // int xr = max(a, b); -// int yl = min(c, d); -// int yr = max(c, d); -// int ans = outerQuery(xl, xr, yl, yr, 100, 200, 1); +// int yl = min((int)(c * 10), (int)(d * 10)); +// int yr = max((int)(c * 10), (int)(d * 10)); +// int ans = outerQuery(xl, xr, yl, yr, MINX, MAXX, 1); // if (ans == -1) { // printf("-1\n"); // } else { @@ -128,7 +125,7 @@ // } // } // } -// scanf("%d", &m); +// scanf("%d", &q); // } // return 0; //} \ No newline at end of file From aff31650259b93d7d417e669c44aed928ee5e9fe Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 19 Feb 2025 15:30:10 +0800 Subject: [PATCH 0695/2029] modify code --- src/class160/Code04_IndexWithSegment1.java | 87 +++++++++--------- src/class160/Code04_IndexWithSegment2.java | 98 +++++++++++++-------- src/class160/Code06_NetworkManagement1.java | 43 +++++---- src/class160/Code06_NetworkManagement2.java | 60 +++++++++---- 4 files changed, 170 insertions(+), 118 deletions(-) diff --git a/src/class160/Code04_IndexWithSegment1.java b/src/class160/Code04_IndexWithSegment1.java index af99c995f..df2510093 100644 --- a/src/class160/Code04_IndexWithSegment1.java +++ b/src/class160/Code04_IndexWithSegment1.java @@ -37,7 +37,6 @@ public class Code04_IndexWithSegment1 { public static int[] sorted = new int[MAXN * 2]; - // 注意这不是主席树!而是若干棵动态开点权值线段树! public static int[] root = new int[MAXN]; public static int[] sum = new int[MAXT]; @@ -48,13 +47,13 @@ public class Code04_IndexWithSegment1 { public static int cntt = 0; - public static int[] pos = new int[MAXN]; + public static int[] addTree = new int[MAXN]; - public static int[] pre = new int[MAXN]; + public static int[] minusTree = new int[MAXN]; - public static int cntpos; + public static int cntadd; - public static int cntpre; + public static int cntminus; public static int kth(int num) { int left = 1, right = s, mid; @@ -99,55 +98,55 @@ public static int innerQuery(int jobk, int l, int r) { } int mid = (l + r) / 2; int leftsum = 0; - for (int i = 1; i <= cntpos; i++) { - leftsum += sum[left[pos[i]]]; + for (int i = 1; i <= cntadd; i++) { + leftsum += sum[left[addTree[i]]]; } - for (int i = 1; i <= cntpre; i++) { - leftsum -= sum[left[pre[i]]]; + for (int i = 1; i <= cntminus; i++) { + leftsum -= sum[left[minusTree[i]]]; } if (jobk <= leftsum) { - for (int i = 1; i <= cntpos; i++) { - pos[i] = left[pos[i]]; + for (int i = 1; i <= cntadd; i++) { + addTree[i] = left[addTree[i]]; } - for (int i = 1; i <= cntpre; i++) { - pre[i] = left[pre[i]]; + for (int i = 1; i <= cntminus; i++) { + minusTree[i] = left[minusTree[i]]; } return innerQuery(jobk, l, mid); } else { - for (int i = 1; i <= cntpos; i++) { - pos[i] = right[pos[i]]; + for (int i = 1; i <= cntadd; i++) { + addTree[i] = right[addTree[i]]; } - for (int i = 1; i <= cntpre; i++) { - pre[i] = right[pre[i]]; + for (int i = 1; i <= cntminus; i++) { + minusTree[i] = right[minusTree[i]]; } return innerQuery(jobk - leftsum, mid + 1, r); } } - public static int innerRank(int jobk, int l, int r) { + public static int innerSmall(int jobi, int l, int r) { if (l == r) { return 0; } int mid = (l + r) / 2; - if (jobk <= mid) { - for (int i = 1; i <= cntpos; i++) { - pos[i] = left[pos[i]]; + if (jobi <= mid) { + for (int i = 1; i <= cntadd; i++) { + addTree[i] = left[addTree[i]]; } - for (int i = 1; i <= cntpre; i++) { - pre[i] = left[pre[i]]; + for (int i = 1; i <= cntminus; i++) { + minusTree[i] = left[minusTree[i]]; } - return innerRank(jobk, l, mid); + return innerSmall(jobi, l, mid); } else { int leftsum = 0; - for (int i = 1; i <= cntpos; i++) { - leftsum += sum[left[pos[i]]]; - pos[i] = right[pos[i]]; + for (int i = 1; i <= cntadd; i++) { + leftsum += sum[left[addTree[i]]]; + addTree[i] = right[addTree[i]]; } - for (int i = 1; i <= cntpre; i++) { - leftsum -= sum[left[pre[i]]]; - pre[i] = right[pre[i]]; + for (int i = 1; i <= cntminus; i++) { + leftsum -= sum[left[minusTree[i]]]; + minusTree[i] = right[minusTree[i]]; } - return leftsum + innerRank(jobk, mid + 1, r); + return leftsum + innerSmall(jobi, mid + 1, r); } } @@ -158,40 +157,40 @@ public static void outerAdd(int i, int v) { } public static int outerQuery(int l, int r, int k) { - cntpos = cntpre = 0; + cntadd = cntminus = 0; for (int i = r; i > 0; i -= lowbit(i)) { - pos[++cntpos] = root[i]; + addTree[++cntadd] = root[i]; } for (int i = l - 1; i > 0; i -= lowbit(i)) { - pre[++cntpre] = root[i]; + minusTree[++cntminus] = root[i]; } return sorted[innerQuery(k, 1, s)]; } - public static int outerRank(int l, int r, int k) { - cntpos = cntpre = 0; + public static int outerRank(int l, int r, int v) { + cntadd = cntminus = 0; for (int i = r; i > 0; i -= lowbit(i)) { - pos[++cntpos] = root[i]; + addTree[++cntadd] = root[i]; } for (int i = l - 1; i > 0; i -= lowbit(i)) { - pre[++cntpre] = root[i]; + minusTree[++cntminus] = root[i]; } - return innerRank(k, 1, s) + 1; + return innerSmall(v, 1, s) + 1; } - public static int outerPre(int l, int r, int k) { - int rank = outerRank(l, r, k); + public static int outerPre(int l, int r, int v) { + int rank = outerRank(l, r, v); if (rank == 1) { return -INF; } return outerQuery(l, r, rank - 1); } - public static int outerPost(int l, int r, int k) { - if (k == s) { + public static int outerPost(int l, int r, int v) { + if (v == s) { return INF; } - int rank = outerRank(l, r, k + 1); + int rank = outerRank(l, r, v + 1); if (rank == r - l + 2) { return INF; } diff --git a/src/class160/Code04_IndexWithSegment2.java b/src/class160/Code04_IndexWithSegment2.java index 69b6be34b..aeac1b7d5 100644 --- a/src/class160/Code04_IndexWithSegment2.java +++ b/src/class160/Code04_IndexWithSegment2.java @@ -32,9 +32,10 @@ //int rs[MAXT]; //int cntt; // -//int pos[MAXN]; -//int pre[MAXN]; -//int cntpos, cntpre; +//int addTree[MAXN]; +//int minusTree[MAXN]; +//int cntadd; +//int cntminus; // //int kth(int num) { // int l = 1, r = s; @@ -57,8 +58,11 @@ // sum[i] += jobv; // } else { // int mid = (l + r) >> 1; -// if (jobi <= mid) ls[i] = innerAdd(jobi, jobv, l, mid, ls[i]); -// else rs[i] = innerAdd(jobi, jobv, mid + 1, r, rs[i]); +// if (jobi <= mid) { +// ls[i] = innerAdd(jobi, jobv, l, mid, ls[i]); +// } else { +// rs[i] = innerAdd(jobi, jobv, mid + 1, r, rs[i]); +// } // sum[i] = sum[ls[i]] + sum[rs[i]]; // } // return i; @@ -68,37 +72,53 @@ // if (l == r) return l; // int mid = (l + r) >> 1; // int leftsum = 0; -// for (int i = 1; i <= cntpos; i++) leftsum += sum[ls[pos[i]]]; -// for (int i = 1; i <= cntpre; i++) leftsum -= sum[ls[pre[i]]]; +// for (int i = 1; i <= cntadd; i++) { +// leftsum += sum[ls[addTree[i]]]; +// } +// for (int i = 1; i <= cntminus; i++) { +// leftsum -= sum[ls[minusTree[i]]]; +// } // if (jobk <= leftsum) { -// for (int i = 1; i <= cntpos; i++) pos[i] = ls[pos[i]]; -// for (int i = 1; i <= cntpre; i++) pre[i] = ls[pre[i]]; +// for (int i = 1; i <= cntadd; i++) { +// addTree[i] = ls[addTree[i]]; +// } +// for (int i = 1; i <= cntminus; i++) { +// minusTree[i] = ls[minusTree[i]]; +// } // return innerQuery(jobk, l, mid); // } else { -// for (int i = 1; i <= cntpos; i++) pos[i] = rs[pos[i]]; -// for (int i = 1; i <= cntpre; i++) pre[i] = rs[pre[i]]; +// for (int i = 1; i <= cntadd; i++) { +// addTree[i] = rs[addTree[i]]; +// } +// for (int i = 1; i <= cntminus; i++) { +// minusTree[i] = rs[minusTree[i]]; +// } // return innerQuery(jobk - leftsum, mid + 1, r); // } //} // -//int innerRank(int jobi, int l, int r) { +//int innerSmall(int jobi, int l, int r) { // if (l == r) return 0; // int mid = (l + r) >> 1; // if (jobi <= mid) { -// for (int i = 1; i <= cntpos; i++) pos[i] = ls[pos[i]]; -// for (int i = 1; i <= cntpre; i++) pre[i] = ls[pre[i]]; -// return innerRank(jobi, l, mid); +// for (int i = 1; i <= cntadd; i++) { +// addTree[i] = ls[addTree[i]]; +// } +// for (int i = 1; i <= cntminus; i++) { +// minusTree[i] = ls[minusTree[i]]; +// } +// return innerSmall(jobi, l, mid); // } else { // int leftsum = 0; -// for (int i = 1; i <= cntpos; i++) { -// leftsum += sum[ls[pos[i]]]; -// pos[i] = rs[pos[i]]; +// for (int i = 1; i <= cntadd; i++) { +// leftsum += sum[ls[addTree[i]]]; +// addTree[i] = rs[addTree[i]]; // } -// for (int i = 1; i <= cntpre; i++) { -// leftsum -= sum[ls[pre[i]]]; -// pre[i] = rs[pre[i]]; +// for (int i = 1; i <= cntminus; i++) { +// leftsum -= sum[ls[minusTree[i]]]; +// minusTree[i] = rs[minusTree[i]]; // } -// return leftsum + innerRank(jobi, mid + 1, r); +// return leftsum + innerSmall(jobi, mid + 1, r); // } //} // @@ -109,27 +129,35 @@ //} // //int outerQuery(int l, int r, int k) { -// cntpos = cntpre = 0; -// for (int i = r; i > 0; i -= lowbit(i)) pos[++cntpos] = root[i]; -// for (int i = l - 1; i > 0; i -= lowbit(i)) pre[++cntpre] = root[i]; +// cntadd = cntminus = 0; +// for (int i = r; i > 0; i -= lowbit(i)) { +// addTree[++cntadd] = root[i]; +// } +// for (int i = l - 1; i > 0; i -= lowbit(i)) { +// minusTree[++cntminus] = root[i]; +// } // return sorted[innerQuery(k, 1, s)]; //} // -//int outerRank(int l, int r, int k) { -// cntpos = cntpre = 0; -// for (int i = r; i > 0; i -= lowbit(i)) pos[++cntpos] = root[i]; -// for (int i = l - 1; i > 0; i -= lowbit(i)) pre[++cntpre] = root[i]; -// return innerRank(k, 1, s) + 1; +//int outerRank(int l, int r, int v) { +// cntadd = cntminus = 0; +// for (int i = r; i > 0; i -= lowbit(i)) { +// addTree[++cntadd] = root[i]; +// } +// for (int i = l - 1; i > 0; i -= lowbit(i)) { +// minusTree[++cntminus] = root[i]; +// } +// return innerSmall(v, 1, s) + 1; //} // -//int outerPre(int l, int r, int k) { -// int rk = outerRank(l, r, k); +//int outerPre(int l, int r, int v) { +// int rk = outerRank(l, r, v); // return (rk == 1) ? -INF : outerQuery(l, r, rk - 1); //} // -//int outerPost(int l, int r, int k) { -// if (k == s) return INF; -// int rk = outerRank(l, r, k + 1); +//int outerPost(int l, int r, int v) { +// if (v == s) return INF; +// int rk = outerRank(l, r, v + 1); // return (rk == r - l + 2) ? INF : outerQuery(l, r, rk); //} // diff --git a/src/class160/Code06_NetworkManagement1.java b/src/class160/Code06_NetworkManagement1.java index 83e721266..2c609701f 100644 --- a/src/class160/Code06_NetworkManagement1.java +++ b/src/class160/Code06_NetworkManagement1.java @@ -66,14 +66,13 @@ public class Code06_NetworkManagement1 { public static int cntd = 0; - // 查询信息需要,所有pos版本的信息和 - 所有pre版本的信息和 - public static int[] pos = new int[MAXN]; + public static int[] addTree = new int[MAXN]; - public static int[] pre = new int[MAXN]; + public static int[] minusTree = new int[MAXN]; - public static int cntpos; + public static int cntadd; - public static int cntpre; + public static int cntminus; public static void addEdge(int u, int v) { next[++cntg] = head[u]; @@ -221,26 +220,26 @@ public static int innerQuery(int jobk, int l, int r) { } int mid = (l + r) / 2; int leftsum = 0; - for (int i = 1; i <= cntpos; i++) { - leftsum += sum[left[pos[i]]]; + for (int i = 1; i <= cntadd; i++) { + leftsum += sum[left[addTree[i]]]; } - for (int i = 1; i <= cntpre; i++) { - leftsum -= sum[left[pre[i]]]; + for (int i = 1; i <= cntminus; i++) { + leftsum -= sum[left[minusTree[i]]]; } if (jobk <= leftsum) { - for (int i = 1; i <= cntpos; i++) { - pos[i] = left[pos[i]]; + for (int i = 1; i <= cntadd; i++) { + addTree[i] = left[addTree[i]]; } - for (int i = 1; i <= cntpre; i++) { - pre[i] = left[pre[i]]; + for (int i = 1; i <= cntminus; i++) { + minusTree[i] = left[minusTree[i]]; } return innerQuery(jobk, l, mid); } else { - for (int i = 1; i <= cntpos; i++) { - pos[i] = right[pos[i]]; + for (int i = 1; i <= cntadd; i++) { + addTree[i] = right[addTree[i]]; } - for (int i = 1; i <= cntpre; i++) { - pre[i] = right[pre[i]]; + for (int i = 1; i <= cntminus; i++) { + minusTree[i] = right[minusTree[i]]; } return innerQuery(jobk - leftsum, mid + 1, r); } @@ -267,18 +266,18 @@ public static int query(int x, int y, int k) { if (num < k) { return -1; } - cntpos = cntpre = 0; + cntadd = cntminus = 0; for (int i = dfn[x]; i > 0; i -= lowbit(i)) { - pos[++cntpos] = root[i]; + addTree[++cntadd] = root[i]; } for (int i = dfn[y]; i > 0; i -= lowbit(i)) { - pos[++cntpos] = root[i]; + addTree[++cntadd] = root[i]; } for (int i = dfn[lca]; i > 0; i -= lowbit(i)) { - pre[++cntpre] = root[i]; + minusTree[++cntminus] = root[i]; } for (int i = dfn[lcafa]; i > 0; i -= lowbit(i)) { - pre[++cntpre] = root[i]; + minusTree[++cntminus] = root[i]; } return innerQuery(num - k + 1, 1, s); } diff --git a/src/class160/Code06_NetworkManagement2.java b/src/class160/Code06_NetworkManagement2.java index 7e2eb432a..16328a234 100644 --- a/src/class160/Code06_NetworkManagement2.java +++ b/src/class160/Code06_NetworkManagement2.java @@ -42,9 +42,9 @@ //int stjump[MAXN][MAXH]; //int cntd; // -//int pos[MAXN]; -//int pre[MAXN]; -//int cntpos, cntpre; +//int addTree[MAXN]; +//int minusTree[MAXN]; +//int cntadd, cntminus; // //void addEdge(int u, int v) { // nxt[++cntg] = head[u]; @@ -72,7 +72,9 @@ // size[u] = 1; // dfn[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 p = 1; p < MAXH; p++) { +// stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; +// } // for (int e = head[u]; e; e = nxt[e]) { // if (to[e] != fa) dfs(to[e], u); // } @@ -84,7 +86,9 @@ //int lca(int a, int b) { // if (deep[a] < deep[b]) swap(a, b); // for (int p = MAXH - 1; p >= 0; p--) { -// if (deep[stjump[a][p]] >= deep[b]) a = stjump[a][p]; +// if (deep[stjump[a][p]] >= deep[b]) { +// a = stjump[a][p]; +// } // } // if (a == b) return a; // for (int p = MAXH - 1; p >= 0; p--) { @@ -116,21 +120,35 @@ // if (l == r) return l; // int mid = (l + r) / 2; // int leftsum = 0; -// for (int i = 1; i <= cntpos; i++) leftsum += sum[ls[pos[i]]]; -// for (int i = 1; i <= cntpre; i++) leftsum -= sum[ls[pre[i]]]; +// for (int i = 1; i <= cntadd; i++) { +// leftsum += sum[ls[addTree[i]]]; +// } +// for (int i = 1; i <= cntminus; i++) { +// leftsum -= sum[ls[minusTree[i]]]; +// } // if (jobk <= leftsum) { -// for (int i = 1; i <= cntpos; i++) pos[i] = ls[pos[i]]; -// for (int i = 1; i <= cntpre; i++) pre[i] = ls[pre[i]]; +// for (int i = 1; i <= cntadd; i++) { +// addTree[i] = ls[addTree[i]]; +// } +// for (int i = 1; i <= cntminus; i++) { +// minusTree[i] = ls[minusTree[i]]; +// } // return innerQuery(jobk, l, mid); // } else { -// for (int i = 1; i <= cntpos; i++) pos[i] = rs[pos[i]]; -// for (int i = 1; i <= cntpre; i++) pre[i] = rs[pre[i]]; +// for (int i = 1; i <= cntadd; i++) { +// addTree[i] = rs[addTree[i]]; +// } +// for (int i = 1; i <= cntminus; i++) { +// minusTree[i] = rs[minusTree[i]]; +// } // return innerQuery(jobk - leftsum, mid + 1, r); // } //} // //void add(int i, int kth, int val) { -// for (; i <= n; i += lowbit(i)) root[i] = innerAdd(kth, val, 1, s, root[i]); +// for (; i <= n; i += lowbit(i)) { +// root[i] = innerAdd(kth, val, 1, s, root[i]); +// } //} // //void update(int i, int v) { @@ -146,11 +164,19 @@ // int lcafa = stjump[xylca][0]; // int num = deep[x] + deep[y] - deep[xylca] - deep[lcafa]; // if (num < k) return -1; -// cntpos = cntpre = 0; -// for (int i = dfn[x]; i; i -= lowbit(i)) pos[++cntpos] = root[i]; -// for (int i = dfn[y]; i; i -= lowbit(i)) pos[++cntpos] = root[i]; -// for (int i = dfn[xylca]; i; i -= lowbit(i)) pre[++cntpre] = root[i]; -// for (int i = dfn[lcafa]; i; i -= lowbit(i)) pre[++cntpre] = root[i]; +// cntadd = cntminus = 0; +// for (int i = dfn[x]; i; i -= lowbit(i)) { +// addTree[++cntadd] = root[i]; +// } +// for (int i = dfn[y]; i; i -= lowbit(i)) { +// addTree[++cntadd] = root[i]; +// } +// for (int i = dfn[xylca]; i; i -= lowbit(i)) { +// minusTree[++cntminus] = root[i]; +// } +// for (int i = dfn[lcafa]; i; i -= lowbit(i)) { +// minusTree[++cntminus] = root[i]; +// } // return innerQuery(num - k + 1, 1, s); //} // From e907f5f711fe64a1a2a3a7c1c34f80ecedc40338 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 19 Feb 2025 16:12:59 +0800 Subject: [PATCH 0696/2029] modify code --- src/class160/Code03_SegmentWithBalanced2.java | 20 +-- src/class160/Code04_IndexWithSegment1.java | 60 +++++--- src/class160/Code04_IndexWithSegment2.java | 145 +++++++++++------- src/class160/Code06_NetworkManagement1.java | 15 +- src/class160/Code06_NetworkManagement2.java | 15 +- 5 files changed, 156 insertions(+), 99 deletions(-) diff --git a/src/class160/Code03_SegmentWithBalanced2.java b/src/class160/Code03_SegmentWithBalanced2.java index 2a3b47b49..62c8a2b48 100644 --- a/src/class160/Code03_SegmentWithBalanced2.java +++ b/src/class160/Code03_SegmentWithBalanced2.java @@ -229,19 +229,19 @@ // ios::sync_with_stdio(false); // cin.tie(nullptr); // cin >> n >> m; -// for(int i=1;i<=n;i++) cin >> arr[i]; -// build(1,n,1); -// for(int i=1,op,x,y,z;i<=m;i++){ +// for(int i = 1; i <= n; i++) cin >> arr[i]; +// build(1, n, 1); +// for(int i = 1, op, x, y, z; i <= m; i++) { // cin >> op >> x >> y; -// if(op==3){ -// update(x,y,1,n,1); -// arr[x]=y; +// if(op == 3) { +// update(x, y, 1, n, 1); +// arr[x] = y; // } else { // cin >> z; -// if(op==1) cout << small(x,y,z,1,n,1)+1 << "\n"; -// else if(op==2) cout << number(x,y,z) << "\n"; -// else if(op==4) cout << pre(x,y,z,1,n,1) << "\n"; -// else cout << post(x,y,z,1,n,1) << "\n"; +// if(op == 1) cout << small(x, y, z, 1, n, 1) + 1 << "\n"; +// else if(op == 2) cout << number(x, y, z) << "\n"; +// else if(op == 4) cout << pre(x, y, z, 1, n, 1) << "\n"; +// else cout << post(x, y, z, 1, n, 1) << "\n"; // } // } // return 0; diff --git a/src/class160/Code04_IndexWithSegment1.java b/src/class160/Code04_IndexWithSegment1.java index df2510093..5572dd2a8 100644 --- a/src/class160/Code04_IndexWithSegment1.java +++ b/src/class160/Code04_IndexWithSegment1.java @@ -150,13 +150,19 @@ public static int innerSmall(int jobi, int l, int r) { } } - public static void outerAdd(int i, int v) { + public static void add(int i, int cnt) { for (int j = i; j <= n; j += lowbit(j)) { - root[j] = innerAdd(arr[i], v, 1, s, root[j]); + root[j] = innerAdd(arr[i], cnt, 1, s, root[j]); } } - public static int outerQuery(int l, int r, int k) { + public static void update(int i, int v) { + add(i, -1); + arr[i] = kth(v); + add(i, 1); + } + + public static int small(int l, int r, int v) { cntadd = cntminus = 0; for (int i = r; i > 0; i -= lowbit(i)) { addTree[++cntadd] = root[i]; @@ -164,10 +170,10 @@ public static int outerQuery(int l, int r, int k) { for (int i = l - 1; i > 0; i -= lowbit(i)) { minusTree[++cntminus] = root[i]; } - return sorted[innerQuery(k, 1, s)]; + return innerSmall(v, 1, s); } - public static int outerRank(int l, int r, int v) { + public static int number(int l, int r, int k) { cntadd = cntminus = 0; for (int i = r; i > 0; i -= lowbit(i)) { addTree[++cntadd] = root[i]; @@ -175,26 +181,26 @@ public static int outerRank(int l, int r, int v) { for (int i = l - 1; i > 0; i -= lowbit(i)) { minusTree[++cntminus] = root[i]; } - return innerSmall(v, 1, s) + 1; + return sorted[innerQuery(k, 1, s)]; } - public static int outerPre(int l, int r, int v) { - int rank = outerRank(l, r, v); + public static int pre(int l, int r, int v) { + int rank = small(l, r, v) + 1; if (rank == 1) { return -INF; } - return outerQuery(l, r, rank - 1); + return number(l, r, rank - 1); } - public static int outerPost(int l, int r, int v) { + public static int post(int l, int r, int v) { if (v == s) { return INF; } - int rank = outerRank(l, r, v + 1); + int rank = small(l, r, v + 1) + 1; if (rank == r - l + 2) { return INF; } - return outerQuery(l, r, rank); + return number(l, r, rank); } public static void prepare() { @@ -219,7 +225,7 @@ public static void prepare() { s = len; for (int i = 1; i <= n; i++) { arr[i] = kth(arr[i]); - outerAdd(i, 1); + add(i, 1); } } @@ -248,19 +254,23 @@ public static void main(String[] args) throws IOException { } } prepare(); - for (int i = 1; i <= m; i++) { - if (ques[i][0] == 1) { - out.println(outerRank(ques[i][1], ques[i][2], kth(ques[i][3]))); - } else if (ques[i][0] == 2) { - out.println(outerQuery(ques[i][1], ques[i][2], ques[i][3])); - } else if (ques[i][0] == 3) { - outerAdd(ques[i][1], -1); - arr[ques[i][1]] = kth(ques[i][2]); - outerAdd(ques[i][1], 1); - } else if (ques[i][0] == 4) { - out.println(outerPre(ques[i][1], ques[i][2], kth(ques[i][3]))); + for (int i = 1, op, x, y, z; i <= m; i++) { + op = ques[i][0]; + x = ques[i][1]; + y = ques[i][2]; + if (op == 3) { + update(x, y); } else { - out.println(outerPost(ques[i][1], ques[i][2], kth(ques[i][3]))); + z = ques[i][3]; + if (op == 1) { + out.println(small(x, y, kth(z)) + 1); + } else if (op == 2) { + out.println(number(x, y, z)); + } else if (op == 4) { + out.println(pre(x, y, kth(z))); + } else { + out.println(post(x, y, kth(z))); + } } } out.flush(); diff --git a/src/class160/Code04_IndexWithSegment2.java b/src/class160/Code04_IndexWithSegment2.java index aeac1b7d5..9693aad80 100644 --- a/src/class160/Code04_IndexWithSegment2.java +++ b/src/class160/Code04_IndexWithSegment2.java @@ -25,25 +25,27 @@ //int arr[MAXN]; //int ques[MAXN][4]; //int sorted[MAXN * 2]; -// //int root[MAXN]; //int sum[MAXT]; //int ls[MAXT]; //int rs[MAXT]; -//int cntt; -// +//int cntt = 0; //int addTree[MAXN]; //int minusTree[MAXN]; //int cntadd; //int cntminus; // //int kth(int num) { -// int l = 1, r = s; -// while (l <= r) { -// int mid = (l + r) >> 1; -// if (sorted[mid] == num) return mid; -// if (sorted[mid] < num) l = mid + 1; -// else r = mid - 1; +// 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; //} @@ -53,15 +55,17 @@ //} // //int innerAdd(int jobi, int jobv, int l, int r, int i) { -// if (!i) i = ++cntt; +// if (i == 0) { +// i = ++cntt; +// } // if (l == r) { // sum[i] += jobv; // } else { -// int mid = (l + r) >> 1; +// int mid = (l + r) / 2; // if (jobi <= mid) { -// ls[i] = innerAdd(jobi, jobv, l, mid, ls[i]); +// ls[i] = innerAdd(jobi, jobv, l, mid, ls[i]); // } else { -// rs[i] = innerAdd(jobi, jobv, mid + 1, r, rs[i]); +// rs[i] = innerAdd(jobi, jobv, mid + 1, r, rs[i]); // } // sum[i] = sum[ls[i]] + sum[rs[i]]; // } @@ -69,8 +73,10 @@ //} // //int innerQuery(int jobk, int l, int r) { -// if (l == r) return l; -// int mid = (l + r) >> 1; +// if (l == r) { +// return l; +// } +// int mid = (l + r) / 2; // int leftsum = 0; // for (int i = 1; i <= cntadd; i++) { // leftsum += sum[ls[addTree[i]]]; @@ -98,8 +104,10 @@ //} // //int innerSmall(int jobi, int l, int r) { -// if (l == r) return 0; -// int mid = (l + r) >> 1; +// if (l == r) { +// return 0; +// } +// int mid = (l + r) / 2; // if (jobi <= mid) { // for (int i = 1; i <= cntadd; i++) { // addTree[i] = ls[addTree[i]]; @@ -122,13 +130,19 @@ // } //} // -//void outerAdd(int i, int v) { +//void add(int i, int cnt) { // for (int j = i; j <= n; j += lowbit(j)) { -// root[j] = innerAdd(arr[i], v, 1, s, root[j]); +// root[j] = innerAdd(arr[i], cnt, 1, s, root[j]); // } //} // -//int outerQuery(int l, int r, int k) { +//void update(int i, int v) { +// add(i, -1); +// arr[i] = kth(v); +// add(i, 1); +//} +// +//int small(int l, int r, int v) { // cntadd = cntminus = 0; // for (int i = r; i > 0; i -= lowbit(i)) { // addTree[++cntadd] = root[i]; @@ -136,10 +150,10 @@ // for (int i = l - 1; i > 0; i -= lowbit(i)) { // minusTree[++cntminus] = root[i]; // } -// return sorted[innerQuery(k, 1, s)]; +// return innerSmall(v, 1, s); //} // -//int outerRank(int l, int r, int v) { +//int number(int l, int r, int k) { // cntadd = cntminus = 0; // for (int i = r; i > 0; i -= lowbit(i)) { // addTree[++cntadd] = root[i]; @@ -147,61 +161,88 @@ // for (int i = l - 1; i > 0; i -= lowbit(i)) { // minusTree[++cntminus] = root[i]; // } -// return innerSmall(v, 1, s) + 1; +// return sorted[innerQuery(k, 1, s)]; //} // -//int outerPre(int l, int r, int v) { -// int rk = outerRank(l, r, v); -// return (rk == 1) ? -INF : outerQuery(l, r, rk - 1); +//int pre(int l, int r, int v) { +// int rank = small(l, r, v) + 1; +// if (rank == 1) { +// return -INF; +// } +// return number(l, r, rank - 1); //} // -//int outerPost(int l, int r, int v) { -// if (v == s) return INF; -// int rk = outerRank(l, r, v + 1); -// return (rk == r - l + 2) ? INF : outerQuery(l, r, rk); +//int post(int l, int r, int v) { +// if (v == s) { +// return INF; +// } +// int rank = small(l, r, v + 1) + 1; +// if (rank == r - l + 2) { +// return INF; +// } +// return number(l, r, rank); //} // //void prepare() { // s = 0; -// for (int i = 1; i <= n; i++) sorted[++s] = arr[i]; +// for (int i = 1; i <= n; i++) { +// sorted[++s] = arr[i]; +// } // for (int i = 1; i <= m; i++) { -// if (ques[i][0] == 3) sorted[++s] = ques[i][2]; -// else if (ques[i][0] != 2) sorted[++s] = ques[i][3]; +// if (ques[i][0] == 3) { +// sorted[++s] = ques[i][2]; +// } else if (ques[i][0] != 2) { +// sorted[++s] = ques[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]; +// for (int i = 2; i <= s; i++) { +// if (sorted[len] != sorted[i]) { +// sorted[++len] = sorted[i]; +// } +// } // s = len; // for (int i = 1; i <= n; i++) { // arr[i] = kth(arr[i]); -// outerAdd(i, 1); +// add(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]; +// cin >> n; +// cin >> m; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } // for (int i = 1; i <= m; i++) { -// cin >> ques[i][0] >> ques[i][1] >> ques[i][2]; -// if (ques[i][0] != 3) cin >> ques[i][3]; +// cin >> ques[i][0]; +// cin >> ques[i][1]; +// cin >> ques[i][2]; +// if (ques[i][0] != 3) { +// cin >> ques[i][3]; +// } // } // prepare(); -// for (int i = 1; i <= m; i++) { -// if (ques[i][0] == 1) { -// cout << outerRank(ques[i][1], ques[i][2], kth(ques[i][3])) << "\n"; -// } else if (ques[i][0] == 2) { -// cout << outerQuery(ques[i][1], ques[i][2], ques[i][3]) << "\n"; -// } else if (ques[i][0] == 3) { -// outerAdd(ques[i][1], -1); -// arr[ques[i][1]] = kth(ques[i][2]); -// outerAdd(ques[i][1], 1); -// } else if (ques[i][0] == 4) { -// cout << outerPre(ques[i][1], ques[i][2], kth(ques[i][3])) << "\n"; +// for (int i = 1, op, x, y, z; i <= m; i++) { +// op = ques[i][0]; +// x = ques[i][1]; +// y = ques[i][2]; +// if (op == 3) { +// update(x, y); // } else { -// cout << outerPost(ques[i][1], ques[i][2], kth(ques[i][3])) << "\n"; +// z = ques[i][3]; +// if (op == 1) { +// cout << small(x, y, kth(z)) + 1 << "\n"; +// } else if (op == 2) { +// cout << number(x, y, z) << "\n"; +// } else if (op == 4) { +// cout << pre(x, y, kth(z)) << "\n"; +// } else { +// cout << post(x, y, kth(z)) << "\n"; +// } // } // } // return 0; diff --git a/src/class160/Code06_NetworkManagement1.java b/src/class160/Code06_NetworkManagement1.java index 2c609701f..fd7d769f6 100644 --- a/src/class160/Code06_NetworkManagement1.java +++ b/src/class160/Code06_NetworkManagement1.java @@ -339,15 +339,18 @@ public static void main(String[] args) throws IOException { ques[i][2] = (int) in.nval; } prepare(); - for (int i = 1; i <= m; i++) { - if (ques[i][0] == 0) { - update(ques[i][1], ques[i][2]); + for (int i = 1, k, x, y; i <= m; i++) { + k = ques[i][0]; + x = ques[i][1]; + y = ques[i][2]; + if (k == 0) { + update(x, y); } else { - int ans = query(ques[i][1], ques[i][2], ques[i][0]); - if (ans == -1) { + int idx = query(x, y, k); + if (idx == -1) { out.println("invalid request!"); } else { - out.println(sorted[ans]); + out.println(sorted[idx]); } } } diff --git a/src/class160/Code06_NetworkManagement2.java b/src/class160/Code06_NetworkManagement2.java index 16328a234..09aeae9d9 100644 --- a/src/class160/Code06_NetworkManagement2.java +++ b/src/class160/Code06_NetworkManagement2.java @@ -208,15 +208,18 @@ // } // for (int i = 1; i <= m; i++) cin >> ques[i][0] >> ques[i][1] >> ques[i][2]; // prepare(); -// for (int i = 1; i <= m; i++) { -// if (ques[i][0] == 0) { -// update(ques[i][1], ques[i][2]); +// for (int i = 1, k, x, y; i <= m; i++) { +// k = ques[i][0]; +// x = ques[i][1]; +// y = ques[i][2]; +// if (k == 0) { +// update(x, y); // } else { -// int ans = query(ques[i][1], ques[i][2], ques[i][0]); -// if(ans == -1) { +// int idx = query(x, y, k); +// if(idx == -1) { // cout << "invalid request!" << "\n"; // } else { -// cout << sorted[ans] << "\n"; +// cout << sorted[idx] << "\n"; // } // } // } From 92f183eb8920b7015bb4ca499f4f5dfdaaff0adc Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 19 Feb 2025 16:17:35 +0800 Subject: [PATCH 0697/2029] modify code --- src/class160/Code06_NetworkManagement1.java | 8 ++++---- src/class160/Code06_NetworkManagement2.java | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/class160/Code06_NetworkManagement1.java b/src/class160/Code06_NetworkManagement1.java index fd7d769f6..6fecf33bb 100644 --- a/src/class160/Code06_NetworkManagement1.java +++ b/src/class160/Code06_NetworkManagement1.java @@ -279,7 +279,7 @@ public static int query(int x, int y, int k) { for (int i = dfn[lcafa]; i > 0; i -= lowbit(i)) { minusTree[++cntminus] = root[i]; } - return innerQuery(num - k + 1, 1, s); + return sorted[innerQuery(num - k + 1, 1, s)]; } public static void prepare() { @@ -346,11 +346,11 @@ public static void main(String[] args) throws IOException { if (k == 0) { update(x, y); } else { - int idx = query(x, y, k); - if (idx == -1) { + int ans = query(x, y, k); + if (ans == -1) { out.println("invalid request!"); } else { - out.println(sorted[idx]); + out.println(ans); } } } diff --git a/src/class160/Code06_NetworkManagement2.java b/src/class160/Code06_NetworkManagement2.java index 09aeae9d9..540f3b2d8 100644 --- a/src/class160/Code06_NetworkManagement2.java +++ b/src/class160/Code06_NetworkManagement2.java @@ -177,7 +177,7 @@ // for (int i = dfn[lcafa]; i; i -= lowbit(i)) { // minusTree[++cntminus] = root[i]; // } -// return innerQuery(num - k + 1, 1, s); +// return sorted[innerQuery(num - k + 1, 1, s)]; //} // //void prepare() { @@ -215,11 +215,11 @@ // if (k == 0) { // update(x, y); // } else { -// int idx = query(x, y, k); -// if(idx == -1) { +// int ans = query(x, y, k); +// if(ans == -1) { // cout << "invalid request!" << "\n"; // } else { -// cout << sorted[idx] << "\n"; +// cout << ans << "\n"; // } // } // } From 1fb81e351bda28fe63466a50172e6457edd6bafd Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 19 Feb 2025 17:11:47 +0800 Subject: [PATCH 0698/2029] modify code --- src/class160/Code03_SegmentWithBalanced1.java | 3 +- src/class160/Code03_SegmentWithBalanced2.java | 3 +- src/class160/Code04_IndexWithSegment1.java | 3 +- src/class160/Code04_IndexWithSegment2.java | 3 +- src/class160/Code05_DynamicRankings1.java | 242 ++++++++++++++++++ src/class160/Code05_DynamicRankings2.java | 182 +++++++++++++ ...ode05_LineUp1.java => Code06_LineUp1.java} | 2 +- ...ode05_LineUp2.java => Code06_LineUp2.java} | 0 ...t1.java => Code07_NetworkManagement1.java} | 2 +- ...t2.java => Code07_NetworkManagement2.java} | 0 10 files changed, 430 insertions(+), 10 deletions(-) create mode 100644 src/class160/Code05_DynamicRankings1.java create mode 100644 src/class160/Code05_DynamicRankings2.java rename src/class160/{Code05_LineUp1.java => Code06_LineUp1.java} (99%) rename src/class160/{Code05_LineUp2.java => Code06_LineUp2.java} (100%) rename src/class160/{Code06_NetworkManagement1.java => Code07_NetworkManagement1.java} (99%) rename src/class160/{Code06_NetworkManagement2.java => Code07_NetworkManagement2.java} (100%) diff --git a/src/class160/Code03_SegmentWithBalanced1.java b/src/class160/Code03_SegmentWithBalanced1.java index 21285c3f8..e594a2ad4 100644 --- a/src/class160/Code03_SegmentWithBalanced1.java +++ b/src/class160/Code03_SegmentWithBalanced1.java @@ -1,8 +1,7 @@ package class160; // 线段树套平衡树,java版 -// 给定一个长度为n的数组arr,下标1~n -// 每条操作都是如下5种类型中的一种,一共进行m次操作 +// 给定一个长度为n的数组arr,下标1~n,每条操作都是如下5种类型中的一种,一共进行m次操作 // 操作 1 x y z : 查询数字z在arr[x..y]中的排名 // 操作 2 x y z : 查询arr[x..y]中排第z名的数字 // 操作 3 x y : arr中x位置的数字改成y diff --git a/src/class160/Code03_SegmentWithBalanced2.java b/src/class160/Code03_SegmentWithBalanced2.java index 62c8a2b48..5e6318480 100644 --- a/src/class160/Code03_SegmentWithBalanced2.java +++ b/src/class160/Code03_SegmentWithBalanced2.java @@ -1,8 +1,7 @@ package class160; // 线段树套平衡树,C++版 -// 给定一个长度为n的数组arr,下标1~n -// 每条操作都是如下5种类型中的一种,一共进行m次操作 +// 给定一个长度为n的数组arr,下标1~n,每条操作都是如下5种类型中的一种,一共进行m次操作 // 操作 1 x y z : 查询数字z在arr[x..y]中的排名 // 操作 2 x y z : 查询arr[x..y]中排第z名的数字 // 操作 3 x y : arr中x位置的数字改成y diff --git a/src/class160/Code04_IndexWithSegment1.java b/src/class160/Code04_IndexWithSegment1.java index 5572dd2a8..7b5eaaf0f 100644 --- a/src/class160/Code04_IndexWithSegment1.java +++ b/src/class160/Code04_IndexWithSegment1.java @@ -1,8 +1,7 @@ package class160; // 树状数组套线段树,java版 -// 给定一个长度为n的数组arr,下标1~n -// 每条操作都是如下5种类型中的一种,一共进行m次操作 +// 给定一个长度为n的数组arr,下标1~n,每条操作都是如下5种类型中的一种,一共进行m次操作 // 操作 1 x y z : 查询数字z在arr[x..y]中的排名 // 操作 2 x y z : 查询arr[x..y]中排第z名的数字 // 操作 3 x y : arr中x位置的数字改成y diff --git a/src/class160/Code04_IndexWithSegment2.java b/src/class160/Code04_IndexWithSegment2.java index 9693aad80..a9a4b7589 100644 --- a/src/class160/Code04_IndexWithSegment2.java +++ b/src/class160/Code04_IndexWithSegment2.java @@ -1,8 +1,7 @@ package class160; // 树状数组套线段树,C++版 -// 给定一个长度为n的数组arr,下标1~n -// 每条操作都是如下5种类型中的一种,一共进行m次操作 +// 给定一个长度为n的数组arr,下标1~n,每条操作都是如下5种类型中的一种,一共进行m次操作 // 操作 1 x y z : 查询数字z在arr[x..y]中的排名 // 操作 2 x y z : 查询arr[x..y]中排第z名的数字 // 操作 3 x y : arr中x位置的数字改成y diff --git a/src/class160/Code05_DynamicRankings1.java b/src/class160/Code05_DynamicRankings1.java new file mode 100644 index 000000000..8a129f2ec --- /dev/null +++ b/src/class160/Code05_DynamicRankings1.java @@ -0,0 +1,242 @@ +package class160; + +// 动态排名,java版 +// 给定一个长度为n的数组arr,下标1~n,每条操作都是如下2种类型中的一种,一共进行m次操作 +// 操作 Q x y z : 查询arr[x..y]中排第z名的数字 +// 操作 C x y : arr中x位置的数字改成y +// 1 <= n、m <= 10^5 +// 数组中的值永远在[0, 10^9]范围内 +// 测试链接 : https://www.luogu.com.cn/problem/P2617 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.StringTokenizer; + +public class Code05_DynamicRankings1 { + + public static int MAXN = 100001; + + public static int MAXT = MAXN * 130; + + public static int n, m, s; + + public static int[] arr = new int[MAXN]; + + public static int[][] ques = new int[MAXN][4]; + + public static int[] sorted = new int[MAXN * 2]; + + public static int[] root = new int[MAXN]; + + public static int[] sum = new int[MAXT]; + + public static int[] left = new int[MAXT]; + + public static int[] right = new int[MAXT]; + + public static int cntt = 0; + + public static int[] addTree = new int[MAXN]; + + public static int[] minusTree = new int[MAXN]; + + public static int cntadd; + + public static int cntminus; + + 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 int lowbit(int i) { + return i & -i; + } + + public static int innerAdd(int jobi, int jobv, int l, int r, int i) { + if (i == 0) { + i = ++cntt; + } + if (l == r) { + sum[i] += jobv; + } else { + int mid = (l + r) / 2; + if (jobi <= mid) { + left[i] = innerAdd(jobi, jobv, l, mid, left[i]); + } else { + right[i] = innerAdd(jobi, jobv, mid + 1, r, right[i]); + } + sum[i] = sum[left[i]] + sum[right[i]]; + } + return i; + } + + public static int innerQuery(int jobk, int l, int r) { + if (l == r) { + return l; + } + int mid = (l + r) / 2; + int leftsum = 0; + for (int i = 1; i <= cntadd; i++) { + leftsum += sum[left[addTree[i]]]; + } + for (int i = 1; i <= cntminus; i++) { + leftsum -= sum[left[minusTree[i]]]; + } + if (jobk <= leftsum) { + for (int i = 1; i <= cntadd; i++) { + addTree[i] = left[addTree[i]]; + } + for (int i = 1; i <= cntminus; i++) { + minusTree[i] = left[minusTree[i]]; + } + return innerQuery(jobk, l, mid); + } else { + for (int i = 1; i <= cntadd; i++) { + addTree[i] = right[addTree[i]]; + } + for (int i = 1; i <= cntminus; i++) { + minusTree[i] = right[minusTree[i]]; + } + return innerQuery(jobk - leftsum, mid + 1, r); + } + } + + public static void add(int i, int cnt) { + for (int j = i; j <= n; j += lowbit(j)) { + root[j] = innerAdd(arr[i], cnt, 1, s, root[j]); + } + } + + public static void update(int i, int v) { + add(i, -1); + arr[i] = kth(v); + add(i, 1); + } + + public static int number(int l, int r, int k) { + cntadd = cntminus = 0; + for (int i = r; i > 0; i -= lowbit(i)) { + addTree[++cntadd] = root[i]; + } + for (int i = l - 1; i > 0; i -= lowbit(i)) { + minusTree[++cntminus] = root[i]; + } + return sorted[innerQuery(k, 1, s)]; + } + + public static void prepare() { + s = 0; + for (int i = 1; i <= n; i++) { + sorted[++s] = arr[i]; + } + for (int i = 1; i <= m; i++) { + if (ques[i][0] == 2) { + sorted[++s] = ques[i][2]; + } + } + 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 <= n; i++) { + arr[i] = kth(arr[i]); + add(i, 1); + } + } + + public static void main(String[] args) { + Kattio io = new Kattio(); + n = io.nextInt(); + m = io.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = io.nextInt(); + } + for (int i = 1; i <= m; i++) { + ques[i][0] = io.next().equals("Q") ? 1 : 2; + ques[i][1] = io.nextInt(); + ques[i][2] = io.nextInt(); + if (ques[i][0] == 1) { + ques[i][3] = io.nextInt(); + } + } + prepare(); + for (int i = 1, op, x, y, z; i <= m; i++) { + op = ques[i][0]; + x = ques[i][1]; + y = ques[i][2]; + if (op == 1) { + z = ques[i][3]; + io.println(number(x, y, z)); + } else { + update(x, y); + } + } + io.flush(); + io.close(); + } + + // 读写工具类 + public static class Kattio extends PrintWriter { + private BufferedReader r; + private StringTokenizer st; + + public Kattio() { + this(System.in, System.out); + } + + public Kattio(InputStream i, OutputStream o) { + super(o); + r = new BufferedReader(new InputStreamReader(i)); + } + + public Kattio(String intput, String output) throws IOException { + super(output); + r = new BufferedReader(new FileReader(intput)); + } + + public String next() { + try { + while (st == null || !st.hasMoreTokens()) + st = new StringTokenizer(r.readLine()); + return st.nextToken(); + } catch (Exception e) { + } + return null; + } + + public int nextInt() { + return Integer.parseInt(next()); + } + + public double nextDouble() { + return Double.parseDouble(next()); + } + + public long nextLong() { + return Long.parseLong(next()); + } + } + +} \ No newline at end of file diff --git a/src/class160/Code05_DynamicRankings2.java b/src/class160/Code05_DynamicRankings2.java new file mode 100644 index 000000000..4b872c698 --- /dev/null +++ b/src/class160/Code05_DynamicRankings2.java @@ -0,0 +1,182 @@ +package class160; + +// 动态排名,C++版 +// 给定一个长度为n的数组arr,下标1~n,每条操作都是如下2种类型中的一种,一共进行m次操作 +// 操作 Q x y z : 查询arr[x..y]中排第z名的数字 +// 操作 C x y : arr中x位置的数字改成y +// 1 <= n、m <= 10^5 +// 数组中的值永远在[0, 10^9]范围内 +// 测试链接 : https://www.luogu.com.cn/problem/P2617 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +//const int MAXT = MAXN * 130; +//int n, m, s; +//int arr[MAXN]; +//int ques[MAXN][4]; +//int sorted[MAXN * 2]; +//int root[MAXN]; +//int sum[MAXT]; +//int ls[MAXT]; +//int rs[MAXT]; +//int cntt = 0; +//int addTree[MAXN]; +//int minusTree[MAXN]; +//int cntadd; +//int cntminus; +// +//int kth(int num) { +// int l = 1, r = s, mid; +// while (l <= r) { +// mid = (l + r) / 2; +// if (sorted[mid] == num) { +// return mid; +// } else if (sorted[mid] < num) { +// l = mid + 1; +// } else { +// r = mid - 1; +// } +// } +// return -1; +//} +// +//int lowbit(int i) { +// return i & -i; +//} +// +//int innerAdd(int jobi, int jobv, int l, int r, int i) { +// if (i == 0) { +// i = ++cntt; +// } +// if (l == r) { +// sum[i] += jobv; +// } else { +// int mid = (l + r) / 2; +// if (jobi <= mid) { +// ls[i] = innerAdd(jobi, jobv, l, mid, ls[i]); +// } else { +// rs[i] = innerAdd(jobi, jobv, mid + 1, r, rs[i]); +// } +// sum[i] = sum[ls[i]] + sum[rs[i]]; +// } +// return i; +//} +// +//int innerQuery(int jobk, int l, int r) { +// if (l == r) { +// return l; +// } +// int mid = (l + r) / 2; +// int leftsum = 0; +// for (int i = 1; i <= cntadd; i++) { +// leftsum += sum[ls[addTree[i]]]; +// } +// for (int i = 1; i <= cntminus; i++) { +// leftsum -= sum[ls[minusTree[i]]]; +// } +// if (jobk <= leftsum) { +// for (int i = 1; i <= cntadd; i++) { +// addTree[i] = ls[addTree[i]]; +// } +// for (int i = 1; i <= cntminus; i++) { +// minusTree[i] = ls[minusTree[i]]; +// } +// return innerQuery(jobk, l, mid); +// } else { +// for (int i = 1; i <= cntadd; i++) { +// addTree[i] = rs[addTree[i]]; +// } +// for (int i = 1; i <= cntminus; i++) { +// minusTree[i] = rs[minusTree[i]]; +// } +// return innerQuery(jobk - leftsum, mid + 1, r); +// } +//} +// +//void add(int i, int cnt) { +// for (int j = i; j <= n; j += lowbit(j)) { +// root[j] = innerAdd(arr[i], cnt, 1, s, root[j]); +// } +//} +// +//void update(int i, int v) { +// add(i, -1); +// arr[i] = kth(v); +// add(i, 1); +//} +// +//int number(int l, int r, int k) { +// cntadd = cntminus = 0; +// for (int i = r; i > 0; i -= lowbit(i)) { +// addTree[++cntadd] = root[i]; +// } +// for (int i = l - 1; i > 0; i -= lowbit(i)) { +// minusTree[++cntminus] = root[i]; +// } +// return sorted[innerQuery(k, 1, s)]; +//} +// +//void prepare() { +// s = 0; +// for (int i = 1; i <= n; i++) { +// sorted[++s] = arr[i]; +// } +// for (int i = 1; i <= m; i++) { +// if (ques[i][0] == 2) { +// sorted[++s] = ques[i][2]; +// } +// } +// 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 <= n; i++) { +// arr[i] = kth(arr[i]); +// add(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++) { +// string op; +// cin >> op; +// if (op == "Q") { +// ques[i][0] = 1; +// } else { +// ques[i][0] = 2; +// } +// cin >> ques[i][1]; +// cin >> ques[i][2]; +// if (ques[i][0] == 1) { +// cin >> ques[i][3]; +// } +// } +// prepare(); +// for (int i = 1, op, x, y, z; i <= m; i++) { +// op = ques[i][0]; +// x = ques[i][1]; +// y = ques[i][2]; +// if (op == 1) { +// z = ques[i][3]; +// cout << number(x, y, z) << "\n"; +// } else { +// update(x, y); +// } +// } +// return 0; +//} \ No newline at end of file diff --git a/src/class160/Code05_LineUp1.java b/src/class160/Code06_LineUp1.java similarity index 99% rename from src/class160/Code05_LineUp1.java rename to src/class160/Code06_LineUp1.java index 72bc1d237..a78d7579e 100644 --- a/src/class160/Code05_LineUp1.java +++ b/src/class160/Code06_LineUp1.java @@ -19,7 +19,7 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class Code05_LineUp1 { +public class Code06_LineUp1 { public static int MAXN = 20001; diff --git a/src/class160/Code05_LineUp2.java b/src/class160/Code06_LineUp2.java similarity index 100% rename from src/class160/Code05_LineUp2.java rename to src/class160/Code06_LineUp2.java diff --git a/src/class160/Code06_NetworkManagement1.java b/src/class160/Code07_NetworkManagement1.java similarity index 99% rename from src/class160/Code06_NetworkManagement1.java rename to src/class160/Code07_NetworkManagement1.java index 6fecf33bb..868f32f8c 100644 --- a/src/class160/Code06_NetworkManagement1.java +++ b/src/class160/Code07_NetworkManagement1.java @@ -19,7 +19,7 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class Code06_NetworkManagement1 { +public class Code07_NetworkManagement1 { public static int MAXN = 80001; diff --git a/src/class160/Code06_NetworkManagement2.java b/src/class160/Code07_NetworkManagement2.java similarity index 100% rename from src/class160/Code06_NetworkManagement2.java rename to src/class160/Code07_NetworkManagement2.java From 96111c043826b4518da0ad05f5858d322eb54a01 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 20 Feb 2025 13:04:07 +0800 Subject: [PATCH 0699/2029] modify code --- src/class122/Code05_TransportPlan2.java | 106 ++++++++++++++++-------- 1 file changed, 72 insertions(+), 34 deletions(-) diff --git a/src/class122/Code05_TransportPlan2.java b/src/class122/Code05_TransportPlan2.java index b84f76fee..bde647031 100644 --- a/src/class122/Code05_TransportPlan2.java +++ b/src/class122/Code05_TransportPlan2.java @@ -10,12 +10,10 @@ // 测试链接 : https://www.luogu.com.cn/problem/P2680 // 提交以下的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 Code05_TransportPlan2 { @@ -213,30 +211,38 @@ public static boolean dfs(int root) { return false; } + public static int compute() { + tarjan(1); + int l = 0, r = maxCost, mid; + int ans = 0; + while (l <= r) { + mid = (l + r) / 2; + if (f(mid)) { + ans = mid; + r = mid - 1; + } else { + l = mid + 1; + } + } + return ans; + } + 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; + FastIO in = new FastIO(); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out), false); + n = in.nextInt(); build(); - in.nextToken(); - m = (int) in.nval; + m = in.nextInt(); for (int i = 1, u, v, w; i < n; i++) { - in.nextToken(); - u = (int) in.nval; - in.nextToken(); - v = (int) in.nval; - in.nextToken(); - w = (int) in.nval; + u = in.nextInt(); + v = in.nextInt(); + w = in.nextInt(); addEdge(u, v, w); addEdge(v, u, w); } for (int i = 1, u, v; i <= m; i++) { - in.nextToken(); - u = (int) in.nval; - in.nextToken(); - v = (int) in.nval; + u = in.nextInt(); + v = in.nextInt(); quesu[i] = u; quesv[i] = v; addQuery(u, v, i); @@ -245,23 +251,55 @@ public static void main(String[] args) throws IOException { out.println(compute()); out.flush(); out.close(); - br.close(); } - public static int compute() { - tarjan(1); - int l = 0, r = maxCost, mid; - int ans = 0; - while (l <= r) { - mid = (l + r) / 2; - if (f(mid)) { - ans = mid; - r = mid - 1; - } else { - l = mid + 1; + // IO工具类 + static class FastIO { + private final int SIZE = 1 << 20; + private byte[] buf; + private int pos; + private int count; + private InputStream is; + + public FastIO() { + buf = new byte[SIZE]; + pos = 0; + count = 0; + is = System.in; + } + + private int readByte() throws IOException { + if (count == -1) { + return -1; // EOF + } + if (pos >= count) { + pos = 0; + count = is.read(buf); + if (count == -1) { + return -1; + } } + return buf[pos++] & 0xff; + } + + public int nextInt() throws IOException { + int c, value = 0; + boolean neg = false; + do { + c = readByte(); + if (c == -1) { + return -1; + } + } while (c <= ' '); + if (c == '-') { + neg = true; + c = readByte(); + } + for (; c >= '0' && c <= '9'; c = readByte()) { + value = value * 10 + (c - '0'); + } + return neg ? -value : value; } - return ans; } -} \ No newline at end of file +} From 1b301011ed7254846ec9c918eb54b5bf249893f0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 20 Feb 2025 13:42:25 +0800 Subject: [PATCH 0700/2029] modify code --- src/class122/Code05_TransportPlan1.java | 34 ++--- src/class122/Code05_TransportPlan2.java | 10 +- src/class122/Code05_TransportPlan3.java | 172 ++++++++++++++++++++++++ 3 files changed, 196 insertions(+), 20 deletions(-) create mode 100644 src/class122/Code05_TransportPlan3.java diff --git a/src/class122/Code05_TransportPlan1.java b/src/class122/Code05_TransportPlan1.java index 85d688844..987e4bbe8 100644 --- a/src/class122/Code05_TransportPlan1.java +++ b/src/class122/Code05_TransportPlan1.java @@ -1,6 +1,6 @@ package class122; -// 运输计划(递归版) +// 运输计划,java版,递归dfs // 有n个节点,给定n-1条边使其连接成一棵树,每条边有正数边权 // 给定很多运输计划,每个运输计划(a,b)表示从a去往b // 每个运输计划的代价就是沿途边权和,运输计划之间完全互不干扰 @@ -170,6 +170,22 @@ public static boolean dfs(int u, int f, int w) { return num[u] == beyond && w >= atLeast; } + public static int compute() { + tarjan(1, 0, 0); + int l = 0, r = maxCost, mid; + int ans = 0; + while (l <= r) { + mid = (l + r) / 2; + if (f(mid)) { + ans = mid; + r = mid - 1; + } else { + l = mid + 1; + } + } + return ans; + } + public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StreamTokenizer in = new StreamTokenizer(br); @@ -205,20 +221,4 @@ public static void main(String[] args) throws IOException { br.close(); } - public static int compute() { - tarjan(1, 0, 0); - int l = 0, r = maxCost, mid; - int ans = 0; - while (l <= r) { - mid = (l + r) / 2; - if (f(mid)) { - ans = mid; - r = mid - 1; - } else { - l = mid + 1; - } - } - return ans; - } - } \ No newline at end of file diff --git a/src/class122/Code05_TransportPlan2.java b/src/class122/Code05_TransportPlan2.java index bde647031..d2e283c0d 100644 --- a/src/class122/Code05_TransportPlan2.java +++ b/src/class122/Code05_TransportPlan2.java @@ -1,6 +1,6 @@ package class122; -// 运输计划(迭代版) +// 运输计划,java版,迭代dfs // 有n个节点,给定n-1条边使其连接成一棵树,每条边有正数边权 // 给定很多运输计划,每个运输计划(a,b)表示从a去往b // 每个运输计划的代价就是沿途边权和,运输计划之间完全互不干扰 @@ -8,7 +8,11 @@ // 你的目的是让所有运输计划代价的最大值尽量小 // 返回所有运输计划代价的最大值最小能是多少 // 测试链接 : https://www.luogu.com.cn/problem/P2680 -// 提交以下的code,提交时请把类名改成"Main",可以通过所有用例 +// 提交以下的code,提交时请把类名改成"Main" +// 有时候可以完全通过,有时候会有一个测试用例超时 +// 因为这道题根据C++的运行时间,制定通过标准,根本没考虑java的用户 +// 本节课Code05_TransportPlan3文件就是C++的实现 +// 两个版本的逻辑完全一样,C++版本可以通过所有测试 import java.io.IOException; import java.io.InputStream; @@ -270,7 +274,7 @@ public FastIO() { private int readByte() throws IOException { if (count == -1) { - return -1; // EOF + return -1; } if (pos >= count) { pos = 0; diff --git a/src/class122/Code05_TransportPlan3.java b/src/class122/Code05_TransportPlan3.java new file mode 100644 index 000000000..00bba0de2 --- /dev/null +++ b/src/class122/Code05_TransportPlan3.java @@ -0,0 +1,172 @@ +package class122; + +// 运输计划,C++版,递归dfs +// 有n个节点,给定n-1条边使其连接成一棵树,每条边有正数边权 +// 给定很多运输计划,每个运输计划(a,b)表示从a去往b +// 每个运输计划的代价就是沿途边权和,运输计划之间完全互不干扰 +// 你只能选择一条边,将其边权变成0 +// 你的目的是让所有运输计划代价的最大值尽量小 +// 返回所有运输计划代价的最大值最小能是多少 +// 测试链接 : https://www.luogu.com.cn/problem/P2680 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 300001; +//const int MAXM = 300001; +//int n, m; +//int num[MAXN]; +//int headEdge[MAXN]; +//int edgeNext[MAXN << 1]; +//int edgeTo[MAXN << 1]; +//int edgeWeight[MAXN << 1]; +//int tcnt; +//int headQuery[MAXN]; +//int queryNext[MAXM << 1]; +//int queryTo[MAXM << 1]; +//int queryIndex[MAXM << 1]; +//int qcnt; +//bool visited[MAXN]; +//int unionfind[MAXN]; +//int quesu[MAXM]; +//int quesv[MAXM]; +//int dist[MAXN]; +//int lca[MAXM]; +//int cost[MAXM]; +//int maxCost; +//int atLeast; +//int beyond; +// +//void build() { +// tcnt = 1; +// qcnt = 1; +// for(int i = 1; i <= n; i++) { +// headEdge[i] = 0; +// headQuery[i] = 0; +// visited[i] = false; +// unionfind[i] = i; +// } +// maxCost = 0; +//} +// +//void addEdge(int u, int v, int w) { +// edgeNext[tcnt] = headEdge[u]; +// edgeTo[tcnt] = v; +// edgeWeight[tcnt] = w; +// headEdge[u] = tcnt++; +//} +// +//void addQuery(int u, int v, int i) { +// queryNext[qcnt] = headQuery[u]; +// queryTo[qcnt] = v; +// queryIndex[qcnt] = i; +// headQuery[u] = qcnt++; +//} +// +//int find(int i) { +// if(i != unionfind[i]) { +// unionfind[i] = find(unionfind[i]); +// } +// return unionfind[i]; +//} +// +//void tarjan(int u, int f, int w) { +// visited[u] = true; +// dist[u] = dist[f] + w; +// for(int e = headEdge[u]; e != 0; e = edgeNext[e]) { +// int v = edgeTo[e]; +// if(v != f) { +// tarjan(v, u, edgeWeight[e]); +// } +// } +// for(int e = headQuery[u]; e != 0; e = queryNext[e]) { +// int v = queryTo[e]; +// if(visited[v]) { +// int i = queryIndex[e]; +// lca[i] = find(v); +// cost[i] = dist[u] + dist[v] - 2 * dist[lca[i]]; +// maxCost = max(maxCost, cost[i]); +// } +// } +// unionfind[u] = f; +//} +// +//bool dfs(int u, int f, int w) { +// for(int e = headEdge[u]; e != 0; e = edgeNext[e]) { +// int v = edgeTo[e]; +// if(v != f) { +// if(dfs(v, u, edgeWeight[e])) { +// return true; +// } +// } +// } +// for(int e = headEdge[u]; e != 0; e = edgeNext[e]) { +// int v = edgeTo[e]; +// if(v != f) { +// num[u] += num[v]; +// } +// } +// return (num[u] == beyond && w >= atLeast); +//} +// +//bool f(int limit) { +// atLeast = maxCost - limit; +// for(int i = 1; i <= n; i++) { +// num[i] = 0; +// } +// beyond = 0; +// for(int i = 1; i <= m; i++) { +// if(cost[i] > limit) { +// num[quesu[i]]++; +// num[quesv[i]]++; +// num[lca[i]] -= 2; +// beyond++; +// } +// } +// if(beyond == 0) return true; +// return dfs(1, 0, 0); +//} +// +//int compute() { +// tarjan(1, 0, 0); +// int l = 0; +// int r = maxCost; +// int ans = 0; +// while(l <= r) { +// int mid = (l + r) / 2; +// if(f(mid)) { +// ans = mid; +// r = mid - 1; +// } else { +// l = mid + 1; +// } +// } +// return ans; +//} +// +//int main(){ +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n; +// build(); +// cin >> m; +// for(int i = 1; i < n; i++){ +// int u,v,w; +// cin >> u >> v >> w; +// addEdge(u,v,w); +// addEdge(v,u,w); +// } +// for(int i = 1; i <= m; i++){ +// int u,v; +// cin >> u >> v; +// quesu[i] = u; +// quesv[i] = v; +// addQuery(u,v,i); +// addQuery(v,u,i); +// } +// cout << compute() << "\n"; +// return 0; +//} \ No newline at end of file From 578b6dc5df8b197b5f02873e4f9519f6aa80ef8f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 20 Feb 2025 13:45:52 +0800 Subject: [PATCH 0701/2029] modify code --- src/class122/Code05_TransportPlan1.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/class122/Code05_TransportPlan1.java b/src/class122/Code05_TransportPlan1.java index 987e4bbe8..9efd32f18 100644 --- a/src/class122/Code05_TransportPlan1.java +++ b/src/class122/Code05_TransportPlan1.java @@ -10,7 +10,6 @@ // 测试链接 : https://www.luogu.com.cn/problem/P2680 // 提交以下的code,提交时请把类名改成"Main" // C++这么写能通过,java会因为递归层数太多而爆栈 -// java能通过的写法参考本节课Code05_TransportPlan2文件 import java.io.BufferedReader; import java.io.IOException; From 036e1fea7273e475e283677719a5afe7c5661583 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 20 Feb 2025 13:47:48 +0800 Subject: [PATCH 0702/2029] modify code --- src/class122/Code05_TransportPlan1.java | 3 ++- src/class122/Code05_TransportPlan2.java | 2 +- src/class122/Code05_TransportPlan3.java | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/class122/Code05_TransportPlan1.java b/src/class122/Code05_TransportPlan1.java index 9efd32f18..48013c427 100644 --- a/src/class122/Code05_TransportPlan1.java +++ b/src/class122/Code05_TransportPlan1.java @@ -1,6 +1,6 @@ package class122; -// 运输计划,java版,递归dfs +// 运输计划,java递归版 // 有n个节点,给定n-1条边使其连接成一棵树,每条边有正数边权 // 给定很多运输计划,每个运输计划(a,b)表示从a去往b // 每个运输计划的代价就是沿途边权和,运输计划之间完全互不干扰 @@ -10,6 +10,7 @@ // 测试链接 : https://www.luogu.com.cn/problem/P2680 // 提交以下的code,提交时请把类名改成"Main" // C++这么写能通过,java会因为递归层数太多而爆栈 +// 本节课Code05_TransportPlan3文件就是C++的实现 import java.io.BufferedReader; import java.io.IOException; diff --git a/src/class122/Code05_TransportPlan2.java b/src/class122/Code05_TransportPlan2.java index d2e283c0d..e78f1fc86 100644 --- a/src/class122/Code05_TransportPlan2.java +++ b/src/class122/Code05_TransportPlan2.java @@ -1,6 +1,6 @@ package class122; -// 运输计划,java版,迭代dfs +// 运输计划,java迭代版 // 有n个节点,给定n-1条边使其连接成一棵树,每条边有正数边权 // 给定很多运输计划,每个运输计划(a,b)表示从a去往b // 每个运输计划的代价就是沿途边权和,运输计划之间完全互不干扰 diff --git a/src/class122/Code05_TransportPlan3.java b/src/class122/Code05_TransportPlan3.java index 00bba0de2..a60e0a895 100644 --- a/src/class122/Code05_TransportPlan3.java +++ b/src/class122/Code05_TransportPlan3.java @@ -1,6 +1,6 @@ package class122; -// 运输计划,C++版,递归dfs +// 运输计划,C++版,递归不用改迭代 // 有n个节点,给定n-1条边使其连接成一棵树,每条边有正数边权 // 给定很多运输计划,每个运输计划(a,b)表示从a去往b // 每个运输计划的代价就是沿途边权和,运输计划之间完全互不干扰 From 5e2e571dbad3f968a4a4a3dd82e272943015d5b8 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 20 Feb 2025 14:15:22 +0800 Subject: [PATCH 0703/2029] modify code --- src/class160/Code01_SegmentWithSegment1.java | 24 ++++++++++++-------- src/class160/Code01_SegmentWithSegment2.java | 20 ++++++++-------- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/src/class160/Code01_SegmentWithSegment1.java b/src/class160/Code01_SegmentWithSegment1.java index 8a8907837..2b3df7ee7 100644 --- a/src/class160/Code01_SegmentWithSegment1.java +++ b/src/class160/Code01_SegmentWithSegment1.java @@ -27,8 +27,12 @@ public class Code01_SegmentWithSegment1 { public static int m = 1001; + // 身高范围对应[MINX, MAXX],活泼度范围对应[MINY, MAXY] public static int MINX = 100, MAXX = 200, MINY = 0, MAXY = 1000; + // 外层是身高线段树,内层是活泼度线段树 + // 每一个外层线段树的节点,对应着一棵内层线段树 + // 内层线段树收集缘分值 public static int[][] tree = new int[n << 2][m << 2]; public static void innerBuild(int yl, int yr, int xi, int yi) { @@ -40,32 +44,32 @@ public static void innerBuild(int yl, int yr, int xi, int yi) { } } - public static void innerUpdate(int joby, int jobv, int yl, int yr, int xi, int yi) { + public static void innerUpdate(int jobi, int jobv, int yl, int yr, int xi, int yi) { if (yl == yr) { tree[xi][yi] = Math.max(tree[xi][yi], jobv); } else { int mid = (yl + yr) / 2; - if (joby <= mid) { - innerUpdate(joby, jobv, yl, mid, xi, yi << 1); + if (jobi <= mid) { + innerUpdate(jobi, jobv, yl, mid, xi, yi << 1); } else { - innerUpdate(joby, jobv, mid + 1, yr, xi, yi << 1 | 1); + innerUpdate(jobi, jobv, mid + 1, yr, xi, yi << 1 | 1); } tree[xi][yi] = Math.max(tree[xi][yi << 1], tree[xi][yi << 1 | 1]); } } - public static int innerQuery(int jobyl, int jobyr, int yl, int yr, int xi, int yi) { - if (jobyl <= yl && yr <= jobyr) { + public static int innerQuery(int jobl, int jobr, int yl, int yr, int xi, int yi) { + if (jobl <= yl && yr <= jobr) { return tree[xi][yi]; } int mid = (yl + yr) / 2; int ans = -1; - if (jobyl <= mid) { - ans = innerQuery(jobyl, jobyr, yl, mid, xi, yi << 1); + if (jobl <= mid) { + ans = innerQuery(jobl, jobr, yl, mid, xi, yi << 1); } - if (jobyr > mid) { - ans = Math.max(ans, innerQuery(jobyl, jobyr, mid + 1, yr, xi, yi << 1 | 1)); + if (jobr > mid) { + ans = Math.max(ans, innerQuery(jobl, jobr, mid + 1, yr, xi, yi << 1 | 1)); } return ans; } diff --git a/src/class160/Code01_SegmentWithSegment2.java b/src/class160/Code01_SegmentWithSegment2.java index 44b127100..b09aaa352 100644 --- a/src/class160/Code01_SegmentWithSegment2.java +++ b/src/class160/Code01_SegmentWithSegment2.java @@ -31,31 +31,31 @@ // } //} // -//void innerUpdate(int joby, int jobv, int yl, int yr, int xi, int yi) { +//void innerUpdate(int jobi, int jobv, int yl, int yr, int xi, int yi) { // if (yl == yr) { // tree[xi][yi] = max(tree[xi][yi], jobv); // } else { // int mid = (yl + yr) >> 1; -// if (joby <= mid) { -// innerUpdate(joby, jobv, yl, mid, xi, yi << 1); +// if (jobi <= mid) { +// innerUpdate(jobi, jobv, yl, mid, xi, yi << 1); // } else { -// innerUpdate(joby, jobv, mid + 1, yr, xi, yi << 1 | 1); +// innerUpdate(jobi, jobv, mid + 1, yr, xi, yi << 1 | 1); // } // tree[xi][yi] = max(tree[xi][yi << 1], tree[xi][(yi << 1) | 1]); // } //} // -//int innerQuery(int jobyl, int jobyr, int yl, int yr, int xi, int yi) { -// if (jobyl <= yl && yr <= jobyr) { +//int innerQuery(int jobl, int jobr, int yl, int yr, int xi, int yi) { +// if (jobl <= yl && yr <= jobr) { // return tree[xi][yi]; // } // int mid = (yl + yr) >> 1; // int ans = -1; -// if (jobyl <= mid) { -// ans = max(ans, innerQuery(jobyl, jobyr, yl, mid, xi, yi << 1)); +// if (jobl <= mid) { +// ans = max(ans, innerQuery(jobl, jobr, yl, mid, xi, yi << 1)); // } -// if (jobyr > mid) { -// ans = max(ans, innerQuery(jobyl, jobyr, mid + 1, yr, xi, (yi << 1) | 1)); +// if (jobr > mid) { +// ans = max(ans, innerQuery(jobl, jobr, mid + 1, yr, xi, (yi << 1) | 1)); // } // return ans; //} From eebb5dcf788ed06b568caa31fba347ccbeb26783 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 20 Feb 2025 14:19:59 +0800 Subject: [PATCH 0704/2029] modify code --- src/class160/Code01_SegmentWithSegment1.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/class160/Code01_SegmentWithSegment1.java b/src/class160/Code01_SegmentWithSegment1.java index 2b3df7ee7..26c187203 100644 --- a/src/class160/Code01_SegmentWithSegment1.java +++ b/src/class160/Code01_SegmentWithSegment1.java @@ -23,8 +23,10 @@ public class Code01_SegmentWithSegment1 { + // 身高范围内有多少数字 public static int n = 101; + // 活泼度范围内有多少数字 public static int m = 1001; // 身高范围对应[MINX, MAXX],活泼度范围对应[MINY, MAXY] From 0c26139ca10ba7af72ec80fb69e046a3157fab45 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 20 Feb 2025 16:06:15 +0800 Subject: [PATCH 0705/2029] modify code --- src/class160/Code01_SegmentWithSegment1.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/class160/Code01_SegmentWithSegment1.java b/src/class160/Code01_SegmentWithSegment1.java index 26c187203..75b07b974 100644 --- a/src/class160/Code01_SegmentWithSegment1.java +++ b/src/class160/Code01_SegmentWithSegment1.java @@ -68,7 +68,6 @@ public static int innerQuery(int jobl, int jobr, int yl, int yr, int xi, int yi) int ans = -1; if (jobl <= mid) { ans = innerQuery(jobl, jobr, yl, mid, xi, yi << 1); - } if (jobr > mid) { ans = Math.max(ans, innerQuery(jobl, jobr, mid + 1, yr, xi, yi << 1 | 1)); From 33e4bf0d0ca3c07905e6bc8d3a61f04a80658f73 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 20 Feb 2025 16:42:32 +0800 Subject: [PATCH 0706/2029] modify code --- src/class160/Code02_QueryKthMaximum1.java | 18 ++++++++++++++---- src/class160/Code02_QueryKthMaximum2.java | 6 +++--- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/class160/Code02_QueryKthMaximum1.java b/src/class160/Code02_QueryKthMaximum1.java index 807b3a535..756172a0c 100644 --- a/src/class160/Code02_QueryKthMaximum1.java +++ b/src/class160/Code02_QueryKthMaximum1.java @@ -26,12 +26,22 @@ public class Code02_QueryKthMaximum1 { public static int n, m, s; + // 所有操作收集起来,因为牵扯到离散化 public static int[][] ques = new int[MAXN][4]; + // 所有可能数字的数字,收集起来去重,方便得到数字排名 public static int[] sorted = new int[MAXN]; + // 外部(a~b) + 内部(c~d)表示:数字排名范围a~b,集合范围c~d,上面数字的个数 + // 外部线段树的下标表示数字的排名 + // 外部(a~b),假设对应的节点编号为i,那么root[i]就是内部线段树的头节点编号 public static int[] root = new int[MAXN << 2]; + // 内部线段树是开点线段树,所以需要cnt来获得节点计数 + // 内部线段树的下标表示集合的编号 + // 内部(c~d),假设对应的节点编号为i + // sum[i]表示集合范围c~d,一共收集了多少数字 + // lazy[i]懒更新信息,集合范围c~d,增加了多少个数字,等待懒更新的下发 public static int[] left = new int[MAXT]; public static int[] right = new int[MAXT]; @@ -117,14 +127,14 @@ public static long innerQuery(int jobl, int jobr, int l, int r, int i) { return ans; } - public static void outerAdd(int jobl, int jobr, int jobk, int l, int r, int i) { + public static void outerAdd(int jobl, int jobr, int jobv, int l, int r, int i) { root[i] = innerAdd(jobl, jobr, 1, n, root[i]); if (l < r) { int mid = (l + r) / 2; - if (jobk <= mid) { - outerAdd(jobl, jobr, jobk, l, mid, i << 1); + if (jobv <= mid) { + outerAdd(jobl, jobr, jobv, l, mid, i << 1); } else { - outerAdd(jobl, jobr, jobk, mid + 1, r, i << 1 | 1); + outerAdd(jobl, jobr, jobv, mid + 1, r, i << 1 | 1); } } } diff --git a/src/class160/Code02_QueryKthMaximum2.java b/src/class160/Code02_QueryKthMaximum2.java index 78f55130a..bf35d30f3 100644 --- a/src/class160/Code02_QueryKthMaximum2.java +++ b/src/class160/Code02_QueryKthMaximum2.java @@ -87,14 +87,14 @@ // return ans; //} // -//void outerAdd(int jobl, int jobr, int jobk, int l, int r, int i) { +//void outerAdd(int jobl, int jobr, int jobv, int l, int r, int i) { // root[i] = innerAdd(jobl, jobr, 1, n, root[i]); // if (l < r) { // int mid = (l + r) >> 1; // if (jobk <= mid) { -// outerAdd(jobl, jobr, jobk, l, mid, i << 1); +// outerAdd(jobl, jobr, jobv, l, mid, i << 1); // } else { -// outerAdd(jobl, jobr, jobk, mid + 1, r, i << 1 | 1); +// outerAdd(jobl, jobr, jobv, mid + 1, r, i << 1 | 1); // } // } //} From d06d8fe4dd01632c8a2720b6faae508d4240f475 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 20 Feb 2025 16:50:00 +0800 Subject: [PATCH 0707/2029] modify code --- src/class160/Code02_QueryKthMaximum1.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class160/Code02_QueryKthMaximum1.java b/src/class160/Code02_QueryKthMaximum1.java index 756172a0c..a1640124d 100644 --- a/src/class160/Code02_QueryKthMaximum1.java +++ b/src/class160/Code02_QueryKthMaximum1.java @@ -26,13 +26,13 @@ public class Code02_QueryKthMaximum1 { public static int n, m, s; - // 所有操作收集起来,因为牵扯到离散化 + // 所有操作收集起来,因为牵扯到数字离散化 public static int[][] ques = new int[MAXN][4]; - // 所有可能数字的数字,收集起来去重,方便得到数字排名 + // 所有可能的数字,收集起来去重,方便得到数字排名 public static int[] sorted = new int[MAXN]; - // 外部(a~b) + 内部(c~d)表示:数字排名范围a~b,集合范围c~d,上面数字的个数 + // 外部(a~b) + 内部(c~d)表示:数字排名范围a~b,集合范围c~d,数字的个数 // 外部线段树的下标表示数字的排名 // 外部(a~b),假设对应的节点编号为i,那么root[i]就是内部线段树的头节点编号 public static int[] root = new int[MAXN << 2]; @@ -41,7 +41,7 @@ public class Code02_QueryKthMaximum1 { // 内部线段树的下标表示集合的编号 // 内部(c~d),假设对应的节点编号为i // sum[i]表示集合范围c~d,一共收集了多少数字 - // lazy[i]懒更新信息,集合范围c~d,增加了多少个数字,等待懒更新的下发 + // lazy[i]懒更新信息,集合范围c~d,增加了几个数字,等待懒更新的下发 public static int[] left = new int[MAXT]; public static int[] right = new int[MAXT]; From 9db67fa340cfe08745c67bdc75b6a4ad9b52eb01 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 20 Feb 2025 16:50:38 +0800 Subject: [PATCH 0708/2029] modify code --- src/class160/Code02_QueryKthMaximum2.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/class160/Code02_QueryKthMaximum2.java b/src/class160/Code02_QueryKthMaximum2.java index bf35d30f3..e6b60c909 100644 --- a/src/class160/Code02_QueryKthMaximum2.java +++ b/src/class160/Code02_QueryKthMaximum2.java @@ -20,7 +20,6 @@ //int n, m, s; //int ques[MAXN][4]; //int sorted[MAXN]; -// //int root[MAXN << 2]; //int ls[MAXT]; //int rs[MAXT]; From b697036a72a74da7bf5d239b8e5274c65fbcfc57 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 20 Feb 2025 17:07:02 +0800 Subject: [PATCH 0709/2029] modify code --- src/class160/Code02_QueryKthMaximum1.java | 2 +- src/class160/Code02_QueryKthMaximum2.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/class160/Code02_QueryKthMaximum1.java b/src/class160/Code02_QueryKthMaximum1.java index a1640124d..5002bfbe0 100644 --- a/src/class160/Code02_QueryKthMaximum1.java +++ b/src/class160/Code02_QueryKthMaximum1.java @@ -5,8 +5,8 @@ // 操作 1 l r v : 数字v放入编号范围[l,r]的每一个集合中 // 操作 2 l r k : 编号范围[l,r]的所有集合,如果生成不去重的并集,返回第k大的数字 // 1 <= n、m <= 5 * 10^4 -// 1 <= v <= n // 1 <= k < 2^63,题目保证第k大的数字一定存在 +// 注意,测试用例里增加了Hack数据,v可能是很大的数字 // 测试链接 : https://www.luogu.com.cn/problem/P3332 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class160/Code02_QueryKthMaximum2.java b/src/class160/Code02_QueryKthMaximum2.java index e6b60c909..8243eb640 100644 --- a/src/class160/Code02_QueryKthMaximum2.java +++ b/src/class160/Code02_QueryKthMaximum2.java @@ -5,8 +5,8 @@ // 操作 1 l r v : 数字v放入编号范围[l,r]的每一个集合中 // 操作 2 l r k : 编号范围[l,r]的所有集合,如果生成不去重的并集,返回第k大的数字 // 1 <= n、m <= 5 * 10^4 -// 1 <= v <= n // 1 <= k < 2^63,题目保证第k大的数字一定存在 +// 注意,测试用例里增加了Hack数据,v可能是很大的数字 // 测试链接 : https://www.luogu.com.cn/problem/P3332 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -90,7 +90,7 @@ // root[i] = innerAdd(jobl, jobr, 1, n, root[i]); // if (l < r) { // int mid = (l + r) >> 1; -// if (jobk <= mid) { +// if (jobv <= mid) { // outerAdd(jobl, jobr, jobv, l, mid, i << 1); // } else { // outerAdd(jobl, jobr, jobv, mid + 1, r, i << 1 | 1); From c748079df22aecff4af13f479111289c1bc2c5fa Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 20 Feb 2025 17:18:56 +0800 Subject: [PATCH 0710/2029] modify code --- src/class160/Code02_QueryKthMaximum1.java | 12 +++++++----- src/class160/Code02_QueryKthMaximum2.java | 10 +++++----- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/class160/Code02_QueryKthMaximum1.java b/src/class160/Code02_QueryKthMaximum1.java index 5002bfbe0..4a24b7586 100644 --- a/src/class160/Code02_QueryKthMaximum1.java +++ b/src/class160/Code02_QueryKthMaximum1.java @@ -20,22 +20,24 @@ public class Code02_QueryKthMaximum1 { - public static int MAXN = 50001; + // 外部线段树的范围,一共只有m个操作,所以最多有m种数字 + public static int MAXM = 50001; - public static int MAXT = MAXN * 230; + // 内部线段树的节点数上限 + public static int MAXT = MAXM * 230; public static int n, m, s; // 所有操作收集起来,因为牵扯到数字离散化 - public static int[][] ques = new int[MAXN][4]; + public static int[][] ques = new int[MAXM][4]; // 所有可能的数字,收集起来去重,方便得到数字排名 - public static int[] sorted = new int[MAXN]; + public static int[] sorted = new int[MAXM]; // 外部(a~b) + 内部(c~d)表示:数字排名范围a~b,集合范围c~d,数字的个数 // 外部线段树的下标表示数字的排名 // 外部(a~b),假设对应的节点编号为i,那么root[i]就是内部线段树的头节点编号 - public static int[] root = new int[MAXN << 2]; + public static int[] root = new int[MAXM << 2]; // 内部线段树是开点线段树,所以需要cnt来获得节点计数 // 内部线段树的下标表示集合的编号 diff --git a/src/class160/Code02_QueryKthMaximum2.java b/src/class160/Code02_QueryKthMaximum2.java index 8243eb640..8a634362d 100644 --- a/src/class160/Code02_QueryKthMaximum2.java +++ b/src/class160/Code02_QueryKthMaximum2.java @@ -15,12 +15,12 @@ // //using namespace std; // -//const int MAXN = 50001; -//const int MAXT = MAXN * 230; +//const int MAXM = 50001; +//const int MAXT = MAXM * 230; //int n, m, s; -//int ques[MAXN][4]; -//int sorted[MAXN]; -//int root[MAXN << 2]; +//int ques[MAXM][4]; +//int sorted[MAXM]; +//int root[MAXM << 2]; //int ls[MAXT]; //int rs[MAXT]; //long long sum[MAXT]; From e731aff6b552b9ca3c444cfb601161c878b03780 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 20 Feb 2025 17:22:12 +0800 Subject: [PATCH 0711/2029] modify code --- src/class160/Code02_QueryKthMaximum1.java | 2 +- src/class160/Code02_QueryKthMaximum2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class160/Code02_QueryKthMaximum1.java b/src/class160/Code02_QueryKthMaximum1.java index 4a24b7586..54c47fca6 100644 --- a/src/class160/Code02_QueryKthMaximum1.java +++ b/src/class160/Code02_QueryKthMaximum1.java @@ -5,8 +5,8 @@ // 操作 1 l r v : 数字v放入编号范围[l,r]的每一个集合中 // 操作 2 l r k : 编号范围[l,r]的所有集合,如果生成不去重的并集,返回第k大的数字 // 1 <= n、m <= 5 * 10^4 +// -n <= v <= +n // 1 <= k < 2^63,题目保证第k大的数字一定存在 -// 注意,测试用例里增加了Hack数据,v可能是很大的数字 // 测试链接 : https://www.luogu.com.cn/problem/P3332 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class160/Code02_QueryKthMaximum2.java b/src/class160/Code02_QueryKthMaximum2.java index 8a634362d..a8fbd7c68 100644 --- a/src/class160/Code02_QueryKthMaximum2.java +++ b/src/class160/Code02_QueryKthMaximum2.java @@ -5,8 +5,8 @@ // 操作 1 l r v : 数字v放入编号范围[l,r]的每一个集合中 // 操作 2 l r k : 编号范围[l,r]的所有集合,如果生成不去重的并集,返回第k大的数字 // 1 <= n、m <= 5 * 10^4 +// -n <= v <= +n // 1 <= k < 2^63,题目保证第k大的数字一定存在 -// 注意,测试用例里增加了Hack数据,v可能是很大的数字 // 测试链接 : https://www.luogu.com.cn/problem/P3332 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From ffc1cd818899db8beba703f7e21d8a8b3d776f38 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 21 Feb 2025 10:34:22 +0800 Subject: [PATCH 0712/2029] modify code --- src/class160/Code03_SegmentWithBalanced1.java | 6 +++--- src/class160/Code03_SegmentWithBalanced2.java | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/class160/Code03_SegmentWithBalanced1.java b/src/class160/Code03_SegmentWithBalanced1.java index e594a2ad4..ee110d112 100644 --- a/src/class160/Code03_SegmentWithBalanced1.java +++ b/src/class160/Code03_SegmentWithBalanced1.java @@ -98,13 +98,13 @@ public static int innerBuild(int l, int r) { return h; } - public static int innerRebuild(int i) { + public static int innerRebuild(int h) { if (top != 0) { ci = 0; inorder(top); if (ci > 0) { if (father == 0) { - i = innerBuild(1, ci); + h = innerBuild(1, ci); } else if (side == 1) { left[father] = innerBuild(1, ci); } else { @@ -112,7 +112,7 @@ public static int innerRebuild(int i) { } } } - return i; + return h; } public static int innerInsert(int num, int i, int f, int s) { diff --git a/src/class160/Code03_SegmentWithBalanced2.java b/src/class160/Code03_SegmentWithBalanced2.java index 5e6318480..4a23ce150 100644 --- a/src/class160/Code03_SegmentWithBalanced2.java +++ b/src/class160/Code03_SegmentWithBalanced2.java @@ -69,13 +69,13 @@ // return h; //} // -//int innerRebuild(int i) { +//int innerRebuild(int h) { // if (top) { // ci = 0; // inorder(top); // if (ci > 0) { // if (father == 0) { -// i = innerBuild(1, ci); +// h = innerBuild(1, ci); // } else if (side == 1) { // ls[father] = innerBuild(1, ci); // } else { @@ -83,7 +83,7 @@ // } // } // } -// return i; +// return h; //} // //int innerInsert(int num, int i, int f, int s) { From 8ef3cf35490267cbcf96265c4da9a623bad7eebf Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 21 Feb 2025 17:07:44 +0800 Subject: [PATCH 0713/2029] modify code --- src/class160/Code03_SegmentWithBalanced1.java | 17 ++++++++++------- src/class160/Code03_SegmentWithBalanced2.java | 10 +++++----- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/class160/Code03_SegmentWithBalanced1.java b/src/class160/Code03_SegmentWithBalanced1.java index ee110d112..2724d5aa6 100644 --- a/src/class160/Code03_SegmentWithBalanced1.java +++ b/src/class160/Code03_SegmentWithBalanced1.java @@ -208,14 +208,15 @@ public static int innerRemove(int num, int i) { return i; } - public static void build(int l, int r, int i) { - for (int j = l; j <= r; j++) { - root[i] = innerInsert(arr[j], root[i]); - } + public static void add(int jobi, int jobv, int l, int r, int i) { + root[i] = innerInsert(jobv, root[i]); if (l < r) { int mid = (l + r) >> 1; - build(l, mid, i << 1); - build(mid + 1, r, i << 1 | 1); + if (jobi <= mid) { + add(jobi, jobv, l, mid, i << 1); + } else { + add(jobi, jobv, mid + 1, r, i << 1 | 1); + } } } @@ -303,7 +304,9 @@ public static void main(String[] args) throws IOException { in.nextToken(); arr[i] = (int) in.nval; } - build(1, n, 1); + for (int i = 1; i <= n; i++) { + add(i, arr[i], 1, n, 1); + } for (int i = 1, op, x, y, z; i <= m; i++) { in.nextToken(); op = (int) in.nval; diff --git a/src/class160/Code03_SegmentWithBalanced2.java b/src/class160/Code03_SegmentWithBalanced2.java index 4a23ce150..6b9dc5144 100644 --- a/src/class160/Code03_SegmentWithBalanced2.java +++ b/src/class160/Code03_SegmentWithBalanced2.java @@ -167,12 +167,12 @@ // return i; //} // -//void build(int l, int r, int i) { -// for (int j = l; j <= r; j++) root[i] = innerInsert(arr[j], root[i]); +//void add(int jobi, int jobv, int l, int r, int i) { +// root[i] = innerInsert(jobv, root[i]); // if (l < r) { // int mid = (l + r) >> 1; -// build(l, mid, i << 1); -// build(mid + 1, r, i << 1 | 1); +// if (jobi <= mid) add(jobi, jobv, l, mid, i << 1); +// else add(jobi, jobv, mid + 1, r, i << 1 | 1); // } //} // @@ -229,7 +229,7 @@ // cin.tie(nullptr); // cin >> n >> m; // for(int i = 1; i <= n; i++) cin >> arr[i]; -// build(1, n, 1); +// for(int i = 1; i <= n; i++) add(i, arr[i], 1, n, 1); // for(int i = 1, op, x, y, z; i <= m; i++) { // cin >> op >> x >> y; // if(op == 3) { From 6e190a334ac65d0bf01b6ee5c6c4eb108f65a188 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 21 Feb 2025 17:14:55 +0800 Subject: [PATCH 0714/2029] modify code --- src/class160/Code03_SegmentWithBalanced1.java | 2 +- src/class160/Code03_SegmentWithBalanced2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class160/Code03_SegmentWithBalanced1.java b/src/class160/Code03_SegmentWithBalanced1.java index 2724d5aa6..fcc7efed9 100644 --- a/src/class160/Code03_SegmentWithBalanced1.java +++ b/src/class160/Code03_SegmentWithBalanced1.java @@ -252,7 +252,7 @@ public static int number(int jobl, int jobr, int jobk) { int l = 0, r = 100000000, mid, ans = 0; while (l <= r) { mid = (l + r) >> 1; - if (small(jobl, jobr, mid + 1, 1, n, 1) >= jobk) { + if (small(jobl, jobr, mid + 1, 1, n, 1) + 1 > jobk) { ans = mid; r = mid - 1; } else { diff --git a/src/class160/Code03_SegmentWithBalanced2.java b/src/class160/Code03_SegmentWithBalanced2.java index 6b9dc5144..569fa0578 100644 --- a/src/class160/Code03_SegmentWithBalanced2.java +++ b/src/class160/Code03_SegmentWithBalanced2.java @@ -198,7 +198,7 @@ // int l = 0, r = 100000000, mid, ans = 0; // while (l <= r) { // mid = (l + r) >> 1; -// if (small(jobl, jobr, mid + 1, 1, n, 1) >= jobk) { +// if (small(jobl, jobr, mid + 1, 1, n, 1) + 1 > jobk) { // ans = mid; // r = mid - 1; // } else { From 0dec580006e074be467169c10995773d0d5f4883 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 21 Feb 2025 19:31:54 +0800 Subject: [PATCH 0715/2029] modify code --- src/class160/Code03_SegmentWithBalanced1.java | 15 +++++++++++---- src/class160/Code03_SegmentWithBalanced2.java | 6 +++--- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/class160/Code03_SegmentWithBalanced1.java b/src/class160/Code03_SegmentWithBalanced1.java index fcc7efed9..a52a2ae3a 100644 --- a/src/class160/Code03_SegmentWithBalanced1.java +++ b/src/class160/Code03_SegmentWithBalanced1.java @@ -136,6 +136,8 @@ public static int innerInsert(int num, int i, int f, int s) { return i; } + // 平衡树当前来到i号节点,把num这个数字插入 + // 返回头节点编号 public static int innerInsert(int num, int i) { top = father = side = 0; i = innerInsert(num, i, 0, 0); @@ -143,6 +145,7 @@ public static int innerInsert(int num, int i) { return i; } + // 平衡树当前来到i号节点,返回= index) { @@ -165,6 +169,7 @@ public static int innerIndex(int index, int i) { } } + // 平衡树当前来到i号节点,返回num的前驱 public static int innerPre(int num, int i) { int kth = innerSmall(num, i) + 1; if (kth == 1) { @@ -174,12 +179,13 @@ public static int innerPre(int num, int i) { } } + // 平衡树当前来到i号节点,返回num的后继 public static int innerPost(int num, int i) { - int kth = innerSmall(num + 1, i); - if (kth == size[i]) { + int k = innerSmall(num + 1, i); + if (k == size[i]) { return INF; } else { - return innerIndex(kth + 1, i); + return innerIndex(k + 1, i); } } @@ -251,7 +257,8 @@ public static int small(int jobl, int jobr, int jobv, int l, int r, int i) { public static int number(int jobl, int jobr, int jobk) { int l = 0, r = 100000000, mid, ans = 0; while (l <= r) { - mid = (l + r) >> 1; + mid = (l + r) >> 1; + // mid + 1 名次 > jobk if (small(jobl, jobr, mid + 1, 1, n, 1) + 1 > jobk) { ans = mid; r = mid - 1; diff --git a/src/class160/Code03_SegmentWithBalanced2.java b/src/class160/Code03_SegmentWithBalanced2.java index 569fa0578..2456a85d4 100644 --- a/src/class160/Code03_SegmentWithBalanced2.java +++ b/src/class160/Code03_SegmentWithBalanced2.java @@ -137,9 +137,9 @@ //} // //int innerPost(int num, int i) { -// int kth = innerSmall(num + 1, i); -// if (kth == siz[i]) return INF; -// return innerIndex(kth + 1, i); +// int k = innerSmall(num + 1, i); +// if (k == siz[i]) return INF; +// return innerIndex(k + 1, i); //} // //void innerRemove(int num, int i, int f, int s) { From c6d0bc3899dc1d4ace2171f6217e14ae66a591d8 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 21 Feb 2025 21:36:06 +0800 Subject: [PATCH 0716/2029] modify code --- src/class160/Code04_IndexWithSegment1.java | 59 +++++++++++++--------- src/class160/Code04_IndexWithSegment2.java | 6 +-- 2 files changed, 38 insertions(+), 27 deletions(-) diff --git a/src/class160/Code04_IndexWithSegment1.java b/src/class160/Code04_IndexWithSegment1.java index 7b5eaaf0f..ce330ca11 100644 --- a/src/class160/Code04_IndexWithSegment1.java +++ b/src/class160/Code04_IndexWithSegment1.java @@ -73,6 +73,7 @@ public static int lowbit(int i) { return i & -i; } + // 第jobi小的数字,增加jobv的计数,数字范围l~r,节点编号i,返回头节点编号 public static int innerAdd(int jobi, int jobv, int l, int r, int i) { if (i == 0) { i = ++cntt; @@ -91,76 +92,83 @@ public static int innerAdd(int jobi, int jobv, int l, int r, int i) { return i; } - public static int innerQuery(int jobk, int l, int r) { + // 查询比jobi小的数字个数,数字范围l~r + // 不需要头节点编号,因为有多棵树,所有的头节点记录在addTree、minusTree + public static int innerSmall(int jobi, int l, int r) { if (l == r) { - return l; + return 0; } int mid = (l + r) / 2; - int leftsum = 0; - for (int i = 1; i <= cntadd; i++) { - leftsum += sum[left[addTree[i]]]; - } - for (int i = 1; i <= cntminus; i++) { - leftsum -= sum[left[minusTree[i]]]; - } - if (jobk <= leftsum) { + if (jobi <= mid) { for (int i = 1; i <= cntadd; i++) { addTree[i] = left[addTree[i]]; } for (int i = 1; i <= cntminus; i++) { minusTree[i] = left[minusTree[i]]; } - return innerQuery(jobk, l, mid); + return innerSmall(jobi, l, mid); } else { + int leftsum = 0; for (int i = 1; i <= cntadd; i++) { + leftsum += sum[left[addTree[i]]]; addTree[i] = right[addTree[i]]; } for (int i = 1; i <= cntminus; i++) { + leftsum -= sum[left[minusTree[i]]]; minusTree[i] = right[minusTree[i]]; } - return innerQuery(jobk - leftsum, mid + 1, r); + return leftsum + innerSmall(jobi, mid + 1, r); } } - public static int innerSmall(int jobi, int l, int r) { + // 查询第jobk小的数字,数字范围l~r + // 不需要头节点编号,因为有多棵树,所有的头节点记录在addTree、minusTree + public static int innerQuery(int jobk, int l, int r) { if (l == r) { - return 0; + return l; } int mid = (l + r) / 2; - if (jobi <= mid) { + int leftsum = 0; + for (int i = 1; i <= cntadd; i++) { + leftsum += sum[left[addTree[i]]]; + } + for (int i = 1; i <= cntminus; i++) { + leftsum -= sum[left[minusTree[i]]]; + } + if (jobk <= leftsum) { for (int i = 1; i <= cntadd; i++) { addTree[i] = left[addTree[i]]; } for (int i = 1; i <= cntminus; i++) { minusTree[i] = left[minusTree[i]]; } - return innerSmall(jobi, l, mid); + return innerQuery(jobk, l, mid); } else { - int leftsum = 0; for (int i = 1; i <= cntadd; i++) { - leftsum += sum[left[addTree[i]]]; addTree[i] = right[addTree[i]]; } for (int i = 1; i <= cntminus; i++) { - leftsum -= sum[left[minusTree[i]]]; minusTree[i] = right[minusTree[i]]; } - return leftsum + innerSmall(jobi, mid + 1, r); + return innerQuery(jobk - leftsum, mid + 1, r); } } + // arr中i下标的数字,增加cnt的计数 public static void add(int i, int cnt) { for (int j = i; j <= n; j += lowbit(j)) { root[j] = innerAdd(arr[i], cnt, 1, s, root[j]); } } + // arr中i下标的数字,改成v public static void update(int i, int v) { add(i, -1); arr[i] = kth(v); add(i, 1); } + // arr[l..r]范围上,比v小的数字个数 public static int small(int l, int r, int v) { cntadd = cntminus = 0; for (int i = r; i > 0; i -= lowbit(i)) { @@ -172,6 +180,7 @@ public static int small(int l, int r, int v) { return innerSmall(v, 1, s); } + // arr[l..r]范围上,查询第k小的数字是什么 public static int number(int l, int r, int k) { cntadd = cntminus = 0; for (int i = r; i > 0; i -= lowbit(i)) { @@ -183,6 +192,7 @@ public static int number(int l, int r, int k) { return sorted[innerQuery(k, 1, s)]; } + // arr[l..r]范围上,查询v的前驱 public static int pre(int l, int r, int v) { int rank = small(l, r, v) + 1; if (rank == 1) { @@ -191,15 +201,16 @@ public static int pre(int l, int r, int v) { return number(l, r, rank - 1); } + // arr[l..r]范围上,查询v的后继 public static int post(int l, int r, int v) { if (v == s) { return INF; } - int rank = small(l, r, v + 1) + 1; - if (rank == r - l + 2) { + int sml = small(l, r, v + 1); + if (sml == r - l + 1) { return INF; } - return number(l, r, rank); + return number(l, r, sml + 1); } public static void prepare() { @@ -224,7 +235,7 @@ public static void prepare() { s = len; for (int i = 1; i <= n; i++) { arr[i] = kth(arr[i]); - add(i, 1); + add(i, 1); // arr中i位置的数字,增加1个词频 } } diff --git a/src/class160/Code04_IndexWithSegment2.java b/src/class160/Code04_IndexWithSegment2.java index a9a4b7589..3f0e9ac5d 100644 --- a/src/class160/Code04_IndexWithSegment2.java +++ b/src/class160/Code04_IndexWithSegment2.java @@ -175,11 +175,11 @@ // if (v == s) { // return INF; // } -// int rank = small(l, r, v + 1) + 1; -// if (rank == r - l + 2) { +// int sml = small(l, r, v + 1); +// if (sml == r - l + 1) { // return INF; // } -// return number(l, r, rank); +// return number(l, r, sml + 1); //} // //void prepare() { From 8f5bbfbf1bbc63433023076530eec6c85cc36f08 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 21 Feb 2025 21:46:01 +0800 Subject: [PATCH 0717/2029] modify code --- src/class160/Code06_LineUp1.java | 12 ++++++------ src/class160/Code06_LineUp2.java | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/class160/Code06_LineUp1.java b/src/class160/Code06_LineUp1.java index a78d7579e..c93829c03 100644 --- a/src/class160/Code06_LineUp1.java +++ b/src/class160/Code06_LineUp1.java @@ -100,7 +100,7 @@ public static int innerQuery(int jobl, int jobr, int l, int r, int i) { return ans; } - public static void insert(int i, int v) { + public static void add(int i, int v) { for (int j = i; j <= n; j += lowbit(j)) { root[j] = innerAdd(arr[i], v, 1, s, root[j]); } @@ -134,7 +134,7 @@ public static void prepare() { s = len; for (int i = 1; i <= n; i++) { arr[i] = kth(arr[i]); - insert(i, 1); + add(i, 1); } } @@ -148,13 +148,13 @@ public static void compute(int a, int b) { } else if (arr[a] > arr[b]) { ans--; } - insert(a, -1); - insert(b, -1); + add(a, -1); + add(b, -1); int tmp = arr[a]; arr[a] = arr[b]; arr[b] = tmp; - insert(a, 1); - insert(b, 1); + add(a, 1); + add(b, 1); } public static void main(String[] args) throws IOException { diff --git a/src/class160/Code06_LineUp2.java b/src/class160/Code06_LineUp2.java index e52766dab..0ab753045 100644 --- a/src/class160/Code06_LineUp2.java +++ b/src/class160/Code06_LineUp2.java @@ -74,7 +74,7 @@ // return ans; //} // -//void insert(int i, int v) { +//void add(int i, int v) { // for (int j = i; j <= n; j += lowbit(j)) { // root[j] = innerAdd(arr[i], v, 1, s, root[j]); // } @@ -104,7 +104,7 @@ // s = len; // for (int i = 1; i <= n; i++) { // arr[i] = kth(arr[i]); -// insert(i, 1); +// add(i, 1); // } //} // @@ -115,11 +115,11 @@ // ans += query(a + 1, b - 1, 1, arr[b] - 1); // if (arr[a] < arr[b]) ans++; // else if (arr[a] > arr[b]) ans--; -// insert(a, -1); -// insert(b, -1); +// add(a, -1); +// add(b, -1); // swap(arr[a], arr[b]); -// insert(a, 1); -// insert(b, 1); +// add(a, 1); +// add(b, 1); //} // //int main() { From 392c33e2241c1fbb8615d6b9833e05680d15d06c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 21 Feb 2025 23:02:35 +0800 Subject: [PATCH 0718/2029] modify code --- src/class160/Code06_LineUp1.java | 45 ++++++++++++++++++-------------- src/class160/Code06_LineUp2.java | 28 ++++++++++---------- 2 files changed, 40 insertions(+), 33 deletions(-) diff --git a/src/class160/Code06_LineUp1.java b/src/class160/Code06_LineUp1.java index c93829c03..6840e0be8 100644 --- a/src/class160/Code06_LineUp1.java +++ b/src/class160/Code06_LineUp1.java @@ -64,6 +64,7 @@ public static int lowbit(int i) { return i & -i; } + // 线段树单点修改,jobi这个数字词频增加jobv public static int innerAdd(int jobi, int jobv, int l, int r, int i) { if (i == 0) { i = ++cnt; @@ -82,6 +83,8 @@ public static int innerAdd(int jobi, int jobv, int l, int r, int i) { return i; } + // 查询的数字范围[jobl...jobr],线段树的数字范围[l..r],节点编号i + // 返回有多少词频 public static int innerQuery(int jobl, int jobr, int l, int r, int i) { if (i == 0) { return 0; @@ -100,12 +103,14 @@ public static int innerQuery(int jobl, int jobr, int l, int r, int i) { return ans; } + // arr的i位置的数字,词频增加v public static void add(int i, int v) { for (int j = i; j <= n; j += lowbit(j)) { root[j] = innerAdd(arr[i], v, 1, s, root[j]); } } + // arr[al..ar]范围上,有多少数字在[numl..numr]范围上 public static int query(int al, int ar, int numl, int numr) { int ans = 0; for (int i = ar; i > 0; i -= lowbit(i)) { @@ -117,6 +122,27 @@ public static int query(int al, int ar, int numl, int numr) { return ans; } + // 交换a和b位置的数字,保证a在前,b在后 + // 修正好逆序对的数量ans + public static void compute(int a, int b) { + ans -= query(a + 1, b - 1, 1, arr[a] - 1); + ans += query(a + 1, b - 1, arr[a] + 1, s); + ans -= query(a + 1, b - 1, arr[b] + 1, s); + ans += query(a + 1, b - 1, 1, arr[b] - 1); + if (arr[a] < arr[b]) { + ans++; + } else if (arr[a] > arr[b]) { + ans--; + } + add(a, -1); + add(b, -1); + int tmp = arr[a]; + arr[a] = arr[b]; + arr[b] = tmp; + add(a, 1); + add(b, 1); + } + public static void prepare() { s = 0; for (int i = 1; i <= n; i++) { @@ -138,25 +164,6 @@ public static void prepare() { } } - public static void compute(int a, int b) { - ans -= query(a + 1, b - 1, 1, arr[a] - 1); - ans += query(a + 1, b - 1, arr[a] + 1, s); - ans -= query(a + 1, b - 1, arr[b] + 1, s); - ans += query(a + 1, b - 1, 1, arr[b] - 1); - if (arr[a] < arr[b]) { - ans++; - } else if (arr[a] > arr[b]) { - ans--; - } - add(a, -1); - add(b, -1); - int tmp = arr[a]; - arr[a] = arr[b]; - arr[b] = tmp; - add(a, 1); - add(b, 1); - } - public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StreamTokenizer in = new StreamTokenizer(br); diff --git a/src/class160/Code06_LineUp2.java b/src/class160/Code06_LineUp2.java index 0ab753045..686211baa 100644 --- a/src/class160/Code06_LineUp2.java +++ b/src/class160/Code06_LineUp2.java @@ -91,6 +91,20 @@ // return ans; //} // +//void compute(int a, int b) { +// ans -= query(a + 1, b - 1, 1, arr[a] - 1); +// ans += query(a + 1, b - 1, arr[a] + 1, s); +// ans -= query(a + 1, b - 1, arr[b] + 1, s); +// ans += query(a + 1, b - 1, 1, arr[b] - 1); +// if (arr[a] < arr[b]) ans++; +// else if (arr[a] > arr[b]) ans--; +// add(a, -1); +// add(b, -1); +// swap(arr[a], arr[b]); +// add(a, 1); +// add(b, 1); +//} +// //void prepare() { // s = 0; // for (int i = 1; i <= n; i++) sorted[++s] = arr[i]; @@ -108,20 +122,6 @@ // } //} // -//void compute(int a, int b) { -// ans -= query(a + 1, b - 1, 1, arr[a] - 1); -// ans += query(a + 1, b - 1, arr[a] + 1, s); -// ans -= query(a + 1, b - 1, arr[b] + 1, s); -// ans += query(a + 1, b - 1, 1, arr[b] - 1); -// if (arr[a] < arr[b]) ans++; -// else if (arr[a] > arr[b]) ans--; -// add(a, -1); -// add(b, -1); -// swap(arr[a], arr[b]); -// add(a, 1); -// add(b, 1); -//} -// //int main() { // ios::sync_with_stdio(false); // cin.tie(nullptr); From b7113495feedd78d6469754b197db34497c78e24 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 22 Feb 2025 00:16:42 +0800 Subject: [PATCH 0719/2029] modify code --- ...70\345\205\263\351\242\230\347\233\256.pptx" | Bin 0 -> 52122 bytes src/class160/Code07_NetworkManagement1.java | 7 ++++--- src/class160/Code07_NetworkManagement2.java | 4 ++-- 3 files changed, 6 insertions(+), 5 deletions(-) create mode 100644 "ppt/\347\256\227\346\263\225\350\256\262\350\247\243160\343\200\220\346\214\272\351\232\276\343\200\221\346\240\221\345\245\227\346\240\221\347\232\204\345\216\237\347\220\206\343\200\201\344\274\230\345\214\226\343\200\201\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\243160\343\200\220\346\214\272\351\232\276\343\200\221\346\240\221\345\245\227\346\240\221\347\232\204\345\216\237\347\220\206\343\200\201\344\274\230\345\214\226\343\200\201\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\243160\343\200\220\346\214\272\351\232\276\343\200\221\346\240\221\345\245\227\346\240\221\347\232\204\345\216\237\347\220\206\343\200\201\344\274\230\345\214\226\343\200\201\347\233\270\345\205\263\351\242\230\347\233\256.pptx" new file mode 100644 index 0000000000000000000000000000000000000000..d3ea4445694fe7be19e66f42b37c90030faf783f GIT binary patch literal 52122 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 K6C`zK-~JD@apATA literal 0 HcmV?d00001 diff --git a/src/class160/Code07_NetworkManagement1.java b/src/class160/Code07_NetworkManagement1.java index 868f32f8c..0e0a9199f 100644 --- a/src/class160/Code07_NetworkManagement1.java +++ b/src/class160/Code07_NetworkManagement1.java @@ -44,7 +44,7 @@ public class Code07_NetworkManagement1 { public static int cntg = 0; - // 注意这不是主席树!而是若干棵动态开点权值线段树! + // 外层的树状数组 public static int[] root = new int[MAXN]; public static int[] left = new int[MAXT]; @@ -245,9 +245,10 @@ public static int innerQuery(int jobk, int l, int r) { } } - public static void add(int i, int kth, int val) { + // i是dfn序号,val这是值,增加cnt的计数 + public static void add(int i, int val, int cnt) { for (; i <= n; i += lowbit(i)) { - root[i] = innerAdd(kth, val, 1, s, root[i]); + root[i] = innerAdd(val, cnt, 1, s, root[i]); } } diff --git a/src/class160/Code07_NetworkManagement2.java b/src/class160/Code07_NetworkManagement2.java index 540f3b2d8..b29cb49dd 100644 --- a/src/class160/Code07_NetworkManagement2.java +++ b/src/class160/Code07_NetworkManagement2.java @@ -145,9 +145,9 @@ // } //} // -//void add(int i, int kth, int val) { +//void add(int i, int val, int cnt) { // for (; i <= n; i += lowbit(i)) { -// root[i] = innerAdd(kth, val, 1, s, root[i]); +// root[i] = innerAdd(val, cnt, 1, s, root[i]); // } //} // From 64cd35fd605e89c4fc55cb0495c0c37db224f655 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 25 Feb 2025 11:59:15 +0800 Subject: [PATCH 0720/2029] modify code --- src/class090/Code03_MeetingMonopoly1.java | 20 +++++++++++++++++++- src/class090/Code03_MeetingMonopoly2.java | 2 +- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/class090/Code03_MeetingMonopoly1.java b/src/class090/Code03_MeetingMonopoly1.java index 657936105..018220812 100644 --- a/src/class090/Code03_MeetingMonopoly1.java +++ b/src/class090/Code03_MeetingMonopoly1.java @@ -6,9 +6,27 @@ // 给定若干会议的开始、结束时间 // 你参加某个会议的期间,不能参加其他会议 // 返回你能参加的最大会议数量 -// 来自真实大厂笔试,没有在线测试,对数器验证 +// 同学找到了Leetcode的在线测试,题意类似 +// 测试链接 :https://leetcode.cn/problems/non-overlapping-intervals/ public class Code03_MeetingMonopoly1 { + // 测试链接 :https://leetcode.cn/problems/non-overlapping-intervals/ + // 测试链接中,问至少删除多少会议,可以让剩下的会议都不重合 + // 那么求出,最多能不重合的参加多少会议,然后 n - 这个数量,就是答案 + // 同时注意,测试链接中,会议的时间点范围[- 5 * 10 ^ 4 ~ + 5 * 10 ^ 4] + public static int eraseOverlapIntervals(int[][] meeting) { + Arrays.sort(meeting, (a, b) -> a[1] - b[1]); + int n = meeting.length; + int ans = 0; + for (int i = 0, cur = -50001; i < n; i++) { + if (cur <= meeting[i][0]) { + ans++; + cur = meeting[i][1]; + } + } + return n - ans; + } + // 暴力方法 // 为了验证 // 时间复杂度O(n!) diff --git a/src/class090/Code03_MeetingMonopoly2.java b/src/class090/Code03_MeetingMonopoly2.java index 19cc23f0c..107c36ca4 100644 --- a/src/class090/Code03_MeetingMonopoly2.java +++ b/src/class090/Code03_MeetingMonopoly2.java @@ -1,6 +1,6 @@ package class090; -// 同学找到了在线测试,看似是题目3,其实不是 +// 同学找到了洛谷的在线测试,看似是题目3,其实不是 // 区别在于数据量,如下测试链接中的题目 // 会议的数量10^6,会议的开始、结束时间也是10^6 // 排序会超时,C++的同学可能不会,但是java的同学会 From ec85e539ccdec082ede420aa1d890a81d12d40b1 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 25 Feb 2025 12:03:23 +0800 Subject: [PATCH 0721/2029] modify code --- src/class090/Code03_MeetingMonopoly1.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/class090/Code03_MeetingMonopoly1.java b/src/class090/Code03_MeetingMonopoly1.java index 018220812..b091494d8 100644 --- a/src/class090/Code03_MeetingMonopoly1.java +++ b/src/class090/Code03_MeetingMonopoly1.java @@ -14,16 +14,19 @@ public class Code03_MeetingMonopoly1 { // 测试链接中,问至少删除多少会议,可以让剩下的会议都不重合 // 那么求出,最多能不重合的参加多少会议,然后 n - 这个数量,就是答案 // 同时注意,测试链接中,会议的时间点范围[- 5 * 10 ^ 4 ~ + 5 * 10 ^ 4] + // 其实就是课上讲的方法,稍微改动一下即可,改动的地方已经加上注释 public static int eraseOverlapIntervals(int[][] meeting) { Arrays.sort(meeting, (a, b) -> a[1] - b[1]); int n = meeting.length; int ans = 0; + // cur初始设置为-50001,因为题目数据状况如此 for (int i = 0, cur = -50001; i < n; i++) { if (cur <= meeting[i][0]) { ans++; cur = meeting[i][1]; } } + // 会议总数 - 参加的最大会议数量 return n - ans; } From b9d6f4f2a7411f81a5c11d1df1a6b80004b92a79 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 25 Feb 2025 17:05:20 +0800 Subject: [PATCH 0722/2029] modify code --- .../Code01_HeavyLightDecompositionLCA1.java | 201 ++++++++++++++++++ .../Code01_HeavyLightDecompositionLCA2.java | 92 ++++++++ 2 files changed, 293 insertions(+) create mode 100644 src/class161/Code01_HeavyLightDecompositionLCA1.java create mode 100644 src/class161/Code01_HeavyLightDecompositionLCA2.java diff --git a/src/class161/Code01_HeavyLightDecompositionLCA1.java b/src/class161/Code01_HeavyLightDecompositionLCA1.java new file mode 100644 index 000000000..64940589d --- /dev/null +++ b/src/class161/Code01_HeavyLightDecompositionLCA1.java @@ -0,0 +1,201 @@ +package class161; + +// 树链剖分解决LCA查询,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P3379 +// 提交以下的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 Code01_HeavyLightDecompositionLCA1 { + + public static int MAXN = 500001; + + public static int n, m, root; + + 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 cnt; + + 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 void addEdge(int u, int v) { + next[++cnt] = head[u]; + to[cnt] = v; + head[u] = cnt; + } + + // 递归版,C++可以通过,java会爆栈 + 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; + } + } + } + } + + // 递归版,C++可以通过,java会爆栈 + public static void dfs2(int u, int t) { + top[u] = t; + for (int e = head[u], v; e > 0; e = next[e]) { + v = to[e]; + if (v != fa[u]) { + if (v == son[u]) { + dfs2(v, t); + } else { + 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(root, 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(root, root, -1); + while (stacksize > 0) { + pop(); + if (edge == -1) { + top[first] = second; + edge = head[first]; + } else { + edge = next[edge]; + } + if (edge != 0) { + push(first, second, edge); + if (to[edge] != fa[first]) { + if (to[edge] == son[first]) { + push(to[edge], second, -1); + } else { + 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]]) { + a = fa[top[a]]; + } else { + b = fa[top[b]]; + } + } + return dep[a] <= dep[b] ? a : b; + } + + 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; + in.nextToken(); + root = (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); + } + dfs3(); // dfs3() 等同于 dfs1(root, 0),调用迭代版防止爆栈 + dfs4(); // dfs4() 等同于 dfs2(root, root),调用迭代版防止爆栈 + for (int i = 1, a, b; i <= m; i++) { + in.nextToken(); + a = (int) in.nval; + in.nextToken(); + b = (int) in.nval; + out.println(lca(a, b)); + } + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class161/Code01_HeavyLightDecompositionLCA2.java b/src/class161/Code01_HeavyLightDecompositionLCA2.java new file mode 100644 index 000000000..fdf55e172 --- /dev/null +++ b/src/class161/Code01_HeavyLightDecompositionLCA2.java @@ -0,0 +1,92 @@ +package class161; + +// 树链剖分解决LCA查询,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P3379 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 500001; +//int n, m, root; +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int cnt; +//int fa[MAXN]; +//int dep[MAXN]; +//int siz[MAXN]; +//int son[MAXN]; +//int top[MAXN]; +// +//void addEdge(int u, int v) { +// nxt[++cnt] = head[u]; +// to[cnt] = v; +// head[u] = cnt; +//} +// +//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 e = head[u], v; e > 0; 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; +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// if (v != fa[u]) { +// if (v == son[u]) { +// dfs2(v, t); +// } else { +// dfs2(v, v); +// } +// } +// } +//} +// +//int lca(int a, int b) { +// while (top[a] != top[b]) { +// if (dep[top[a]] >= dep[top[b]]) { +// a = fa[top[a]]; +// } else { +// b = fa[top[b]]; +// } +// } +// return dep[a] <= dep[b] ? a : b; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m >> root; +// for (int i = 1, u, v; i < n; i++) { +// cin >> u >> v; +// addEdge(u, v); +// addEdge(v, u); +// } +// dfs1(root, 0); +// dfs2(root, root); +// for (int i = 1, a, b; i <= m; i++) { +// cin >> a >> b; +// cout << lca(a, b) << "\n"; +// } +// return 0; +//} \ No newline at end of file From 5c259d9b7c340fe074a847a20e37490e13c87440 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 25 Feb 2025 21:46:14 +0800 Subject: [PATCH 0723/2029] modify code --- .../Code01_HeavyLightDecompositionLCA1.java | 39 +- .../Code01_HeavyLightDecompositionLCA2.java | 20 +- src/class161/Code02_HLD1.java | 341 ++++++++++++++++++ src/class161/Code02_HLD2.java | 209 +++++++++++ 4 files changed, 581 insertions(+), 28 deletions(-) create mode 100644 src/class161/Code02_HLD1.java create mode 100644 src/class161/Code02_HLD2.java diff --git a/src/class161/Code01_HeavyLightDecompositionLCA1.java b/src/class161/Code01_HeavyLightDecompositionLCA1.java index 64940589d..6ff87e69f 100644 --- a/src/class161/Code01_HeavyLightDecompositionLCA1.java +++ b/src/class161/Code01_HeavyLightDecompositionLCA1.java @@ -23,7 +23,7 @@ public class Code01_HeavyLightDecompositionLCA1 { public static int[] to = new int[MAXN << 1]; - public static int cnt; + public static int cnt = 0; public static int[] fa = new int[MAXN]; @@ -66,14 +66,14 @@ public static void dfs1(int u, int f) { // 递归版,C++可以通过,java会爆栈 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]) { - if (v == son[u]) { - dfs2(v, t); - } else { - dfs2(v, v); - } + if (v != fa[u] && v != son[u]) { + dfs2(v, v); } } } @@ -136,20 +136,23 @@ public static void dfs4() { push(root, root, -1); while (stacksize > 0) { pop(); - if (edge == -1) { + if (edge == -1) { // 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 == -2,表示处理完当前节点的重儿子,回到了当前节点 edge = head[first]; - } else { + } else { // edge >= 0, 继续处理其他的边 edge = next[edge]; } if (edge != 0) { push(first, second, edge); - if (to[edge] != fa[first]) { - if (to[edge] == son[first]) { - push(to[edge], second, -1); - } else { - push(to[edge], to[edge], -1); - } + if (to[edge] != fa[first] && to[edge] != son[first]) { + push(to[edge], to[edge], -1); } } } @@ -157,10 +160,10 @@ public static void dfs4() { public static int lca(int a, int b) { while (top[a] != top[b]) { - if (dep[top[a]] >= dep[top[b]]) { - a = fa[top[a]]; - } else { + if (dep[top[a]] <= dep[top[b]]) { b = fa[top[b]]; + } else { + a = fa[top[a]]; } } return dep[a] <= dep[b] ? a : b; diff --git a/src/class161/Code01_HeavyLightDecompositionLCA2.java b/src/class161/Code01_HeavyLightDecompositionLCA2.java index fdf55e172..033ccc8d0 100644 --- a/src/class161/Code01_HeavyLightDecompositionLCA2.java +++ b/src/class161/Code01_HeavyLightDecompositionLCA2.java @@ -14,7 +14,7 @@ //int head[MAXN]; //int nxt[MAXN << 1]; //int to[MAXN << 1]; -//int cnt; +//int cnt = 0; //int fa[MAXN]; //int dep[MAXN]; //int siz[MAXN]; @@ -50,24 +50,24 @@ // //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]) { -// if (v == son[u]) { -// dfs2(v, t); -// } else { -// dfs2(v, v); -// } +// 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]]) { -// a = fa[top[a]]; -// } else { +// if (dep[top[a]] <= dep[top[b]]) { // b = fa[top[b]]; +// } else { +// a = fa[top[a]]; // } // } // return dep[a] <= dep[b] ? a : b; diff --git a/src/class161/Code02_HLD1.java b/src/class161/Code02_HLD1.java new file mode 100644 index 000000000..8511af74b --- /dev/null +++ b/src/class161/Code02_HLD1.java @@ -0,0 +1,341 @@ +package class161; + +// 树链剖分模版题,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P3384 +// 提交以下的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 Code02_HLD1 { + + public static int MAXN = 100001; + + public static int n, m, root, MOD; + + 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 long[] sum = new long[MAXN << 2]; + + public static long[] addTag = new long[MAXN << 2]; + + 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 void addEdge(int u, int v) { + next[++cntg] = head[u]; + to[cntg] = v; + head[u] = cntg; + } + + public static void up(int i) { + sum[i] = (sum[i << 1] + sum[i << 1 | 1]) % MOD; + } + + public static void lazy(int i, long v, int n) { + sum[i] = (sum[i] + v * n) % MOD; + addTag[i] = (addTag[i] + v) % MOD; + } + + public static void down(int i, int ln, int rn) { + if (addTag[i] != 0) { + lazy(i << 1, addTag[i], ln); + lazy(i << 1 | 1, addTag[i], rn); + addTag[i] = 0; + } + } + + public static void build(int l, int r, int i) { + if (l == r) { + sum[i] = val[l] % MOD; + } else { + int mid = (l + r) / 2; + build(l, mid, i << 1); + build(mid + 1, r, i << 1 | 1); + up(i); + } + } + + public static void add(int jobl, int jobr, int jobv, int l, int r, int i) { + if (jobl <= l && r <= jobr) { + lazy(i, jobv, r - l + 1); + } else { + int mid = (l + r) / 2; + down(i, mid - l + 1, r - mid); + if (jobl <= mid) { + add(jobl, jobr, jobv, l, mid, i << 1); + } + if (jobr > mid) { + add(jobl, jobr, jobv, mid + 1, r, i << 1 | 1); + } + up(i); + } + } + + public static long query(int jobl, int jobr, int l, int r, int i) { + if (jobl <= l && r <= jobr) { + return sum[i]; + } + int mid = (l + r) / 2; + down(i, mid - l + 1, r - mid); + long ans = 0; + if (jobl <= mid) { + ans = (ans + query(jobl, jobr, l, mid, i << 1)) % MOD; + } + if (jobr > mid) { + ans = (ans + query(jobl, jobr, mid + 1, r, i << 1 | 1)) % MOD; + } + return ans; + } + + // 递归版,C++可以通过,java会爆栈 + 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; + } + } + } + } + + // 递归版,C++可以通过,java会爆栈 + 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(root, 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(root, root, -1); + while (stacksize > 0) { + pop(); + if (edge == -1) { // 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 == -2,表示处理完当前节点的重儿子,回到了当前节点 + edge = head[first]; + } else { // edge >= 0, 继续处理其他的边 + 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 pathAdd(int x, int y, int v) { + while (top[x] != top[y]) { + if (dep[top[x]] <= dep[top[y]]) { + add(dfn[top[y]], dfn[y], v, 1, n, 1); + y = fa[top[y]]; + } else { + add(dfn[top[x]], dfn[x], v, 1, n, 1); + x = fa[top[x]]; + } + } + if (dep[x] <= dep[y]) { + add(dfn[x], dfn[y], v, 1, n, 1); + } else { + add(dfn[y], dfn[x], v, 1, n, 1); + } + } + + public static void subtreeAdd(int x, int v) { + add(dfn[x], dfn[x] + siz[x] - 1, v, 1, n, 1); + } + + public static long pathSum(int x, int y) { + long ans = 0; + while (top[x] != top[y]) { + if (dep[top[x]] <= dep[top[y]]) { + ans = (ans + query(dfn[top[y]], dfn[y], 1, n, 1)) % MOD; + y = fa[top[y]]; + } else { + ans = (ans + query(dfn[top[x]], dfn[x], 1, n, 1)) % MOD; + x = fa[top[x]]; + } + } + if (dep[x] <= dep[y]) { + ans = (ans + query(dfn[x], dfn[y], 1, n, 1)) % MOD; + } else { + ans = (ans + query(dfn[y], dfn[x], 1, n, 1)) % MOD; + } + return ans; + } + + public static long subtreeSum(int x) { + return query(dfn[x], dfn[x] + siz[x] - 1, 1, n, 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)); + in.nextToken(); + n = (int) in.nval; + in.nextToken(); + m = (int) in.nval; + in.nextToken(); + root = (int) in.nval; + in.nextToken(); + MOD = (int) in.nval; + for (int i = 1; i <= n; i++) { + in.nextToken(); + arr[i] = (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); + } + dfs3(); // dfs3() 等同于 dfs1(root, 0),调用迭代版防止爆栈 + dfs4(); // dfs4() 等同于 dfs2(root, root),调用迭代版防止爆栈 + build(1, n, 1); + for (int i = 1, op, x, y, z; i <= m; i++) { + in.nextToken(); + op = (int) in.nval; + if (op == 1) { + in.nextToken(); + x = (int) in.nval; + in.nextToken(); + y = (int) in.nval; + in.nextToken(); + z = (int) in.nval; + pathAdd(x, y, z); + } else if (op == 2) { + in.nextToken(); + x = (int) in.nval; + in.nextToken(); + y = (int) in.nval; + out.println(pathSum(x, y)); + } else if (op == 3) { + in.nextToken(); + x = (int) in.nval; + in.nextToken(); + y = (int) in.nval; + subtreeAdd(x, y); + } else { + in.nextToken(); + x = (int) in.nval; + out.println(subtreeSum(x)); + } + } + out.flush(); + out.close(); + br.close(); + } +} \ No newline at end of file diff --git a/src/class161/Code02_HLD2.java b/src/class161/Code02_HLD2.java new file mode 100644 index 000000000..a03f012d4 --- /dev/null +++ b/src/class161/Code02_HLD2.java @@ -0,0 +1,209 @@ +package class161; + +// 树链剖分模版题,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P3384 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +//int n, m, root, MOD; +//int arr[MAXN]; +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int cntg = 0; +//long long sum[MAXN << 2]; +//long long addTag[MAXN << 2]; +//int fa[MAXN]; +//int dep[MAXN]; +//int siz[MAXN]; +//int son[MAXN]; +//int top[MAXN]; +//int dfn[MAXN]; +//int val[MAXN]; +//int cntd = 0; +// +//void addEdge(int u, int v) { +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// head[u] = cntg; +//} +// +//void up(int i) { +// sum[i] = (sum[i << 1] + sum[i << 1 | 1]) % MOD; +//} +// +//void lazy(int i, long long v, int n) { +// sum[i] = (sum[i] + v * n) % MOD; +// addTag[i] = (addTag[i] + v) % MOD; +//} +// +//void down(int i, int ln, int rn) { +// if (addTag[i] != 0) { +// lazy(i << 1, addTag[i], ln); +// lazy(i << 1 | 1, addTag[i], rn); +// addTag[i] = 0; +// } +//} +// +//void build(int l, int r, int i) { +// if (l == r) { +// sum[i] = val[l] % MOD; +// } else { +// int mid = (l + r) / 2; +// build(l, mid, i << 1); +// build(mid + 1, r, i << 1 | 1); +// up(i); +// } +//} +// +//void add(int jobl, int jobr, int jobv, int l, int r, int i) { +// if (jobl <= l && r <= jobr) { +// lazy(i, jobv, r - l + 1); +// } else { +// int mid = (l + r) / 2; +// down(i, mid - l + 1, r - mid); +// if (jobl <= mid) { +// add(jobl, jobr, jobv, l, mid, i << 1); +// } +// if (jobr > mid) { +// add(jobl, jobr, jobv, mid + 1, r, i << 1 | 1); +// } +// up(i); +// } +//} +// +//long long query(int jobl, int jobr, int l, int r, int i) { +// if (jobl <= l && r <= jobr) { +// return sum[i]; +// } +// int mid = (l + r) / 2; +// down(i, mid - l + 1, r - mid); +// long long ans = 0; +// if (jobl <= mid) { +// ans = (ans + query(jobl, jobr, l, mid, i << 1)) % MOD; +// } +// if (jobr > mid) { +// ans = (ans + query(jobl, jobr, mid + 1, r, i << 1 | 1)) % MOD; +// } +// return ans; +//} +// +//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 e = head[u], v; e > 0; 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; +// 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 = nxt[e]) { +// v = to[e]; +// if (v != fa[u] && v != son[u]) { +// dfs2(v, v); +// } +// } +//} +// +//void pathAdd(int x, int y, int v) { +// while (top[x] != top[y]) { +// if (dep[top[x]] <= dep[top[y]]) { +// add(dfn[top[y]], dfn[y], v, 1, n, 1); +// y = fa[top[y]]; +// } else { +// add(dfn[top[x]], dfn[x], v, 1, n, 1); +// x = fa[top[x]]; +// } +// } +// if (dep[x] <= dep[y]) { +// add(dfn[x], dfn[y], v, 1, n, 1); +// } else { +// add(dfn[y], dfn[x], v, 1, n, 1); +// } +//} +// +//void subtreeAdd(int x, int v) { +// add(dfn[x], dfn[x] + siz[x] - 1, v, 1, n, 1); +//} +// +//long long pathSum(int x, int y) { +// long long ans = 0; +// while (top[x] != top[y]) { +// if (dep[top[x]] <= dep[top[y]]) { +// ans = (ans + query(dfn[top[y]], dfn[y], 1, n, 1)) % MOD; +// y = fa[top[y]]; +// } else { +// ans = (ans + query(dfn[top[x]], dfn[x], 1, n, 1)) % MOD; +// x = fa[top[x]]; +// } +// } +// if (dep[x] <= dep[y]) { +// ans = (ans + query(dfn[x], dfn[y], 1, n, 1)) % MOD; +// } else { +// ans = (ans + query(dfn[y], dfn[x], 1, n, 1)) % MOD; +// } +// return ans; +//} +// +//long long subtreeSum(int x) { +// return query(dfn[x], dfn[x] + siz[x] - 1, 1, n, 1); +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m >> root >> MOD; +// 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(root, 0); +// dfs2(root, root); +// build(1, n, 1); +// for (int i = 1, op, x, y, z; i <= m; i++) { +// cin >> op; +// if (op == 1) { +// cin >> x >> y >> z; +// pathAdd(x, y, z); +// } else if (op == 2) { +// cin >> x >> y; +// cout << pathSum(x, y) << "\n"; +// } else if (op == 3) { +// cin >> x >> y; +// subtreeAdd(x, y); +// } else { +// cin >> x; +// cout << subtreeSum(x) << "\n"; +// } +// } +// return 0; +//} \ No newline at end of file From 103a07b9a300d5dae9899336240f2e6ebed3116c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 26 Feb 2025 14:46:23 +0800 Subject: [PATCH 0724/2029] modify code --- ...java => Code02_PathSumAndSubtreeSum1.java} | 24 +- ...java => Code02_PathSumAndSubtreeSum2.java} | 20 +- src/class161/Code03_PathMaxAndPathSum1.java | 351 ++++++++++++++++++ src/class161/Code03_PathMaxAndPathSum2.java | 191 ++++++++++ 4 files changed, 556 insertions(+), 30 deletions(-) rename src/class161/{Code02_HLD1.java => Code02_PathSumAndSubtreeSum1.java} (94%) rename src/class161/{Code02_HLD2.java => Code02_PathSumAndSubtreeSum2.java} (91%) create mode 100644 src/class161/Code03_PathMaxAndPathSum1.java create mode 100644 src/class161/Code03_PathMaxAndPathSum2.java diff --git a/src/class161/Code02_HLD1.java b/src/class161/Code02_PathSumAndSubtreeSum1.java similarity index 94% rename from src/class161/Code02_HLD1.java rename to src/class161/Code02_PathSumAndSubtreeSum1.java index 8511af74b..93e87d833 100644 --- a/src/class161/Code02_HLD1.java +++ b/src/class161/Code02_PathSumAndSubtreeSum1.java @@ -1,6 +1,6 @@ package class161; -// 树链剖分模版题,java版 +// 路径累加和与子树累加和,java版 // 测试链接 : https://www.luogu.com.cn/problem/P3384 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -11,7 +11,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code02_HLD1 { +public class Code02_PathSumAndSubtreeSum1 { public static int MAXN = 100001; @@ -43,7 +43,7 @@ public class Code02_HLD1 { public static int[] dfn = new int[MAXN]; - public static int[] val = new int[MAXN]; + public static int[] seg = new int[MAXN]; public static int cntd = 0; @@ -72,7 +72,7 @@ public static void down(int i, int ln, int rn) { public static void build(int l, int r, int i) { if (l == r) { - sum[i] = val[l] % MOD; + sum[i] = arr[seg[l]] % MOD; } else { int mid = (l + r) / 2; build(l, mid, i << 1); @@ -139,7 +139,7 @@ public static void dfs1(int u, int f) { public static void dfs2(int u, int t) { top[u] = t; dfn[u] = ++cntd; - val[cntd] = arr[u]; + seg[cntd] = u; if (son[u] == 0) { return; } @@ -213,7 +213,7 @@ public static void dfs4() { if (edge == -1) { // edge == -1,表示第一次来到当前节点,并且先处理重儿子 top[first] = second; dfn[first] = ++cntd; - val[cntd] = arr[first]; + seg[cntd] = first; if (son[first] == 0) { continue; } @@ -244,11 +244,7 @@ public static void pathAdd(int x, int y, int v) { x = fa[top[x]]; } } - if (dep[x] <= dep[y]) { - add(dfn[x], dfn[y], v, 1, n, 1); - } else { - add(dfn[y], dfn[x], v, 1, n, 1); - } + add(Math.min(dfn[x], dfn[y]), Math.max(dfn[x], dfn[y]), v, 1, n, 1); } public static void subtreeAdd(int x, int v) { @@ -266,11 +262,7 @@ public static long pathSum(int x, int y) { x = fa[top[x]]; } } - if (dep[x] <= dep[y]) { - ans = (ans + query(dfn[x], dfn[y], 1, n, 1)) % MOD; - } else { - ans = (ans + query(dfn[y], dfn[x], 1, n, 1)) % MOD; - } + ans = (ans + query(Math.min(dfn[x], dfn[y]), Math.max(dfn[x], dfn[y]), 1, n, 1)) % MOD; return ans; } diff --git a/src/class161/Code02_HLD2.java b/src/class161/Code02_PathSumAndSubtreeSum2.java similarity index 91% rename from src/class161/Code02_HLD2.java rename to src/class161/Code02_PathSumAndSubtreeSum2.java index a03f012d4..5b376299e 100644 --- a/src/class161/Code02_HLD2.java +++ b/src/class161/Code02_PathSumAndSubtreeSum2.java @@ -1,6 +1,6 @@ package class161; -// 树链剖分模版题,C++版 +// 路径累加和与子树累加和,C++版 // 测试链接 : https://www.luogu.com.cn/problem/P3384 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -24,7 +24,7 @@ //int son[MAXN]; //int top[MAXN]; //int dfn[MAXN]; -//int val[MAXN]; +//int seg[MAXN]; //int cntd = 0; // //void addEdge(int u, int v) { @@ -52,7 +52,7 @@ // //void build(int l, int r, int i) { // if (l == r) { -// sum[i] = val[l] % MOD; +// sum[i] = arr[seg[l]] % MOD; // } else { // int mid = (l + r) / 2; // build(l, mid, i << 1); @@ -117,7 +117,7 @@ //void dfs2(int u, int t) { // top[u] = t; // dfn[u] = ++cntd; -// val[cntd] = arr[u]; +// seg[cntd] = u; // if (son[u] == 0) { // return; // } @@ -140,11 +140,7 @@ // x = fa[top[x]]; // } // } -// if (dep[x] <= dep[y]) { -// add(dfn[x], dfn[y], v, 1, n, 1); -// } else { -// add(dfn[y], dfn[x], v, 1, n, 1); -// } +// add(min(dfn[x], dfn[y]), max(dfn[x], dfn[y]), v, 1, n, 1); //} // //void subtreeAdd(int x, int v) { @@ -162,11 +158,7 @@ // x = fa[top[x]]; // } // } -// if (dep[x] <= dep[y]) { -// ans = (ans + query(dfn[x], dfn[y], 1, n, 1)) % MOD; -// } else { -// ans = (ans + query(dfn[y], dfn[x], 1, n, 1)) % MOD; -// } +// ans = (ans + query(min(dfn[x], dfn[y]), max(dfn[x], dfn[y]), 1, n, 1)) % MOD; // return ans; //} // diff --git a/src/class161/Code03_PathMaxAndPathSum1.java b/src/class161/Code03_PathMaxAndPathSum1.java new file mode 100644 index 000000000..4d4111e1e --- /dev/null +++ b/src/class161/Code03_PathMaxAndPathSum1.java @@ -0,0 +1,351 @@ +package class161; + +// 路径最大值与路径累加和,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P2590 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.util.StringTokenizer; + +public class Code03_PathMaxAndPathSum1 { + + public static int MAXN = 30001; + + public static int INF = 10000001; + + public static int n, m; + + 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[] max = new int[MAXN << 2]; + + public static int[] sum = new int[MAXN << 2]; + + 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[] seg = new int[MAXN]; + + public static int cntd = 0; + + public static void addEdge(int u, int v) { + next[++cntg] = head[u]; + to[cntg] = v; + head[u] = cntg; + } + + public static void up(int i) { + sum[i] = sum[i << 1] + sum[i << 1 | 1]; + max[i] = Math.max(max[i << 1], max[i << 1 | 1]); + } + + public static void build(int l, int r, int i) { + if (l == r) { + sum[i] = max[i] = arr[seg[l]]; + } else { + int mid = (l + r) / 2; + build(l, mid, i << 1); + build(mid + 1, r, i << 1 | 1); + up(i); + } + } + + public static void update(int jobi, int jobv, int l, int r, int i) { + if (l == r) { + sum[i] = max[i] = jobv; + } else { + int mid = (l + r) / 2; + if (jobi <= mid) { + update(jobi, jobv, l, mid, i << 1); + } else { + update(jobi, jobv, mid + 1, r, i << 1 | 1); + } + up(i); + } + } + + public static int queryMax(int jobl, int jobr, int l, int r, int i) { + if (jobl <= l && r <= jobr) { + return max[i]; + } + int mid = (l + r) / 2; + int ans = -INF; + if (jobl <= mid) { + ans = Math.max(ans, queryMax(jobl, jobr, l, mid, i << 1)); + } + if (jobr > mid) { + ans = Math.max(ans, queryMax(jobl, jobr, mid + 1, r, i << 1 | 1)); + } + return ans; + } + + public static int querySum(int jobl, int jobr, int l, int r, int i) { + if (jobl <= l && r <= jobr) { + return sum[i]; + } + int mid = (l + r) / 2; + int ans = 0; + if (jobl <= mid) { + ans += querySum(jobl, jobr, l, mid, i << 1); + } + if (jobr > mid) { + ans += querySum(jobl, jobr, mid + 1, r, i << 1 | 1); + } + return ans; + } + + // 递归版,C++可以通过,java会爆栈 + 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; + } + } + } + } + + // 递归版,C++可以通过,java会爆栈 + public static void dfs2(int u, int t) { + top[u] = t; + dfn[u] = ++cntd; + seg[cntd] = 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) { // edge == -1,表示第一次来到当前节点,并且先处理重儿子 + top[first] = second; + dfn[first] = ++cntd; + seg[cntd] = first; + if (son[first] == 0) { + continue; + } + push(first, second, -2); + push(son[first], second, -1); + continue; + } else if (edge == -2) { // edge == -2,表示处理完当前节点的重儿子,回到了当前节点 + edge = head[first]; + } else { // edge >= 0, 继续处理其他的边 + 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 pointUpdate(int u, int v) { + update(dfn[u], v, 1, n, 1); + } + + public static int pathMax(int x, int y) { + int ans = -INF; + while (top[x] != top[y]) { + if (dep[top[x]] <= dep[top[y]]) { + ans = Math.max(ans, queryMax(dfn[top[y]], dfn[y], 1, n, 1)); + y = fa[top[y]]; + } else { + ans = Math.max(ans, queryMax(dfn[top[x]], dfn[x], 1, n, 1)); + x = fa[top[x]]; + } + } + ans = Math.max(ans, queryMax(Math.min(dfn[x], dfn[y]), Math.max(dfn[x], dfn[y]), 1, n, 1)); + return ans; + } + + public static int pathSum(int x, int y) { + int ans = 0; + while (top[x] != top[y]) { + if (dep[top[x]] <= dep[top[y]]) { + ans += querySum(dfn[top[y]], dfn[y], 1, n, 1); + y = fa[top[y]]; + } else { + ans += querySum(dfn[top[x]], dfn[x], 1, n, 1); + x = fa[top[x]]; + } + } + ans += querySum(Math.min(dfn[x], dfn[y]), Math.max(dfn[x], dfn[y]), 1, n, 1); + return ans; + } + + public static void main(String[] args) { + Kattio io = new Kattio(); + n = io.nextInt(); + for (int i = 1, u, v; i < n; i++) { + u = io.nextInt(); + v = io.nextInt(); + addEdge(u, v); + addEdge(v, u); + } + for (int i = 1; i <= n; i++) { + arr[i] = io.nextInt(); + } + dfs3(); // dfs3() 等同于 dfs1(1, 0),调用迭代版防止爆栈 + dfs4(); // dfs4() 等同于 dfs2(1, 1),调用迭代版防止爆栈 + build(1, n, 1); + m = io.nextInt(); + String op; + int x, y; + for (int i = 1; i <= m; i++) { + op = io.next(); + x = io.nextInt(); + y = io.nextInt(); + if (op.equals("CHANGE")) { + pointUpdate(x, y); + } else if (op.equals("QMAX")) { + io.println(pathMax(x, y)); + } else { + io.println(pathSum(x, y)); + } + } + io.flush(); + io.close(); + } + + // 读写工具类 + public static class Kattio extends PrintWriter { + private BufferedReader r; + private StringTokenizer st; + + public Kattio() { + this(System.in, System.out); + } + + public Kattio(InputStream i, OutputStream o) { + super(o); + r = new BufferedReader(new InputStreamReader(i)); + } + + public Kattio(String intput, String output) throws IOException { + super(output); + r = new BufferedReader(new FileReader(intput)); + } + + public String next() { + try { + while (st == null || !st.hasMoreTokens()) + st = new StringTokenizer(r.readLine()); + return st.nextToken(); + } catch (Exception e) { + } + return null; + } + + public int nextInt() { + return Integer.parseInt(next()); + } + + public double nextDouble() { + return Double.parseDouble(next()); + } + + public long nextLong() { + return Long.parseLong(next()); + } + } + +} diff --git a/src/class161/Code03_PathMaxAndPathSum2.java b/src/class161/Code03_PathMaxAndPathSum2.java new file mode 100644 index 000000000..55be327dd --- /dev/null +++ b/src/class161/Code03_PathMaxAndPathSum2.java @@ -0,0 +1,191 @@ +package class161; + +// 路径最大值与路径累加和,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P2590 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 30001; +//const int INF = 10000001; +//int n, m; +//int arr[MAXN]; +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int cntg = 0; +//int maxv[MAXN << 2]; +//int sumv[MAXN << 2]; +//int fa[MAXN]; +//int dep[MAXN]; +//int siz[MAXN]; +//int son[MAXN]; +//int top[MAXN]; +//int dfn[MAXN]; +//int seg[MAXN]; +//int cntd = 0; +// +//void addEdge(int u, int v) { +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// head[u] = cntg; +//} +// +//void up(int i) { +// sumv[i] = sumv[i << 1] + sumv[i << 1 | 1]; +// maxv[i] = max(maxv[i << 1], maxv[i << 1 | 1]); +//} +// +//void build(int l, int r, int i) { +// if (l == r) { +// sumv[i] = maxv[i] = arr[seg[l]]; +// } else { +// int mid = (l + r) / 2; +// build(l, mid, i << 1); +// build(mid + 1, r, i << 1 | 1); +// up(i); +// } +//} +// +//void update(int jobi, int jobv, int l, int r, int i) { +// if (l == r) { +// sumv[i] = maxv[i] = jobv; +// } else { +// int mid = (l + r) / 2; +// if (jobi <= mid) { +// update(jobi, jobv, l, mid, i << 1); +// } else { +// update(jobi, jobv, mid + 1, r, i << 1 | 1); +// } +// up(i); +// } +//} +// +//int queryMax(int jobl, int jobr, int l, int r, int i) { +// if (jobl <= l && r <= jobr) { +// return maxv[i]; +// } +// int mid = (l + r) / 2, ans = -INF; +// if (jobl <= mid) { +// ans = max(ans, queryMax(jobl, jobr, l, mid, i << 1)); +// } +// if (jobr > mid) { +// ans = max(ans, queryMax(jobl, jobr, mid + 1, r, i << 1 | 1)); +// } +// return ans; +//} +// +//int querySum(int jobl, int jobr, int l, int r, int i) { +// if (jobl <= l && r <= jobr) { +// return sumv[i]; +// } +// int mid = (l + r) / 2, ans = 0; +// if (jobl <= mid) { +// ans += querySum(jobl, jobr, l, mid, i << 1); +// } +// if (jobr > mid) { +// ans += querySum(jobl, jobr, mid + 1, r, i << 1 | 1); +// } +// return ans; +//} +// +//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] || siz[son[u]] < siz[v]) { +// son[u] = v; +// } +// } +// } +//} +// +//void dfs2(int u, int t) { +// top[u] = t; +// dfn[u] = ++cntd; +// seg[cntd] = 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 pointUpdate(int u, int v) { +// update(dfn[u], v, 1, n, 1); +//} +// +//int pathMax(int x, int y) { +// int ans = -INF; +// while (top[x] != top[y]) { +// if (dep[top[x]] <= dep[top[y]]) { +// ans = max(ans, queryMax(dfn[top[y]], dfn[y], 1, n, 1)); +// y = fa[top[y]]; +// } else { +// ans = max(ans, queryMax(dfn[top[x]], dfn[x], 1, n, 1)); +// x = fa[top[x]]; +// } +// } +// return max(ans, queryMax(min(dfn[x], dfn[y]), max(dfn[x], dfn[y]), 1, n, 1)); +//} +// +//int pathSum(int x, int y) { +// int ans = 0; +// while (top[x] != top[y]) { +// if (dep[top[x]] <= dep[top[y]]) { +// ans += querySum(dfn[top[y]], dfn[y], 1, n, 1); +// y = fa[top[y]]; +// } else { +// ans += querySum(dfn[top[x]], dfn[x], 1, n, 1); +// x = fa[top[x]]; +// } +// } +// return ans + querySum(min(dfn[x], dfn[y]), max(dfn[x], dfn[y]), 1, n, 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); +// } +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// dfs1(1, 0); +// dfs2(1, 1); +// build(1, n, 1); +// cin >> m; +// string op; +// int x, y; +// while (m--) { +// cin >> op >> x >> y; +// if (op == "CHANGE") { +// pointUpdate(x, y); +// } else if(op == "QMAX") { +// cout << pathMax(x, y) << '\n'; +// } else { +// cout << pathSum(x, y) << '\n'; +// } +// } +// return 0; +//} \ No newline at end of file From 35af843614d9141d9ad706039dcb6813743df314 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 26 Feb 2025 17:33:27 +0800 Subject: [PATCH 0725/2029] modify code --- .../Code02_PathSumAndSubtreeSum1.java | 120 +++---- .../Code02_PathSumAndSubtreeSum2.java | 82 ++--- src/class161/Code03_PathMaxAndPathSum1.java | 120 +++---- src/class161/Code03_PathMaxAndPathSum2.java | 78 ++--- src/class161/Code04_PackageManager1.java | 321 ++++++++++++++++++ src/class161/Code04_PackageManager2.java | 159 +++++++++ 6 files changed, 680 insertions(+), 200 deletions(-) create mode 100644 src/class161/Code04_PackageManager1.java create mode 100644 src/class161/Code04_PackageManager2.java diff --git a/src/class161/Code02_PathSumAndSubtreeSum1.java b/src/class161/Code02_PathSumAndSubtreeSum1.java index 93e87d833..469c2bf9d 100644 --- a/src/class161/Code02_PathSumAndSubtreeSum1.java +++ b/src/class161/Code02_PathSumAndSubtreeSum1.java @@ -53,66 +53,6 @@ public static void addEdge(int u, int v) { head[u] = cntg; } - public static void up(int i) { - sum[i] = (sum[i << 1] + sum[i << 1 | 1]) % MOD; - } - - public static void lazy(int i, long v, int n) { - sum[i] = (sum[i] + v * n) % MOD; - addTag[i] = (addTag[i] + v) % MOD; - } - - public static void down(int i, int ln, int rn) { - if (addTag[i] != 0) { - lazy(i << 1, addTag[i], ln); - lazy(i << 1 | 1, addTag[i], rn); - addTag[i] = 0; - } - } - - public static void build(int l, int r, int i) { - if (l == r) { - sum[i] = arr[seg[l]] % MOD; - } else { - int mid = (l + r) / 2; - build(l, mid, i << 1); - build(mid + 1, r, i << 1 | 1); - up(i); - } - } - - public static void add(int jobl, int jobr, int jobv, int l, int r, int i) { - if (jobl <= l && r <= jobr) { - lazy(i, jobv, r - l + 1); - } else { - int mid = (l + r) / 2; - down(i, mid - l + 1, r - mid); - if (jobl <= mid) { - add(jobl, jobr, jobv, l, mid, i << 1); - } - if (jobr > mid) { - add(jobl, jobr, jobv, mid + 1, r, i << 1 | 1); - } - up(i); - } - } - - public static long query(int jobl, int jobr, int l, int r, int i) { - if (jobl <= l && r <= jobr) { - return sum[i]; - } - int mid = (l + r) / 2; - down(i, mid - l + 1, r - mid); - long ans = 0; - if (jobl <= mid) { - ans = (ans + query(jobl, jobr, l, mid, i << 1)) % MOD; - } - if (jobr > mid) { - ans = (ans + query(jobl, jobr, mid + 1, r, i << 1 | 1)) % MOD; - } - return ans; - } - // 递归版,C++可以通过,java会爆栈 public static void dfs1(int u, int f) { fa[u] = f; @@ -234,6 +174,66 @@ public static void dfs4() { } } + public static void up(int i) { + sum[i] = (sum[i << 1] + sum[i << 1 | 1]) % MOD; + } + + public static void lazy(int i, long v, int n) { + sum[i] = (sum[i] + v * n) % MOD; + addTag[i] = (addTag[i] + v) % MOD; + } + + public static void down(int i, int ln, int rn) { + if (addTag[i] != 0) { + lazy(i << 1, addTag[i], ln); + lazy(i << 1 | 1, addTag[i], rn); + addTag[i] = 0; + } + } + + public static void build(int l, int r, int i) { + if (l == r) { + sum[i] = arr[seg[l]] % MOD; + } else { + int mid = (l + r) / 2; + build(l, mid, i << 1); + build(mid + 1, r, i << 1 | 1); + up(i); + } + } + + public static void add(int jobl, int jobr, int jobv, int l, int r, int i) { + if (jobl <= l && r <= jobr) { + lazy(i, jobv, r - l + 1); + } else { + int mid = (l + r) / 2; + down(i, mid - l + 1, r - mid); + if (jobl <= mid) { + add(jobl, jobr, jobv, l, mid, i << 1); + } + if (jobr > mid) { + add(jobl, jobr, jobv, mid + 1, r, i << 1 | 1); + } + up(i); + } + } + + public static long query(int jobl, int jobr, int l, int r, int i) { + if (jobl <= l && r <= jobr) { + return sum[i]; + } + int mid = (l + r) / 2; + down(i, mid - l + 1, r - mid); + long ans = 0; + if (jobl <= mid) { + ans = (ans + query(jobl, jobr, l, mid, i << 1)) % MOD; + } + if (jobr > mid) { + ans = (ans + query(jobl, jobr, mid + 1, r, i << 1 | 1)) % MOD; + } + return ans; + } + public static void pathAdd(int x, int y, int v) { while (top[x] != top[y]) { if (dep[top[x]] <= dep[top[y]]) { diff --git a/src/class161/Code02_PathSumAndSubtreeSum2.java b/src/class161/Code02_PathSumAndSubtreeSum2.java index 5b376299e..854a9e731 100644 --- a/src/class161/Code02_PathSumAndSubtreeSum2.java +++ b/src/class161/Code02_PathSumAndSubtreeSum2.java @@ -33,6 +33,43 @@ // 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 > 0; e = nxt[e]) { +// v = to[e]; +// if (v != f) { +// dfs1(v, u); +// } +// } +// for (int e = head[u], v; e > 0; 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; +// dfn[u] = ++cntd; +// seg[cntd] = u; +// 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); +// } +// } +//} +// //void up(int i) { // sum[i] = (sum[i << 1] + sum[i << 1 | 1]) % MOD; //} @@ -44,9 +81,9 @@ // //void down(int i, int ln, int rn) { // if (addTag[i] != 0) { -// lazy(i << 1, addTag[i], ln); -// lazy(i << 1 | 1, addTag[i], rn); -// addTag[i] = 0; +// lazy(i << 1, addTag[i], ln); +// lazy(i << 1 | 1, addTag[i], rn); +// addTag[i] = 0; // } //} // @@ -63,7 +100,7 @@ // //void add(int jobl, int jobr, int jobv, int l, int r, int i) { // if (jobl <= l && r <= jobr) { -// lazy(i, jobv, r - l + 1); +// lazy(i, jobv, r - l + 1); // } else { // int mid = (l + r) / 2; // down(i, mid - l + 1, r - mid); @@ -93,43 +130,6 @@ // return ans; //} // -//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 e = head[u], v; e > 0; 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; -// dfn[u] = ++cntd; -// seg[cntd] = u; -// 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); -// } -// } -//} -// //void pathAdd(int x, int y, int v) { // while (top[x] != top[y]) { // if (dep[top[x]] <= dep[top[y]]) { diff --git a/src/class161/Code03_PathMaxAndPathSum1.java b/src/class161/Code03_PathMaxAndPathSum1.java index 4d4111e1e..619697d2c 100644 --- a/src/class161/Code03_PathMaxAndPathSum1.java +++ b/src/class161/Code03_PathMaxAndPathSum1.java @@ -57,66 +57,6 @@ public static void addEdge(int u, int v) { head[u] = cntg; } - public static void up(int i) { - sum[i] = sum[i << 1] + sum[i << 1 | 1]; - max[i] = Math.max(max[i << 1], max[i << 1 | 1]); - } - - public static void build(int l, int r, int i) { - if (l == r) { - sum[i] = max[i] = arr[seg[l]]; - } else { - int mid = (l + r) / 2; - build(l, mid, i << 1); - build(mid + 1, r, i << 1 | 1); - up(i); - } - } - - public static void update(int jobi, int jobv, int l, int r, int i) { - if (l == r) { - sum[i] = max[i] = jobv; - } else { - int mid = (l + r) / 2; - if (jobi <= mid) { - update(jobi, jobv, l, mid, i << 1); - } else { - update(jobi, jobv, mid + 1, r, i << 1 | 1); - } - up(i); - } - } - - public static int queryMax(int jobl, int jobr, int l, int r, int i) { - if (jobl <= l && r <= jobr) { - return max[i]; - } - int mid = (l + r) / 2; - int ans = -INF; - if (jobl <= mid) { - ans = Math.max(ans, queryMax(jobl, jobr, l, mid, i << 1)); - } - if (jobr > mid) { - ans = Math.max(ans, queryMax(jobl, jobr, mid + 1, r, i << 1 | 1)); - } - return ans; - } - - public static int querySum(int jobl, int jobr, int l, int r, int i) { - if (jobl <= l && r <= jobr) { - return sum[i]; - } - int mid = (l + r) / 2; - int ans = 0; - if (jobl <= mid) { - ans += querySum(jobl, jobr, l, mid, i << 1); - } - if (jobr > mid) { - ans += querySum(jobl, jobr, mid + 1, r, i << 1 | 1); - } - return ans; - } - // 递归版,C++可以通过,java会爆栈 public static void dfs1(int u, int f) { fa[u] = f; @@ -238,6 +178,66 @@ public static void dfs4() { } } + public static void up(int i) { + sum[i] = sum[i << 1] + sum[i << 1 | 1]; + max[i] = Math.max(max[i << 1], max[i << 1 | 1]); + } + + public static void build(int l, int r, int i) { + if (l == r) { + sum[i] = max[i] = arr[seg[l]]; + } else { + int mid = (l + r) / 2; + build(l, mid, i << 1); + build(mid + 1, r, i << 1 | 1); + up(i); + } + } + + public static void update(int jobi, int jobv, int l, int r, int i) { + if (l == r) { + sum[i] = max[i] = jobv; + } else { + int mid = (l + r) / 2; + if (jobi <= mid) { + update(jobi, jobv, l, mid, i << 1); + } else { + update(jobi, jobv, mid + 1, r, i << 1 | 1); + } + up(i); + } + } + + public static int queryMax(int jobl, int jobr, int l, int r, int i) { + if (jobl <= l && r <= jobr) { + return max[i]; + } + int mid = (l + r) / 2; + int ans = -INF; + if (jobl <= mid) { + ans = Math.max(ans, queryMax(jobl, jobr, l, mid, i << 1)); + } + if (jobr > mid) { + ans = Math.max(ans, queryMax(jobl, jobr, mid + 1, r, i << 1 | 1)); + } + return ans; + } + + public static int querySum(int jobl, int jobr, int l, int r, int i) { + if (jobl <= l && r <= jobr) { + return sum[i]; + } + int mid = (l + r) / 2; + int ans = 0; + if (jobl <= mid) { + ans += querySum(jobl, jobr, l, mid, i << 1); + } + if (jobr > mid) { + ans += querySum(jobl, jobr, mid + 1, r, i << 1 | 1); + } + return ans; + } + public static void pointUpdate(int u, int v) { update(dfn[u], v, 1, n, 1); } diff --git a/src/class161/Code03_PathMaxAndPathSum2.java b/src/class161/Code03_PathMaxAndPathSum2.java index 55be327dd..99fbc4905 100644 --- a/src/class161/Code03_PathMaxAndPathSum2.java +++ b/src/class161/Code03_PathMaxAndPathSum2.java @@ -29,19 +29,54 @@ //int cntd = 0; // //void addEdge(int u, int v) { -// nxt[++cntg] = head[u]; +// 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] || siz[son[u]] < siz[v]) { +// son[u] = v; +// } +// } +// } +//} +// +//void dfs2(int u, int t) { +// top[u] = t; +// dfn[u] = ++cntd; +// seg[cntd] = 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 up(int i) { -// sumv[i] = sumv[i << 1] + sumv[i << 1 | 1]; +// sumv[i] = sumv[i << 1] + sumv[i << 1 | 1]; // maxv[i] = max(maxv[i << 1], maxv[i << 1 | 1]); //} // //void build(int l, int r, int i) { // if (l == r) { -// sumv[i] = maxv[i] = arr[seg[l]]; +// sumv[i] = maxv[i] = arr[seg[l]]; // } else { // int mid = (l + r) / 2; // build(l, mid, i << 1); @@ -52,7 +87,7 @@ // //void update(int jobi, int jobv, int l, int r, int i) { // if (l == r) { -// sumv[i] = maxv[i] = jobv; +// sumv[i] = maxv[i] = jobv; // } else { // int mid = (l + r) / 2; // if (jobi <= mid) { @@ -92,41 +127,6 @@ // return ans; //} // -//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] || siz[son[u]] < siz[v]) { -// son[u] = v; -// } -// } -// } -//} -// -//void dfs2(int u, int t) { -// top[u] = t; -// dfn[u] = ++cntd; -// seg[cntd] = 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 pointUpdate(int u, int v) { // update(dfn[u], v, 1, n, 1); //} diff --git a/src/class161/Code04_PackageManager1.java b/src/class161/Code04_PackageManager1.java new file mode 100644 index 000000000..8ca0d44b3 --- /dev/null +++ b/src/class161/Code04_PackageManager1.java @@ -0,0 +1,321 @@ +package class161; + +// 软件包管理器,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P2146 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.util.StringTokenizer; + +public class Code04_PackageManager1 { + + public static int MAXN = 100001; + + public static int n, m; + + 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[] sum = new int[MAXN << 2]; + + public static boolean[] update = new boolean[MAXN << 2]; + + public static int[] change = new int[MAXN << 2]; + + 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 cntd = 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; + 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; + } + } + } + } + + // 递归版,C++可以通过,java会爆栈 + public static void dfs2(int u, int t) { + top[u] = t; + dfn[u] = ++cntd; + 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) { // edge == -1,表示第一次来到当前节点,并且先处理重儿子 + top[first] = second; + dfn[first] = ++cntd; + if (son[first] == 0) { + continue; + } + push(first, second, -2); + push(son[first], second, -1); + continue; + } else if (edge == -2) { // edge == -2,表示处理完当前节点的重儿子,回到了当前节点 + edge = head[first]; + } else { // edge >= 0, 继续处理其他的边 + 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 up(int i) { + sum[i] = sum[i << 1] + sum[i << 1 | 1]; + } + + public static void lazy(int i, int v, int n) { + sum[i] = v * n; + update[i] = true; + change[i] = v; + } + + public static void down(int i, int ln, int rn) { + if (update[i]) { + lazy(i << 1, change[i], ln); + lazy(i << 1 | 1, change[i], rn); + update[i] = false; + } + } + + public static void update(int jobl, int jobr, int jobv, int l, int r, int i) { + if (jobl <= l && r <= jobr) { + lazy(i, jobv, r - l + 1); + } else { + int mid = (l + r) / 2; + down(i, mid - l + 1, r - mid); + if (jobl <= mid) { + update(jobl, jobr, jobv, l, mid, i << 1); + } + if (jobr > mid) { + update(jobl, jobr, jobv, mid + 1, r, i << 1 | 1); + } + up(i); + } + } + + public static long query(int jobl, int jobr, int l, int r, int i) { + if (jobl <= l && r <= jobr) { + return sum[i]; + } + int mid = (l + r) / 2; + down(i, mid - l + 1, r - mid); + long ans = 0; + if (jobl <= mid) { + ans += query(jobl, jobr, l, mid, i << 1); + } + if (jobr > mid) { + ans += query(jobl, jobr, mid + 1, r, i << 1 | 1); + } + return ans; + } + + public static void pathUpdate(int x, int y, int v) { + while (top[x] != top[y]) { + if (dep[top[x]] <= dep[top[y]]) { + update(dfn[top[y]], dfn[y], v, 1, n, 1); + y = fa[top[y]]; + } else { + update(dfn[top[x]], dfn[x], v, 1, n, 1); + x = fa[top[x]]; + } + } + update(Math.min(dfn[x], dfn[y]), Math.max(dfn[x], dfn[y]), v, 1, n, 1); + } + + public static int install(int x) { + int pre = sum[1]; + pathUpdate(1, x, 1); + int post = sum[1]; + return Math.abs(post - pre); + } + + public static int uninstall(int x) { + int pre = sum[1]; + update(dfn[x], dfn[x] + siz[x] - 1, 0, 1, n, 1); + int post = sum[1]; + return Math.abs(post - pre); + } + + public static void main(String[] args) { + Kattio io = new Kattio(); + n = io.nextInt(); + for (int u = 2, v; u <= n; u++) { + v = io.nextInt() + 1; + addEdge(v, u); + } + dfs3(); + dfs4(); + m = io.nextInt(); + String op; + int x; + for (int i = 1; i <= m; i++) { + op = io.next(); + x = io.nextInt() + 1; + if (op.equals("install")) { + io.println(install(x)); + } else { + io.println(uninstall(x)); + } + } + io.flush(); + io.close(); + } + + // 读写工具类 + public static class Kattio extends PrintWriter { + private BufferedReader r; + private StringTokenizer st; + + public Kattio() { + this(System.in, System.out); + } + + public Kattio(InputStream i, OutputStream o) { + super(o); + r = new BufferedReader(new InputStreamReader(i)); + } + + public Kattio(String intput, String output) throws IOException { + super(output); + r = new BufferedReader(new FileReader(intput)); + } + + public String next() { + try { + while (st == null || !st.hasMoreTokens()) + st = new StringTokenizer(r.readLine()); + return st.nextToken(); + } catch (Exception e) { + } + return null; + } + + public int nextInt() { + return Integer.parseInt(next()); + } + + public double nextDouble() { + return Double.parseDouble(next()); + } + + public long nextLong() { + return Long.parseLong(next()); + } + } + +} diff --git a/src/class161/Code04_PackageManager2.java b/src/class161/Code04_PackageManager2.java new file mode 100644 index 000000000..33d22bc72 --- /dev/null +++ b/src/class161/Code04_PackageManager2.java @@ -0,0 +1,159 @@ +package class161; + +// 软件包管理器,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P2146 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +//int n, m; +//int arr[MAXN]; +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int cntg = 0; +//int sum[MAXN << 2]; +//bool update[MAXN << 2]; +//int change[MAXN << 2]; +//int fa[MAXN]; +//int dep[MAXN]; +//int siz[MAXN]; +//int son[MAXN]; +//int top[MAXN]; +//int dfn[MAXN]; +//int cntd = 0; +// +//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 > 0; e = nxt[e]) { +// v = to[e]; +// if (v != f) dfs1(v, u); +// } +// for (int e = head[u], v; e > 0; 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; +// dfn[u] = ++cntd; +// 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); +// } +// } +//} +// +//void up(int i) { +// sum[i] = sum[i << 1] + sum[i << 1 | 1]; +//} +// +//void lazy(int i, int v, int n) { +// sum[i] = v * n; +// update[i] = true; +// change[i] = v; +//} +// +//void down(int i, int ln, int rn) { +// if (update[i]) { +// lazy(i << 1, change[i], ln); +// lazy(i << 1 | 1, change[i], rn); +// update[i] = false; +// } +//} +// +//void updateRange(int jobl, int jobr, int jobv, int l, int r, int i) { +// if (jobl <= l && r <= jobr) { +// lazy(i, jobv, r - l + 1); +// } else { +// int mid = (l + r) / 2; +// down(i, mid - l + 1, r - mid); +// if (jobl <= mid) updateRange(jobl, jobr, jobv, l, mid, i << 1); +// if (jobr > mid) updateRange(jobl, jobr, jobv, mid + 1, r, i << 1 | 1); +// up(i); +// } +//} +// +//long long query(int jobl, int jobr, int l, int r, int i) { +// if (jobl <= l && r <= jobr) return sum[i]; +// int mid = (l + r) / 2; +// down(i, mid - l + 1, r - mid); +// long long ans = 0; +// if (jobl <= mid) ans += query(jobl, jobr, l, mid, i << 1); +// if (jobr > mid) ans += query(jobl, jobr, mid + 1, r, i << 1 | 1); +// return ans; +//} +// +//void pathUpdate(int x, int y, int v) { +// while (top[x] != top[y]) { +// if (dep[top[x]] <= dep[top[y]]) { +// updateRange(dfn[top[y]], dfn[y], v, 1, n, 1); +// y = fa[top[y]]; +// } else { +// updateRange(dfn[top[x]], dfn[x], v, 1, n, 1); +// x = fa[top[x]]; +// } +// } +// updateRange(min(dfn[x], dfn[y]), max(dfn[x], dfn[y]), v, 1, n, 1); +//} +// +//int install(int x) { +// int pre = sum[1]; +// pathUpdate(1, x, 1); +// int post = sum[1]; +// return abs(post - pre); +//} +// +//int uninstall(int x) { +// int pre = sum[1]; +// updateRange(dfn[x], dfn[x] + siz[x] - 1, 0, 1, n, 1); +// int post = sum[1]; +// return abs(post - pre); +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n; +// for (int u = 2, v; u <= n; u++) { +// cin >> v; +// v++; +// addEdge(v, u); +// } +// dfs1(1, 0); +// dfs2(1, 1); +// cin >> m; +// string op; +// int x; +// for (int i = 1; i <= m; i++) { +// cin >> op >> x; +// x++; +// if (op == "install") { +// cout << install(x) << '\n'; +// } else { +// cout << uninstall(x) << '\n'; +// } +// } +// return 0; +//} \ No newline at end of file From faeb0522e2d2ec4a884dd6d3d44ccb85073bd847 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 26 Feb 2025 17:36:13 +0800 Subject: [PATCH 0726/2029] modify code --- src/class161/Code04_PackageManager1.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class161/Code04_PackageManager1.java b/src/class161/Code04_PackageManager1.java index 8ca0d44b3..c3ba0029b 100644 --- a/src/class161/Code04_PackageManager1.java +++ b/src/class161/Code04_PackageManager1.java @@ -258,8 +258,8 @@ public static void main(String[] args) { v = io.nextInt() + 1; addEdge(v, u); } - dfs3(); - dfs4(); + dfs3(); // dfs3() 等同于 dfs1(1, 0),调用迭代版防止爆栈 + dfs4(); // dfs4() 等同于 dfs2(1, 1),调用迭代版防止爆栈 m = io.nextInt(); String op; int x; From 4f29d6f8ddf0b31263341d428ef47b80e3d97609 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 26 Feb 2025 20:24:41 +0800 Subject: [PATCH 0727/2029] modify code --- src/class161/Code05_Coloring1.java | 378 +++++++++++++++++++++++++++++ src/class161/Code05_Coloring2.java | 225 +++++++++++++++++ 2 files changed, 603 insertions(+) create mode 100644 src/class161/Code05_Coloring1.java create mode 100644 src/class161/Code05_Coloring2.java diff --git a/src/class161/Code05_Coloring1.java b/src/class161/Code05_Coloring1.java new file mode 100644 index 000000000..45ef2ff6c --- /dev/null +++ b/src/class161/Code05_Coloring1.java @@ -0,0 +1,378 @@ +package class161; + +// 染色,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P2486 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.util.StringTokenizer; + +public class Code05_Coloring1 { + + public static int MAXN = 100001; + + public static int n, m; + + 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[] sum = new int[MAXN << 2]; + + public static int[] lc = new int[MAXN << 2]; + + public static int[] rc = new int[MAXN << 2]; + + public static int[] change = new int[MAXN << 2]; + + 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[] seg = new int[MAXN]; + + public static int cntd = 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; + 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; + } + } + } + } + + // 递归版,C++可以通过,java会爆栈 + public static void dfs2(int u, int t) { + top[u] = t; + dfn[u] = ++cntd; + seg[cntd] = 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) { // edge == -1,表示第一次来到当前节点,并且先处理重儿子 + top[first] = second; + dfn[first] = ++cntd; + seg[cntd] = first; + if (son[first] == 0) { + continue; + } + push(first, second, -2); + push(son[first], second, -1); + continue; + } else if (edge == -2) { // edge == -2,表示处理完当前节点的重儿子,回到了当前节点 + edge = head[first]; + } else { // edge >= 0, 继续处理其他的边 + 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 up(int i) { + sum[i] = sum[i << 1] + sum[i << 1 | 1]; + if (rc[i << 1] == lc[i << 1 | 1]) { + sum[i]--; + } + lc[i] = lc[i << 1]; + rc[i] = rc[i << 1 | 1]; + } + + public static void lazy(int i, int v) { + sum[i] = 1; + lc[i] = v; + rc[i] = v; + change[i] = v; + } + + public static void down(int i) { + if (change[i] != 0) { + lazy(i << 1, change[i]); + lazy(i << 1 | 1, change[i]); + change[i] = 0; + } + } + + public static void build(int l, int r, int i) { + if (l == r) { + sum[i] = 1; + lc[i] = arr[seg[l]]; + rc[i] = arr[seg[l]]; + } else { + int mid = (l + r) / 2; + build(l, mid, i << 1); + build(mid + 1, r, i << 1 | 1); + up(i); + } + } + + public static void update(int jobl, int jobr, int jobv, int l, int r, int i) { + if (jobl <= l && r <= jobr) { + lazy(i, jobv); + } else { + down(i); + int mid = (l + r) / 2; + if (jobl <= mid) { + update(jobl, jobr, jobv, l, mid, i << 1); + } + if (jobr > mid) { + update(jobl, jobr, jobv, mid + 1, r, i << 1 | 1); + } + up(i); + } + } + + public static int query(int jobl, int jobr, int l, int r, int i) { + if (jobl <= l && r <= jobr) { + return sum[i]; + } + down(i); + int mid = (l + r) / 2; + if (jobr <= mid) { + return query(jobl, jobr, l, mid, i << 1); + } else if (jobl > mid) { + return query(jobl, jobr, mid + 1, r, i << 1 | 1); + } else { + int ans = query(jobl, jobr, l, mid, i << 1) + query(jobl, jobr, mid + 1, r, i << 1 | 1); + if (rc[i << 1] == lc[i << 1 | 1]) { + ans--; + } + return ans; + } + } + + public static int pointColor(int jobi, int l, int r, int i) { + if (l == r) { + return lc[i]; + } + down(i); + int mid = (l + r) / 2; + if (jobi <= mid) { + return pointColor(jobi, l, mid, i << 1); + } else { + return pointColor(jobi, mid + 1, r, i << 1 | 1); + } + } + + public static void pathUpdate(int x, int y, int v) { + while (top[x] != top[y]) { + if (dep[top[x]] <= dep[top[y]]) { + update(dfn[top[y]], dfn[y], v, 1, n, 1); + y = fa[top[y]]; + } else { + update(dfn[top[x]], dfn[x], v, 1, n, 1); + x = fa[top[x]]; + } + } + update(Math.min(dfn[x], dfn[y]), Math.max(dfn[x], dfn[y]), v, 1, n, 1); + } + + public static int pathColors(int x, int y) { + int ans = 0, sonc, fac; + while (top[x] != top[y]) { + if (dep[top[x]] <= dep[top[y]]) { + ans += query(dfn[top[y]], dfn[y], 1, n, 1); + sonc = pointColor(dfn[top[y]], 1, n, 1); + fac = pointColor(dfn[fa[top[y]]], 1, n, 1); + y = fa[top[y]]; + } else { + ans += query(dfn[top[x]], dfn[x], 1, n, 1); + sonc = pointColor(dfn[top[x]], 1, n, 1); + fac = pointColor(dfn[fa[top[x]]], 1, n, 1); + x = fa[top[x]]; + } + if (sonc == fac) { + ans--; + } + } + ans += query(Math.min(dfn[x], dfn[y]), Math.max(dfn[x], dfn[y]), 1, n, 1); + return ans; + } + + public static void main(String[] args) { + Kattio io = new Kattio(); + n = io.nextInt(); + m = io.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = io.nextInt(); + } + for (int i = 1, u, v; i < n; i++) { + u = io.nextInt(); + v = io.nextInt(); + addEdge(u, v); + addEdge(v, u); + } + dfs3(); + dfs4(); + build(1, n, 1); + String op; + int x, y, z; + for (int i = 1; i <= m; i++) { + op = io.next(); + x = io.nextInt(); + y = io.nextInt(); + if (op.equals("C")) { + z = io.nextInt(); + pathUpdate(x, y, z); + } else { + io.println(pathColors(x, y)); + } + } + io.flush(); + io.close(); + } + + // 读写工具类 + public static class Kattio extends PrintWriter { + private BufferedReader r; + private StringTokenizer st; + + public Kattio() { + this(System.in, System.out); + } + + public Kattio(InputStream i, OutputStream o) { + super(o); + r = new BufferedReader(new InputStreamReader(i)); + } + + public Kattio(String intput, String output) throws IOException { + super(output); + r = new BufferedReader(new FileReader(intput)); + } + + public String next() { + try { + while (st == null || !st.hasMoreTokens()) + st = new StringTokenizer(r.readLine()); + return st.nextToken(); + } catch (Exception e) { + } + return null; + } + + public int nextInt() { + return Integer.parseInt(next()); + } + + public double nextDouble() { + return Double.parseDouble(next()); + } + + public long nextLong() { + return Long.parseLong(next()); + } + } + +} diff --git a/src/class161/Code05_Coloring2.java b/src/class161/Code05_Coloring2.java new file mode 100644 index 000000000..c578ee6b4 --- /dev/null +++ b/src/class161/Code05_Coloring2.java @@ -0,0 +1,225 @@ +package class161; + +// 染色,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P2486 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +//int n, m; +//int arr[MAXN]; +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int cntg = 0; +//int sum[MAXN << 2]; +//int lc[MAXN << 2]; +//int rc[MAXN << 2]; +//int change[MAXN << 2]; +//int fa[MAXN]; +//int dep[MAXN]; +//int siz[MAXN]; +//int son[MAXN]; +//int top[MAXN]; +//int dfn[MAXN]; +//int seg[MAXN]; +//int cntd = 0; +// +//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 > 0; e = nxt[e]) { +// v = to[e]; +// if (v != f) { +// dfs1(v, u); +// } +// } +// for (int e = head[u], v; e > 0; 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; +// dfn[u] = ++cntd; +// seg[cntd] = u; +// 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); +// } +// } +//} +// +//void up(int i) { +// sum[i] = sum[i << 1] + sum[i << 1 | 1]; +// if (rc[i << 1] == lc[(i << 1) | 1]) { +// sum[i]--; +// } +// lc[i] = lc[i << 1]; +// rc[i] = rc[(i << 1) | 1]; +//} +// +//void lazy(int i, int v) { +// sum[i] = 1; +// lc[i] = v; +// rc[i] = v; +// change[i] = v; +//} +// +//void down(int i) { +// if (change[i] != 0) { +// lazy(i << 1, change[i]); +// lazy((i << 1) | 1, change[i]); +// change[i] = 0; +// } +//} +// +//void build(int l, int r, int i) { +// if (l == r) { +// sum[i] = 1; +// lc[i] = arr[seg[l]]; +// rc[i] = arr[seg[l]]; +// } else { +// int mid = (l + r) / 2; +// build(l, mid, i << 1); +// build(mid + 1, r, (i << 1) | 1); +// up(i); +// } +//} +// +//void update(int jobl, int jobr, int jobv, int l, int r, int i) { +// if (jobl <= l && r <= jobr) { +// lazy(i, jobv); +// } else { +// down(i); +// int mid = (l + r) / 2; +// if (jobl <= mid) { +// update(jobl, jobr, jobv, l, mid, i << 1); +// } +// if (jobr > mid) { +// update(jobl, jobr, jobv, mid + 1, r, (i << 1) | 1); +// } +// up(i); +// } +//} +// +//int query(int jobl, int jobr, int l, int r, int i) { +// if (jobl <= l && r <= jobr) { +// return sum[i]; +// } +// down(i); +// int mid = (l + r) / 2; +// if (jobr <= mid) { +// return query(jobl, jobr, l, mid, i << 1); +// } else if (jobl > mid) { +// return query(jobl, jobr, mid + 1, r, (i << 1) | 1); +// } else { +// int ans = query(jobl, jobr, l, mid, i << 1) +// + query(jobl, jobr, mid + 1, r, (i << 1) | 1); +// if (rc[i << 1] == lc[(i << 1) | 1]) { +// ans--; +// } +// return ans; +// } +//} +// +//int pointColor(int jobi, int l, int r, int i) { +// if (l == r) { +// return lc[i]; +// } +// down(i); +// int mid = (l + r) / 2; +// if (jobi <= mid) { +// return pointColor(jobi, l, mid, i << 1); +// } else { +// return pointColor(jobi, mid + 1, r, (i << 1) | 1); +// } +//} +// +//void pathUpdate(int x, int y, int v) { +// while (top[x] != top[y]) { +// if (dep[top[x]] <= dep[top[y]]) { +// update(dfn[top[y]], dfn[y], v, 1, n, 1); +// y = fa[top[y]]; +// } else { +// update(dfn[top[x]], dfn[x], v, 1, n, 1); +// x = fa[top[x]]; +// } +// } +// update(min(dfn[x], dfn[y]), max(dfn[x], dfn[y]), v, 1, n, 1); +//} +// +//int pathColors(int x, int y) { +// int ans = 0, sonc, fac; +// while (top[x] != top[y]) { +// if (dep[top[x]] <= dep[top[y]]) { +// ans += query(dfn[top[y]], dfn[y], 1, n, 1); +// sonc = pointColor(dfn[top[y]], 1, n, 1); +// fac = pointColor(dfn[fa[top[y]]], 1, n, 1); +// y = fa[top[y]]; +// } else { +// ans += query(dfn[top[x]], dfn[x], 1, n, 1); +// sonc = pointColor(dfn[top[x]], 1, n, 1); +// fac = pointColor(dfn[fa[top[x]]], 1, n, 1); +// x = fa[top[x]]; +// } +// if (sonc == fac) { +// ans--; +// } +// } +// ans += query(min(dfn[x], dfn[y]), max(dfn[x], dfn[y]), 1, n, 1); +// 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); +// build(1, n, 1); +// string op; +// int x, y; +// for (int i = 1; i <= m; i++) { +// cin >> op; +// cin >> x >> y; +// if (op == "C") { +// int z; +// cin >> z; +// pathUpdate(x, y, z); +// } else { +// cout << pathColors(x, y) << "\n"; +// } +// } +// return 0; +//} \ No newline at end of file From 9d256a2cbec85be1a0b0cc0cfd5a2765e7d15c79 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 26 Feb 2025 20:28:20 +0800 Subject: [PATCH 0728/2029] modify code --- src/class161/Code05_Coloring1.java | 22 +++++++++++----------- src/class161/Code05_Coloring2.java | 26 +++++++++++++------------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/class161/Code05_Coloring1.java b/src/class161/Code05_Coloring1.java index 45ef2ff6c..057aefe8c 100644 --- a/src/class161/Code05_Coloring1.java +++ b/src/class161/Code05_Coloring1.java @@ -31,9 +31,9 @@ public class Code05_Coloring1 { public static int[] sum = new int[MAXN << 2]; - public static int[] lc = new int[MAXN << 2]; + public static int[] lcolor = new int[MAXN << 2]; - public static int[] rc = new int[MAXN << 2]; + public static int[] rcolor = new int[MAXN << 2]; public static int[] change = new int[MAXN << 2]; @@ -182,17 +182,17 @@ public static void dfs4() { public static void up(int i) { sum[i] = sum[i << 1] + sum[i << 1 | 1]; - if (rc[i << 1] == lc[i << 1 | 1]) { + if (rcolor[i << 1] == lcolor[i << 1 | 1]) { sum[i]--; } - lc[i] = lc[i << 1]; - rc[i] = rc[i << 1 | 1]; + lcolor[i] = lcolor[i << 1]; + rcolor[i] = rcolor[i << 1 | 1]; } public static void lazy(int i, int v) { sum[i] = 1; - lc[i] = v; - rc[i] = v; + lcolor[i] = v; + rcolor[i] = v; change[i] = v; } @@ -207,8 +207,8 @@ public static void down(int i) { public static void build(int l, int r, int i) { if (l == r) { sum[i] = 1; - lc[i] = arr[seg[l]]; - rc[i] = arr[seg[l]]; + lcolor[i] = arr[seg[l]]; + rcolor[i] = arr[seg[l]]; } else { int mid = (l + r) / 2; build(l, mid, i << 1); @@ -245,7 +245,7 @@ public static int query(int jobl, int jobr, int l, int r, int i) { return query(jobl, jobr, mid + 1, r, i << 1 | 1); } else { int ans = query(jobl, jobr, l, mid, i << 1) + query(jobl, jobr, mid + 1, r, i << 1 | 1); - if (rc[i << 1] == lc[i << 1 | 1]) { + if (rcolor[i << 1] == lcolor[i << 1 | 1]) { ans--; } return ans; @@ -254,7 +254,7 @@ public static int query(int jobl, int jobr, int l, int r, int i) { public static int pointColor(int jobi, int l, int r, int i) { if (l == r) { - return lc[i]; + return lcolor[i]; } down(i); int mid = (l + r) / 2; diff --git a/src/class161/Code05_Coloring2.java b/src/class161/Code05_Coloring2.java index c578ee6b4..1cb750f8a 100644 --- a/src/class161/Code05_Coloring2.java +++ b/src/class161/Code05_Coloring2.java @@ -17,8 +17,8 @@ //int to[MAXN << 1]; //int cntg = 0; //int sum[MAXN << 2]; -//int lc[MAXN << 2]; -//int rc[MAXN << 2]; +//int lcolor[MAXN << 2]; +//int rcolor[MAXN << 2]; //int change[MAXN << 2]; //int fa[MAXN]; //int dep[MAXN]; @@ -73,18 +73,18 @@ //} // //void up(int i) { -// sum[i] = sum[i << 1] + sum[i << 1 | 1]; -// if (rc[i << 1] == lc[(i << 1) | 1]) { +// sum[i] = sum[i << 1] + sum[i << 1 | 1]; +// if (rcolor[i << 1] == lcolor[(i << 1) | 1]) { // sum[i]--; // } -// lc[i] = lc[i << 1]; -// rc[i] = rc[(i << 1) | 1]; +// lcolor[i] = lcolor[i << 1]; +// rcolor[i] = rcolor[(i << 1) | 1]; //} // //void lazy(int i, int v) { -// sum[i] = 1; -// lc[i] = v; -// rc[i] = v; +// sum[i] = 1; +// lcolor[i] = v; +// rcolor[i] = v; // change[i] = v; //} // @@ -99,8 +99,8 @@ //void build(int l, int r, int i) { // if (l == r) { // sum[i] = 1; -// lc[i] = arr[seg[l]]; -// rc[i] = arr[seg[l]]; +// lcolor[i] = arr[seg[l]]; +// rcolor[i] = arr[seg[l]]; // } else { // int mid = (l + r) / 2; // build(l, mid, i << 1); @@ -138,7 +138,7 @@ // } else { // int ans = query(jobl, jobr, l, mid, i << 1) // + query(jobl, jobr, mid + 1, r, (i << 1) | 1); -// if (rc[i << 1] == lc[(i << 1) | 1]) { +// if (rcolor[i << 1] == lcolor[(i << 1) | 1]) { // ans--; // } // return ans; @@ -147,7 +147,7 @@ // //int pointColor(int jobi, int l, int r, int i) { // if (l == r) { -// return lc[i]; +// return lcolor[i]; // } // down(i); // int mid = (l + r) / 2; From 67db7b285d19c9c046501ea9447c89d47843d233 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 26 Feb 2025 20:47:55 +0800 Subject: [PATCH 0729/2029] modify code --- src/class161/Code05_Coloring2.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class161/Code05_Coloring2.java b/src/class161/Code05_Coloring2.java index 1cb750f8a..be1f17bed 100644 --- a/src/class161/Code05_Coloring2.java +++ b/src/class161/Code05_Coloring2.java @@ -98,7 +98,7 @@ // //void build(int l, int r, int i) { // if (l == r) { -// sum[i] = 1; +// sum[i] = 1; // lcolor[i] = arr[seg[l]]; // rcolor[i] = arr[seg[l]]; // } else { From 8f618f57602b1f6db279d287ba21dcc8ba3fcc8a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 26 Feb 2025 20:50:41 +0800 Subject: [PATCH 0730/2029] modify code --- src/class161/Code05_Coloring2.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/class161/Code05_Coloring2.java b/src/class161/Code05_Coloring2.java index be1f17bed..f12a2ebcd 100644 --- a/src/class161/Code05_Coloring2.java +++ b/src/class161/Code05_Coloring2.java @@ -74,11 +74,11 @@ // //void up(int i) { // sum[i] = sum[i << 1] + sum[i << 1 | 1]; -// if (rcolor[i << 1] == lcolor[(i << 1) | 1]) { +// if (rcolor[i << 1] == lcolor[i << 1 | 1]) { // sum[i]--; // } // lcolor[i] = lcolor[i << 1]; -// rcolor[i] = rcolor[(i << 1) | 1]; +// rcolor[i] = rcolor[i << 1 | 1]; //} // //void lazy(int i, int v) { @@ -91,7 +91,7 @@ //void down(int i) { // if (change[i] != 0) { // lazy(i << 1, change[i]); -// lazy((i << 1) | 1, change[i]); +// lazy(i << 1 | 1, change[i]); // change[i] = 0; // } //} @@ -104,7 +104,7 @@ // } else { // int mid = (l + r) / 2; // build(l, mid, i << 1); -// build(mid + 1, r, (i << 1) | 1); +// build(mid + 1, r, i << 1 | 1); // up(i); // } //} @@ -119,7 +119,7 @@ // update(jobl, jobr, jobv, l, mid, i << 1); // } // if (jobr > mid) { -// update(jobl, jobr, jobv, mid + 1, r, (i << 1) | 1); +// update(jobl, jobr, jobv, mid + 1, r, i << 1 | 1); // } // up(i); // } @@ -134,11 +134,11 @@ // if (jobr <= mid) { // return query(jobl, jobr, l, mid, i << 1); // } else if (jobl > mid) { -// return query(jobl, jobr, mid + 1, r, (i << 1) | 1); +// return query(jobl, jobr, mid + 1, r, i << 1 | 1); // } else { // int ans = query(jobl, jobr, l, mid, i << 1) -// + query(jobl, jobr, mid + 1, r, (i << 1) | 1); -// if (rcolor[i << 1] == lcolor[(i << 1) | 1]) { +// + query(jobl, jobr, mid + 1, r, i << 1 | 1); +// if (rcolor[i << 1] == lcolor[i << 1 | 1]) { // ans--; // } // return ans; @@ -154,7 +154,7 @@ // if (jobi <= mid) { // return pointColor(jobi, l, mid, i << 1); // } else { -// return pointColor(jobi, mid + 1, r, (i << 1) | 1); +// return pointColor(jobi, mid + 1, r, i << 1 | 1); // } //} // From 88702f8ff3a3a5b4c1a1be914dd915ebe1aa94f2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 27 Feb 2025 16:18:10 +0800 Subject: [PATCH 0731/2029] modify code --- .../Code02_PathSumAndSubtreeSum1.java | 8 +- .../Code02_PathSumAndSubtreeSum2.java | 4 +- src/class161/Code03_PathMaxAndPathSum1.java | 8 +- src/class161/Code03_PathMaxAndPathSum2.java | 4 +- src/class161/Code04_PackageManager1.java | 12 +- src/class161/Code04_PackageManager2.java | 6 +- src/class161/Code05_Coloring1.java | 16 +- src/class161/Code05_Coloring2.java | 8 +- src/class161/Code06_Travel1.java | 345 ++++++++++++++++++ src/class161/Code06_Travel2.java | 239 ++++++++++++ 10 files changed, 617 insertions(+), 33 deletions(-) create mode 100644 src/class161/Code06_Travel1.java create mode 100644 src/class161/Code06_Travel2.java diff --git a/src/class161/Code02_PathSumAndSubtreeSum1.java b/src/class161/Code02_PathSumAndSubtreeSum1.java index 469c2bf9d..ed8c04e59 100644 --- a/src/class161/Code02_PathSumAndSubtreeSum1.java +++ b/src/class161/Code02_PathSumAndSubtreeSum1.java @@ -27,10 +27,6 @@ public class Code02_PathSumAndSubtreeSum1 { public static int cntg = 0; - public static long[] sum = new long[MAXN << 2]; - - public static long[] addTag = new long[MAXN << 2]; - public static int[] fa = new int[MAXN]; public static int[] dep = new int[MAXN]; @@ -47,6 +43,10 @@ public class Code02_PathSumAndSubtreeSum1 { public static int cntd = 0; + public static long[] sum = new long[MAXN << 2]; + + public static long[] addTag = new long[MAXN << 2]; + public static void addEdge(int u, int v) { next[++cntg] = head[u]; to[cntg] = v; diff --git a/src/class161/Code02_PathSumAndSubtreeSum2.java b/src/class161/Code02_PathSumAndSubtreeSum2.java index 854a9e731..3cf25f725 100644 --- a/src/class161/Code02_PathSumAndSubtreeSum2.java +++ b/src/class161/Code02_PathSumAndSubtreeSum2.java @@ -16,8 +16,6 @@ //int nxt[MAXN << 1]; //int to[MAXN << 1]; //int cntg = 0; -//long long sum[MAXN << 2]; -//long long addTag[MAXN << 2]; //int fa[MAXN]; //int dep[MAXN]; //int siz[MAXN]; @@ -26,6 +24,8 @@ //int dfn[MAXN]; //int seg[MAXN]; //int cntd = 0; +//long long sum[MAXN << 2]; +//long long addTag[MAXN << 2]; // //void addEdge(int u, int v) { // nxt[++cntg] = head[u]; diff --git a/src/class161/Code03_PathMaxAndPathSum1.java b/src/class161/Code03_PathMaxAndPathSum1.java index 619697d2c..ac40502e6 100644 --- a/src/class161/Code03_PathMaxAndPathSum1.java +++ b/src/class161/Code03_PathMaxAndPathSum1.java @@ -31,10 +31,6 @@ public class Code03_PathMaxAndPathSum1 { public static int cntg = 0; - public static int[] max = new int[MAXN << 2]; - - public static int[] sum = new int[MAXN << 2]; - public static int[] fa = new int[MAXN]; public static int[] dep = new int[MAXN]; @@ -51,6 +47,10 @@ public class Code03_PathMaxAndPathSum1 { public static int cntd = 0; + public static int[] max = new int[MAXN << 2]; + + public static int[] sum = new int[MAXN << 2]; + public static void addEdge(int u, int v) { next[++cntg] = head[u]; to[cntg] = v; diff --git a/src/class161/Code03_PathMaxAndPathSum2.java b/src/class161/Code03_PathMaxAndPathSum2.java index 99fbc4905..3ce3f5ce8 100644 --- a/src/class161/Code03_PathMaxAndPathSum2.java +++ b/src/class161/Code03_PathMaxAndPathSum2.java @@ -17,8 +17,6 @@ //int nxt[MAXN << 1]; //int to[MAXN << 1]; //int cntg = 0; -//int maxv[MAXN << 2]; -//int sumv[MAXN << 2]; //int fa[MAXN]; //int dep[MAXN]; //int siz[MAXN]; @@ -27,6 +25,8 @@ //int dfn[MAXN]; //int seg[MAXN]; //int cntd = 0; +//int maxv[MAXN << 2]; +//int sumv[MAXN << 2]; // //void addEdge(int u, int v) { // nxt[++cntg] = head[u]; diff --git a/src/class161/Code04_PackageManager1.java b/src/class161/Code04_PackageManager1.java index c3ba0029b..7f76a6325 100644 --- a/src/class161/Code04_PackageManager1.java +++ b/src/class161/Code04_PackageManager1.java @@ -29,12 +29,6 @@ public class Code04_PackageManager1 { public static int cntg = 0; - public static int[] sum = new int[MAXN << 2]; - - public static boolean[] update = new boolean[MAXN << 2]; - - public static int[] change = new int[MAXN << 2]; - public static int[] fa = new int[MAXN]; public static int[] dep = new int[MAXN]; @@ -49,6 +43,12 @@ public class Code04_PackageManager1 { public static int cntd = 0; + public static int[] sum = new int[MAXN << 2]; + + public static boolean[] update = new boolean[MAXN << 2]; + + public static int[] change = new int[MAXN << 2]; + public static void addEdge(int u, int v) { next[++cntg] = head[u]; to[cntg] = v; diff --git a/src/class161/Code04_PackageManager2.java b/src/class161/Code04_PackageManager2.java index 33d22bc72..8d9b34677 100644 --- a/src/class161/Code04_PackageManager2.java +++ b/src/class161/Code04_PackageManager2.java @@ -16,9 +16,6 @@ //int nxt[MAXN << 1]; //int to[MAXN << 1]; //int cntg = 0; -//int sum[MAXN << 2]; -//bool update[MAXN << 2]; -//int change[MAXN << 2]; //int fa[MAXN]; //int dep[MAXN]; //int siz[MAXN]; @@ -26,6 +23,9 @@ //int top[MAXN]; //int dfn[MAXN]; //int cntd = 0; +//int sum[MAXN << 2]; +//bool update[MAXN << 2]; +//int change[MAXN << 2]; // //void addEdge(int u, int v) { // nxt[++cntg] = head[u]; diff --git a/src/class161/Code05_Coloring1.java b/src/class161/Code05_Coloring1.java index 057aefe8c..14d55ad04 100644 --- a/src/class161/Code05_Coloring1.java +++ b/src/class161/Code05_Coloring1.java @@ -29,14 +29,6 @@ public class Code05_Coloring1 { public static int cntg = 0; - public static int[] sum = new int[MAXN << 2]; - - public static int[] lcolor = new int[MAXN << 2]; - - public static int[] rcolor = new int[MAXN << 2]; - - public static int[] change = new int[MAXN << 2]; - public static int[] fa = new int[MAXN]; public static int[] dep = new int[MAXN]; @@ -53,6 +45,14 @@ public class Code05_Coloring1 { public static int cntd = 0; + public static int[] sum = new int[MAXN << 2]; + + public static int[] lcolor = new int[MAXN << 2]; + + public static int[] rcolor = new int[MAXN << 2]; + + public static int[] change = new int[MAXN << 2]; + public static void addEdge(int u, int v) { next[++cntg] = head[u]; to[cntg] = v; diff --git a/src/class161/Code05_Coloring2.java b/src/class161/Code05_Coloring2.java index f12a2ebcd..0e3b16528 100644 --- a/src/class161/Code05_Coloring2.java +++ b/src/class161/Code05_Coloring2.java @@ -16,10 +16,6 @@ //int nxt[MAXN << 1]; //int to[MAXN << 1]; //int cntg = 0; -//int sum[MAXN << 2]; -//int lcolor[MAXN << 2]; -//int rcolor[MAXN << 2]; -//int change[MAXN << 2]; //int fa[MAXN]; //int dep[MAXN]; //int siz[MAXN]; @@ -28,6 +24,10 @@ //int dfn[MAXN]; //int seg[MAXN]; //int cntd = 0; +//int sum[MAXN << 2]; +//int lcolor[MAXN << 2]; +//int rcolor[MAXN << 2]; +//int change[MAXN << 2]; // //void addEdge(int u, int v) { // nxt[++cntg] = head[u]; diff --git a/src/class161/Code06_Travel1.java b/src/class161/Code06_Travel1.java new file mode 100644 index 000000000..1cf6f4fd2 --- /dev/null +++ b/src/class161/Code06_Travel1.java @@ -0,0 +1,345 @@ +package class161; + +// 旅游,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P3976 +// 提交以下的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 Code06_Travel1 { + + public static int MAXN = 50001; + + public static int INF = 1000000001; + + public static int n, m; + + 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[] seg = new int[MAXN]; + + public static int cntd = 0; + + public static int[] max = new int[MAXN << 2]; + + public static int[] min = new int[MAXN << 2]; + + public static int[] lprofit = new int[MAXN << 2]; + + public static int[] rprofit = new int[MAXN << 2]; + + public static int[] addTag = new int[MAXN << 2]; + + 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; + 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; + } + } + } + } + + // 递归版,C++可以通过,java会爆栈 + public static void dfs2(int u, int t) { + top[u] = t; + dfn[u] = ++cntd; + seg[cntd] = 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) { // edge == -1,表示第一次来到当前节点,并且先处理重儿子 + top[first] = second; + dfn[first] = ++cntd; + seg[cntd] = first; + if (son[first] == 0) { + continue; + } + push(first, second, -2); + push(son[first], second, -1); + continue; + } else if (edge == -2) { // edge == -2,表示处理完当前节点的重儿子,回到了当前节点 + edge = head[first]; + } else { // edge >= 0, 继续处理其他的边 + 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 up(int i) { + int l = i << 1, r = i << 1 | 1; + max[i] = Math.max(max[l], max[r]); + min[i] = Math.min(min[l], min[r]); + lprofit[i] = Math.max(Math.max(lprofit[l], lprofit[r]), max[r] - min[l]); + rprofit[i] = Math.max(Math.max(rprofit[l], rprofit[r]), max[l] - min[r]); + } + + public static void lazy(int i, int v) { + max[i] += v; + min[i] += v; + addTag[i] += v; + } + + public static void down(int i) { + if (addTag[i] != 0) { + lazy(i << 1, addTag[i]); + lazy(i << 1 | 1, addTag[i]); + addTag[i] = 0; + } + } + + public static void build(int l, int r, int i) { + if (l == r) { + max[i] = min[i] = arr[seg[l]]; + } else { + int mid = (l + r) / 2; + build(l, mid, i << 1); + build(mid + 1, r, i << 1 | 1); + up(i); + } + } + + public static void add(int jobl, int jobr, int jobv, int l, int r, int i) { + if (jobl <= l && r <= jobr) { + lazy(i, jobv); + } else { + down(i); + int mid = (l + r) / 2; + if (jobl <= mid) { + add(jobl, jobr, jobv, l, mid, i << 1); + } + if (jobr > mid) { + add(jobl, jobr, jobv, mid + 1, r, i << 1 | 1); + } + up(i); + } + } + + public static void merge(int[] ans, int rmax, int rmin, int rlpro, int rrpro) { + int lmax = ans[0]; + int lmin = ans[1]; + int llpro = ans[2]; + int lrpro = ans[3]; + ans[0] = Math.max(lmax, rmax); + ans[1] = Math.min(lmin, rmin); + ans[2] = Math.max(Math.max(llpro, rlpro), rmax - lmin); + ans[3] = Math.max(Math.max(lrpro, rrpro), lmax - rmin); + } + + public static void query(int[] ans, int jobl, int jobr, int l, int r, int i) { + if (jobl <= l && r <= jobr) { + merge(ans, max[i], min[i], lprofit[i], rprofit[i]); + } else { + down(i); + int mid = (l + r) / 2; + if (jobl <= mid) { + query(ans, jobl, jobr, l, mid, i << 1); + } + if (jobr > mid) { + query(ans, jobl, jobr, mid + 1, r, i << 1 | 1); + } + } + } + + public static int[] query(int jobl, int jobr) { + int[] ans = new int[] { -INF, INF, 0, 0 }; + query(ans, jobl, jobr, 1, n, 1); + return ans; + } + + public static int compute(int x, int y, int v) { + int tmpx = x, tmpy = y; + int[] xpath = new int[] { -INF, INF, 0, 0 }; + int[] ypath = new int[] { -INF, INF, 0, 0 }; + while (top[x] != top[y]) { + if (dep[top[x]] <= dep[top[y]]) { + int[] cur = query(dfn[top[y]], dfn[y]); + merge(cur, ypath[0], ypath[1], ypath[2], ypath[3]); + ypath = cur; + y = fa[top[y]]; + } else { + int[] cur = query(dfn[top[x]], dfn[x]); + merge(cur, xpath[0], xpath[1], xpath[2], xpath[3]); + xpath = cur; + x = fa[top[x]]; + } + } + if (dep[x] <= dep[y]) { + int[] cur = query(dfn[x], dfn[y]); + merge(cur, ypath[0], ypath[1], ypath[2], ypath[3]); + ypath = cur; + } else { + int[] cur = query(dfn[y], dfn[x]); + merge(cur, xpath[0], xpath[1], xpath[2], xpath[3]); + xpath = cur; + } + int ans = Math.max(Math.max(xpath[3], ypath[2]), ypath[0] - xpath[1]); + x = tmpx; + y = tmpy; + while (top[x] != top[y]) { + if (dep[top[x]] <= dep[top[y]]) { + add(dfn[top[y]], dfn[y], v, 1, n, 1); + y = fa[top[y]]; + } else { + add(dfn[top[x]], dfn[x], v, 1, n, 1); + x = fa[top[x]]; + } + } + add(Math.min(dfn[x], dfn[y]), Math.max(dfn[x], dfn[y]), v, 1, n, 1); + return ans; + } + + 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; + for (int i = 1; i <= n; i++) { + in.nextToken(); + arr[i] = (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); + } + dfs3(); // dfs3() 等同于 dfs1(1, 0),调用迭代版防止爆栈 + dfs4(); // dfs4() 等同于 dfs2(1, 1),调用迭代版防止爆栈 + build(1, n, 1); + in.nextToken(); + m = (int) in.nval; + for (int i = 1, x, y, v; i <= m; i++) { + in.nextToken(); + x = (int) in.nval; + in.nextToken(); + y = (int) in.nval; + in.nextToken(); + v = (int) in.nval; + out.println(compute(x, y, v)); + } + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class161/Code06_Travel2.java b/src/class161/Code06_Travel2.java new file mode 100644 index 000000000..be5e8c724 --- /dev/null +++ b/src/class161/Code06_Travel2.java @@ -0,0 +1,239 @@ +package class161; + +// 旅游,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P3976 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 50001; +//const int INF = 1000000001; +//int n, m; +//int arr[MAXN]; +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int cntg = 0; +//int fa[MAXN]; +//int dep[MAXN]; +//int siz[MAXN]; +//int son[MAXN]; +//int top[MAXN]; +//int dfn[MAXN]; +//int seg[MAXN]; +//int cntd = 0; +//int maxv[MAXN << 2]; +//int minv[MAXN << 2]; +//int lprofit[MAXN << 2]; +//int rprofit[MAXN << 2]; +//int addTag[MAXN << 2]; +// +//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]; e > 0; e = nxt[e]) { +// int v = to[e]; +// if (v != f) { +// dfs1(v, u); +// } +// } +// for (int e = head[u]; e > 0; e = nxt[e]) { +// int 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; +// dfn[u] = ++cntd; +// seg[cntd] = u; +// if (son[u] == 0) { +// return; +// } +// dfs2(son[u], t); +// for (int e = head[u]; e > 0; e = nxt[e]) { +// int v = to[e]; +// if (v != fa[u] && v != son[u]) { +// dfs2(v, v); +// } +// } +//} +// +//void up(int i) { +// int l = i << 1; +// int r = i << 1 | 1; +// maxv[i] = max(maxv[l], maxv[r]); +// minv[i] = min(minv[l], minv[r]); +// lprofit[i] = max({lprofit[l], lprofit[r], maxv[r] - minv[l]}); +// rprofit[i] = max({rprofit[l], rprofit[r], maxv[l] - minv[r]}); +//} +// +//void lazy(int i, int v) { +// maxv[i] += v; +// minv[i] += v; +// addTag[i] += v; +//} +// +//void down(int i) { +// if (addTag[i] != 0) { +// lazy(i << 1, addTag[i]); +// lazy(i << 1 | 1, addTag[i]); +// addTag[i] = 0; +// } +//} +// +//void build(int l, int r, int i) { +// if (l == r) { +// maxv[i] = minv[i] = arr[seg[l]]; +// } else { +// int mid = (l + r) >> 1; +// build(l, mid, i << 1); +// build(mid + 1, r, i << 1 | 1); +// up(i); +// } +//} +// +//void add(int jobl, int jobr, int jobv, int l, int r, int i) { +// if (jobl <= l && r <= jobr) { +// lazy(i, jobv); +// } else { +// down(i); +// 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); +// } +// up(i); +// } +//} +// +//void merge(int ans[], int rmax, int rmin, int rlpro, int rrpro) { +// int lmax = ans[0]; +// int lmin = ans[1]; +// int llpro = ans[2]; +// int lrpro = ans[3]; +// ans[0] = max(lmax, rmax); +// ans[1] = min(lmin, rmin); +// ans[2] = max({llpro, rlpro, rmax - lmin}); +// ans[3] = max({lrpro, rrpro, lmax - rmin}); +//} +// +//void query(int ans[], int jobl, int jobr, int l, int r, int i) { +// if (jobl <= l && r <= jobr) { +// merge(ans, maxv[i], minv[i], lprofit[i], rprofit[i]); +// } else { +// down(i); +// int mid = (l + r) >> 1; +// if (jobl <= mid) { +// query(ans, jobl, jobr, l, mid, i << 1); +// } +// if (jobr > mid) { +// query(ans, jobl, jobr, mid + 1, r, i << 1 | 1); +// } +// } +//} +// +//void query(int ans[], int jobl, int jobr) { +// ans[0] = -INF; +// ans[1] = INF; +// ans[2] = 0; +// ans[3] = 0; +// query(ans, jobl, jobr, 1, n, 1); +//} +// +//int compute(int x, int y, int v) { +// int tmpx = x; +// int tmpy = y; +// int xpath[4] = {-INF, INF, 0, 0}; +// int ypath[4] = {-INF, INF, 0, 0}; +// while (top[x] != top[y]) { +// if (dep[top[x]] <= dep[top[y]]) { +// int cur[4]; +// query(cur, dfn[top[y]], dfn[y]); +// merge(cur, ypath[0], ypath[1], ypath[2], ypath[3]); +// for (int i = 0; i < 4; i++) { +// ypath[i] = cur[i]; +// } +// y = fa[top[y]]; +// } else { +// int cur[4]; +// query(cur, dfn[top[x]], dfn[x]); +// merge(cur, xpath[0], xpath[1], xpath[2], xpath[3]); +// for (int i = 0; i < 4; i++) { +// xpath[i] = cur[i]; +// } +// x = fa[top[x]]; +// } +// } +// if (dep[x] <= dep[y]) { +// int cur[4]; +// query(cur, dfn[x], dfn[y]); +// merge(cur, ypath[0], ypath[1], ypath[2], ypath[3]); +// for (int i = 0; i < 4; i++) { +// ypath[i] = cur[i]; +// } +// } else { +// int cur[4]; +// query(cur, dfn[y], dfn[x]); +// merge(cur, xpath[0], xpath[1], xpath[2], xpath[3]); +// for (int i = 0; i < 4; i++) { +// xpath[i] = cur[i]; +// } +// } +// int ans = max({xpath[3], ypath[2], ypath[0] - xpath[1]}); +// x = tmpx; +// y = tmpy; +// while (top[x] != top[y]) { +// if (dep[top[x]] <= dep[top[y]]) { +// add(dfn[top[y]], dfn[y], v, 1, n, 1); +// y = fa[top[y]]; +// } else { +// add(dfn[top[x]], dfn[x], v, 1, n, 1); +// x = fa[top[x]]; +// } +// } +// add(min(dfn[x], dfn[y]), max(dfn[x], dfn[y]), v, 1, n, 1); +// return ans; +//} +// +//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 = 1; i < n; i++) { +// int u, v; +// cin >> u >> v; +// addEdge(u, v); +// addEdge(v, u); +// } +// dfs1(1, 0); +// dfs2(1, 1); +// build(1, n, 1); +// cin >> m; +// for (int i = 1; i <= m; i++) { +// int x, y, v; +// cin >> x >> y >> v; +// cout << compute(x, y, v) << "\n"; +// } +// return 0; +//} \ No newline at end of file From af34c3f42d28c5570623f2465b338ac0842173f7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 27 Feb 2025 16:28:26 +0800 Subject: [PATCH 0732/2029] modify code --- src/class161/Code06_Travel1.java | 33 +++++++++++++++++++++----------- src/class161/Code06_Travel2.java | 13 +++++-------- 2 files changed, 27 insertions(+), 19 deletions(-) diff --git a/src/class161/Code06_Travel1.java b/src/class161/Code06_Travel1.java index 1cf6f4fd2..a9cb7cb6f 100644 --- a/src/class161/Code06_Travel1.java +++ b/src/class161/Code06_Travel1.java @@ -257,37 +257,48 @@ public static void query(int[] ans, int jobl, int jobr, int l, int r, int i) { } } - public static int[] query(int jobl, int jobr) { - int[] ans = new int[] { -INF, INF, 0, 0 }; + public static void query(int[] ans, int jobl, int jobr) { + ans[0] = -INF; + ans[1] = INF; + ans[2] = 0; + ans[3] = 0; query(ans, jobl, jobr, 1, n, 1); - return ans; } public static int compute(int x, int y, int v) { int tmpx = x, tmpy = y; int[] xpath = new int[] { -INF, INF, 0, 0 }; int[] ypath = new int[] { -INF, INF, 0, 0 }; + int[] cur = new int[4]; while (top[x] != top[y]) { if (dep[top[x]] <= dep[top[y]]) { - int[] cur = query(dfn[top[y]], dfn[y]); + query(cur, dfn[top[y]], dfn[y]); merge(cur, ypath[0], ypath[1], ypath[2], ypath[3]); - ypath = cur; + for (int i = 0; i <= 3; i++) { + ypath[i] = cur[i]; + } y = fa[top[y]]; } else { - int[] cur = query(dfn[top[x]], dfn[x]); + query(cur, dfn[top[x]], dfn[x]); merge(cur, xpath[0], xpath[1], xpath[2], xpath[3]); - xpath = cur; + for (int i = 0; i <= 3; i++) { + xpath[i] = cur[i]; + } x = fa[top[x]]; } } if (dep[x] <= dep[y]) { - int[] cur = query(dfn[x], dfn[y]); + query(cur, dfn[x], dfn[y]); merge(cur, ypath[0], ypath[1], ypath[2], ypath[3]); - ypath = cur; + for (int i = 0; i <= 3; i++) { + ypath[i] = cur[i]; + } } else { - int[] cur = query(dfn[y], dfn[x]); + query(cur, dfn[y], dfn[x]); merge(cur, xpath[0], xpath[1], xpath[2], xpath[3]); - xpath = cur; + for (int i = 0; i <= 3; i++) { + xpath[i] = cur[i]; + } } int ans = Math.max(Math.max(xpath[3], ypath[2]), ypath[0] - xpath[1]); x = tmpx; diff --git a/src/class161/Code06_Travel2.java b/src/class161/Code06_Travel2.java index be5e8c724..9b5312e59 100644 --- a/src/class161/Code06_Travel2.java +++ b/src/class161/Code06_Travel2.java @@ -163,37 +163,34 @@ // int tmpy = y; // int xpath[4] = {-INF, INF, 0, 0}; // int ypath[4] = {-INF, INF, 0, 0}; +// int cur[4]; // while (top[x] != top[y]) { // if (dep[top[x]] <= dep[top[y]]) { -// int cur[4]; // query(cur, dfn[top[y]], dfn[y]); // merge(cur, ypath[0], ypath[1], ypath[2], ypath[3]); -// for (int i = 0; i < 4; i++) { +// for (int i = 0; i <= 3; i++) { // ypath[i] = cur[i]; // } // y = fa[top[y]]; // } else { -// int cur[4]; // query(cur, dfn[top[x]], dfn[x]); // merge(cur, xpath[0], xpath[1], xpath[2], xpath[3]); -// for (int i = 0; i < 4; i++) { +// for (int i = 0; i <= 3; i++) { // xpath[i] = cur[i]; // } // x = fa[top[x]]; // } // } // if (dep[x] <= dep[y]) { -// int cur[4]; // query(cur, dfn[x], dfn[y]); // merge(cur, ypath[0], ypath[1], ypath[2], ypath[3]); -// for (int i = 0; i < 4; i++) { +// for (int i = 0; i <= 3; i++) { // ypath[i] = cur[i]; // } // } else { -// int cur[4]; // query(cur, dfn[y], dfn[x]); // merge(cur, xpath[0], xpath[1], xpath[2], xpath[3]); -// for (int i = 0; i < 4; i++) { +// for (int i = 0; i <= 3; i++) { // xpath[i] = cur[i]; // } // } From 43f11bb2d74c48779836b9a95f22c6f4fbb5bbe2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 27 Feb 2025 16:33:55 +0800 Subject: [PATCH 0733/2029] modify code --- src/class161/{Code06_Travel1.java => Code06_Tourism1.java} | 2 +- src/class161/{Code06_Travel2.java => Code06_Tourism2.java} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/class161/{Code06_Travel1.java => Code06_Tourism1.java} (99%) rename src/class161/{Code06_Travel2.java => Code06_Tourism2.java} (100%) diff --git a/src/class161/Code06_Travel1.java b/src/class161/Code06_Tourism1.java similarity index 99% rename from src/class161/Code06_Travel1.java rename to src/class161/Code06_Tourism1.java index a9cb7cb6f..8a229252e 100644 --- a/src/class161/Code06_Travel1.java +++ b/src/class161/Code06_Tourism1.java @@ -11,7 +11,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code06_Travel1 { +public class Code06_Tourism1 { public static int MAXN = 50001; diff --git a/src/class161/Code06_Travel2.java b/src/class161/Code06_Tourism2.java similarity index 100% rename from src/class161/Code06_Travel2.java rename to src/class161/Code06_Tourism2.java From 9e52032fc8eab0d45801b4af6a1f33206e87e034 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 27 Feb 2025 16:37:19 +0800 Subject: [PATCH 0734/2029] modify code --- src/class161/Code06_Tourism2.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class161/Code06_Tourism2.java b/src/class161/Code06_Tourism2.java index 9b5312e59..471b2f771 100644 --- a/src/class161/Code06_Tourism2.java +++ b/src/class161/Code06_Tourism2.java @@ -137,7 +137,7 @@ // //void query(int ans[], int jobl, int jobr, int l, int r, int i) { // if (jobl <= l && r <= jobr) { -// merge(ans, maxv[i], minv[i], lprofit[i], rprofit[i]); +// merge(ans, maxv[i], minv[i], lprofit[i], rprofit[i]); // } else { // down(i); // int mid = (l + r) >> 1; From 08db5816b17705cb700cc28b569134e2dbff126b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 27 Feb 2025 22:19:11 +0800 Subject: [PATCH 0735/2029] modify code --- src/class161/Code07_Network1.java | 369 ++++++++++++++++++++++++++++++ src/class161/Code07_Network2.java | 239 +++++++++++++++++++ 2 files changed, 608 insertions(+) create mode 100644 src/class161/Code07_Network1.java create mode 100644 src/class161/Code07_Network2.java diff --git a/src/class161/Code07_Network1.java b/src/class161/Code07_Network1.java new file mode 100644 index 000000000..808aa5a71 --- /dev/null +++ b/src/class161/Code07_Network1.java @@ -0,0 +1,369 @@ +package class161; + +// 网络,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P3250 +// 提交以下的code,提交时请把类名改成"Main",会有一个测试用例超时 +// 因为这道题根据C++的运行时间,制定通过标准,根本没考虑java的用户 +// 本节课Code07_Network2文件就是C++的实现 +// 两个版本的逻辑完全一样,C++版本可以通过所有测试 + +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 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[] son = new int[MAXN]; + + public static int[] top = new int[MAXN]; + + public static int[] dfn = new int[MAXN]; + + public static int[] seg = new int[MAXN]; + + public static int cntd = 0; + + public static int[] tree = new int[MAXN]; + + public static int[][] events = new int[MAXM][4]; + + public static int[][] levent = new int[MAXM][4]; + + public static int[][] revent = new int[MAXM][4]; + + public static int[] sorted = new int[MAXM]; + + public static int s = 0; + + public static int[] ans = new int[MAXM]; + + public static int cntans = 0; + + 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 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; + 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; + } + } + } + } + + // 递归版,C++可以通过,java会爆栈 + public static void dfs2(int u, int t) { + top[u] = t; + dfn[u] = ++cntd; + seg[cntd] = 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) { // edge == -1,表示第一次来到当前节点,并且先处理重儿子 + top[first] = second; + dfn[first] = ++cntd; + seg[cntd] = first; + if (son[first] == 0) { + continue; + } + push(first, second, -2); + push(son[first], second, -1); + continue; + } else if (edge == -2) { // edge == -2,表示处理完当前节点的重儿子,回到了当前节点 + edge = head[first]; + } else { // edge >= 0, 继续处理其他的边 + 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 add(int i, int v) { + for (; i <= n; i += i & -i) { + tree[i] += 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 sum = 0; + for (; i > 0; i -= i & -i) { + sum += tree[i]; + } + return sum; + } + + public static void pathAdd(int x, int y, int v) { + while (top[x] != top[y]) { + if (dep[top[x]] <= dep[top[y]]) { + add(dfn[top[y]], dfn[y], v); + y = fa[top[y]]; + } else { + add(dfn[top[x]], dfn[x], v); + x = fa[top[x]]; + } + } + add(Math.min(dfn[x], dfn[y]), Math.max(dfn[x], dfn[y]), v); + } + + public static void copyEvent(int[] event1, int[] event2) { + event1[0] = event2[0]; + event1[1] = event2[1]; + event1[2] = event2[2]; + event1[3] = event2[3]; + } + + public static void prepare() { + dfs3(); // dfs3() 等同于 dfs1(1, 0),调用迭代版防止爆栈 + dfs4(); // dfs4() 等同于 dfs2(1, 1),调用迭代版防止爆栈 + 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) { + copyEvent(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 (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 left = 0, right = 0, activeCnt = 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); + copyEvent(revent[++right], events[i]); + activeCnt++; + } else { + copyEvent(levent[++left], events[i]); + } + } else if (events[i][0] == -1) { + if (events[i][3] > impm) { + pathAdd(events[i][1], events[i][2], -1); + copyEvent(revent[++right], events[i]); + activeCnt--; + } else { + copyEvent(levent[++left], events[i]); + } + } else { + int sum = query(dfn[events[i][1]]); + if (sum != activeCnt) { + copyEvent(revent[++right], events[i]); + } else { + copyEvent(levent[++left], events[i]); + } + } + } + for (int i = 1; i <= right; i++) { + if (revent[i][0] == 0) { + if (revent[i][3] > impm) { + pathAdd(revent[i][1], revent[i][2], -1); + } + } else if (revent[i][0] == -1 && revent[i][3] > impm) { + pathAdd(revent[i][1], revent[i][2], 1); + } + } + for (int i = 1; i <= left; i++) { + copyEvent(events[evtl + i - 1], levent[i]); + } + for (int i = 1; i <= right; i++) { + copyEvent(events[evtl + left + i - 1], revent[i]); + } + compute(evtl, evtl + left - 1, impl, impm); + compute(evtl + left, 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(); + } + +} diff --git a/src/class161/Code07_Network2.java b/src/class161/Code07_Network2.java new file mode 100644 index 000000000..dd878c8e8 --- /dev/null +++ b/src/class161/Code07_Network2.java @@ -0,0 +1,239 @@ +package class161; + +// 网络,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P3250 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +//const int MAXM = 200001; +//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 son[MAXN]; +//int top[MAXN]; +//int dfn[MAXN]; +//int seg[MAXN]; +//int cntd = 0; +//int tree[MAXN]; +//int events[MAXM][4]; +//int levent[MAXM][4]; +//int revent[MAXM][4]; +//int sorted[MAXM]; +//int s = 0; +//int ans[MAXM]; +//int cntans = 0; +// +//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 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]; e > 0; e = nxt[e]) { +// int v = to[e]; +// if (v != f) { +// dfs1(v, u); +// } +// } +// for (int e = head[u]; e > 0; e = nxt[e]) { +// int 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; +// dfn[u] = ++cntd; +// seg[cntd] = u; +// if (son[u] == 0) { +// return; +// } +// dfs2(son[u], t); +// for (int e = head[u]; e > 0; e = nxt[e]) { +// int v = to[e]; +// if (v != fa[u] && v != son[u]) { +// dfs2(v, v); +// } +// } +//} +// +//void add(int i, int v) { +// for (; i <= n; i += i & -i) { +// tree[i] += v; +// } +//} +// +//void add(int l, int r, int v) { +// add(l, v); +// add(r + 1, -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) { +// while (top[x] != top[y]) { +// if (dep[top[x]] <= dep[top[y]]) { +// add(dfn[top[y]], dfn[y], v); +// y = fa[top[y]]; +// } else { +// add(dfn[top[x]], dfn[x], v); +// x = fa[top[x]]; +// } +// } +// add(min(dfn[x], dfn[y]), max(dfn[x], dfn[y]), v); +//} +// +//void copyEvent(int *event1, int *event2) { +// event1[0] = event2[0]; +// event1[1] = event2[1]; +// event1[2] = event2[2]; +// event1[3] = event2[3]; +//} +// +//void prepare() { +// dfs1(1, 0); +// dfs2(1, 1); +// 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) { +// copyEvent(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 (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 left = 0, right = 0, activeCnt = 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); +// copyEvent(revent[++right], events[i]); +// activeCnt++; +// } else { +// copyEvent(levent[++left], events[i]); +// } +// } else if (events[i][0] == -1) { +// if (events[i][3] > impm) { +// pathAdd(events[i][1], events[i][2], -1); +// copyEvent(revent[++right], events[i]); +// activeCnt--; +// } else { +// copyEvent(levent[++left], events[i]); +// } +// } else { +// int sum = query(dfn[events[i][1]]); +// if (sum != activeCnt) { +// copyEvent(revent[++right], events[i]); +// } else { +// copyEvent(levent[++left], events[i]); +// } +// } +// } +// for (int i = 1; i <= right; i++) { +// if (revent[i][0] == 0) { +// if (revent[i][3] > impm) { +// pathAdd(revent[i][1], revent[i][2], -1); +// } +// } else if (revent[i][0] == -1 && revent[i][3] > impm) { +// pathAdd(revent[i][1], revent[i][2], 1); +// } +// } +// for (int i = 1; i <= left; i++) { +// copyEvent(events[evtl + i - 1], levent[i]); +// } +// for (int i = 1; i <= right; i++) { +// copyEvent(events[evtl + left + i - 1], revent[i]); +// } +// compute(evtl, evtl + left - 1, impl, impm); +// compute(evtl + left, evtr, impm + 1, impr); +// } +//} +// +//int main() { +// scanf("%d%d", &n, &m); +// for(int i = 1; i < n; i++) { +// int u, v; +// scanf("%d%d", &u, &v); +// addEdge(u, v); +// addEdge(v, u); +// } +// for(int i = 1; i <= m; i++) { +// scanf("%d", &events[i][0]); +// scanf("%d", &events[i][1]); +// if(events[i][0] == 0) { +// scanf("%d%d", &events[i][2], &events[i][3]); +// } +// } +// prepare(); +// compute(1, m, 0, s); +// for(int i = 1; i <= cntans; i++) { +// printf("%d\n", sorted[ans[i]]); +// } +// return 0; +//} \ No newline at end of file From 6bbafd6c8c162f1db1553c32dec5f4b4004841fd Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 27 Feb 2025 22:24:59 +0800 Subject: [PATCH 0736/2029] modify code --- src/class161/Code07_Network1.java | 20 ++++++++++---------- src/class161/Code07_Network2.java | 20 ++++++++++---------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/class161/Code07_Network1.java b/src/class161/Code07_Network1.java index 808aa5a71..ac0f89291 100644 --- a/src/class161/Code07_Network1.java +++ b/src/class161/Code07_Network1.java @@ -237,7 +237,7 @@ public static void pathAdd(int x, int y, int v) { add(Math.min(dfn[x], dfn[y]), Math.max(dfn[x], dfn[y]), v); } - public static void copyEvent(int[] event1, int[] event2) { + public static void clone(int[] event1, int[] event2) { event1[0] = event2[0]; event1[1] = event2[1]; event1[2] = event2[2]; @@ -265,7 +265,7 @@ public static void prepare() { if (events[i][0] == 0) { events[i][3] = kth(events[i][3]); } else if (events[i][0] == 1) { - copyEvent(events[i], events[events[i][1]]); + clone(events[i], events[events[i][1]]); events[i][0] = -1; } else { events[i][0] = ++cntans; @@ -287,25 +287,25 @@ public static void compute(int evtl, int evtr, int impl, int impr) { if (events[i][0] == 0) { if (events[i][3] > impm) { pathAdd(events[i][1], events[i][2], 1); - copyEvent(revent[++right], events[i]); + clone(revent[++right], events[i]); activeCnt++; } else { - copyEvent(levent[++left], events[i]); + clone(levent[++left], events[i]); } } else if (events[i][0] == -1) { if (events[i][3] > impm) { pathAdd(events[i][1], events[i][2], -1); - copyEvent(revent[++right], events[i]); + clone(revent[++right], events[i]); activeCnt--; } else { - copyEvent(levent[++left], events[i]); + clone(levent[++left], events[i]); } } else { int sum = query(dfn[events[i][1]]); if (sum != activeCnt) { - copyEvent(revent[++right], events[i]); + clone(revent[++right], events[i]); } else { - copyEvent(levent[++left], events[i]); + clone(levent[++left], events[i]); } } } @@ -319,10 +319,10 @@ public static void compute(int evtl, int evtr, int impl, int impr) { } } for (int i = 1; i <= left; i++) { - copyEvent(events[evtl + i - 1], levent[i]); + clone(events[evtl + i - 1], levent[i]); } for (int i = 1; i <= right; i++) { - copyEvent(events[evtl + left + i - 1], revent[i]); + clone(events[evtl + left + i - 1], revent[i]); } compute(evtl, evtl + left - 1, impl, impm); compute(evtl + left, evtr, impm + 1, impr); diff --git a/src/class161/Code07_Network2.java b/src/class161/Code07_Network2.java index dd878c8e8..96fcfe88b 100644 --- a/src/class161/Code07_Network2.java +++ b/src/class161/Code07_Network2.java @@ -123,7 +123,7 @@ // add(min(dfn[x], dfn[y]), max(dfn[x], dfn[y]), v); //} // -//void copyEvent(int *event1, int *event2) { +//void clone(int *event1, int *event2) { // event1[0] = event2[0]; // event1[1] = event2[1]; // event1[2] = event2[2]; @@ -151,7 +151,7 @@ // if (events[i][0] == 0) { // events[i][3] = kth(events[i][3]); // } else if (events[i][0] == 1) { -// copyEvent(events[i], events[events[i][1]]); +// clone(events[i], events[events[i][1]]); // events[i][0] = -1; // } else { // events[i][0] = ++cntans; @@ -173,25 +173,25 @@ // if (events[i][0] == 0) { // if (events[i][3] > impm) { // pathAdd(events[i][1], events[i][2], 1); -// copyEvent(revent[++right], events[i]); +// clone(revent[++right], events[i]); // activeCnt++; // } else { -// copyEvent(levent[++left], events[i]); +// clone(levent[++left], events[i]); // } // } else if (events[i][0] == -1) { // if (events[i][3] > impm) { // pathAdd(events[i][1], events[i][2], -1); -// copyEvent(revent[++right], events[i]); +// clone(revent[++right], events[i]); // activeCnt--; // } else { -// copyEvent(levent[++left], events[i]); +// clone(levent[++left], events[i]); // } // } else { // int sum = query(dfn[events[i][1]]); // if (sum != activeCnt) { -// copyEvent(revent[++right], events[i]); +// clone(revent[++right], events[i]); // } else { -// copyEvent(levent[++left], events[i]); +// clone(levent[++left], events[i]); // } // } // } @@ -205,10 +205,10 @@ // } // } // for (int i = 1; i <= left; i++) { -// copyEvent(events[evtl + i - 1], levent[i]); +// clone(events[evtl + i - 1], levent[i]); // } // for (int i = 1; i <= right; i++) { -// copyEvent(events[evtl + left + i - 1], revent[i]); +// clone(events[evtl + left + i - 1], revent[i]); // } // compute(evtl, evtl + left - 1, impl, impm); // compute(evtl + left, evtr, impm + 1, impr); From 0775ec5691593b135ab9d50d0a22f4469bb8eb90 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 28 Feb 2025 16:39:19 +0800 Subject: [PATCH 0737/2029] modify code --- src/class161/Code01_HeavyLightDecompositionLCA1.java | 4 ++++ src/class161/Code01_HeavyLightDecompositionLCA2.java | 4 ++++ src/class161/Code02_PathSumAndSubtreeSum1.java | 10 ++++++++++ src/class161/Code02_PathSumAndSubtreeSum2.java | 10 ++++++++++ src/class161/Code03_PathMaxAndPathSum1.java | 8 ++++++++ src/class161/Code03_PathMaxAndPathSum2.java | 8 ++++++++ src/class161/Code04_PackageManager1.java | 7 +++++++ src/class161/Code04_PackageManager2.java | 7 +++++++ src/class161/Code05_Coloring1.java | 8 ++++++++ src/class161/Code05_Coloring2.java | 8 ++++++++ src/class161/Code06_Tourism1.java | 8 ++++++++ src/class161/Code06_Tourism2.java | 8 ++++++++ src/class161/Code07_Network1.java | 4 ---- src/class161/Code07_Network2.java | 2 -- 14 files changed, 90 insertions(+), 6 deletions(-) diff --git a/src/class161/Code01_HeavyLightDecompositionLCA1.java b/src/class161/Code01_HeavyLightDecompositionLCA1.java index 6ff87e69f..b5a1e500e 100644 --- a/src/class161/Code01_HeavyLightDecompositionLCA1.java +++ b/src/class161/Code01_HeavyLightDecompositionLCA1.java @@ -1,6 +1,10 @@ package class161; // 树链剖分解决LCA查询,java版 +// 一共有n个节点,n-1条边,节点连成一棵树,给定头节点编号root +// 一共有m条查询,每条查询给定a和b,打印a和b的最低公共祖先 +// 请用树链剖分的方式实现 +// 1 <= n、m <= 5 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3379 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class161/Code01_HeavyLightDecompositionLCA2.java b/src/class161/Code01_HeavyLightDecompositionLCA2.java index 033ccc8d0..b784ad703 100644 --- a/src/class161/Code01_HeavyLightDecompositionLCA2.java +++ b/src/class161/Code01_HeavyLightDecompositionLCA2.java @@ -1,6 +1,10 @@ package class161; // 树链剖分解决LCA查询,C++版 +// 一共有n个节点,n-1条边,节点连成一棵树,给定头节点编号root +// 一共有m条查询,每条查询给定a和b,打印a和b的最低公共祖先 +// 请用树链剖分的方式实现 +// 1 <= n、m <= 5 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P3379 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class161/Code02_PathSumAndSubtreeSum1.java b/src/class161/Code02_PathSumAndSubtreeSum1.java index ed8c04e59..8959fb90c 100644 --- a/src/class161/Code02_PathSumAndSubtreeSum1.java +++ b/src/class161/Code02_PathSumAndSubtreeSum1.java @@ -1,6 +1,16 @@ package class161; // 路径累加和与子树累加和,java版 +// 一共有n个节点,n-1条边,节点连成一棵树 +// 给定头节点编号root,给定数字MOD +// 一共有m条操作,每种操作是如下4种类型中的一种 +// 操作 1 x y z : x到y的路径上,每个节点值增加v +// 操作 2 x y : x到y的路径上,打印所有节点值的累加和 % MOD +// 操作 3 x y : x为头的子树上,每个节点值增加y +// 操作 4 x : x为头的子树上,打印所有节点值的累加和 % MOD +// 1 <= n、m <= 10^5 +// 1 <= MOD <= 2^30 +// 输入的值都为int类型 // 测试链接 : https://www.luogu.com.cn/problem/P3384 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class161/Code02_PathSumAndSubtreeSum2.java b/src/class161/Code02_PathSumAndSubtreeSum2.java index 3cf25f725..e7b8af442 100644 --- a/src/class161/Code02_PathSumAndSubtreeSum2.java +++ b/src/class161/Code02_PathSumAndSubtreeSum2.java @@ -1,6 +1,16 @@ package class161; // 路径累加和与子树累加和,C++版 +// 一共有n个节点,n-1条边,节点连成一棵树 +// 给定头节点编号root,给定数字MOD +// 一共有m条操作,每种操作是如下4种类型中的一种 +// 操作 1 x y z : x到y的路径上,每个节点值增加v +// 操作 2 x y : x到y的路径上,打印所有节点值的累加和 % MOD +// 操作 3 x y : x为头的子树上,每个节点值增加y +// 操作 4 x : x为头的子树上,打印所有节点值的累加和 % MOD +// 1 <= n、m <= 10^5 +// 1 <= MOD <= 2^30 +// 输入的值都为int类型 // 测试链接 : https://www.luogu.com.cn/problem/P3384 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class161/Code03_PathMaxAndPathSum1.java b/src/class161/Code03_PathMaxAndPathSum1.java index ac40502e6..f77268727 100644 --- a/src/class161/Code03_PathMaxAndPathSum1.java +++ b/src/class161/Code03_PathMaxAndPathSum1.java @@ -1,6 +1,14 @@ package class161; // 路径最大值与路径累加和,java版 +// 一共有n个节点,n-1条边,节点连成一棵树,每个节点给定权值 +// 一共有m条操作,每种操作是如下3种类型中的一种 +// 操作 CHANGE x y : x的权值修改为y +// 操作 QMAX u v : x到y的路径上,打印节点值的最大值 +// 操作 QSUM u v : x到y的路径上,打印节点值的累加和 +// 1 <= n <= 3 * 10^4 +// 0 <= m <= 2 * 10^5 +// -30000 <= 节点权值 <= +30000 // 测试链接 : https://www.luogu.com.cn/problem/P2590 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class161/Code03_PathMaxAndPathSum2.java b/src/class161/Code03_PathMaxAndPathSum2.java index 3ce3f5ce8..3fd35e15c 100644 --- a/src/class161/Code03_PathMaxAndPathSum2.java +++ b/src/class161/Code03_PathMaxAndPathSum2.java @@ -1,6 +1,14 @@ package class161; // 路径最大值与路径累加和,C++版 +// 一共有n个节点,n-1条边,节点连成一棵树,每个节点给定权值 +// 一共有m条操作,每种操作是如下3种类型中的一种 +// 操作 CHANGE x y : x的权值修改为y +// 操作 QMAX u v : x到y的路径上,打印节点值的最大值 +// 操作 QSUM u v : x到y的路径上,打印节点值的累加和 +// 1 <= n <= 3 * 10^4 +// 0 <= m <= 2 * 10^5 +// -30000 <= 节点权值 <= +30000 // 测试链接 : https://www.luogu.com.cn/problem/P2590 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class161/Code04_PackageManager1.java b/src/class161/Code04_PackageManager1.java index 7f76a6325..bd9251b8d 100644 --- a/src/class161/Code04_PackageManager1.java +++ b/src/class161/Code04_PackageManager1.java @@ -1,6 +1,13 @@ package class161; // 软件包管理器,java版 +// 一共有n个软件,编号0~n-1,0号软件不依赖任何软件,其他每个软件都仅依赖一个软件 +// 依赖关系由数组形式给出,题目保证不会出现循环依赖 +// 一开始所有软件都是没有安装的,如果a依赖b,那么安装a需要安装b,同时卸载b需要卸载a +// 一共有m条操作,每种操作是如下2种类型中的一种 +// 操作 install x : 安装x,如果x已经安装打印0,否则打印有多少个软件的状态需要改变 +// 操作 uninstall x : 卸载x,如果x没有安装打印0,否则打印有多少个软件的状态需要改变 +// 1 <= n、m <= 10^6 // 测试链接 : https://www.luogu.com.cn/problem/P2146 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class161/Code04_PackageManager2.java b/src/class161/Code04_PackageManager2.java index 8d9b34677..d9b0dbed5 100644 --- a/src/class161/Code04_PackageManager2.java +++ b/src/class161/Code04_PackageManager2.java @@ -1,6 +1,13 @@ package class161; // 软件包管理器,C++版 +// 一共有n个软件,编号0~n-1,0号软件不依赖任何软件,其他每个软件都仅依赖一个软件 +// 依赖关系由数组形式给出,题目保证不会出现循环依赖 +// 一开始所有软件都是没有安装的,如果a依赖b,那么安装a需要安装b,同时卸载b需要卸载a +// 一共有m条操作,每种操作是如下2种类型中的一种 +// 操作 install x : 安装x,如果x已经安装打印0,否则打印有多少个软件的状态需要改变 +// 操作 uninstall x : 卸载x,如果x没有安装打印0,否则打印有多少个软件的状态需要改变 +// 1 <= n、m <= 10^6 // 测试链接 : https://www.luogu.com.cn/problem/P2146 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class161/Code05_Coloring1.java b/src/class161/Code05_Coloring1.java index 14d55ad04..fd539ebce 100644 --- a/src/class161/Code05_Coloring1.java +++ b/src/class161/Code05_Coloring1.java @@ -1,6 +1,14 @@ package class161; // 染色,java版 +// 一共有n个节点,n-1条边,节点连成一棵树,每个节点给定初始颜色值 +// 连续相同颜色被认为是一段,变化了就认为是另一段 +// 比如,112221,有三个颜色段,分别为 11、222、1 +// 一共有m条操作,每种操作是如下2种类型中的一种 +// 操作 C x y z : x到y的路径上,每个节点的颜色都改为z +// 操作 Q x y : x到y的路径上,打印有几个颜色段 +// 1 <= n、m <= 10^5 +// 1 <= 任何时候的颜色值 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P2486 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class161/Code05_Coloring2.java b/src/class161/Code05_Coloring2.java index 0e3b16528..72184109c 100644 --- a/src/class161/Code05_Coloring2.java +++ b/src/class161/Code05_Coloring2.java @@ -1,6 +1,14 @@ package class161; // 染色,C++版 +// 一共有n个节点,n-1条边,节点连成一棵树,每个节点给定初始颜色值 +// 连续相同颜色被认为是一段,变化了就认为是另一段 +// 比如,112221,有三个颜色段,分别为 11、222、1 +// 一共有m条操作,每种操作是如下2种类型中的一种 +// 操作 C x y z : x到y的路径上,每个节点的颜色都改为z +// 操作 Q x y : x到y的路径上,打印有几个颜色段 +// 1 <= n、m <= 10^5 +// 1 <= 任何时候的颜色值 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P2486 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class161/Code06_Tourism1.java b/src/class161/Code06_Tourism1.java index 8a229252e..7b69823c6 100644 --- a/src/class161/Code06_Tourism1.java +++ b/src/class161/Code06_Tourism1.java @@ -1,6 +1,14 @@ package class161; // 旅游,java版 +// 一共有n个城市,n-1条边,城市连成一棵树,每个城市给定初始的宝石价格 +// 一共有m条操作,操作类型如下 +// 操作 x y v : 城市x到城市y的最短路途中,你可以选择一城买入宝石 +// 继续行进的过程中,再选一城卖出宝石,以此获得利润 +// 打印你能获得的最大利润,如果为负数,打印0 +// 当你结束旅途后,沿途所有城市的宝石价格增加v +// 1 <= n、m <= 5 * 10^4 +// 0 <= 任何时候的宝石价格 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P3976 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class161/Code06_Tourism2.java b/src/class161/Code06_Tourism2.java index 471b2f771..57057a6ee 100644 --- a/src/class161/Code06_Tourism2.java +++ b/src/class161/Code06_Tourism2.java @@ -1,6 +1,14 @@ package class161; // 旅游,C++版 +// 一共有n个城市,n-1条边,城市连成一棵树,每个城市给定初始的宝石价格 +// 一共有m条操作,操作类型如下 +// 操作 x y v : 城市x到城市y的最短路途中,你可以选择一城买入宝石 +// 继续行进的过程中,再选一城卖出宝石,以此获得利润 +// 打印你能获得的最大利润,如果为负数,打印0 +// 当你结束旅途后,沿途所有城市的宝石价格增加v +// 1 <= n、m <= 5 * 10^4 +// 0 <= 任何时候的宝石价格 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P3976 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class161/Code07_Network1.java b/src/class161/Code07_Network1.java index ac0f89291..e193f45ba 100644 --- a/src/class161/Code07_Network1.java +++ b/src/class161/Code07_Network1.java @@ -43,8 +43,6 @@ public class Code07_Network1 { public static int[] dfn = new int[MAXN]; - public static int[] seg = new int[MAXN]; - public static int cntd = 0; public static int[] tree = new int[MAXN]; @@ -110,7 +108,6 @@ public static void dfs1(int u, int f) { public static void dfs2(int u, int t) { top[u] = t; dfn[u] = ++cntd; - seg[cntd] = u; if (son[u] == 0) { return; } @@ -184,7 +181,6 @@ public static void dfs4() { if (edge == -1) { // edge == -1,表示第一次来到当前节点,并且先处理重儿子 top[first] = second; dfn[first] = ++cntd; - seg[cntd] = first; if (son[first] == 0) { continue; } diff --git a/src/class161/Code07_Network2.java b/src/class161/Code07_Network2.java index 96fcfe88b..b36570599 100644 --- a/src/class161/Code07_Network2.java +++ b/src/class161/Code07_Network2.java @@ -22,7 +22,6 @@ //int son[MAXN]; //int top[MAXN]; //int dfn[MAXN]; -//int seg[MAXN]; //int cntd = 0; //int tree[MAXN]; //int events[MAXM][4]; @@ -78,7 +77,6 @@ //void dfs2(int u, int t) { // top[u] = t; // dfn[u] = ++cntd; -// seg[cntd] = u; // if (son[u] == 0) { // return; // } From d9364088ebb1803e4075962c58b7188b50015f88 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 28 Feb 2025 16:52:37 +0800 Subject: [PATCH 0738/2029] modify code --- src/class161/Code07_Network1.java | 9 ++++----- src/class161/Code07_Network2.java | 9 ++++----- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/class161/Code07_Network1.java b/src/class161/Code07_Network1.java index e193f45ba..845768c17 100644 --- a/src/class161/Code07_Network1.java +++ b/src/class161/Code07_Network1.java @@ -306,11 +306,10 @@ public static void compute(int evtl, int evtr, int impl, int impr) { } } for (int i = 1; i <= right; i++) { - if (revent[i][0] == 0) { - if (revent[i][3] > impm) { - pathAdd(revent[i][1], revent[i][2], -1); - } - } else if (revent[i][0] == -1 && revent[i][3] > impm) { + if (revent[i][0] == 0 && revent[i][3] > impm) { + pathAdd(revent[i][1], revent[i][2], -1); + } + if (revent[i][0] == -1 && revent[i][3] > impm) { pathAdd(revent[i][1], revent[i][2], 1); } } diff --git a/src/class161/Code07_Network2.java b/src/class161/Code07_Network2.java index b36570599..80847fdfd 100644 --- a/src/class161/Code07_Network2.java +++ b/src/class161/Code07_Network2.java @@ -194,11 +194,10 @@ // } // } // for (int i = 1; i <= right; i++) { -// if (revent[i][0] == 0) { -// if (revent[i][3] > impm) { -// pathAdd(revent[i][1], revent[i][2], -1); -// } -// } else if (revent[i][0] == -1 && revent[i][3] > impm) { +// if (revent[i][0] == 0 && revent[i][3] > impm) { +// pathAdd(revent[i][1], revent[i][2], -1); +// } +// if (revent[i][0] == -1 && revent[i][3] > impm) { // pathAdd(revent[i][1], revent[i][2], 1); // } // } From e567c5bfe211aec266deac21a1edf8362a940851 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 28 Feb 2025 17:05:09 +0800 Subject: [PATCH 0739/2029] modify code --- src/class161/Code07_Network1.java | 40 +++++++++++++++---------------- src/class161/Code07_Network2.java | 40 +++++++++++++++---------------- 2 files changed, 40 insertions(+), 40 deletions(-) diff --git a/src/class161/Code07_Network1.java b/src/class161/Code07_Network1.java index 845768c17..ac7253f36 100644 --- a/src/class161/Code07_Network1.java +++ b/src/class161/Code07_Network1.java @@ -49,9 +49,9 @@ public class Code07_Network1 { public static int[][] events = new int[MAXM][4]; - public static int[][] levent = new int[MAXM][4]; + public static int[][] lset = new int[MAXM][4]; - public static int[][] revent = new int[MAXM][4]; + public static int[][] rset = new int[MAXM][4]; public static int[] sorted = new int[MAXM]; @@ -278,49 +278,49 @@ public static void compute(int evtl, int evtr, int impl, int impr) { } } else { int impm = (impl + impr) / 2; - int left = 0, right = 0, activeCnt = 0; + int lsize = 0, rsize = 0, activeCnt = 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(revent[++right], events[i]); + clone(rset[++rsize], events[i]); activeCnt++; } else { - clone(levent[++left], events[i]); + 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(revent[++right], events[i]); + clone(rset[++rsize], events[i]); activeCnt--; } else { - clone(levent[++left], events[i]); + clone(lset[++lsize], events[i]); } } else { int sum = query(dfn[events[i][1]]); if (sum != activeCnt) { - clone(revent[++right], events[i]); + clone(rset[++rsize], events[i]); } else { - clone(levent[++left], events[i]); + clone(lset[++lsize], events[i]); } } } - for (int i = 1; i <= right; i++) { - if (revent[i][0] == 0 && revent[i][3] > impm) { - pathAdd(revent[i][1], revent[i][2], -1); + 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 (revent[i][0] == -1 && revent[i][3] > impm) { - pathAdd(revent[i][1], revent[i][2], 1); + if (rset[i][0] == -1 && rset[i][3] > impm) { + pathAdd(rset[i][1], rset[i][2], 1); } } - for (int i = 1; i <= left; i++) { - clone(events[evtl + i - 1], levent[i]); + for (int i = 1; i <= lsize; i++) { + clone(events[evtl + i - 1], lset[i]); } - for (int i = 1; i <= right; i++) { - clone(events[evtl + left + i - 1], revent[i]); + for (int i = 1; i <= rsize; i++) { + clone(events[evtl + lsize + i - 1], rset[i]); } - compute(evtl, evtl + left - 1, impl, impm); - compute(evtl + left, evtr, impm + 1, impr); + compute(evtl, evtl + lsize - 1, impl, impm); + compute(evtl + lsize, evtr, impm + 1, impr); } } diff --git a/src/class161/Code07_Network2.java b/src/class161/Code07_Network2.java index 80847fdfd..a62919e0a 100644 --- a/src/class161/Code07_Network2.java +++ b/src/class161/Code07_Network2.java @@ -25,8 +25,8 @@ //int cntd = 0; //int tree[MAXN]; //int events[MAXM][4]; -//int levent[MAXM][4]; -//int revent[MAXM][4]; +//int lset[MAXM][4]; +//int rset[MAXM][4]; //int sorted[MAXM]; //int s = 0; //int ans[MAXM]; @@ -166,49 +166,49 @@ // } // } else { // int impm = (impl + impr) / 2; -// int left = 0, right = 0, activeCnt = 0; +// int lsize = 0, rsize = 0, activeCnt = 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(revent[++right], events[i]); +// clone(rset[++rsize], events[i]); // activeCnt++; // } else { -// clone(levent[++left], events[i]); +// 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(revent[++right], events[i]); +// clone(rset[++rsize], events[i]); // activeCnt--; // } else { -// clone(levent[++left], events[i]); +// clone(lset[++lsize], events[i]); // } // } else { // int sum = query(dfn[events[i][1]]); // if (sum != activeCnt) { -// clone(revent[++right], events[i]); +// clone(rset[++rsize], events[i]); // } else { -// clone(levent[++left], events[i]); +// clone(lset[++lsize], events[i]); // } // } // } -// for (int i = 1; i <= right; i++) { -// if (revent[i][0] == 0 && revent[i][3] > impm) { -// pathAdd(revent[i][1], revent[i][2], -1); +// 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 (revent[i][0] == -1 && revent[i][3] > impm) { -// pathAdd(revent[i][1], revent[i][2], 1); +// if (rset[i][0] == -1 && rset[i][3] > impm) { +// pathAdd(rset[i][1], rset[i][2], 1); // } // } -// for (int i = 1; i <= left; i++) { -// clone(events[evtl + i - 1], levent[i]); +// for (int i = 1; i <= lsize; i++) { +// clone(events[evtl + i - 1], lset[i]); // } -// for (int i = 1; i <= right; i++) { -// clone(events[evtl + left + i - 1], revent[i]); +// for (int i = 1; i <= rsize; i++) { +// clone(events[evtl + lsize + i - 1], rset[i]); // } -// compute(evtl, evtl + left - 1, impl, impm); -// compute(evtl + left, evtr, impm + 1, impr); +// compute(evtl, evtl + lsize - 1, impl, impm); +// compute(evtl + lsize, evtr, impm + 1, impr); // } //} // From 7c770142c911c48647e36051c49c8e953c4652af Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 28 Feb 2025 17:10:39 +0800 Subject: [PATCH 0740/2029] modify code --- src/class161/Code07_Network1.java | 16 ++++++++-------- src/class161/Code07_Network2.java | 16 ++++++++-------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/class161/Code07_Network1.java b/src/class161/Code07_Network1.java index ac7253f36..6d5652e98 100644 --- a/src/class161/Code07_Network1.java +++ b/src/class161/Code07_Network1.java @@ -207,11 +207,6 @@ public static void add(int i, int 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 sum = 0; for (; i > 0; i -= i & -i) { @@ -220,17 +215,22 @@ public static int query(int i) { return sum; } + public static void linkAdd(int x, int y, int v) { + add(x, v); + add(y + 1, -v); + } + public static void pathAdd(int x, int y, int v) { while (top[x] != top[y]) { if (dep[top[x]] <= dep[top[y]]) { - add(dfn[top[y]], dfn[y], v); + linkAdd(dfn[top[y]], dfn[y], v); y = fa[top[y]]; } else { - add(dfn[top[x]], dfn[x], v); + linkAdd(dfn[top[x]], dfn[x], v); x = fa[top[x]]; } } - add(Math.min(dfn[x], dfn[y]), Math.max(dfn[x], dfn[y]), v); + linkAdd(Math.min(dfn[x], dfn[y]), Math.max(dfn[x], dfn[y]), v); } public static void clone(int[] event1, int[] event2) { diff --git a/src/class161/Code07_Network2.java b/src/class161/Code07_Network2.java index a62919e0a..f50620ac7 100644 --- a/src/class161/Code07_Network2.java +++ b/src/class161/Code07_Network2.java @@ -95,11 +95,6 @@ // } //} // -//void add(int l, int r, int v) { -// add(l, v); -// add(r + 1, -v); -//} -// //int query(int i) { // int sum = 0; // for (; i > 0; i -= i & -i) { @@ -108,17 +103,22 @@ // return sum; //} // +//void linkAdd(int x, int y, int v) { +// add(x, v); +// add(y + 1, -v); +//} +// //void pathAdd(int x, int y, int v) { // while (top[x] != top[y]) { // if (dep[top[x]] <= dep[top[y]]) { -// add(dfn[top[y]], dfn[y], v); +// linkAdd(dfn[top[y]], dfn[y], v); // y = fa[top[y]]; // } else { -// add(dfn[top[x]], dfn[x], v); +// linkAdd(dfn[top[x]], dfn[x], v); // x = fa[top[x]]; // } // } -// add(min(dfn[x], dfn[y]), max(dfn[x], dfn[y]), v); +// linkAdd(min(dfn[x], dfn[y]), max(dfn[x], dfn[y]), v); //} // //void clone(int *event1, int *event2) { From 08f09902c3736c094709230d8df4e9267d8c9b5a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 28 Feb 2025 18:03:54 +0800 Subject: [PATCH 0741/2029] modify code --- src/class161/Code07_Network1.java | 18 ++++++++++++++---- src/class161/Code07_Network2.java | 18 ++++++++++++++---- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/src/class161/Code07_Network1.java b/src/class161/Code07_Network1.java index 6d5652e98..04a5f93be 100644 --- a/src/class161/Code07_Network1.java +++ b/src/class161/Code07_Network1.java @@ -1,6 +1,16 @@ package class161; // 网络,java版 +// 一共有n个服务器,n-1条边,所有服务器连成一棵树 +// 某两个服务器之间的路径上,可能接受一条请求,路径上的所有服务器都需要保存该请求的重要度 +// 一共有m条操作,每条操作是如下3种类型中的一种,操作依次发生,第i条操作发生的时间为i +// 操作 0 a b v : a号服务器到b号服务器的路径上,增加了一个重要度为v的请求 +// 操作 1 t : 当初时间为t的操作,一定是增加请求的操作,现在这个请求结束了 +// 操作 2 x : 当前时间下,和x号服务器无关的所有请求中,打印最大的重要度 +// 如果当前时间下,没有任何请求、或者所有请求都和x号服务器有关,打印-1 +// 2 <= n <= 10^5 +// 1 <= m <= 2 * 10^5 +// 重要度 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P3250 // 提交以下的code,提交时请把类名改成"Main",会有一个测试用例超时 // 因为这道题根据C++的运行时间,制定通过标准,根本没考虑java的用户 @@ -278,13 +288,13 @@ public static void compute(int evtl, int evtr, int impl, int impr) { } } else { int impm = (impl + impr) / 2; - int lsize = 0, rsize = 0, activeCnt = 0; + int lsize = 0, rsize = 0, influence = 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]); - activeCnt++; + influence++; } else { clone(lset[++lsize], events[i]); } @@ -292,13 +302,13 @@ public static void compute(int evtl, int evtr, int impl, int impr) { if (events[i][3] > impm) { pathAdd(events[i][1], events[i][2], -1); clone(rset[++rsize], events[i]); - activeCnt--; + influence--; } else { clone(lset[++lsize], events[i]); } } else { int sum = query(dfn[events[i][1]]); - if (sum != activeCnt) { + if (sum != influence) { clone(rset[++rsize], events[i]); } else { clone(lset[++lsize], events[i]); diff --git a/src/class161/Code07_Network2.java b/src/class161/Code07_Network2.java index f50620ac7..59e518247 100644 --- a/src/class161/Code07_Network2.java +++ b/src/class161/Code07_Network2.java @@ -1,6 +1,16 @@ package class161; // 网络,C++版 +// 一共有n个服务器,n-1条边,所有服务器连成一棵树 +// 某两个服务器之间的路径上,可能接受一条请求,路径上的所有服务器都需要保存该请求的重要度 +// 一共有m条操作,每条操作是如下3种类型中的一种,操作依次发生,第i条操作发生的时间为i +// 操作 0 a b v : a号服务器到b号服务器的路径上,增加了一个重要度为v的请求 +// 操作 1 t : 当初时间为t的操作,一定是增加请求的操作,现在这个请求结束了 +// 操作 2 x : 当前时间下,和x号服务器无关的所有请求中,打印最大的重要度 +// 如果当前时间下,没有任何请求、或者所有请求都和x号服务器有关,打印-1 +// 2 <= n <= 10^5 +// 1 <= m <= 2 * 10^5 +// 重要度 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P3250 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -166,13 +176,13 @@ // } // } else { // int impm = (impl + impr) / 2; -// int lsize = 0, rsize = 0, activeCnt = 0; +// int lsize = 0, rsize = 0, influence = 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]); -// activeCnt++; +// influence++; // } else { // clone(lset[++lsize], events[i]); // } @@ -180,13 +190,13 @@ // if (events[i][3] > impm) { // pathAdd(events[i][1], events[i][2], -1); // clone(rset[++rsize], events[i]); -// activeCnt--; +// influence--; // } else { // clone(lset[++lsize], events[i]); // } // } else { // int sum = query(dfn[events[i][1]]); -// if (sum != activeCnt) { +// if (sum != influence) { // clone(rset[++rsize], events[i]); // } else { // clone(lset[++lsize], events[i]); From 93781ca386e5358983420a4b51f6d72c79b2ad38 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 28 Feb 2025 19:35:36 +0800 Subject: [PATCH 0742/2029] modify code --- src/class161/Code07_Network1.java | 8 ++++---- src/class161/Code07_Network2.java | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/class161/Code07_Network1.java b/src/class161/Code07_Network1.java index 04a5f93be..a9726d695 100644 --- a/src/class161/Code07_Network1.java +++ b/src/class161/Code07_Network1.java @@ -323,11 +323,11 @@ public static void compute(int evtl, int evtr, int impl, int impr) { pathAdd(rset[i][1], rset[i][2], 1); } } - for (int i = 1; i <= lsize; i++) { - clone(events[evtl + i - 1], lset[i]); + for (int i = evtl, j = 1; j <= lsize; i++, j++) { + clone(events[i], lset[j]); } - for (int i = 1; i <= rsize; i++) { - clone(events[evtl + lsize + i - 1], rset[i]); + 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); diff --git a/src/class161/Code07_Network2.java b/src/class161/Code07_Network2.java index 59e518247..3d77413b8 100644 --- a/src/class161/Code07_Network2.java +++ b/src/class161/Code07_Network2.java @@ -211,11 +211,11 @@ // pathAdd(rset[i][1], rset[i][2], 1); // } // } -// for (int i = 1; i <= lsize; i++) { -// clone(events[evtl + i - 1], lset[i]); +// for (int i = evtl, j = 1; j <= lsize; i++, j++) { +// clone(events[i], lset[j]); // } -// for (int i = 1; i <= rsize; i++) { -// clone(events[evtl + lsize + i - 1], rset[i]); +// 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); From 931bc7eae594e51cce9073bd127383bba3b00ed6 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 28 Feb 2025 19:38:16 +0800 Subject: [PATCH 0743/2029] modify code --- src/class161/Code07_Network2.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class161/Code07_Network2.java b/src/class161/Code07_Network2.java index 3d77413b8..914f8d39a 100644 --- a/src/class161/Code07_Network2.java +++ b/src/class161/Code07_Network2.java @@ -144,25 +144,25 @@ // sorted[0] = -1; // for (int i = 1; i <= m; i++) { // if (events[i][0] == 0) { -// sorted[++s] = events[i][3]; +// 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]; +// 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]); +// 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; +// events[i][0] = ++cntans; // } // } //} From de4e5d143ee158797f3d9006413c3c21eba4a840 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 28 Feb 2025 20:40:29 +0800 Subject: [PATCH 0744/2029] modify code --- src/class161/Code07_Network1.java | 10 +++++----- src/class161/Code07_Network2.java | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/class161/Code07_Network1.java b/src/class161/Code07_Network1.java index a9726d695..57aa9a6f4 100644 --- a/src/class161/Code07_Network1.java +++ b/src/class161/Code07_Network1.java @@ -14,7 +14,7 @@ // 测试链接 : https://www.luogu.com.cn/problem/P3250 // 提交以下的code,提交时请把类名改成"Main",会有一个测试用例超时 // 因为这道题根据C++的运行时间,制定通过标准,根本没考虑java的用户 -// 本节课Code07_Network2文件就是C++的实现 +// 想通过用C++实现,本节课Code07_Network2文件就是C++的实现 // 两个版本的逻辑完全一样,C++版本可以通过所有测试 import java.io.BufferedReader; @@ -288,13 +288,13 @@ public static void compute(int evtl, int evtr, int impl, int impr) { } } else { int impm = (impl + impr) / 2; - int lsize = 0, rsize = 0, influence = 0; + 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]); - influence++; + request++; } else { clone(lset[++lsize], events[i]); } @@ -302,13 +302,13 @@ public static void compute(int evtl, int evtr, int impl, int impr) { if (events[i][3] > impm) { pathAdd(events[i][1], events[i][2], -1); clone(rset[++rsize], events[i]); - influence--; + request--; } else { clone(lset[++lsize], events[i]); } } else { int sum = query(dfn[events[i][1]]); - if (sum != influence) { + if (sum != request) { clone(rset[++rsize], events[i]); } else { clone(lset[++lsize], events[i]); diff --git a/src/class161/Code07_Network2.java b/src/class161/Code07_Network2.java index 914f8d39a..523a4f0bc 100644 --- a/src/class161/Code07_Network2.java +++ b/src/class161/Code07_Network2.java @@ -176,13 +176,13 @@ // } // } else { // int impm = (impl + impr) / 2; -// int lsize = 0, rsize = 0, influence = 0; +// 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]); -// influence++; +// request++; // } else { // clone(lset[++lsize], events[i]); // } @@ -190,13 +190,13 @@ // if (events[i][3] > impm) { // pathAdd(events[i][1], events[i][2], -1); // clone(rset[++rsize], events[i]); -// influence--; +// request--; // } else { // clone(lset[++lsize], events[i]); // } // } else { // int sum = query(dfn[events[i][1]]); -// if (sum != influence) { +// if (sum != request) { // clone(rset[++rsize], events[i]); // } else { // clone(lset[++lsize], events[i]); From 86b972b6da85c83a9a5a6d93cfd63cefe9b4e26e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 1 Mar 2025 20:00:51 +0800 Subject: [PATCH 0745/2029] modify code --- ...dSubtreeSum1.java => Code01_HeavyLightDecomposition1.java} | 4 ++-- ...dSubtreeSum2.java => Code01_HeavyLightDecomposition2.java} | 2 +- ...de01_HeavyLightDecompositionLCA1.java => Code02_LCA1.java} | 4 ++-- ...de01_HeavyLightDecompositionLCA2.java => Code02_LCA2.java} | 2 +- ...e03_PathMaxAndPathSum1.java => Code03_PathMaxAndSum1.java} | 4 ++-- ...e03_PathMaxAndPathSum2.java => Code03_PathMaxAndSum2.java} | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) rename src/class161/{Code02_PathSumAndSubtreeSum1.java => Code01_HeavyLightDecomposition1.java} (98%) rename src/class161/{Code02_PathSumAndSubtreeSum2.java => Code01_HeavyLightDecomposition2.java} (99%) rename src/class161/{Code01_HeavyLightDecompositionLCA1.java => Code02_LCA1.java} (98%) rename src/class161/{Code01_HeavyLightDecompositionLCA2.java => Code02_LCA2.java} (98%) rename src/class161/{Code03_PathMaxAndPathSum1.java => Code03_PathMaxAndSum1.java} (98%) rename src/class161/{Code03_PathMaxAndPathSum2.java => Code03_PathMaxAndSum2.java} (99%) diff --git a/src/class161/Code02_PathSumAndSubtreeSum1.java b/src/class161/Code01_HeavyLightDecomposition1.java similarity index 98% rename from src/class161/Code02_PathSumAndSubtreeSum1.java rename to src/class161/Code01_HeavyLightDecomposition1.java index 8959fb90c..4ffb238b3 100644 --- a/src/class161/Code02_PathSumAndSubtreeSum1.java +++ b/src/class161/Code01_HeavyLightDecomposition1.java @@ -1,6 +1,6 @@ package class161; -// 路径累加和与子树累加和,java版 +// 树链剖分模版题1,java版 // 一共有n个节点,n-1条边,节点连成一棵树 // 给定头节点编号root,给定数字MOD // 一共有m条操作,每种操作是如下4种类型中的一种 @@ -21,7 +21,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code02_PathSumAndSubtreeSum1 { +public class Code01_HeavyLightDecomposition1 { public static int MAXN = 100001; diff --git a/src/class161/Code02_PathSumAndSubtreeSum2.java b/src/class161/Code01_HeavyLightDecomposition2.java similarity index 99% rename from src/class161/Code02_PathSumAndSubtreeSum2.java rename to src/class161/Code01_HeavyLightDecomposition2.java index e7b8af442..9f249f126 100644 --- a/src/class161/Code02_PathSumAndSubtreeSum2.java +++ b/src/class161/Code01_HeavyLightDecomposition2.java @@ -1,6 +1,6 @@ package class161; -// 路径累加和与子树累加和,C++版 +// 树链剖分模版题1,C++版 // 一共有n个节点,n-1条边,节点连成一棵树 // 给定头节点编号root,给定数字MOD // 一共有m条操作,每种操作是如下4种类型中的一种 diff --git a/src/class161/Code01_HeavyLightDecompositionLCA1.java b/src/class161/Code02_LCA1.java similarity index 98% rename from src/class161/Code01_HeavyLightDecompositionLCA1.java rename to src/class161/Code02_LCA1.java index b5a1e500e..a90a3091d 100644 --- a/src/class161/Code01_HeavyLightDecompositionLCA1.java +++ b/src/class161/Code02_LCA1.java @@ -1,6 +1,6 @@ package class161; -// 树链剖分解决LCA查询,java版 +// 树链剖分模版题2,java版 // 一共有n个节点,n-1条边,节点连成一棵树,给定头节点编号root // 一共有m条查询,每条查询给定a和b,打印a和b的最低公共祖先 // 请用树链剖分的方式实现 @@ -15,7 +15,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code01_HeavyLightDecompositionLCA1 { +public class Code02_LCA1 { public static int MAXN = 500001; diff --git a/src/class161/Code01_HeavyLightDecompositionLCA2.java b/src/class161/Code02_LCA2.java similarity index 98% rename from src/class161/Code01_HeavyLightDecompositionLCA2.java rename to src/class161/Code02_LCA2.java index b784ad703..deaee2c43 100644 --- a/src/class161/Code01_HeavyLightDecompositionLCA2.java +++ b/src/class161/Code02_LCA2.java @@ -1,6 +1,6 @@ package class161; -// 树链剖分解决LCA查询,C++版 +// 树链剖分模版题2,C++版 // 一共有n个节点,n-1条边,节点连成一棵树,给定头节点编号root // 一共有m条查询,每条查询给定a和b,打印a和b的最低公共祖先 // 请用树链剖分的方式实现 diff --git a/src/class161/Code03_PathMaxAndPathSum1.java b/src/class161/Code03_PathMaxAndSum1.java similarity index 98% rename from src/class161/Code03_PathMaxAndPathSum1.java rename to src/class161/Code03_PathMaxAndSum1.java index f77268727..e0bdeae15 100644 --- a/src/class161/Code03_PathMaxAndPathSum1.java +++ b/src/class161/Code03_PathMaxAndSum1.java @@ -1,6 +1,6 @@ package class161; -// 路径最大值与路径累加和,java版 +// 树链剖分模版题3,java版 // 一共有n个节点,n-1条边,节点连成一棵树,每个节点给定权值 // 一共有m条操作,每种操作是如下3种类型中的一种 // 操作 CHANGE x y : x的权值修改为y @@ -21,7 +21,7 @@ import java.io.PrintWriter; import java.util.StringTokenizer; -public class Code03_PathMaxAndPathSum1 { +public class Code03_PathMaxAndSum1 { public static int MAXN = 30001; diff --git a/src/class161/Code03_PathMaxAndPathSum2.java b/src/class161/Code03_PathMaxAndSum2.java similarity index 99% rename from src/class161/Code03_PathMaxAndPathSum2.java rename to src/class161/Code03_PathMaxAndSum2.java index 3fd35e15c..9315b2c14 100644 --- a/src/class161/Code03_PathMaxAndPathSum2.java +++ b/src/class161/Code03_PathMaxAndSum2.java @@ -1,6 +1,6 @@ package class161; -// 路径最大值与路径累加和,C++版 +// 树链剖分模版题3,C++版 // 一共有n个节点,n-1条边,节点连成一棵树,每个节点给定权值 // 一共有m条操作,每种操作是如下3种类型中的一种 // 操作 CHANGE x y : x的权值修改为y From ffaa692d58e52a64077f83dbcd7db7c2fe85d106 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 1 Mar 2025 20:12:01 +0800 Subject: [PATCH 0746/2029] modify code --- .../{Code01_HeavyLightDecomposition1.java => Code01_HLD1.java} | 2 +- .../{Code01_HeavyLightDecomposition2.java => Code01_HLD2.java} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/class161/{Code01_HeavyLightDecomposition1.java => Code01_HLD1.java} (99%) rename src/class161/{Code01_HeavyLightDecomposition2.java => Code01_HLD2.java} (100%) diff --git a/src/class161/Code01_HeavyLightDecomposition1.java b/src/class161/Code01_HLD1.java similarity index 99% rename from src/class161/Code01_HeavyLightDecomposition1.java rename to src/class161/Code01_HLD1.java index 4ffb238b3..43be9c6bc 100644 --- a/src/class161/Code01_HeavyLightDecomposition1.java +++ b/src/class161/Code01_HLD1.java @@ -21,7 +21,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code01_HeavyLightDecomposition1 { +public class Code01_HLD1 { public static int MAXN = 100001; diff --git a/src/class161/Code01_HeavyLightDecomposition2.java b/src/class161/Code01_HLD2.java similarity index 100% rename from src/class161/Code01_HeavyLightDecomposition2.java rename to src/class161/Code01_HLD2.java From 40c3b1f3f4eb899d644bc3d9d5998ff49fc33b43 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 2 Mar 2025 15:28:02 +0800 Subject: [PATCH 0747/2029] modify code --- src/class161/Code01_HLD1.java | 8 ++++---- src/class161/Code01_HLD2.java | 8 ++++---- src/class161/Code02_LCA1.java | 2 +- src/class161/Code02_LCA2.java | 2 +- src/class161/Code03_PathMaxAndSum1.java | 2 +- src/class161/Code03_PathMaxAndSum2.java | 2 +- src/class161/Code05_Coloring1.java | 2 +- src/class161/Code05_Coloring2.java | 2 +- src/class161/Code06_Tourism1.java | 2 +- src/class161/Code06_Tourism2.java | 2 +- src/class161/Code07_Network1.java | 2 +- src/class161/Code07_Network2.java | 2 +- 12 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/class161/Code01_HLD1.java b/src/class161/Code01_HLD1.java index 43be9c6bc..4240ac2f9 100644 --- a/src/class161/Code01_HLD1.java +++ b/src/class161/Code01_HLD1.java @@ -1,16 +1,16 @@ package class161; // 树链剖分模版题1,java版 -// 一共有n个节点,n-1条边,节点连成一棵树 -// 给定头节点编号root,给定数字MOD +// 一共有n个节点,n-1条边,节点连成一棵树,给定树的头节点编号root // 一共有m条操作,每种操作是如下4种类型中的一种 // 操作 1 x y z : x到y的路径上,每个节点值增加v -// 操作 2 x y : x到y的路径上,打印所有节点值的累加和 % MOD +// 操作 2 x y : x到y的路径上,打印所有节点值的累加和 // 操作 3 x y : x为头的子树上,每个节点值增加y -// 操作 4 x : x为头的子树上,打印所有节点值的累加和 % MOD +// 操作 4 x : x为头的子树上,打印所有节点值的累加和 // 1 <= n、m <= 10^5 // 1 <= MOD <= 2^30 // 输入的值都为int类型 +// 查询操作时,打印(查询结果 % MOD),题目会给定MOD值 // 测试链接 : https://www.luogu.com.cn/problem/P3384 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class161/Code01_HLD2.java b/src/class161/Code01_HLD2.java index 9f249f126..6aa440ac4 100644 --- a/src/class161/Code01_HLD2.java +++ b/src/class161/Code01_HLD2.java @@ -1,16 +1,16 @@ package class161; // 树链剖分模版题1,C++版 -// 一共有n个节点,n-1条边,节点连成一棵树 -// 给定头节点编号root,给定数字MOD +// 一共有n个节点,给定n-1条边,节点连成一棵树,给定树的头节点编号root // 一共有m条操作,每种操作是如下4种类型中的一种 // 操作 1 x y z : x到y的路径上,每个节点值增加v -// 操作 2 x y : x到y的路径上,打印所有节点值的累加和 % MOD +// 操作 2 x y : x到y的路径上,打印所有节点值的累加和 // 操作 3 x y : x为头的子树上,每个节点值增加y -// 操作 4 x : x为头的子树上,打印所有节点值的累加和 % MOD +// 操作 4 x : x为头的子树上,打印所有节点值的累加和 // 1 <= n、m <= 10^5 // 1 <= MOD <= 2^30 // 输入的值都为int类型 +// 查询操作时,打印(查询结果 % MOD),题目会给定MOD值 // 测试链接 : https://www.luogu.com.cn/problem/P3384 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class161/Code02_LCA1.java b/src/class161/Code02_LCA1.java index a90a3091d..36276828e 100644 --- a/src/class161/Code02_LCA1.java +++ b/src/class161/Code02_LCA1.java @@ -1,7 +1,7 @@ package class161; // 树链剖分模版题2,java版 -// 一共有n个节点,n-1条边,节点连成一棵树,给定头节点编号root +// 一共有n个节点,给定n-1条边,节点连成一棵树,给定头节点编号root // 一共有m条查询,每条查询给定a和b,打印a和b的最低公共祖先 // 请用树链剖分的方式实现 // 1 <= n、m <= 5 * 10^5 diff --git a/src/class161/Code02_LCA2.java b/src/class161/Code02_LCA2.java index deaee2c43..1eb0667fd 100644 --- a/src/class161/Code02_LCA2.java +++ b/src/class161/Code02_LCA2.java @@ -1,7 +1,7 @@ package class161; // 树链剖分模版题2,C++版 -// 一共有n个节点,n-1条边,节点连成一棵树,给定头节点编号root +// 一共有n个节点,给定n-1条边,节点连成一棵树,给定头节点编号root // 一共有m条查询,每条查询给定a和b,打印a和b的最低公共祖先 // 请用树链剖分的方式实现 // 1 <= n、m <= 5 * 10^5 diff --git a/src/class161/Code03_PathMaxAndSum1.java b/src/class161/Code03_PathMaxAndSum1.java index e0bdeae15..31fa28688 100644 --- a/src/class161/Code03_PathMaxAndSum1.java +++ b/src/class161/Code03_PathMaxAndSum1.java @@ -1,7 +1,7 @@ package class161; // 树链剖分模版题3,java版 -// 一共有n个节点,n-1条边,节点连成一棵树,每个节点给定权值 +// 一共有n个节点,给定n-1条边,节点连成一棵树,每个节点给定权值 // 一共有m条操作,每种操作是如下3种类型中的一种 // 操作 CHANGE x y : x的权值修改为y // 操作 QMAX u v : x到y的路径上,打印节点值的最大值 diff --git a/src/class161/Code03_PathMaxAndSum2.java b/src/class161/Code03_PathMaxAndSum2.java index 9315b2c14..278224079 100644 --- a/src/class161/Code03_PathMaxAndSum2.java +++ b/src/class161/Code03_PathMaxAndSum2.java @@ -1,7 +1,7 @@ package class161; // 树链剖分模版题3,C++版 -// 一共有n个节点,n-1条边,节点连成一棵树,每个节点给定权值 +// 一共有n个节点,给定n-1条边,节点连成一棵树,每个节点给定权值 // 一共有m条操作,每种操作是如下3种类型中的一种 // 操作 CHANGE x y : x的权值修改为y // 操作 QMAX u v : x到y的路径上,打印节点值的最大值 diff --git a/src/class161/Code05_Coloring1.java b/src/class161/Code05_Coloring1.java index fd539ebce..dfbca8445 100644 --- a/src/class161/Code05_Coloring1.java +++ b/src/class161/Code05_Coloring1.java @@ -1,7 +1,7 @@ package class161; // 染色,java版 -// 一共有n个节点,n-1条边,节点连成一棵树,每个节点给定初始颜色值 +// 一共有n个节点,给定n-1条边,节点连成一棵树,每个节点给定初始颜色值 // 连续相同颜色被认为是一段,变化了就认为是另一段 // 比如,112221,有三个颜色段,分别为 11、222、1 // 一共有m条操作,每种操作是如下2种类型中的一种 diff --git a/src/class161/Code05_Coloring2.java b/src/class161/Code05_Coloring2.java index 72184109c..634b1e536 100644 --- a/src/class161/Code05_Coloring2.java +++ b/src/class161/Code05_Coloring2.java @@ -1,7 +1,7 @@ package class161; // 染色,C++版 -// 一共有n个节点,n-1条边,节点连成一棵树,每个节点给定初始颜色值 +// 一共有n个节点,给定n-1条边,节点连成一棵树,每个节点给定初始颜色值 // 连续相同颜色被认为是一段,变化了就认为是另一段 // 比如,112221,有三个颜色段,分别为 11、222、1 // 一共有m条操作,每种操作是如下2种类型中的一种 diff --git a/src/class161/Code06_Tourism1.java b/src/class161/Code06_Tourism1.java index 7b69823c6..03fda9a42 100644 --- a/src/class161/Code06_Tourism1.java +++ b/src/class161/Code06_Tourism1.java @@ -1,7 +1,7 @@ package class161; // 旅游,java版 -// 一共有n个城市,n-1条边,城市连成一棵树,每个城市给定初始的宝石价格 +// 一共有n个城市,给定n-1条边,城市连成一棵树,每个城市给定初始的宝石价格 // 一共有m条操作,操作类型如下 // 操作 x y v : 城市x到城市y的最短路途中,你可以选择一城买入宝石 // 继续行进的过程中,再选一城卖出宝石,以此获得利润 diff --git a/src/class161/Code06_Tourism2.java b/src/class161/Code06_Tourism2.java index 57057a6ee..cdde5e641 100644 --- a/src/class161/Code06_Tourism2.java +++ b/src/class161/Code06_Tourism2.java @@ -1,7 +1,7 @@ package class161; // 旅游,C++版 -// 一共有n个城市,n-1条边,城市连成一棵树,每个城市给定初始的宝石价格 +// 一共有n个城市,给定n-1条边,城市连成一棵树,每个城市给定初始的宝石价格 // 一共有m条操作,操作类型如下 // 操作 x y v : 城市x到城市y的最短路途中,你可以选择一城买入宝石 // 继续行进的过程中,再选一城卖出宝石,以此获得利润 diff --git a/src/class161/Code07_Network1.java b/src/class161/Code07_Network1.java index 57aa9a6f4..37cefdbb1 100644 --- a/src/class161/Code07_Network1.java +++ b/src/class161/Code07_Network1.java @@ -1,7 +1,7 @@ package class161; // 网络,java版 -// 一共有n个服务器,n-1条边,所有服务器连成一棵树 +// 一共有n个服务器,给定n-1条边,所有服务器连成一棵树 // 某两个服务器之间的路径上,可能接受一条请求,路径上的所有服务器都需要保存该请求的重要度 // 一共有m条操作,每条操作是如下3种类型中的一种,操作依次发生,第i条操作发生的时间为i // 操作 0 a b v : a号服务器到b号服务器的路径上,增加了一个重要度为v的请求 diff --git a/src/class161/Code07_Network2.java b/src/class161/Code07_Network2.java index 523a4f0bc..168bb6356 100644 --- a/src/class161/Code07_Network2.java +++ b/src/class161/Code07_Network2.java @@ -1,7 +1,7 @@ package class161; // 网络,C++版 -// 一共有n个服务器,n-1条边,所有服务器连成一棵树 +// 一共有n个服务器,给定n-1条边,所有服务器连成一棵树 // 某两个服务器之间的路径上,可能接受一条请求,路径上的所有服务器都需要保存该请求的重要度 // 一共有m条操作,每条操作是如下3种类型中的一种,操作依次发生,第i条操作发生的时间为i // 操作 0 a b v : a号服务器到b号服务器的路径上,增加了一个重要度为v的请求 From a4911b073fb1be6ea3445294db95401d06dbfc2f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 2 Mar 2025 15:28:39 +0800 Subject: [PATCH 0748/2029] modify code --- src/class161/Code01_HLD1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class161/Code01_HLD1.java b/src/class161/Code01_HLD1.java index 4240ac2f9..bbd516990 100644 --- a/src/class161/Code01_HLD1.java +++ b/src/class161/Code01_HLD1.java @@ -1,7 +1,7 @@ package class161; // 树链剖分模版题1,java版 -// 一共有n个节点,n-1条边,节点连成一棵树,给定树的头节点编号root +// 一共有n个节点,给定n-1条边,节点连成一棵树,给定树的头节点编号root // 一共有m条操作,每种操作是如下4种类型中的一种 // 操作 1 x y z : x到y的路径上,每个节点值增加v // 操作 2 x y : x到y的路径上,打印所有节点值的累加和 From 60367ac8c06efbbc15e8d8028870b8bffc59b221 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 2 Mar 2025 15:32:35 +0800 Subject: [PATCH 0749/2029] modify code --- src/class161/Code01_HLD1.java | 14 +++++++------- src/class161/Code01_HLD2.java | 14 +++++++------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/class161/Code01_HLD1.java b/src/class161/Code01_HLD1.java index bbd516990..6eda53f45 100644 --- a/src/class161/Code01_HLD1.java +++ b/src/class161/Code01_HLD1.java @@ -3,9 +3,9 @@ // 树链剖分模版题1,java版 // 一共有n个节点,给定n-1条边,节点连成一棵树,给定树的头节点编号root // 一共有m条操作,每种操作是如下4种类型中的一种 -// 操作 1 x y z : x到y的路径上,每个节点值增加v +// 操作 1 x y v : x到y的路径上,每个节点值增加v // 操作 2 x y : x到y的路径上,打印所有节点值的累加和 -// 操作 3 x y : x为头的子树上,每个节点值增加y +// 操作 3 x v : x为头的子树上,每个节点值增加v // 操作 4 x : x为头的子树上,打印所有节点值的累加和 // 1 <= n、m <= 10^5 // 1 <= MOD <= 2^30 @@ -307,7 +307,7 @@ public static void main(String[] args) throws IOException { dfs3(); // dfs3() 等同于 dfs1(root, 0),调用迭代版防止爆栈 dfs4(); // dfs4() 等同于 dfs2(root, root),调用迭代版防止爆栈 build(1, n, 1); - for (int i = 1, op, x, y, z; i <= m; i++) { + for (int i = 1, op, x, y, v; i <= m; i++) { in.nextToken(); op = (int) in.nval; if (op == 1) { @@ -316,8 +316,8 @@ public static void main(String[] args) throws IOException { in.nextToken(); y = (int) in.nval; in.nextToken(); - z = (int) in.nval; - pathAdd(x, y, z); + v = (int) in.nval; + pathAdd(x, y, v); } else if (op == 2) { in.nextToken(); x = (int) in.nval; @@ -328,8 +328,8 @@ public static void main(String[] args) throws IOException { in.nextToken(); x = (int) in.nval; in.nextToken(); - y = (int) in.nval; - subtreeAdd(x, y); + v = (int) in.nval; + subtreeAdd(x, v); } else { in.nextToken(); x = (int) in.nval; diff --git a/src/class161/Code01_HLD2.java b/src/class161/Code01_HLD2.java index 6aa440ac4..046fe8860 100644 --- a/src/class161/Code01_HLD2.java +++ b/src/class161/Code01_HLD2.java @@ -3,9 +3,9 @@ // 树链剖分模版题1,C++版 // 一共有n个节点,给定n-1条边,节点连成一棵树,给定树的头节点编号root // 一共有m条操作,每种操作是如下4种类型中的一种 -// 操作 1 x y z : x到y的路径上,每个节点值增加v +// 操作 1 x y v : x到y的路径上,每个节点值增加v // 操作 2 x y : x到y的路径上,打印所有节点值的累加和 -// 操作 3 x y : x为头的子树上,每个节点值增加y +// 操作 3 x v : x为头的子树上,每个节点值增加v // 操作 4 x : x为头的子树上,打印所有节点值的累加和 // 1 <= n、m <= 10^5 // 1 <= MOD <= 2^30 @@ -191,17 +191,17 @@ // dfs1(root, 0); // dfs2(root, root); // build(1, n, 1); -// for (int i = 1, op, x, y, z; i <= m; i++) { +// for (int i = 1, op, x, y, v; i <= m; i++) { // cin >> op; // if (op == 1) { -// cin >> x >> y >> z; -// pathAdd(x, y, z); +// cin >> x >> y >> v; +// pathAdd(x, y, v); // } else if (op == 2) { // cin >> x >> y; // cout << pathSum(x, y) << "\n"; // } else if (op == 3) { -// cin >> x >> y; -// subtreeAdd(x, y); +// cin >> x >> v; +// subtreeAdd(x, v); // } else { // cin >> x; // cout << subtreeSum(x) << "\n"; From 44877d0cfb25b848d83420dfa76f6c1b149d7573 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 2 Mar 2025 15:34:53 +0800 Subject: [PATCH 0750/2029] modify code --- src/class161/Code03_PathMaxAndSum1.java | 4 ++-- src/class161/Code03_PathMaxAndSum2.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class161/Code03_PathMaxAndSum1.java b/src/class161/Code03_PathMaxAndSum1.java index 31fa28688..0a496a5f8 100644 --- a/src/class161/Code03_PathMaxAndSum1.java +++ b/src/class161/Code03_PathMaxAndSum1.java @@ -4,8 +4,8 @@ // 一共有n个节点,给定n-1条边,节点连成一棵树,每个节点给定权值 // 一共有m条操作,每种操作是如下3种类型中的一种 // 操作 CHANGE x y : x的权值修改为y -// 操作 QMAX u v : x到y的路径上,打印节点值的最大值 -// 操作 QSUM u v : x到y的路径上,打印节点值的累加和 +// 操作 QMAX x y : x到y的路径上,打印节点值的最大值 +// 操作 QSUM x y : x到y的路径上,打印节点值的累加和 // 1 <= n <= 3 * 10^4 // 0 <= m <= 2 * 10^5 // -30000 <= 节点权值 <= +30000 diff --git a/src/class161/Code03_PathMaxAndSum2.java b/src/class161/Code03_PathMaxAndSum2.java index 278224079..723ba299e 100644 --- a/src/class161/Code03_PathMaxAndSum2.java +++ b/src/class161/Code03_PathMaxAndSum2.java @@ -4,8 +4,8 @@ // 一共有n个节点,给定n-1条边,节点连成一棵树,每个节点给定权值 // 一共有m条操作,每种操作是如下3种类型中的一种 // 操作 CHANGE x y : x的权值修改为y -// 操作 QMAX u v : x到y的路径上,打印节点值的最大值 -// 操作 QSUM u v : x到y的路径上,打印节点值的累加和 +// 操作 QMAX x y : x到y的路径上,打印节点值的最大值 +// 操作 QSUM x y : x到y的路径上,打印节点值的累加和 // 1 <= n <= 3 * 10^4 // 0 <= m <= 2 * 10^5 // -30000 <= 节点权值 <= +30000 From cb45ccc880e59c23c66246baa8228bbe120182b8 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 2 Mar 2025 15:49:16 +0800 Subject: [PATCH 0751/2029] modify code --- src/class161/Code01_HLD1.java | 11 ----------- src/class161/Code01_HLD2.java | 3 +++ src/class161/Code02_LCA1.java | 7 ------- src/class161/Code02_LCA2.java | 2 ++ src/class161/Code03_PathMaxAndSum1.java | 11 ----------- src/class161/Code03_PathMaxAndSum2.java | 3 +++ src/class161/Code04_PackageManager1.java | 11 ----------- src/class161/Code04_PackageManager2.java | 3 +++ src/class161/Code05_Coloring1.java | 13 ------------- src/class161/Code05_Coloring2.java | 3 +++ src/class161/Code06_Tourism1.java | 14 -------------- src/class161/Code06_Tourism2.java | 3 +++ src/class161/Code07_Network1.java | 20 ++++---------------- src/class161/Code07_Network2.java | 8 ++++++-- 14 files changed, 27 insertions(+), 85 deletions(-) diff --git a/src/class161/Code01_HLD1.java b/src/class161/Code01_HLD1.java index 6eda53f45..827a553e4 100644 --- a/src/class161/Code01_HLD1.java +++ b/src/class161/Code01_HLD1.java @@ -30,31 +30,20 @@ public class Code01_HLD1 { 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[] seg = new int[MAXN]; - public static int cntd = 0; public static long[] sum = new long[MAXN << 2]; - public static long[] addTag = new long[MAXN << 2]; public static void addEdge(int u, int v) { diff --git a/src/class161/Code01_HLD2.java b/src/class161/Code01_HLD2.java index 046fe8860..fdc28fc34 100644 --- a/src/class161/Code01_HLD2.java +++ b/src/class161/Code01_HLD2.java @@ -22,10 +22,12 @@ //const int MAXN = 100001; //int n, m, root, MOD; //int arr[MAXN]; +// //int head[MAXN]; //int nxt[MAXN << 1]; //int to[MAXN << 1]; //int cntg = 0; +// //int fa[MAXN]; //int dep[MAXN]; //int siz[MAXN]; @@ -34,6 +36,7 @@ //int dfn[MAXN]; //int seg[MAXN]; //int cntd = 0; +// //long long sum[MAXN << 2]; //long long addTag[MAXN << 2]; // diff --git a/src/class161/Code02_LCA1.java b/src/class161/Code02_LCA1.java index 36276828e..eb6b10169 100644 --- a/src/class161/Code02_LCA1.java +++ b/src/class161/Code02_LCA1.java @@ -22,21 +22,14 @@ public class Code02_LCA1 { public static int n, m, root; 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 cnt = 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 void addEdge(int u, int v) { diff --git a/src/class161/Code02_LCA2.java b/src/class161/Code02_LCA2.java index 1eb0667fd..99b45a9e9 100644 --- a/src/class161/Code02_LCA2.java +++ b/src/class161/Code02_LCA2.java @@ -15,10 +15,12 @@ // //const int MAXN = 500001; //int n, m, root; +// //int head[MAXN]; //int nxt[MAXN << 1]; //int to[MAXN << 1]; //int cnt = 0; +// //int fa[MAXN]; //int dep[MAXN]; //int siz[MAXN]; diff --git a/src/class161/Code03_PathMaxAndSum1.java b/src/class161/Code03_PathMaxAndSum1.java index 0a496a5f8..3f156c747 100644 --- a/src/class161/Code03_PathMaxAndSum1.java +++ b/src/class161/Code03_PathMaxAndSum1.java @@ -32,31 +32,20 @@ public class Code03_PathMaxAndSum1 { 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[] seg = new int[MAXN]; - public static int cntd = 0; public static int[] max = new int[MAXN << 2]; - public static int[] sum = new int[MAXN << 2]; public static void addEdge(int u, int v) { diff --git a/src/class161/Code03_PathMaxAndSum2.java b/src/class161/Code03_PathMaxAndSum2.java index 723ba299e..216f7ca1a 100644 --- a/src/class161/Code03_PathMaxAndSum2.java +++ b/src/class161/Code03_PathMaxAndSum2.java @@ -21,10 +21,12 @@ //const int INF = 10000001; //int n, m; //int arr[MAXN]; +// //int head[MAXN]; //int nxt[MAXN << 1]; //int to[MAXN << 1]; //int cntg = 0; +// //int fa[MAXN]; //int dep[MAXN]; //int siz[MAXN]; @@ -33,6 +35,7 @@ //int dfn[MAXN]; //int seg[MAXN]; //int cntd = 0; +// //int maxv[MAXN << 2]; //int sumv[MAXN << 2]; // diff --git a/src/class161/Code04_PackageManager1.java b/src/class161/Code04_PackageManager1.java index bd9251b8d..9d5a09dde 100644 --- a/src/class161/Code04_PackageManager1.java +++ b/src/class161/Code04_PackageManager1.java @@ -29,31 +29,20 @@ public class Code04_PackageManager1 { 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 cntd = 0; public static int[] sum = new int[MAXN << 2]; - public static boolean[] update = new boolean[MAXN << 2]; - public static int[] change = new int[MAXN << 2]; public static void addEdge(int u, int v) { diff --git a/src/class161/Code04_PackageManager2.java b/src/class161/Code04_PackageManager2.java index d9b0dbed5..c417bfc1d 100644 --- a/src/class161/Code04_PackageManager2.java +++ b/src/class161/Code04_PackageManager2.java @@ -19,10 +19,12 @@ //const int MAXN = 100001; //int n, m; //int arr[MAXN]; +// //int head[MAXN]; //int nxt[MAXN << 1]; //int to[MAXN << 1]; //int cntg = 0; +// //int fa[MAXN]; //int dep[MAXN]; //int siz[MAXN]; @@ -30,6 +32,7 @@ //int top[MAXN]; //int dfn[MAXN]; //int cntd = 0; +// //int sum[MAXN << 2]; //bool update[MAXN << 2]; //int change[MAXN << 2]; diff --git a/src/class161/Code05_Coloring1.java b/src/class161/Code05_Coloring1.java index dfbca8445..abbe638fc 100644 --- a/src/class161/Code05_Coloring1.java +++ b/src/class161/Code05_Coloring1.java @@ -30,35 +30,22 @@ public class Code05_Coloring1 { 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[] seg = new int[MAXN]; - public static int cntd = 0; public static int[] sum = new int[MAXN << 2]; - public static int[] lcolor = new int[MAXN << 2]; - public static int[] rcolor = new int[MAXN << 2]; - public static int[] change = new int[MAXN << 2]; public static void addEdge(int u, int v) { diff --git a/src/class161/Code05_Coloring2.java b/src/class161/Code05_Coloring2.java index 634b1e536..cb21f6e01 100644 --- a/src/class161/Code05_Coloring2.java +++ b/src/class161/Code05_Coloring2.java @@ -20,10 +20,12 @@ //const int MAXN = 100001; //int n, m; //int arr[MAXN]; +// //int head[MAXN]; //int nxt[MAXN << 1]; //int to[MAXN << 1]; //int cntg = 0; +// //int fa[MAXN]; //int dep[MAXN]; //int siz[MAXN]; @@ -32,6 +34,7 @@ //int dfn[MAXN]; //int seg[MAXN]; //int cntd = 0; +// //int sum[MAXN << 2]; //int lcolor[MAXN << 2]; //int rcolor[MAXN << 2]; diff --git a/src/class161/Code06_Tourism1.java b/src/class161/Code06_Tourism1.java index 03fda9a42..1cd06db73 100644 --- a/src/class161/Code06_Tourism1.java +++ b/src/class161/Code06_Tourism1.java @@ -30,37 +30,23 @@ public class Code06_Tourism1 { 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[] seg = new int[MAXN]; - public static int cntd = 0; public static int[] max = new int[MAXN << 2]; - public static int[] min = new int[MAXN << 2]; - public static int[] lprofit = new int[MAXN << 2]; - public static int[] rprofit = new int[MAXN << 2]; - public static int[] addTag = new int[MAXN << 2]; public static void addEdge(int u, int v) { diff --git a/src/class161/Code06_Tourism2.java b/src/class161/Code06_Tourism2.java index cdde5e641..a7d692925 100644 --- a/src/class161/Code06_Tourism2.java +++ b/src/class161/Code06_Tourism2.java @@ -21,10 +21,12 @@ //const int INF = 1000000001; //int n, m; //int arr[MAXN]; +// //int head[MAXN]; //int nxt[MAXN << 1]; //int to[MAXN << 1]; //int cntg = 0; +// //int fa[MAXN]; //int dep[MAXN]; //int siz[MAXN]; @@ -33,6 +35,7 @@ //int dfn[MAXN]; //int seg[MAXN]; //int cntd = 0; +// //int maxv[MAXN << 2]; //int minv[MAXN << 2]; //int lprofit[MAXN << 2]; diff --git a/src/class161/Code07_Network1.java b/src/class161/Code07_Network1.java index 37cefdbb1..cb8d08553 100644 --- a/src/class161/Code07_Network1.java +++ b/src/class161/Code07_Network1.java @@ -34,41 +34,29 @@ public class Code07_Network1 { 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[] son = new int[MAXN]; - public static int[] top = new int[MAXN]; - public static int[] dfn = new int[MAXN]; - public static int cntd = 0; + // 树状数组 public static int[] tree = new int[MAXN]; + // 从早到晚发生的事件 public static int[][] events = new int[MAXM][4]; - - public static int[][] lset = new int[MAXM][4]; - - public static int[][] rset = 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 int kth(int num) { diff --git a/src/class161/Code07_Network2.java b/src/class161/Code07_Network2.java index 168bb6356..f0cf0f9e5 100644 --- a/src/class161/Code07_Network2.java +++ b/src/class161/Code07_Network2.java @@ -26,6 +26,7 @@ //int nxt[MAXN << 1]; //int to[MAXN << 1]; //int cntg = 0; +// //int fa[MAXN]; //int dep[MAXN]; //int siz[MAXN]; @@ -33,12 +34,15 @@ //int top[MAXN]; //int dfn[MAXN]; //int cntd = 0; +// //int tree[MAXN]; +// //int events[MAXM][4]; -//int lset[MAXM][4]; -//int rset[MAXM][4]; //int sorted[MAXM]; //int s = 0; +// +//int lset[MAXM][4]; +//int rset[MAXM][4]; //int ans[MAXM]; //int cntans = 0; // From fa74ae026686a0a443f6144d65849c126a6466c3 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 2 Mar 2025 16:05:55 +0800 Subject: [PATCH 0752/2029] modify code --- src/class161/Code01_HLD1.java | 2 +- src/class161/Code01_HLD2.java | 2 +- src/class161/Code02_LCA1.java | 2 +- src/class161/Code02_LCA2.java | 2 +- src/class161/Code03_PathMaxAndSum1.java | 2 +- src/class161/Code03_PathMaxAndSum2.java | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/class161/Code01_HLD1.java b/src/class161/Code01_HLD1.java index 827a553e4..bf4ed25dc 100644 --- a/src/class161/Code01_HLD1.java +++ b/src/class161/Code01_HLD1.java @@ -1,6 +1,6 @@ package class161; -// 树链剖分模版题1,java版 +// 重链剖分模版题,java版 // 一共有n个节点,给定n-1条边,节点连成一棵树,给定树的头节点编号root // 一共有m条操作,每种操作是如下4种类型中的一种 // 操作 1 x y v : x到y的路径上,每个节点值增加v diff --git a/src/class161/Code01_HLD2.java b/src/class161/Code01_HLD2.java index fdc28fc34..ca6697a09 100644 --- a/src/class161/Code01_HLD2.java +++ b/src/class161/Code01_HLD2.java @@ -1,6 +1,6 @@ package class161; -// 树链剖分模版题1,C++版 +// 重链剖分模版题,C++版 // 一共有n个节点,给定n-1条边,节点连成一棵树,给定树的头节点编号root // 一共有m条操作,每种操作是如下4种类型中的一种 // 操作 1 x y v : x到y的路径上,每个节点值增加v diff --git a/src/class161/Code02_LCA1.java b/src/class161/Code02_LCA1.java index eb6b10169..8ac627c0d 100644 --- a/src/class161/Code02_LCA1.java +++ b/src/class161/Code02_LCA1.java @@ -1,6 +1,6 @@ package class161; -// 树链剖分模版题2,java版 +// 重链剖分解决LCA查询,java版 // 一共有n个节点,给定n-1条边,节点连成一棵树,给定头节点编号root // 一共有m条查询,每条查询给定a和b,打印a和b的最低公共祖先 // 请用树链剖分的方式实现 diff --git a/src/class161/Code02_LCA2.java b/src/class161/Code02_LCA2.java index 99b45a9e9..9185a2e43 100644 --- a/src/class161/Code02_LCA2.java +++ b/src/class161/Code02_LCA2.java @@ -1,6 +1,6 @@ package class161; -// 树链剖分模版题2,C++版 +// 重链剖分解决LCA查询,C++版 // 一共有n个节点,给定n-1条边,节点连成一棵树,给定头节点编号root // 一共有m条查询,每条查询给定a和b,打印a和b的最低公共祖先 // 请用树链剖分的方式实现 diff --git a/src/class161/Code03_PathMaxAndSum1.java b/src/class161/Code03_PathMaxAndSum1.java index 3f156c747..a1db818c8 100644 --- a/src/class161/Code03_PathMaxAndSum1.java +++ b/src/class161/Code03_PathMaxAndSum1.java @@ -1,6 +1,6 @@ package class161; -// 树链剖分模版题3,java版 +// 路径最大值与累加和,java版 // 一共有n个节点,给定n-1条边,节点连成一棵树,每个节点给定权值 // 一共有m条操作,每种操作是如下3种类型中的一种 // 操作 CHANGE x y : x的权值修改为y diff --git a/src/class161/Code03_PathMaxAndSum2.java b/src/class161/Code03_PathMaxAndSum2.java index 216f7ca1a..9041b1065 100644 --- a/src/class161/Code03_PathMaxAndSum2.java +++ b/src/class161/Code03_PathMaxAndSum2.java @@ -1,6 +1,6 @@ package class161; -// 树链剖分模版题3,C++版 +// 路径最大值与累加和,C++版 // 一共有n个节点,给定n-1条边,节点连成一棵树,每个节点给定权值 // 一共有m条操作,每种操作是如下3种类型中的一种 // 操作 CHANGE x y : x的权值修改为y From 58519055d2a3759af3a182932e15a05e8e1ebe8c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 2 Mar 2025 17:32:14 +0800 Subject: [PATCH 0753/2029] modify code --- src/class161/Code01_HLD1.java | 3 ++- src/class161/Code01_HLD2.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/class161/Code01_HLD1.java b/src/class161/Code01_HLD1.java index bf4ed25dc..9cdb986cb 100644 --- a/src/class161/Code01_HLD1.java +++ b/src/class161/Code01_HLD1.java @@ -1,7 +1,8 @@ package class161; // 重链剖分模版题,java版 -// 一共有n个节点,给定n-1条边,节点连成一棵树,给定树的头节点编号root +// 一共有n个节点,给定n-1条边,节点连成一棵树 +// 给定每个节点的初始权值,给定树的头节点编号root // 一共有m条操作,每种操作是如下4种类型中的一种 // 操作 1 x y v : x到y的路径上,每个节点值增加v // 操作 2 x y : x到y的路径上,打印所有节点值的累加和 diff --git a/src/class161/Code01_HLD2.java b/src/class161/Code01_HLD2.java index ca6697a09..812811ac9 100644 --- a/src/class161/Code01_HLD2.java +++ b/src/class161/Code01_HLD2.java @@ -1,7 +1,8 @@ package class161; // 重链剖分模版题,C++版 -// 一共有n个节点,给定n-1条边,节点连成一棵树,给定树的头节点编号root +// 一共有n个节点,给定n-1条边,节点连成一棵树 +// 给定每个节点的初始权值,给定树的头节点编号root // 一共有m条操作,每种操作是如下4种类型中的一种 // 操作 1 x y v : x到y的路径上,每个节点值增加v // 操作 2 x y : x到y的路径上,打印所有节点值的累加和 From b6dda2170295d44b4fb8bb91c030aea00ba93945 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 2 Mar 2025 20:05:37 +0800 Subject: [PATCH 0754/2029] modify code --- src/class161/Code01_HLD1.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/class161/Code01_HLD1.java b/src/class161/Code01_HLD1.java index 9cdb986cb..c5c6d6397 100644 --- a/src/class161/Code01_HLD1.java +++ b/src/class161/Code01_HLD1.java @@ -54,6 +54,8 @@ public static void addEdge(int u, int v) { } // 递归版,C++可以通过,java会爆栈 + // 来到节点u,节点u树上的父节点是f + // dfs1的过程去设置 fa dep siz son public static void dfs1(int u, int f) { fa[u] = f; dep[u] = dep[f] + 1; @@ -76,6 +78,8 @@ public static void dfs1(int u, int f) { } // 递归版,C++可以通过,java会爆栈 + // 来到节点u,节点u所在重链的头节点是t + // dfs2的过程去设置 top dfn seg public static void dfs2(int u, int t) { top[u] = t; dfn[u] = ++cntd; @@ -234,6 +238,7 @@ public static long query(int jobl, int jobr, int l, int r, int i) { return ans; } + // 从x到y的路径上,所有节点的值增加v public static void pathAdd(int x, int y, int v) { while (top[x] != top[y]) { if (dep[top[x]] <= dep[top[y]]) { @@ -247,10 +252,12 @@ public static void pathAdd(int x, int y, int v) { add(Math.min(dfn[x], dfn[y]), Math.max(dfn[x], dfn[y]), v, 1, n, 1); } + // x的子树上,所有节点的值增加v public static void subtreeAdd(int x, int v) { add(dfn[x], dfn[x] + siz[x] - 1, v, 1, n, 1); } + // 从x到y的路径上,查询所有节点的累加和 public static long pathSum(int x, int y) { long ans = 0; while (top[x] != top[y]) { @@ -266,6 +273,7 @@ public static long pathSum(int x, int y) { return ans; } + // x的子树上,查询所有节点的累加和 public static long subtreeSum(int x) { return query(dfn[x], dfn[x] + siz[x] - 1, 1, n, 1); } From ed5ce296b76089b3a973c3b03d2b03b9a72321f4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 3 Mar 2025 00:24:54 +0800 Subject: [PATCH 0755/2029] modify code --- src/class161/Code07_Network1.java | 47 ++++++++++++++++++------------- src/class161/Code07_Network2.java | 42 ++++++++++++++++----------- 2 files changed, 53 insertions(+), 36 deletions(-) diff --git a/src/class161/Code07_Network1.java b/src/class161/Code07_Network1.java index cb8d08553..e2c9270b9 100644 --- a/src/class161/Code07_Network1.java +++ b/src/class161/Code07_Network1.java @@ -12,10 +12,7 @@ // 1 <= m <= 2 * 10^5 // 重要度 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P3250 -// 提交以下的code,提交时请把类名改成"Main",会有一个测试用例超时 -// 因为这道题根据C++的运行时间,制定通过标准,根本没考虑java的用户 -// 想通过用C++实现,本节课Code07_Network2文件就是C++的实现 -// 两个版本的逻辑完全一样,C++版本可以通过所有测试 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.BufferedReader; import java.io.IOException; @@ -199,6 +196,17 @@ public static void dfs4() { } } + 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 add(int i, int v) { for (; i <= n; i += i & -i) { tree[i] += v; @@ -213,22 +221,19 @@ public static int query(int i) { return sum; } - public static void linkAdd(int x, int y, int v) { - add(x, v); - add(y + 1, -v); - } - public static void pathAdd(int x, int y, int v) { - while (top[x] != top[y]) { - if (dep[top[x]] <= dep[top[y]]) { - linkAdd(dfn[top[y]], dfn[y], v); - y = fa[top[y]]; - } else { - linkAdd(dfn[top[x]], dfn[x], v); - x = fa[top[x]]; - } + 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); } - linkAdd(Math.min(dfn[x], dfn[y]), Math.max(dfn[x], dfn[y]), v); + } + + 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) { @@ -268,6 +273,9 @@ 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) { @@ -295,8 +303,7 @@ public static void compute(int evtl, int evtr, int impl, int impr) { clone(lset[++lsize], events[i]); } } else { - int sum = query(dfn[events[i][1]]); - if (sum != request) { + if (pointQuery(events[i][1]) != request) { clone(rset[++rsize], events[i]); } else { clone(lset[++lsize], events[i]); diff --git a/src/class161/Code07_Network2.java b/src/class161/Code07_Network2.java index f0cf0f9e5..9f7c091dc 100644 --- a/src/class161/Code07_Network2.java +++ b/src/class161/Code07_Network2.java @@ -103,6 +103,17 @@ // } //} // +//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 add(int i, int v) { // for (; i <= n; i += i & -i) { // tree[i] += v; @@ -117,22 +128,19 @@ // return sum; //} // -//void linkAdd(int x, int y, int v) { -// add(x, v); -// add(y + 1, -v); -//} -// //void pathAdd(int x, int y, int v) { -// while (top[x] != top[y]) { -// if (dep[top[x]] <= dep[top[y]]) { -// linkAdd(dfn[top[y]], dfn[y], v); -// y = fa[top[y]]; -// } else { -// linkAdd(dfn[top[x]], dfn[x], v); -// x = fa[top[x]]; -// } +// 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); // } -// linkAdd(min(dfn[x], dfn[y]), max(dfn[x], dfn[y]), v); +//} +// +//int pointQuery(int x) { +// return query(dfn[x] + siz[x] - 1) - query(dfn[x] - 1); //} // //void clone(int *event1, int *event2) { @@ -172,6 +180,9 @@ //} // //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) { @@ -199,8 +210,7 @@ // clone(lset[++lsize], events[i]); // } // } else { -// int sum = query(dfn[events[i][1]]); -// if (sum != request) { +// if (pointQuery(events[i][1]) != request) { // clone(rset[++rsize], events[i]); // } else { // clone(lset[++lsize], events[i]); From 07b200630e23bb60970a0f156a13aa2706ce928e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 3 Mar 2025 12:52:36 +0800 Subject: [PATCH 0756/2029] modify code --- src/class161/Code07_Network1.java | 2 +- src/class161/Code07_Network2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class161/Code07_Network1.java b/src/class161/Code07_Network1.java index e2c9270b9..a034a30a1 100644 --- a/src/class161/Code07_Network1.java +++ b/src/class161/Code07_Network1.java @@ -10,7 +10,7 @@ // 如果当前时间下,没有任何请求、或者所有请求都和x号服务器有关,打印-1 // 2 <= n <= 10^5 // 1 <= m <= 2 * 10^5 -// 重要度 <= 10^9 +// 1 <= 重要度 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P3250 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class161/Code07_Network2.java b/src/class161/Code07_Network2.java index 9f7c091dc..8f67dd3c4 100644 --- a/src/class161/Code07_Network2.java +++ b/src/class161/Code07_Network2.java @@ -10,7 +10,7 @@ // 如果当前时间下,没有任何请求、或者所有请求都和x号服务器有关,打印-1 // 2 <= n <= 10^5 // 1 <= m <= 2 * 10^5 -// 重要度 <= 10^9 +// 1 <= 重要度 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P3250 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From 797d88034da6605001cfd8d3c00a61a1cc2e9308 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 3 Mar 2025 13:14:29 +0800 Subject: [PATCH 0757/2029] modify code --- src/class161/Code07_Network1.java | 30 +++++++++++++++--------------- src/class161/Code07_Network2.java | 30 +++++++++++++++--------------- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/src/class161/Code07_Network1.java b/src/class161/Code07_Network1.java index a034a30a1..cc19f228d 100644 --- a/src/class161/Code07_Network1.java +++ b/src/class161/Code07_Network1.java @@ -56,21 +56,6 @@ public class Code07_Network1 { public static int[] ans = new int[MAXM]; public static int cntans = 0; - 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 addEdge(int u, int v) { next[++cntg] = head[u]; to[cntg] = v; @@ -236,6 +221,21 @@ 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]; diff --git a/src/class161/Code07_Network2.java b/src/class161/Code07_Network2.java index 8f67dd3c4..72e83d7c0 100644 --- a/src/class161/Code07_Network2.java +++ b/src/class161/Code07_Network2.java @@ -46,21 +46,6 @@ //int ans[MAXM]; //int cntans = 0; // -//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 addEdge(int u, int v) { // nxt[++cntg] = head[u]; // to[cntg] = v; @@ -143,6 +128,21 @@ // 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 *event1, int *event2) { // event1[0] = event2[0]; // event1[1] = event2[1]; From c78409cb1348d9d4d149606eac1d133a9fb3bfc5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 3 Mar 2025 15:17:50 +0800 Subject: [PATCH 0758/2029] modify code --- src/class161/Code04_PackageManager1.java | 8 ++++---- src/class161/Code04_PackageManager2.java | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/class161/Code04_PackageManager1.java b/src/class161/Code04_PackageManager1.java index 9d5a09dde..6613b5434 100644 --- a/src/class161/Code04_PackageManager1.java +++ b/src/class161/Code04_PackageManager1.java @@ -26,8 +26,6 @@ public class Code04_PackageManager1 { public static int n, m; - 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]; @@ -220,7 +218,9 @@ public static long query(int jobl, int jobr, int l, int r, int i) { return ans; } - public static void pathUpdate(int x, int y, int v) { + // 从1到x的路径上,所有节点值改成v + public static void pathUpdate(int x, int v) { + int y = 1; while (top[x] != top[y]) { if (dep[top[x]] <= dep[top[y]]) { update(dfn[top[y]], dfn[y], v, 1, n, 1); @@ -235,7 +235,7 @@ public static void pathUpdate(int x, int y, int v) { public static int install(int x) { int pre = sum[1]; - pathUpdate(1, x, 1); + pathUpdate(x, 1); int post = sum[1]; return Math.abs(post - pre); } diff --git a/src/class161/Code04_PackageManager2.java b/src/class161/Code04_PackageManager2.java index c417bfc1d..02187672a 100644 --- a/src/class161/Code04_PackageManager2.java +++ b/src/class161/Code04_PackageManager2.java @@ -18,7 +18,6 @@ // //const int MAXN = 100001; //int n, m; -//int arr[MAXN]; // //int head[MAXN]; //int nxt[MAXN << 1]; @@ -115,7 +114,8 @@ // return ans; //} // -//void pathUpdate(int x, int y, int v) { +//void pathUpdate(int x, int v) { +// int y = 1; // while (top[x] != top[y]) { // if (dep[top[x]] <= dep[top[y]]) { // updateRange(dfn[top[y]], dfn[y], v, 1, n, 1); @@ -130,7 +130,7 @@ // //int install(int x) { // int pre = sum[1]; -// pathUpdate(1, x, 1); +// pathUpdate(x, 1); // int post = sum[1]; // return abs(post - pre); //} From d5492db42c9587fbd6a873572567c37e2d342161 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 3 Mar 2025 15:19:39 +0800 Subject: [PATCH 0759/2029] modify code --- src/class161/Code04_PackageManager1.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/class161/Code04_PackageManager1.java b/src/class161/Code04_PackageManager1.java index 6613b5434..19cd5bfa6 100644 --- a/src/class161/Code04_PackageManager1.java +++ b/src/class161/Code04_PackageManager1.java @@ -172,6 +172,7 @@ public static void up(int i) { sum[i] = sum[i << 1] + sum[i << 1 | 1]; } + // 线段树重置操作的懒更新 public static void lazy(int i, int v, int n) { sum[i] = v * n; update[i] = true; From 600e5c6333a3ca7c5fcb864132e23e60fb9a7927 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 3 Mar 2025 16:23:56 +0800 Subject: [PATCH 0760/2029] modify code --- src/class161/Code05_Coloring1.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/class161/Code05_Coloring1.java b/src/class161/Code05_Coloring1.java index abbe638fc..fe7cb508e 100644 --- a/src/class161/Code05_Coloring1.java +++ b/src/class161/Code05_Coloring1.java @@ -46,6 +46,9 @@ public class Code05_Coloring1 { public static int[] sum = new int[MAXN << 2]; public static int[] lcolor = new int[MAXN << 2]; public static int[] rcolor = new int[MAXN << 2]; + // change是线段树的懒更新信息 + // change[i] == 0 代表没有懒更新信息 + // change[i] != 0 代表颜色重置为change[i] public static int[] change = new int[MAXN << 2]; public static void addEdge(int u, int v) { @@ -247,6 +250,7 @@ public static int query(int jobl, int jobr, int l, int r, int i) { } } + // 查询单点颜色,jobi为节点的dfn序号 public static int pointColor(int jobi, int l, int r, int i) { if (l == r) { return lcolor[i]; From b04e422925b3522b254916d28bd33a0f239e7265 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 3 Mar 2025 16:35:26 +0800 Subject: [PATCH 0761/2029] modify code --- src/class161/Code06_Tourism1.java | 37 +++++++++++++++++++++---------- src/class161/Code06_Tourism2.java | 23 +++++++++---------- 2 files changed, 36 insertions(+), 24 deletions(-) diff --git a/src/class161/Code06_Tourism1.java b/src/class161/Code06_Tourism1.java index 1cd06db73..ff3876c2e 100644 --- a/src/class161/Code06_Tourism1.java +++ b/src/class161/Code06_Tourism1.java @@ -225,6 +225,15 @@ public static void add(int jobl, int jobr, int jobv, int l, int r, int i) { } } + // ans[0] : 线段树更左侧部分的max + // ans[1] : 线段树更左侧部分的min + // ans[2] : 线段树更左侧部分的lprofit + // ans[3] : 线段树更左侧部分的rprofit + // rmax : 线段树更右侧部分的max + // rmin : 线段树更右侧部分的min + // rlpro : 线段树更右侧部分的lprofit + // rrpro : 线段树更右侧部分的rprofit + // 左侧部分和右侧部分的信息整合在一起得到整个范围的max、min、lprofit、rprofit public static void merge(int[] ans, int rmax, int rmin, int rlpro, int rrpro) { int lmax = ans[0]; int lmin = ans[1]; @@ -236,6 +245,11 @@ public static void merge(int[] ans, int rmax, int rmin, int rlpro, int rrpro) { ans[3] = Math.max(Math.max(lrpro, rrpro), lmax - rmin); } + // ans[0] : 线段树更左侧部分的max + // ans[1] : 线段树更左侧部分的min + // ans[2] : 线段树更左侧部分的lprofit + // ans[3] : 线段树更左侧部分的rprofit + // 随着线段树查询的展开,会有更右部分的信息整合进ans,最终整合出整体信息 public static void query(int[] ans, int jobl, int jobr, int l, int r, int i) { if (jobl <= l && r <= jobr) { merge(ans, max[i], min[i], lprofit[i], rprofit[i]); @@ -259,6 +273,13 @@ public static void query(int[] ans, int jobl, int jobr) { query(ans, jobl, jobr, 1, n, 1); } + 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 compute(int x, int y, int v) { int tmpx = x, tmpy = y; int[] xpath = new int[] { -INF, INF, 0, 0 }; @@ -268,31 +289,23 @@ public static int compute(int x, int y, int v) { if (dep[top[x]] <= dep[top[y]]) { query(cur, dfn[top[y]], dfn[y]); merge(cur, ypath[0], ypath[1], ypath[2], ypath[3]); - for (int i = 0; i <= 3; i++) { - ypath[i] = cur[i]; - } + clone(ypath, cur); y = fa[top[y]]; } else { query(cur, dfn[top[x]], dfn[x]); merge(cur, xpath[0], xpath[1], xpath[2], xpath[3]); - for (int i = 0; i <= 3; i++) { - xpath[i] = cur[i]; - } + clone(xpath, cur); x = fa[top[x]]; } } if (dep[x] <= dep[y]) { query(cur, dfn[x], dfn[y]); merge(cur, ypath[0], ypath[1], ypath[2], ypath[3]); - for (int i = 0; i <= 3; i++) { - ypath[i] = cur[i]; - } + clone(ypath, cur); } else { query(cur, dfn[y], dfn[x]); merge(cur, xpath[0], xpath[1], xpath[2], xpath[3]); - for (int i = 0; i <= 3; i++) { - xpath[i] = cur[i]; - } + clone(xpath, cur); } int ans = Math.max(Math.max(xpath[3], ypath[2]), ypath[0] - xpath[1]); x = tmpx; diff --git a/src/class161/Code06_Tourism2.java b/src/class161/Code06_Tourism2.java index a7d692925..047cdfa4b 100644 --- a/src/class161/Code06_Tourism2.java +++ b/src/class161/Code06_Tourism2.java @@ -169,6 +169,13 @@ // query(ans, jobl, jobr, 1, n, 1); //} // +//void clone(int *a, int *b) { +// a[0] = b[0]; +// a[1] = b[1]; +// a[2] = b[2]; +// a[3] = b[3]; +//} +// //int compute(int x, int y, int v) { // int tmpx = x; // int tmpy = y; @@ -179,31 +186,23 @@ // if (dep[top[x]] <= dep[top[y]]) { // query(cur, dfn[top[y]], dfn[y]); // merge(cur, ypath[0], ypath[1], ypath[2], ypath[3]); -// for (int i = 0; i <= 3; i++) { -// ypath[i] = cur[i]; -// } +// clone(ypath, cur); // y = fa[top[y]]; // } else { // query(cur, dfn[top[x]], dfn[x]); // merge(cur, xpath[0], xpath[1], xpath[2], xpath[3]); -// for (int i = 0; i <= 3; i++) { -// xpath[i] = cur[i]; -// } +// clone(xpath, cur); // x = fa[top[x]]; // } // } // if (dep[x] <= dep[y]) { // query(cur, dfn[x], dfn[y]); // merge(cur, ypath[0], ypath[1], ypath[2], ypath[3]); -// for (int i = 0; i <= 3; i++) { -// ypath[i] = cur[i]; -// } +// clone(ypath, cur); // } else { // query(cur, dfn[y], dfn[x]); // merge(cur, xpath[0], xpath[1], xpath[2], xpath[3]); -// for (int i = 0; i <= 3; i++) { -// xpath[i] = cur[i]; -// } +// clone(xpath, cur); // } // int ans = max({xpath[3], ypath[2], ypath[0] - xpath[1]}); // x = tmpx; From 4f4188393b92067b16b69def2bc2089f2917bcfb Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 3 Mar 2025 18:22:00 +0800 Subject: [PATCH 0762/2029] modify code --- src/class161/Code06_Tourism1.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/class161/Code06_Tourism1.java b/src/class161/Code06_Tourism1.java index ff3876c2e..adf45126f 100644 --- a/src/class161/Code06_Tourism1.java +++ b/src/class161/Code06_Tourism1.java @@ -47,6 +47,7 @@ public class Code06_Tourism1 { public static int[] min = new int[MAXN << 2]; public static int[] lprofit = new int[MAXN << 2]; public static int[] rprofit = new int[MAXN << 2]; + // 线段树范围增加的懒更新信息 public static int[] addTag = new int[MAXN << 2]; public static void addEdge(int u, int v) { From 2c4e023d97e206c44020035a2efd96dc12cdebe3 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 4 Mar 2025 15:15:52 +0800 Subject: [PATCH 0763/2029] modify code --- src/class161/Code07_FarAway1.java | 334 +++++++++++++++++++++++++++ src/class161/Code07_FarAway2.java | 222 ++++++++++++++++++ src/class161/Code07_Network1.java | 369 ------------------------------ src/class161/Code07_Network2.java | 260 --------------------- 4 files changed, 556 insertions(+), 629 deletions(-) create mode 100644 src/class161/Code07_FarAway1.java create mode 100644 src/class161/Code07_FarAway2.java delete mode 100644 src/class161/Code07_Network1.java delete mode 100644 src/class161/Code07_Network2.java diff --git a/src/class161/Code07_FarAway1.java b/src/class161/Code07_FarAway1.java new file mode 100644 index 000000000..6a206afa3 --- /dev/null +++ b/src/class161/Code07_FarAway1.java @@ -0,0 +1,334 @@ +package class161; + +// 遥远的国度,java版 +// 一共有n个节点,给定n-1条边,节点连成一棵树,给定树的初始头节点,给定每个点的点权 +// 一共有m条操作,每种操作是如下3种类型中的一种 +// 操作 1 x : 树的头节点变成x,树的形态重新组织 +// 操作 2 x y v : x到y的路径上,所有节点的值改成v +// 操作 3 x : 当前树的形态下,打印x的子树最小值 +// 1 <= n、m <= 10^5 +// 任何时候节点值一定是正数 +// 测试链接 : https://www.luogu.com.cn/problem/P3979 +// 提交以下的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 Code07_FarAway1 { + + public static int MAXN = 100001; + public static int n, m; + 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[] seg = new int[MAXN]; + public static int cntd = 0; + + public static int[] min = new int[MAXN << 2]; + // 重置操作的懒更新信息 + // 因为题目说了,任何时候节点值一定是正数 + // change[i] == 0,表示没有重置懒更新 + // change[i] != 0,表示范围内的数字修改为change[i] + public static int[] change = new int[MAXN << 2]; + + 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; + 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; + } + } + } + } + + // 递归版,C++可以通过,java会爆栈 + public static void dfs2(int u, int t) { + top[u] = t; + dfn[u] = ++cntd; + seg[cntd] = 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) { // edge == -1,表示第一次来到当前节点,并且先处理重儿子 + top[first] = second; + dfn[first] = ++cntd; + seg[cntd] = first; + if (son[first] == 0) { + continue; + } + push(first, second, -2); + push(son[first], second, -1); + continue; + } else if (edge == -2) { // edge == -2,表示处理完当前节点的重儿子,回到了当前节点 + edge = head[first]; + } else { // edge >= 0, 继续处理其他的边 + 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 up(int i) { + min[i] = Math.min(min[i << 1], min[i << 1 | 1]); + } + + public static void lazy(int i, int v) { + min[i] = v; + change[i] = v; + } + + public static void down(int i) { + if (change[i] != 0) { + lazy(i << 1, change[i]); + lazy(i << 1 | 1, change[i]); + change[i] = 0; + } + } + + public static void build(int l, int r, int i) { + if (l == r) { + min[i] = arr[seg[l]]; + } else { + int mid = (l + r) / 2; + build(l, mid, i << 1); + build(mid + 1, r, i << 1 | 1); + up(i); + } + } + + public static void update(int jobl, int jobr, int jobv, int l, int r, int i) { + if (jobl <= l && r <= jobr) { + lazy(i, jobv); + } else { + down(i); + int mid = (l + r) / 2; + if (jobl <= mid) { + update(jobl, jobr, jobv, l, mid, i << 1); + } + if (jobr > mid) { + update(jobl, jobr, jobv, mid + 1, r, i << 1 | 1); + } + up(i); + } + } + + public static int query(int jobl, int jobr, int l, int r, int i) { + if (jobl <= l && r <= jobr) { + return min[i]; + } + down(i); + int mid = (l + r) / 2; + int ans = Integer.MAX_VALUE; + 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 ans; + } + + public static void pathUpdate(int x, int y, int v) { + while (top[x] != top[y]) { + if (dep[top[x]] <= dep[top[y]]) { + update(dfn[top[y]], dfn[y], v, 1, n, 1); + y = fa[top[y]]; + } else { + update(dfn[top[x]], dfn[x], v, 1, n, 1); + x = fa[top[x]]; + } + } + update(Math.min(dfn[x], dfn[y]), Math.max(dfn[x], dfn[y]), v, 1, n, 1); + } + + // 判断root和u的关系 + // 如果root和u是同一个点,返回-1 + // 如果root不在u的子树上,返回0 + // 如果root在u的子树上,找到u的哪个儿子的子树里有root,返回那个儿子的编号 + public static int find(int root, int u) { + if (u == root) { + return -1; + } + if (dfn[root] < dfn[u] || dfn[u] + siz[u] <= dfn[root]) { + return 0; + } + while (top[root] != top[u]) { + if (fa[top[root]] == u) { + return top[root]; + } + root = fa[top[root]]; + } + return son[u]; + } + + // 假设树的头节点变成root,查询在变化后的树中,u的子树中,最小值是多少 + public static int treeQuery(int root, int u) { + int uson = find(root, u); + if (uson == -1) { + return min[1]; + } else if (uson == 0) { + return query(dfn[u], dfn[u] + siz[u] - 1, 1, n, 1); + } else { + int ans = query(1, dfn[uson] - 1, 1, n, 1); + if (dfn[uson] + siz[uson] <= n) { + ans = Math.min(ans, query(dfn[uson] + siz[uson], n, 1, n, 1)); + } + return ans; + } + } + + 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 <= n; i++) { + in.nextToken(); + arr[i] = (int) in.nval; + } + dfs3(); // dfs3() 等同于 dfs1(1, 0),调用迭代版防止爆栈 + dfs4(); // dfs4() 等同于 dfs2(1, 1),调用迭代版防止爆栈 + build(1, n, 1); + in.nextToken(); + int root = (int) in.nval; + for (int i = 1, op, x, y, v; i <= m; i++) { + in.nextToken(); + op = (int) in.nval; + if (op == 1) { + in.nextToken(); + root = (int) in.nval; + } else if (op == 2) { + in.nextToken(); + x = (int) in.nval; + in.nextToken(); + y = (int) in.nval; + in.nextToken(); + v = (int) in.nval; + pathUpdate(x, y, v); + } else { + in.nextToken(); + x = (int) in.nval; + out.println(treeQuery(root, x)); + } + } + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class161/Code07_FarAway2.java b/src/class161/Code07_FarAway2.java new file mode 100644 index 000000000..e59c7253b --- /dev/null +++ b/src/class161/Code07_FarAway2.java @@ -0,0 +1,222 @@ +package class161; + +// 遥远的国度,C++版 +// 一共有n个节点,给定n-1条边,节点连成一棵树,给定树的初始头节点,给定每个点的点权 +// 一共有m条操作,每种操作是如下3种类型中的一种 +// 操作 1 x : 树的头节点变成x,树的形态重新组织 +// 操作 2 x y v : x到y的路径上,所有节点的值改成v +// 操作 3 x : 当前树的形态下,打印x的子树最小值 +// 1 <= n、m <= 10^5 +// 任何时候节点值一定是正数 +// 测试链接 : https://www.luogu.com.cn/problem/P3979 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +//int n, m; +//int arr[MAXN]; +// +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int cntg = 0; +// +//int fa[MAXN]; +//int dep[MAXN]; +//int siz[MAXN]; +//int son[MAXN]; +//int top[MAXN]; +//int dfn[MAXN]; +//int seg[MAXN]; +//int cntd = 0; +// +//int minv[MAXN << 2]; +//int change[MAXN << 2]; +// +//void addEdge(int u, int v) { +// ++cntg; +// 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]; e > 0; e = nxt[e]) { +// int v = to[e]; +// if (v != f) { +// dfs1(v, u); +// } +// } +// for (int e = head[u]; e > 0; e = nxt[e]) { +// int 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; +// dfn[u] = ++cntd; +// seg[cntd] = u; +// if (son[u] == 0) { +// return; +// } +// dfs2(son[u], t); +// for (int e = head[u]; e > 0; e = nxt[e]) { +// int v = to[e]; +// if (v != fa[u] && v != son[u]) { +// dfs2(v, v); +// } +// } +//} +// +//void up(int i) { +// minv[i] = min(minv[i << 1], minv[i << 1 | 1]); +//} +// +//void lazy(int i, int v) { +// minv[i] = v; +// change[i] = v; +//} +// +//void down(int i) { +// if (change[i] != 0) { +// lazy(i << 1, change[i]); +// lazy(i << 1 | 1, change[i]); +// change[i] = 0; +// } +//} +// +//void build(int l, int r, int i) { +// if (l == r) { +// minv[i] = arr[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 jobl, int jobr, int jobv, int l, int r, int i) { +// if (jobl <= l && r <= jobr) { +// lazy(i, jobv); +// } else { +// down(i); +// int mid = (l + r) >> 1; +// if (jobl <= mid) { +// update(jobl, jobr, jobv, l, mid, i << 1); +// } +// if (jobr > mid) { +// update(jobl, jobr, jobv, mid + 1, r, i << 1 | 1); +// } +// up(i); +// } +//} +// +//int query(int jobl, int jobr, int l, int r, int i) { +// if (jobl <= l && r <= jobr) { +// return minv[i]; +// } +// down(i); +// int mid = (l + r) >> 1; +// int ans = INT_MAX; +// 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 ans; +//} +// +//void pathUpdate(int x, int y, int v) { +// while (top[x] != top[y]) { +// if (dep[top[x]] <= dep[top[y]]) { +// update(dfn[top[y]], dfn[y], v, 1, n, 1); +// y = fa[top[y]]; +// } else { +// update(dfn[top[x]], dfn[x], v, 1, n, 1); +// x = fa[top[x]]; +// } +// } +// update(min(dfn[x], dfn[y]), max(dfn[x], dfn[y]), v, 1, n, 1); +//} +// +//int find(int root, int u) { +// if (u == root) { +// return -1; +// } +// if (dfn[root] < dfn[u] || dfn[u] + siz[u] <= dfn[root]) { +// return 0; +// } +// while (top[root] != top[u]) { +// if (fa[top[root]] == u) { +// return top[root]; +// } +// root = fa[top[root]]; +// } +// return son[u]; +//} +// +//int treeQuery(int root, int u) { +// int uson = find(root, u); +// if (uson == -1) { +// return minv[1]; +// } else if (uson == 0) { +// return query(dfn[u], dfn[u] + siz[u] - 1, 1, n, 1); +// } else { +// int ans = INT_MAX; +// if (1 <= dfn[uson] - 1) { +// ans = min(ans, query(1, dfn[uson] - 1, 1, n, 1)); +// } +// if (dfn[uson] + siz[uson] <= n) { +// ans = min(ans, query(dfn[uson] + siz[uson], n, 1, n, 1)); +// } +// return ans; +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1; i < n; i++) { +// int u, v; +// cin >> u >> v; +// addEdge(u, v); +// addEdge(v, u); +// } +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// dfs1(1, 0); +// dfs2(1, 1); +// build(1, n, 1); +// int root; +// cin >> root; +// for (int i = 1, op, x, y, v; i <= m; i++) { +// cin >> op; +// if (op == 1) { +// cin >> root; +// } else if (op == 2) { +// cin >> x >> y >> v; +// pathUpdate(x, y, v); +// } else { +// cin >> x; +// cout << treeQuery(root, x) << "\n"; +// } +// } +// return 0; +//} \ No newline at end of file diff --git a/src/class161/Code07_Network1.java b/src/class161/Code07_Network1.java deleted file mode 100644 index cc19f228d..000000000 --- a/src/class161/Code07_Network1.java +++ /dev/null @@ -1,369 +0,0 @@ -package class161; - -// 网络,java版 -// 一共有n个服务器,给定n-1条边,所有服务器连成一棵树 -// 某两个服务器之间的路径上,可能接受一条请求,路径上的所有服务器都需要保存该请求的重要度 -// 一共有m条操作,每条操作是如下3种类型中的一种,操作依次发生,第i条操作发生的时间为i -// 操作 0 a b v : a号服务器到b号服务器的路径上,增加了一个重要度为v的请求 -// 操作 1 t : 当初时间为t的操作,一定是增加请求的操作,现在这个请求结束了 -// 操作 2 x : 当前时间下,和x号服务器无关的所有请求中,打印最大的重要度 -// 如果当前时间下,没有任何请求、或者所有请求都和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 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[] son = new int[MAXN]; - public static int[] top = new int[MAXN]; - public static int[] dfn = new int[MAXN]; - public static int cntd = 0; - - // 树状数组 - 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; - 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; - } - } - } - } - - // 递归版,C++可以通过,java会爆栈 - public static void dfs2(int u, int t) { - top[u] = t; - dfn[u] = ++cntd; - 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) { // edge == -1,表示第一次来到当前节点,并且先处理重儿子 - top[first] = second; - dfn[first] = ++cntd; - if (son[first] == 0) { - continue; - } - push(first, second, -2); - push(son[first], second, -1); - continue; - } else if (edge == -2) { // edge == -2,表示处理完当前节点的重儿子,回到了当前节点 - edge = head[first]; - } else { // edge >= 0, 继续处理其他的边 - 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 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() { - dfs3(); // dfs3() 等同于 dfs1(1, 0),调用迭代版防止爆栈 - dfs4(); // dfs4() 等同于 dfs2(1, 1),调用迭代版防止爆栈 - 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(); - } - -} diff --git a/src/class161/Code07_Network2.java b/src/class161/Code07_Network2.java deleted file mode 100644 index 72e83d7c0..000000000 --- a/src/class161/Code07_Network2.java +++ /dev/null @@ -1,260 +0,0 @@ -package class161; - -// 网络,C++版 -// 一共有n个服务器,给定n-1条边,所有服务器连成一棵树 -// 某两个服务器之间的路径上,可能接受一条请求,路径上的所有服务器都需要保存该请求的重要度 -// 一共有m条操作,每条操作是如下3种类型中的一种,操作依次发生,第i条操作发生的时间为i -// 操作 0 a b v : a号服务器到b号服务器的路径上,增加了一个重要度为v的请求 -// 操作 1 t : 当初时间为t的操作,一定是增加请求的操作,现在这个请求结束了 -// 操作 2 x : 当前时间下,和x号服务器无关的所有请求中,打印最大的重要度 -// 如果当前时间下,没有任何请求、或者所有请求都和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; -//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 son[MAXN]; -//int top[MAXN]; -//int dfn[MAXN]; -//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 dfs1(int u, int f) { -// fa[u] = f; -// dep[u] = dep[f] + 1; -// siz[u] = 1; -// for (int e = head[u]; e > 0; e = nxt[e]) { -// int v = to[e]; -// if (v != f) { -// dfs1(v, u); -// } -// } -// for (int e = head[u]; e > 0; e = nxt[e]) { -// int 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; -// dfn[u] = ++cntd; -// if (son[u] == 0) { -// return; -// } -// dfs2(son[u], t); -// for (int e = head[u]; e > 0; e = nxt[e]) { -// int 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 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 *event1, int *event2) { -// event1[0] = event2[0]; -// event1[1] = event2[1]; -// event1[2] = event2[2]; -// event1[3] = event2[3]; -//} -// -//void prepare() { -// dfs1(1, 0); -// dfs2(1, 1); -// 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() { -// scanf("%d%d", &n, &m); -// for(int i = 1; i < n; i++) { -// int u, v; -// scanf("%d%d", &u, &v); -// addEdge(u, v); -// addEdge(v, u); -// } -// for(int i = 1; i <= m; i++) { -// scanf("%d", &events[i][0]); -// scanf("%d", &events[i][1]); -// if(events[i][0] == 0) { -// scanf("%d%d", &events[i][2], &events[i][3]); -// } -// } -// prepare(); -// compute(1, m, 0, s); -// for(int i = 1; i <= cntans; i++) { -// printf("%d\n", sorted[ans[i]]); -// } -// return 0; -//} \ No newline at end of file From 5ae81ca90486c7185e3f808890f619498ce1f953 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 4 Mar 2025 15:24:39 +0800 Subject: [PATCH 0764/2029] modify code --- src/class161/Code07_FarAway1.java | 4 ++-- src/class161/Code07_FarAway2.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/class161/Code07_FarAway1.java b/src/class161/Code07_FarAway1.java index 6a206afa3..7a28a0b01 100644 --- a/src/class161/Code07_FarAway1.java +++ b/src/class161/Code07_FarAway1.java @@ -5,7 +5,7 @@ // 一共有m条操作,每种操作是如下3种类型中的一种 // 操作 1 x : 树的头节点变成x,树的形态重新组织 // 操作 2 x y v : x到y的路径上,所有节点的值改成v -// 操作 3 x : 当前树的形态下,打印x的子树最小值 +// 操作 3 x : 当前树的形态下,打印u的子树中的最小值 // 1 <= n、m <= 10^5 // 任何时候节点值一定是正数 // 测试链接 : https://www.luogu.com.cn/problem/P3979 @@ -265,7 +265,7 @@ public static int find(int root, int u) { return son[u]; } - // 假设树的头节点变成root,查询在变化后的树中,u的子树中,最小值是多少 + // 假设树的头节点变成root,当前树的形态下,查询u的子树中的最小值 public static int treeQuery(int root, int u) { int uson = find(root, u); if (uson == -1) { diff --git a/src/class161/Code07_FarAway2.java b/src/class161/Code07_FarAway2.java index e59c7253b..846c653d5 100644 --- a/src/class161/Code07_FarAway2.java +++ b/src/class161/Code07_FarAway2.java @@ -5,7 +5,7 @@ // 一共有m条操作,每种操作是如下3种类型中的一种 // 操作 1 x : 树的头节点变成x,树的形态重新组织 // 操作 2 x y v : x到y的路径上,所有节点的值改成v -// 操作 3 x : 当前树的形态下,打印x的子树最小值 +// 操作 3 x : 当前树的形态下,打印u的子树中的最小值 // 1 <= n、m <= 10^5 // 任何时候节点值一定是正数 // 测试链接 : https://www.luogu.com.cn/problem/P3979 From 86175db0899e184fb4882937e7e0f543cce8d47d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 4 Mar 2025 15:33:26 +0800 Subject: [PATCH 0765/2029] modify code --- src/class161/Code07_FarAway1.java | 20 ++++++-------------- src/class161/Code07_FarAway2.java | 14 ++++---------- 2 files changed, 10 insertions(+), 24 deletions(-) diff --git a/src/class161/Code07_FarAway1.java b/src/class161/Code07_FarAway1.java index 7a28a0b01..72e57bf1f 100644 --- a/src/class161/Code07_FarAway1.java +++ b/src/class161/Code07_FarAway1.java @@ -245,17 +245,9 @@ public static void pathUpdate(int x, int y, int v) { update(Math.min(dfn[x], dfn[y]), Math.max(dfn[x], dfn[y]), v, 1, n, 1); } - // 判断root和u的关系 - // 如果root和u是同一个点,返回-1 - // 如果root不在u的子树上,返回0 - // 如果root在u的子树上,找到u的哪个儿子的子树里有root,返回那个儿子的编号 - public static int find(int root, int u) { - if (u == root) { - return -1; - } - if (dfn[root] < dfn[u] || dfn[u] + siz[u] <= dfn[root]) { - return 0; - } + // 已知root一定在u的子树上 + // 找到u哪个儿子的子树里有root,返回那个儿子的编号 + public static int findSon(int root, int u) { while (top[root] != top[u]) { if (fa[top[root]] == u) { return top[root]; @@ -267,12 +259,12 @@ public static int find(int root, int u) { // 假设树的头节点变成root,当前树的形态下,查询u的子树中的最小值 public static int treeQuery(int root, int u) { - int uson = find(root, u); - if (uson == -1) { + if (root == u) { return min[1]; - } else if (uson == 0) { + } else if (dfn[root] < dfn[u] || dfn[u] + siz[u] <= dfn[root]) { return query(dfn[u], dfn[u] + siz[u] - 1, 1, n, 1); } else { + int uson = findSon(root, u); int ans = query(1, dfn[uson] - 1, 1, n, 1); if (dfn[uson] + siz[uson] <= n) { ans = Math.min(ans, query(dfn[uson] + siz[uson], n, 1, n, 1)); diff --git a/src/class161/Code07_FarAway2.java b/src/class161/Code07_FarAway2.java index 846c653d5..fed9a4fdb 100644 --- a/src/class161/Code07_FarAway2.java +++ b/src/class161/Code07_FarAway2.java @@ -154,13 +154,7 @@ // update(min(dfn[x], dfn[y]), max(dfn[x], dfn[y]), v, 1, n, 1); //} // -//int find(int root, int u) { -// if (u == root) { -// return -1; -// } -// if (dfn[root] < dfn[u] || dfn[u] + siz[u] <= dfn[root]) { -// return 0; -// } +//int findSon(int root, int u) { // while (top[root] != top[u]) { // if (fa[top[root]] == u) { // return top[root]; @@ -171,12 +165,12 @@ //} // //int treeQuery(int root, int u) { -// int uson = find(root, u); -// if (uson == -1) { +// if (root == u) { // return minv[1]; -// } else if (uson == 0) { +// } else if (dfn[root] < dfn[u] || dfn[u] + siz[u] <= dfn[root]) { // return query(dfn[u], dfn[u] + siz[u] - 1, 1, n, 1); // } else { +// int uson = findSon(root, u); // int ans = INT_MAX; // if (1 <= dfn[uson] - 1) { // ans = min(ans, query(1, dfn[uson] - 1, 1, n, 1)); From 21a48efb737726be3e043808f0dfe057977447e1 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 4 Mar 2025 16:01:47 +0800 Subject: [PATCH 0766/2029] modify code --- src/class161/Code07_FarAway1.java | 16 ++++++++-------- src/class161/Code07_FarAway2.java | 12 ++++++------ 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/class161/Code07_FarAway1.java b/src/class161/Code07_FarAway1.java index 72e57bf1f..a903f7799 100644 --- a/src/class161/Code07_FarAway1.java +++ b/src/class161/Code07_FarAway1.java @@ -41,9 +41,9 @@ public class Code07_FarAway1 { public static int[] min = new int[MAXN << 2]; // 重置操作的懒更新信息 // 因为题目说了,任何时候节点值一定是正数 - // change[i] == 0,表示没有重置懒更新 - // change[i] != 0,表示范围内的数字修改为change[i] - public static int[] change = new int[MAXN << 2]; + // changeTag[i] == 0,表示没有重置懒更新 + // changeTag[i] != 0,表示范围内的数字修改为changeTag[i] + public static int[] changeTag = new int[MAXN << 2]; public static void addEdge(int u, int v) { next[++cntg] = head[u]; @@ -178,14 +178,14 @@ public static void up(int i) { public static void lazy(int i, int v) { min[i] = v; - change[i] = v; + changeTag[i] = v; } public static void down(int i) { - if (change[i] != 0) { - lazy(i << 1, change[i]); - lazy(i << 1 | 1, change[i]); - change[i] = 0; + if (changeTag[i] != 0) { + lazy(i << 1, changeTag[i]); + lazy(i << 1 | 1, changeTag[i]); + changeTag[i] = 0; } } diff --git a/src/class161/Code07_FarAway2.java b/src/class161/Code07_FarAway2.java index fed9a4fdb..8a12e1509 100644 --- a/src/class161/Code07_FarAway2.java +++ b/src/class161/Code07_FarAway2.java @@ -35,7 +35,7 @@ //int cntd = 0; // //int minv[MAXN << 2]; -//int change[MAXN << 2]; +//int changeTag[MAXN << 2]; // //void addEdge(int u, int v) { // ++cntg; @@ -87,14 +87,14 @@ // //void lazy(int i, int v) { // minv[i] = v; -// change[i] = v; +// changeTag[i] = v; //} // //void down(int i) { -// if (change[i] != 0) { -// lazy(i << 1, change[i]); -// lazy(i << 1 | 1, change[i]); -// change[i] = 0; +// if (changeTag[i] != 0) { +// lazy(i << 1, changeTag[i]); +// lazy(i << 1 | 1, changeTag[i]); +// changeTag[i] = 0; // } //} // From f127dc6acde76f28ccc8cc95bbac663384e6552a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 4 Mar 2025 16:02:59 +0800 Subject: [PATCH 0767/2029] modify code --- src/class161/Code07_FarAway1.java | 16 ++++++++-------- src/class161/Code07_FarAway2.java | 12 ++++++------ 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/class161/Code07_FarAway1.java b/src/class161/Code07_FarAway1.java index a903f7799..72e57bf1f 100644 --- a/src/class161/Code07_FarAway1.java +++ b/src/class161/Code07_FarAway1.java @@ -41,9 +41,9 @@ public class Code07_FarAway1 { public static int[] min = new int[MAXN << 2]; // 重置操作的懒更新信息 // 因为题目说了,任何时候节点值一定是正数 - // changeTag[i] == 0,表示没有重置懒更新 - // changeTag[i] != 0,表示范围内的数字修改为changeTag[i] - public static int[] changeTag = new int[MAXN << 2]; + // change[i] == 0,表示没有重置懒更新 + // change[i] != 0,表示范围内的数字修改为change[i] + public static int[] change = new int[MAXN << 2]; public static void addEdge(int u, int v) { next[++cntg] = head[u]; @@ -178,14 +178,14 @@ public static void up(int i) { public static void lazy(int i, int v) { min[i] = v; - changeTag[i] = v; + change[i] = v; } public static void down(int i) { - if (changeTag[i] != 0) { - lazy(i << 1, changeTag[i]); - lazy(i << 1 | 1, changeTag[i]); - changeTag[i] = 0; + if (change[i] != 0) { + lazy(i << 1, change[i]); + lazy(i << 1 | 1, change[i]); + change[i] = 0; } } diff --git a/src/class161/Code07_FarAway2.java b/src/class161/Code07_FarAway2.java index 8a12e1509..fed9a4fdb 100644 --- a/src/class161/Code07_FarAway2.java +++ b/src/class161/Code07_FarAway2.java @@ -35,7 +35,7 @@ //int cntd = 0; // //int minv[MAXN << 2]; -//int changeTag[MAXN << 2]; +//int change[MAXN << 2]; // //void addEdge(int u, int v) { // ++cntg; @@ -87,14 +87,14 @@ // //void lazy(int i, int v) { // minv[i] = v; -// changeTag[i] = v; +// change[i] = v; //} // //void down(int i) { -// if (changeTag[i] != 0) { -// lazy(i << 1, changeTag[i]); -// lazy(i << 1 | 1, changeTag[i]); -// changeTag[i] = 0; +// if (change[i] != 0) { +// lazy(i << 1, change[i]); +// lazy(i << 1 | 1, change[i]); +// change[i] = 0; // } //} // From 4964743438541ed6fa9b690933106ad6fcbcc589 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 4 Mar 2025 16:12:33 +0800 Subject: [PATCH 0768/2029] modify code --- src/class161/Code07_FarAway1.java | 6 +++--- src/class161/Code07_FarAway2.java | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/class161/Code07_FarAway1.java b/src/class161/Code07_FarAway1.java index 72e57bf1f..893fbe640 100644 --- a/src/class161/Code07_FarAway1.java +++ b/src/class161/Code07_FarAway1.java @@ -3,9 +3,9 @@ // 遥远的国度,java版 // 一共有n个节点,给定n-1条边,节点连成一棵树,给定树的初始头节点,给定每个点的点权 // 一共有m条操作,每种操作是如下3种类型中的一种 -// 操作 1 x : 树的头节点变成x,树的形态重新组织 +// 操作 1 x : 树的头节点变成x,整棵树需要重新组织 // 操作 2 x y v : x到y的路径上,所有节点的值改成v -// 操作 3 x : 当前树的形态下,打印u的子树中的最小值 +// 操作 3 x : 在当前树的状态下,打印u的子树中的最小值 // 1 <= n、m <= 10^5 // 任何时候节点值一定是正数 // 测试链接 : https://www.luogu.com.cn/problem/P3979 @@ -257,7 +257,7 @@ public static int findSon(int root, int u) { return son[u]; } - // 假设树的头节点变成root,当前树的形态下,查询u的子树中的最小值 + // 假设树的头节点变成root,在当前树的状态下,查询u的子树中的最小值 public static int treeQuery(int root, int u) { if (root == u) { return min[1]; diff --git a/src/class161/Code07_FarAway2.java b/src/class161/Code07_FarAway2.java index fed9a4fdb..fb3d1d30c 100644 --- a/src/class161/Code07_FarAway2.java +++ b/src/class161/Code07_FarAway2.java @@ -3,9 +3,9 @@ // 遥远的国度,C++版 // 一共有n个节点,给定n-1条边,节点连成一棵树,给定树的初始头节点,给定每个点的点权 // 一共有m条操作,每种操作是如下3种类型中的一种 -// 操作 1 x : 树的头节点变成x,树的形态重新组织 +// 操作 1 x : 树的头节点变成x,整棵树需要重新组织 // 操作 2 x y v : x到y的路径上,所有节点的值改成v -// 操作 3 x : 当前树的形态下,打印u的子树中的最小值 +// 操作 3 x : 在当前树的状态下,打印u的子树中的最小值 // 1 <= n、m <= 10^5 // 任何时候节点值一定是正数 // 测试链接 : https://www.luogu.com.cn/problem/P3979 From d59cddd44d48c2c73c4babb16fa92ef6545912ce Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 4 Mar 2025 17:26:51 +0800 Subject: [PATCH 0769/2029] modify code --- ...6\345\211\226\345\210\206-\344\270\212.pptx" | Bin 0 -> 53873 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "ppt/\347\256\227\346\263\225\350\256\262\350\247\243161\343\200\220\346\214\272\351\232\276\343\200\221\346\240\221\351\223\276\345\211\226\345\210\206-\344\270\212.pptx" diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243161\343\200\220\346\214\272\351\232\276\343\200\221\346\240\221\351\223\276\345\211\226\345\210\206-\344\270\212.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243161\343\200\220\346\214\272\351\232\276\343\200\221\346\240\221\351\223\276\345\211\226\345\210\206-\344\270\212.pptx" new file mode 100644 index 0000000000000000000000000000000000000000..3d9c5f3f7caaa9f3042448b6fe35fb06372edf63 GIT binary patch literal 53873 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 Date: Tue, 4 Mar 2025 19:31:16 +0800 Subject: [PATCH 0770/2029] modify code --- ... => Code03_MultiplyPositiveNegative1.java} | 2 +- .../Code03_MultiplyPositiveNegative2.java | 55 +++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) rename src/class127/{Code03_MultiplyPositiveNegative.java => Code03_MultiplyPositiveNegative1.java} (97%) create mode 100644 src/class127/Code03_MultiplyPositiveNegative2.java diff --git a/src/class127/Code03_MultiplyPositiveNegative.java b/src/class127/Code03_MultiplyPositiveNegative1.java similarity index 97% rename from src/class127/Code03_MultiplyPositiveNegative.java rename to src/class127/Code03_MultiplyPositiveNegative1.java index a2a1a5e94..f590949bc 100644 --- a/src/class127/Code03_MultiplyPositiveNegative.java +++ b/src/class127/Code03_MultiplyPositiveNegative1.java @@ -7,7 +7,7 @@ // 1 <= n <= 10^6 // -10^9 <= arr[i] <= +10^9,arr[i]一定不是0 // 来自真实大厂笔试,对数器验证 -public class Code03_MultiplyPositiveNegative { +public class Code03_MultiplyPositiveNegative1 { // 正式方法 public static int[] num(int[] arr) { diff --git a/src/class127/Code03_MultiplyPositiveNegative2.java b/src/class127/Code03_MultiplyPositiveNegative2.java new file mode 100644 index 000000000..1e8a5db70 --- /dev/null +++ b/src/class127/Code03_MultiplyPositiveNegative2.java @@ -0,0 +1,55 @@ +package class127; + +// 感谢热心的同学,找到了题目3的线上测试 +// 测试链接 : https://codeforces.com/problemset/problem/1215/B +// 提交以下的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 Code03_MultiplyPositiveNegative2 { + + public static int MAXN = 200001; + + public static int n; + + public static int[] arr = new int[MAXN]; + + // 结果可能很大,所以用long类型 + public static long ans1, ans2; + + public static void compute() { + int[] cnt = new int[2]; + cnt[0] = 1; + cnt[1] = 0; + ans1 = ans2 = 0; + for (int i = 1, cur = 0; i <= n; i++) { + cur ^= arr[i] > 0 ? 0 : 1; + ans1 += cnt[cur]; + ans2 += cnt[cur ^ 1]; + cnt[cur]++; + } + } + + 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; + for (int i = 1; i <= n; i++) { + in.nextToken(); + arr[i] = (int) in.nval; + } + compute(); + out.println(ans2 + " " + ans1); + out.flush(); + out.close(); + br.close(); + } + +} From ec64ec2c4a1336be631d437997b5ed59b8ff9965 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 5 Mar 2025 15:14:31 +0800 Subject: [PATCH 0771/2029] modify code --- src/class161/Code01_HLD1.java | 2 - src/class161/Code02_LCA1.java | 1 - src/class161/Code03_PathMaxAndSum1.java | 3 - src/class161/Code04_PackageManager1.java | 1 - src/class161/Code05_Coloring1.java | 2 - src/class161/Code06_Tourism1.java | 3 - src/class162/Code01_GrassPlanting1.java | 305 +++++++++++++++++++++++ src/class162/Code01_GrassPlanting2.java | 164 ++++++++++++ 8 files changed, 469 insertions(+), 12 deletions(-) create mode 100644 src/class162/Code01_GrassPlanting1.java create mode 100644 src/class162/Code01_GrassPlanting2.java diff --git a/src/class161/Code01_HLD1.java b/src/class161/Code01_HLD1.java index c5c6d6397..d4f573d54 100644 --- a/src/class161/Code01_HLD1.java +++ b/src/class161/Code01_HLD1.java @@ -25,9 +25,7 @@ public class Code01_HLD1 { public static int MAXN = 100001; - public static int n, m, root, MOD; - public static int[] arr = new int[MAXN]; public static int[] head = new int[MAXN]; diff --git a/src/class161/Code02_LCA1.java b/src/class161/Code02_LCA1.java index 8ac627c0d..f257d890d 100644 --- a/src/class161/Code02_LCA1.java +++ b/src/class161/Code02_LCA1.java @@ -18,7 +18,6 @@ public class Code02_LCA1 { public static int MAXN = 500001; - public static int n, m, root; public static int[] head = new int[MAXN]; diff --git a/src/class161/Code03_PathMaxAndSum1.java b/src/class161/Code03_PathMaxAndSum1.java index a1db818c8..eba1394ec 100644 --- a/src/class161/Code03_PathMaxAndSum1.java +++ b/src/class161/Code03_PathMaxAndSum1.java @@ -24,11 +24,8 @@ public class Code03_PathMaxAndSum1 { public static int MAXN = 30001; - public static int INF = 10000001; - public static int n, m; - public static int[] arr = new int[MAXN]; public static int[] head = new int[MAXN]; diff --git a/src/class161/Code04_PackageManager1.java b/src/class161/Code04_PackageManager1.java index 19cd5bfa6..b243e94d5 100644 --- a/src/class161/Code04_PackageManager1.java +++ b/src/class161/Code04_PackageManager1.java @@ -23,7 +23,6 @@ public class Code04_PackageManager1 { public static int MAXN = 100001; - public static int n, m; public static int[] head = new int[MAXN]; diff --git a/src/class161/Code05_Coloring1.java b/src/class161/Code05_Coloring1.java index fe7cb508e..4701f1067 100644 --- a/src/class161/Code05_Coloring1.java +++ b/src/class161/Code05_Coloring1.java @@ -24,9 +24,7 @@ public class Code05_Coloring1 { public static int MAXN = 100001; - public static int n, m; - public static int[] arr = new int[MAXN]; public static int[] head = new int[MAXN]; diff --git a/src/class161/Code06_Tourism1.java b/src/class161/Code06_Tourism1.java index adf45126f..055796419 100644 --- a/src/class161/Code06_Tourism1.java +++ b/src/class161/Code06_Tourism1.java @@ -22,11 +22,8 @@ public class Code06_Tourism1 { public static int MAXN = 50001; - public static int INF = 1000000001; - public static int n, m; - public static int[] arr = new int[MAXN]; public static int[] head = new int[MAXN]; diff --git a/src/class162/Code01_GrassPlanting1.java b/src/class162/Code01_GrassPlanting1.java new file mode 100644 index 000000000..e35822282 --- /dev/null +++ b/src/class162/Code01_GrassPlanting1.java @@ -0,0 +1,305 @@ +package class162; + +// 边权转化为点权的模版题,java版 +// 一共有n个节点,给定n-1条边,节点连成一棵树,初始时所有边的权值为0 +// 一共有m条操作,每条操作是如下2种类型中的一种 +// 操作 P x y : x到y的路径上,每条边的权值增加1 +// 操作 Q x y : x和y保证是直接连接的,查询他们之间的边权 +// 1 <= n、m <= 10^5 +// 测试链接 : https://www.luogu.com.cn/problem/P3038 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.util.StringTokenizer; + +public class Code01_GrassPlanting1 { + + public static int MAXN = 100001; + 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[] son = new int[MAXN]; + public static int[] top = new int[MAXN]; + public static int[] dfn = new int[MAXN]; + public static int cntd = 0; + + public static int[] sum = new int[MAXN << 2]; + public static int[] addTag = new int[MAXN << 2]; + + 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; + 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; + 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 up(int i) { + sum[i] = sum[i << 1] + sum[i << 1 | 1]; + } + + public static void lazy(int i, int v, int n) { + sum[i] += v * n; + addTag[i] += v; + } + + public static void down(int i, int ln, int rn) { + if (addTag[i] != 0) { + lazy(i << 1, addTag[i], ln); + lazy(i << 1 | 1, addTag[i], rn); + addTag[i] = 0; + } + } + + // 范围增加 + public static void add(int jobl, int jobr, int jobv, int l, int r, int i) { + if (jobl <= l && r <= jobr) { + lazy(i, jobv, r - l + 1); + } else { + int mid = (l + r) / 2; + down(i, mid - l + 1, r - mid); + if (jobl <= mid) { + add(jobl, jobr, jobv, l, mid, i << 1); + } + if (jobr > mid) { + add(jobl, jobr, jobv, mid + 1, r, i << 1 | 1); + } + up(i); + } + } + + // 单点查询 + public static int query(int jobi, int l, int r, int i) { + if (l == r) { + return sum[i]; + } + int mid = (l + r) / 2; + down(i, mid - l + 1, r - mid); + if (jobi <= mid) { + return query(jobi, l, mid, i << 1); + } else { + return query(jobi, mid + 1, r, i << 1 | 1); + } + } + + // x到y的路径上,每条边的边权变成下方点的点权 + // 每条边的边权增加v,就是若干点的点权增加v + // 但是要注意!x和y的最低公共祖先,不能增加点权! + public static void pathAdd(int x, int y, int v) { + while (top[x] != top[y]) { + if (dep[top[x]] <= dep[top[y]]) { + add(dfn[top[y]], dfn[y], v, 1, n, 1); + y = fa[top[y]]; + } else { + add(dfn[top[x]], dfn[x], v, 1, n, 1); + x = fa[top[x]]; + } + } + // x和y的最低公共祖先,点权不增加! + add(Math.min(dfn[x], dfn[y]) + 1, Math.max(dfn[x], dfn[y]), v, 1, n, 1); + } + + // 返回x和y之间这条边的边权 + public static int edgeQuery(int x, int y) { + int down = Math.max(dfn[x], dfn[y]); + return query(down, 1, n, 1); + } + + public static void main(String[] args) { + Kattio io = new Kattio(); + n = io.nextInt(); + m = io.nextInt(); + for (int i = 1, u, v; i < n; i++) { + u = io.nextInt(); + v = io.nextInt(); + addEdge(u, v); + addEdge(v, u); + } + dfs3(); + dfs4(); + String op; + for (int i = 1, x, y; i <= m; i++) { + op = io.next(); + x = io.nextInt(); + y = io.nextInt(); + if (op.equals("P")) { + pathAdd(x, y, 1); + } else { + io.println(edgeQuery(x, y)); + } + } + io.flush(); + io.close(); + } + + // 读写工具类 + public static class Kattio extends PrintWriter { + private BufferedReader r; + private StringTokenizer st; + + public Kattio() { + this(System.in, System.out); + } + + public Kattio(InputStream i, OutputStream o) { + super(o); + r = new BufferedReader(new InputStreamReader(i)); + } + + public Kattio(String intput, String output) throws IOException { + super(output); + r = new BufferedReader(new FileReader(intput)); + } + + public String next() { + try { + while (st == null || !st.hasMoreTokens()) + st = new StringTokenizer(r.readLine()); + return st.nextToken(); + } catch (Exception e) { + } + return null; + } + + public int nextInt() { + return Integer.parseInt(next()); + } + + public double nextDouble() { + return Double.parseDouble(next()); + } + + public long nextLong() { + return Long.parseLong(next()); + } + } + +} diff --git a/src/class162/Code01_GrassPlanting2.java b/src/class162/Code01_GrassPlanting2.java new file mode 100644 index 000000000..2a36ea606 --- /dev/null +++ b/src/class162/Code01_GrassPlanting2.java @@ -0,0 +1,164 @@ +package class162; + +// 边权转化为点权的模版题,C++版 +// 一共有n个节点,给定n-1条边,节点连成一棵树,初始时所有边的权值为0 +// 一共有m条操作,每条操作是如下2种类型中的一种 +// 操作 P x y : x到y的路径上,每条边的权值增加1 +// 操作 Q x y : x和y保证是直接连接的,查询他们之间的边权 +// 1 <= n、m <= 10^5 +// 测试链接 : https://www.luogu.com.cn/problem/P3038 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +//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 son[MAXN]; +//int top[MAXN]; +//int dfn[MAXN]; +//int cntd = 0; +// +//int sum[MAXN << 2]; +//int addTag[MAXN << 2]; +// +//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 > 0; e = nxt[e]) { +// v = to[e]; +// if (v != f) { +// dfs1(v, u); +// } +// } +// for (int e = head[u], v; e > 0; 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; +// dfn[u] = ++cntd; +// 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); +// } +// } +//} +// +//void up(int i) { +// sum[i] = sum[i << 1] + sum[i << 1 | 1]; +//} +// +//void lazy(int i, int v, int len) { +// sum[i] += v * len; +// addTag[i] += v; +//} +// +//void down(int i, int ln, int rn) { +// if (addTag[i] != 0) { +// lazy(i << 1, addTag[i], ln); +// lazy(i << 1 | 1, addTag[i], rn); +// addTag[i] = 0; +// } +//} +// +//void add(int jobl, int jobr, int jobv, int l, int r, int i) { +// if (jobl <= l && r <= jobr) { +// lazy(i, jobv, r - l + 1); +// } else { +// int mid = (l + r) >> 1; +// down(i, mid - l + 1, r - mid); +// if (jobl <= mid) { +// add(jobl, jobr, jobv, l, mid, i << 1); +// } +// if (jobr > mid) { +// add(jobl, jobr, jobv, mid + 1, r, i << 1 | 1); +// } +// up(i); +// } +//} +// +//int query(int jobi, int l, int r, int i) { +// if (l == r) { +// return sum[i]; +// } +// int mid = (l + r) >> 1; +// down(i, mid - l + 1, r - mid); +// if (jobi <= mid) { +// return query(jobi, l, mid, i << 1); +// } else { +// return query(jobi, mid + 1, r, i << 1 | 1); +// } +//} +// +//void pathAdd(int x, int y, int v) { +// while (top[x] != top[y]) { +// if (dep[top[x]] <= dep[top[y]]) { +// add(dfn[top[y]], dfn[y], v, 1, n, 1); +// y = fa[top[y]]; +// } else { +// add(dfn[top[x]], dfn[x], v, 1, n, 1); +// x = fa[top[x]]; +// } +// } +// add(min(dfn[x], dfn[y]) + 1, max(dfn[x], dfn[y]), v, 1, n, 1); +//} +// +//int edgeQuery(int x, int y) { +// int down = max(dfn[x], dfn[y]); +// return query(down, 1, n, 1); +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1; i < n; i++) { +// int u, v; +// cin >> u >> v; +// addEdge(u, v); +// addEdge(v, u); +// } +// dfs1(1, 0); +// dfs2(1, 1); +// char op; +// for (int i = 1, x, y; i <= m; i++) { +// cin >> op >> x >> y; +// if (op == 'P') { +// pathAdd(x, y, 1); +// } else { +// cout << edgeQuery(x, y) << "\n"; +// } +// } +// return 0; +//} \ No newline at end of file From 575516ce0594a310e3a7a7afa5abee5aedb8cd6b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 5 Mar 2025 17:28:19 +0800 Subject: [PATCH 0772/2029] modify code --- src/class162/Code01_GrassPlanting1.java | 1 - src/class162/Code02_UnderMoon1.java | 387 ++++++++++++++++++++++++ src/class162/Code02_UnderMoon2.java | 250 +++++++++++++++ 3 files changed, 637 insertions(+), 1 deletion(-) create mode 100644 src/class162/Code02_UnderMoon1.java create mode 100644 src/class162/Code02_UnderMoon2.java diff --git a/src/class162/Code01_GrassPlanting1.java b/src/class162/Code01_GrassPlanting1.java index e35822282..4820324e7 100644 --- a/src/class162/Code01_GrassPlanting1.java +++ b/src/class162/Code01_GrassPlanting1.java @@ -81,7 +81,6 @@ public static void dfs2(int u, int t) { } } - // 递归函数不会改迭代版,去看讲解118,详解了从递归版改迭代版 public static int[][] fse = new int[MAXN][3]; public static int stacksize, first, second, edge; diff --git a/src/class162/Code02_UnderMoon1.java b/src/class162/Code02_UnderMoon1.java new file mode 100644 index 000000000..8d1e15a90 --- /dev/null +++ b/src/class162/Code02_UnderMoon1.java @@ -0,0 +1,387 @@ +package class162; + +// 月下毛景树,java版 +// 一共有n个节点,节点编号从1到n,所有节点连成一棵树 +// 给定n-1条边,边的编号从1到n-1,每条边给定初始边权 +// 会进行若干次操作,每条操作的类型是如下4种类型中的一种 +// 操作 Change x v : 第x条边的边权改成v +// 操作 Cover x y v : x号点到y号点的路径上,所有边权改成v +// 操作 Add x y v : x号点到y号点的路径上,所有边权增加v +// 操作 Max x y : x号点到y号点的路径上,打印最大的边权 +// 1 <= n <= 10^5 +// 任何时候的边权 <= 10^9 +// 测试链接 : https://www.luogu.com.cn/problem/P4315 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.util.StringTokenizer; + +public class Code02_UnderMoon1 { + + public static int MAXN = 100001; + public static int n; + public static int[][] arr = new int[MAXN][3]; + + 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 cntd = 0; + + public static int[] max = new int[MAXN << 2]; + public static int[] addTag = new int[MAXN << 2]; + public static boolean[] updateTag = new boolean[MAXN << 2]; + public static int[] change = new int[MAXN << 2]; + + 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; + 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); + } + } + } + + 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; + 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 up(int i) { + max[i] = Math.max(max[i << 1], max[i << 1 | 1]); + } + + public static void addLazy(int i, int v) { + max[i] += v; + addTag[i] += v; + } + + public static void updateLazy(int i, int v) { + max[i] = v; + addTag[i] = 0; + updateTag[i] = true; + change[i] = v; + } + + public static void down(int i) { + if (updateTag[i]) { + updateLazy(i << 1, change[i]); + updateLazy(i << 1 | 1, change[i]); + updateTag[i] = false; + } + if (addTag[i] != 0) { + addLazy(i << 1, addTag[i]); + addLazy(i << 1 | 1, addTag[i]); + addTag[i] = 0; + } + } + + public static void update(int jobl, int jobr, int jobv, int l, int r, int i) { + if (jobl <= l && r <= jobr) { + updateLazy(i, jobv); + } else { + int mid = (l + r) >> 1; + down(i); + if (jobl <= mid) { + update(jobl, jobr, jobv, l, mid, i << 1); + } + if (jobr > mid) { + update(jobl, jobr, jobv, mid + 1, r, i << 1 | 1); + } + up(i); + } + } + + public static void add(int jobl, int jobr, int jobv, int l, int r, int i) { + if (jobl <= l && r <= jobr) { + addLazy(i, jobv); + } else { + int mid = (l + r) >> 1; + down(i); + if (jobl <= mid) { + add(jobl, jobr, jobv, l, mid, i << 1); + } + if (jobr > mid) { + add(jobl, jobr, jobv, mid + 1, r, i << 1 | 1); + } + up(i); + } + } + + public static int query(int jobl, int jobr, int l, int r, int i) { + if (jobl <= l && r <= jobr) { + return max[i]; + } + int mid = (l + r) >> 1; + down(i); + int ans = Integer.MIN_VALUE; + if (jobl <= mid) { + ans = Math.max(ans, query(jobl, jobr, l, mid, i << 1)); + } + if (jobr > mid) { + ans = Math.max(ans, query(jobl, jobr, mid + 1, r, i << 1 | 1)); + } + return ans; + } + + public static void edgeUpdate(int ei, int val) { + int x = arr[ei][0]; + int y = arr[ei][1]; + int down = Math.max(dfn[x], dfn[y]); + update(down, down, val, 1, n, 1); + } + + public static void pathUpdate(int x, int y, int v) { + while (top[x] != top[y]) { + if (dep[top[x]] <= dep[top[y]]) { + update(dfn[top[y]], dfn[y], v, 1, n, 1); + y = fa[top[y]]; + } else { + update(dfn[top[x]], dfn[x], v, 1, n, 1); + x = fa[top[x]]; + } + } + update(Math.min(dfn[x], dfn[y]) + 1, Math.max(dfn[x], dfn[y]), v, 1, n, 1); + } + + public static void pathAdd(int x, int y, int v) { + while (top[x] != top[y]) { + if (dep[top[x]] <= dep[top[y]]) { + add(dfn[top[y]], dfn[y], v, 1, n, 1); + y = fa[top[y]]; + } else { + add(dfn[top[x]], dfn[x], v, 1, n, 1); + x = fa[top[x]]; + } + } + add(Math.min(dfn[x], dfn[y]) + 1, Math.max(dfn[x], dfn[y]), v, 1, n, 1); + } + + public static int pathMax(int x, int y) { + int ans = Integer.MIN_VALUE; + while (top[x] != top[y]) { + if (dep[top[x]] <= dep[top[y]]) { + ans = Math.max(ans, query(dfn[top[y]], dfn[y], 1, n, 1)); + y = fa[top[y]]; + } else { + ans = Math.max(ans, query(dfn[top[x]], dfn[x], 1, n, 1)); + x = fa[top[x]]; + } + } + ans = Math.max(ans, query(Math.min(dfn[x], dfn[y]) + 1, Math.max(dfn[x], dfn[y]), 1, n, 1)); + return ans; + } + + public static void prepare() { + for (int i = 1; i < n; i++) { + addEdge(arr[i][0], arr[i][1]); + addEdge(arr[i][1], arr[i][0]); + } + dfs3(); + dfs4(); + for (int i = 1; i < n; i++) { + edgeUpdate(i, arr[i][2]); + } + } + + public static void main(String[] args) { + Kattio io = new Kattio(); + n = io.nextInt(); + for (int i = 1; i < n; i++) { + arr[i][0] = io.nextInt(); + arr[i][1] = io.nextInt(); + arr[i][2] = io.nextInt(); + } + prepare(); + String op = io.next(); + int x, y, v; + while (!op.equals("Stop")) { + if (op.equals("Change")) { + x = io.nextInt(); + v = io.nextInt(); + edgeUpdate(x, v); + } else if (op.equals("Cover")) { + x = io.nextInt(); + y = io.nextInt(); + v = io.nextInt(); + pathUpdate(x, y, v); + } else if (op.equals("Add")) { + x = io.nextInt(); + y = io.nextInt(); + v = io.nextInt(); + pathAdd(x, y, v); + } else { + x = io.nextInt(); + y = io.nextInt(); + io.println(pathMax(x, y)); + } + op = io.next(); + } + io.flush(); + io.close(); + } + + // 读写工具类 + public static class Kattio extends PrintWriter { + private BufferedReader r; + private StringTokenizer st; + + public Kattio() { + this(System.in, System.out); + } + + public Kattio(InputStream i, OutputStream o) { + super(o); + r = new BufferedReader(new InputStreamReader(i)); + } + + public Kattio(String intput, String output) throws IOException { + super(output); + r = new BufferedReader(new FileReader(intput)); + } + + public String next() { + try { + while (st == null || !st.hasMoreTokens()) + st = new StringTokenizer(r.readLine()); + return st.nextToken(); + } catch (Exception e) { + } + return null; + } + + public int nextInt() { + return Integer.parseInt(next()); + } + + public double nextDouble() { + return Double.parseDouble(next()); + } + + public long nextLong() { + return Long.parseLong(next()); + } + } + +} diff --git a/src/class162/Code02_UnderMoon2.java b/src/class162/Code02_UnderMoon2.java new file mode 100644 index 000000000..c8f411c37 --- /dev/null +++ b/src/class162/Code02_UnderMoon2.java @@ -0,0 +1,250 @@ +package class162; + +// 月下毛景树,C++版 +// 一共有n个节点,节点编号从1到n,所有节点连成一棵树 +// 给定n-1条边,边的编号从1到n-1,每条边给定初始边权 +// 会进行若干次操作,每条操作的类型是如下4种类型中的一种 +// 操作 Change x v : 第x条边的边权改成v +// 操作 Cover x y v : x号点到y号点的路径上,所有边权改成v +// 操作 Add x y v : x号点到y号点的路径上,所有边权增加v +// 操作 Max x y : x号点到y号点的路径上,打印最大的边权 +// 1 <= n <= 10^5 +// 任何时候的边权 <= 10^9 +// 测试链接 : https://www.luogu.com.cn/problem/P4315 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +//int n; +//int arr[MAXN][3]; +// +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int cntg = 0; +// +//int fa[MAXN]; +//int dep[MAXN]; +//int siz[MAXN]; +//int son[MAXN]; +//int top[MAXN]; +//int dfn[MAXN]; +//int cntd = 0; +// +//int maxv[MAXN << 2]; +//int addTag[MAXN << 2]; +//bool updateTag[MAXN << 2]; +//int change[MAXN << 2]; +// +//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 > 0; e = nxt[e]) { +// v = to[e]; +// if (v != f) { +// dfs1(v, u); +// } +// } +// for (int e = head[u], v; e > 0; 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; +// dfn[u] = ++cntd; +// 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); +// } +// } +//} +// +//void up(int i) { +// maxv[i] = max(maxv[i << 1], maxv[i << 1 | 1]); +//} +// +//void addLazy(int i, int v) { +// maxv[i] += v; +// addTag[i] += v; +//} +// +//void updateLazy(int i, int v) { +// maxv[i] = v; +// addTag[i] = 0; +// updateTag[i] = true; +// change[i] = v; +//} +// +//void down(int i) { +// if (updateTag[i]) { +// updateLazy(i << 1, change[i]); +// updateLazy(i << 1 | 1, change[i]); +// updateTag[i] = false; +// } +// if (addTag[i] != 0) { +// addLazy(i << 1, addTag[i]); +// addLazy(i << 1 | 1, addTag[i]); +// addTag[i] = 0; +// } +//} +// +//void update(int jobl, int jobr, int jobv, int l, int r, int i) { +// if (jobl <= l && r <= jobr) { +// updateLazy(i, jobv); +// } else { +// int mid = (l + r) >> 1; +// down(i); +// if (jobl <= mid) { +// update(jobl, jobr, jobv, l, mid, i << 1); +// } +// if (jobr > mid) { +// update(jobl, jobr, jobv, mid + 1, r, i << 1 | 1); +// } +// up(i); +// } +//} +// +//void add(int jobl, int jobr, int jobv, int l, int r, int i) { +// if (jobl <= l && r <= jobr) { +// addLazy(i, jobv); +// } else { +// int mid = (l + r) >> 1; +// down(i); +// if (jobl <= mid) { +// add(jobl, jobr, jobv, l, mid, i << 1); +// } +// if (jobr > mid) { +// add(jobl, jobr, jobv, mid + 1, r, i << 1 | 1); +// } +// up(i); +// } +//} +// +//int query(int jobl, int jobr, int l, int r, int i) { +// if (jobl <= l && r <= jobr) { +// return maxv[i]; +// } +// int mid = (l + r) >> 1; +// down(i); +// int ans = INT_MIN; +// if (jobl <= mid) { +// ans = max(ans, query(jobl, jobr, l, mid, i << 1)); +// } +// if (jobr > mid) { +// ans = max(ans, query(jobl, jobr, mid + 1, r, i << 1 | 1)); +// } +// return ans; +//} +// +//void edgeUpdate(int ei, int val) { +// int x = arr[ei][0]; +// int y = arr[ei][1]; +// int downv = max(dfn[x], dfn[y]); +// update(downv, downv, val, 1, n, 1); +//} +// +//void pathUpdate(int x, int y, int v) { +// while (top[x] != top[y]) { +// if (dep[top[x]] <= dep[top[y]]) { +// update(dfn[top[y]], dfn[y], v, 1, n, 1); +// y = fa[top[y]]; +// } else { +// update(dfn[top[x]], dfn[x], v, 1, n, 1); +// x = fa[top[x]]; +// } +// } +// update(min(dfn[x], dfn[y]) + 1, max(dfn[x], dfn[y]), v, 1, n, 1); +//} +// +//void pathAdd(int x, int y, int v) { +// while (top[x] != top[y]) { +// if (dep[top[x]] <= dep[top[y]]) { +// add(dfn[top[y]], dfn[y], v, 1, n, 1); +// y = fa[top[y]]; +// } else { +// add(dfn[top[x]], dfn[x], v, 1, n, 1); +// x = fa[top[x]]; +// } +// } +// add(min(dfn[x], dfn[y]) + 1, max(dfn[x], dfn[y]), v, 1, n, 1); +//} +// +//int pathMax(int x, int y) { +// int ans = INT_MIN; +// while (top[x] != top[y]) { +// if (dep[top[x]] <= dep[top[y]]) { +// ans = max(ans, query(dfn[top[y]], dfn[y], 1, n, 1)); +// y = fa[top[y]]; +// } else { +// ans = max(ans, query(dfn[top[x]], dfn[x], 1, n, 1)); +// x = fa[top[x]]; +// } +// } +// ans = max(ans, query(min(dfn[x], dfn[y]) + 1, max(dfn[x], dfn[y]), 1, n, 1)); +// return ans; +//} +// +//void prepare() { +// for (int i = 1; i < n; i++) { +// addEdge(arr[i][0], arr[i][1]); +// addEdge(arr[i][1], arr[i][0]); +// } +// dfs1(1, 0); +// dfs2(1, 1); +// for (int i = 1; i < n; i++) { +// edgeUpdate(i, arr[i][2]); +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n; +// for (int i = 1; i < n; i++) { +// cin >> arr[i][0] >> arr[i][1] >> arr[i][2]; +// } +// prepare(); +// string op; +// cin >> op; +// int x, y, v; +// while (op != "Stop") { +// if (op == "Change") { +// cin >> x >> v; +// edgeUpdate(x, v); +// } else if (op == "Cover") { +// cin >> x >> y >> v; +// pathUpdate(x, y, v); +// } else if (op == "Add") { +// cin >> x >> y >> v; +// pathAdd(x, y, v); +// } else { +// cin >> x >> y; +// cout << pathMax(x, y) << "\n"; +// } +// cin >> op; +// } +// return 0; +//} \ No newline at end of file From c3919449f6f3856b0bc9d42f12f5dde019ac6104 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 5 Mar 2025 17:34:58 +0800 Subject: [PATCH 0773/2029] modify code --- src/class162/Code01_GrassPlanting1.java | 3 +++ src/class162/Code02_UnderMoon1.java | 8 ++++++++ 2 files changed, 11 insertions(+) diff --git a/src/class162/Code01_GrassPlanting1.java b/src/class162/Code01_GrassPlanting1.java index 4820324e7..00cefcc26 100644 --- a/src/class162/Code01_GrassPlanting1.java +++ b/src/class162/Code01_GrassPlanting1.java @@ -23,11 +23,13 @@ public class Code01_GrassPlanting1 { public static int MAXN = 100001; 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]; @@ -36,6 +38,7 @@ public class Code01_GrassPlanting1 { public static int[] dfn = new int[MAXN]; public static int cntd = 0; + // 线段树 public static int[] sum = new int[MAXN << 2]; public static int[] addTag = new int[MAXN << 2]; diff --git a/src/class162/Code02_UnderMoon1.java b/src/class162/Code02_UnderMoon1.java index 8d1e15a90..668530011 100644 --- a/src/class162/Code02_UnderMoon1.java +++ b/src/class162/Code02_UnderMoon1.java @@ -28,11 +28,13 @@ public class Code02_UnderMoon1 { public static int n; public static int[][] arr = new int[MAXN][3]; + // 链式前向星 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]; @@ -41,6 +43,12 @@ public class Code02_UnderMoon1 { public static int[] dfn = new int[MAXN]; public static int cntd = 0; + // 线段树查询区间最大值 + // 但是需要同时兼顾,区间增加、区间修改,这两种操作 + // 那么就牵扯到两种操作相互影响的问题 + // 因为区间修改明显会取消之前的区间增加 + // 讲解110,线段树章节,题目6,重点讲了这种线段树 + // 不会的同学可以看看,讲的非常清楚 public static int[] max = new int[MAXN << 2]; public static int[] addTag = new int[MAXN << 2]; public static boolean[] updateTag = new boolean[MAXN << 2]; From 56a7ad617ae052bc479ec3af5f0ffc79b9f9ee2f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 5 Mar 2025 17:52:50 +0800 Subject: [PATCH 0774/2029] modify code --- src/class162/Code02_UnderMoon1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class162/Code02_UnderMoon1.java b/src/class162/Code02_UnderMoon1.java index 668530011..4933b8cf0 100644 --- a/src/class162/Code02_UnderMoon1.java +++ b/src/class162/Code02_UnderMoon1.java @@ -47,7 +47,7 @@ public class Code02_UnderMoon1 { // 但是需要同时兼顾,区间增加、区间修改,这两种操作 // 那么就牵扯到两种操作相互影响的问题 // 因为区间修改明显会取消之前的区间增加 - // 讲解110,线段树章节,题目6,重点讲了这种线段树 + // 讲解110,线段树章节,题目5、题目6,重点讲了这种线段树 // 不会的同学可以看看,讲的非常清楚 public static int[] max = new int[MAXN << 2]; public static int[] addTag = new int[MAXN << 2]; From 7eb874c24c5f7a2ca6646055d3918ed1fd7cde6c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 6 Mar 2025 14:34:00 +0800 Subject: [PATCH 0775/2029] modify code --- .../Code03_MultiplyPositiveNegative2.java | 2 +- ...edian.java => Code05_MaximizeMedian1.java} | 2 +- src/class128/Code05_MaximizeMedian2.java | 126 ++++++++++++++++++ 3 files changed, 128 insertions(+), 2 deletions(-) rename src/class128/{Code05_MaximizeMedian.java => Code05_MaximizeMedian1.java} (98%) create mode 100644 src/class128/Code05_MaximizeMedian2.java diff --git a/src/class127/Code03_MultiplyPositiveNegative2.java b/src/class127/Code03_MultiplyPositiveNegative2.java index 1e8a5db70..02a890e34 100644 --- a/src/class127/Code03_MultiplyPositiveNegative2.java +++ b/src/class127/Code03_MultiplyPositiveNegative2.java @@ -1,6 +1,6 @@ package class127; -// 感谢热心的同学,找到了题目3的线上测试 +// 感谢热心的同学,找到了题目3的在线测试 // 测试链接 : https://codeforces.com/problemset/problem/1215/B // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class128/Code05_MaximizeMedian.java b/src/class128/Code05_MaximizeMedian1.java similarity index 98% rename from src/class128/Code05_MaximizeMedian.java rename to src/class128/Code05_MaximizeMedian1.java index 592f606ac..5e206f60d 100644 --- a/src/class128/Code05_MaximizeMedian.java +++ b/src/class128/Code05_MaximizeMedian1.java @@ -12,7 +12,7 @@ // 2 <= n <= 10^5 // 1 <= arr[i] <= 10^9 // 来自真实大厂笔试,对数器验证 -public class Code05_MaximizeMedian { +public class Code05_MaximizeMedian1 { // 正式方法 // 时间复杂度O(n * log n) diff --git a/src/class128/Code05_MaximizeMedian2.java b/src/class128/Code05_MaximizeMedian2.java new file mode 100644 index 000000000..2cd4f9069 --- /dev/null +++ b/src/class128/Code05_MaximizeMedian2.java @@ -0,0 +1,126 @@ +package class128; + +// 感谢热心的同学,找到了题目5的在线测试 +// 最大平均值和中位数 +// 给定一个长度为n的数组arr,现在要选出一些数 +// 满足 任意两个相邻的数中至少有一个数被选择 +// 被选中的数字平均值的最大值,打印的答案为double类型,误差在0.001以内 +// 被选中的数字中位数的最大值,打印的答案为int类型,中位数认为是上中位数 +// 2 <= n <= 10^5 +// 1 <= arr[i] <= 10^9 +// 测试链接 : https://atcoder.jp/contests/abc236/tasks/abc236_e +// 提交以下的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 Code05_MaximizeMedian2 { + + public static int MAXN = 100005; + public static int n; + public static int[] arr = new int[MAXN]; + + // 求最大平均数需要 + public static double[] help1 = new double[MAXN]; + public static double[][] dp1 = new double[MAXN][2]; + + // 求最大上中位数需要 + public static int[] sorted = new int[MAXN]; + public static int[] help2 = new int[MAXN]; + public static int[][] dp2 = new int[MAXN][2]; + + 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; + for (int i = 1; i <= n; i++) { + in.nextToken(); + arr[i] = (int) in.nval; + } + out.println(average()); + out.println(median()); + out.flush(); + out.close(); + br.close(); + } + + // 最大平均数 + // 课上没有讲,但是很好理解,也是二分答案 + // 假设arr中最小值为l,最大值为r + // 那么最大平均值必然在[l, r]范围上 + // 假设平均值设为中点m,arr中所有的数字都减去m + // 如果此时,任意两个相邻的数中至少有一个数被选择 + // 最后得到的结果 >= 0,说明最大平均值至少是m,去右侧二分 + // 否则去左侧二分 + public static double average() { + double l = Double.MAX_VALUE, r = Double.MIN_VALUE, m; + for (int i = 1; i <= n; i++) { + l = Math.min(l, arr[i]); + r = Math.max(r, arr[i]); + } + // 二分60次,足够让误差小于0.001 + for (int i = 1; i <= 60; i++) { + m = (l + r) / 2; + if (check1(m)) { + l = m; + } else { + r = m; + } + } + return l; + } + + public static boolean check1(double x) { + // arr中所有的数字都减去m,得到的数字填入help1 + for (int i = 1; i <= n; i++) { + help1[i] = (double) arr[i] - x; + } + // 和课上讲的一样的逻辑 + // 任意两个相邻的数中至少有一个数被选择,去得到dp表 + dp1[n + 1][0] = dp1[n + 1][1] = 0; + for (int i = n; i >= 1; i--) { + dp1[i][0] = Math.max(help1[i] + dp1[i + 1][0], dp1[i + 1][1]); + dp1[i][1] = help1[i] + dp1[i + 1][0]; + } + return dp1[1][0] >= 0; + } + + // 最大上中位数,就和课上讲的一样了 + public static int median() { + for (int i = 1; i <= n; i++) { + sorted[i] = arr[i]; + } + Arrays.sort(sorted, 1, n + 1); + int l = 1, r = n, m, ans = 0; + while (l <= r) { + m = (l + r) / 2; + if (check2(sorted[m])) { + ans = sorted[m]; + l = m + 1; + } else { + r = m - 1; + } + } + return ans; + } + + public static boolean check2(int x) { + for (int i = 1; i <= n; i++) { + help2[i] = arr[i] >= x ? 1 : -1; + } + dp2[n + 1][0] = dp2[n + 1][1] = 0; + for (int i = n; i >= 1; i--) { + dp2[i][0] = Math.max(help2[i] + dp2[i + 1][0], dp2[i + 1][1]); + dp2[i][1] = help2[i] + dp2[i + 1][0]; + } + return dp2[1][0] > 0; + } + +} \ No newline at end of file From f0906af99d99fbf39ee7a7e111499287e4101d13 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 6 Mar 2025 14:38:41 +0800 Subject: [PATCH 0776/2029] modify code --- src/class128/Code05_MaximizeMedian1.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/class128/Code05_MaximizeMedian1.java b/src/class128/Code05_MaximizeMedian1.java index 5e206f60d..9726cf6b7 100644 --- a/src/class128/Code05_MaximizeMedian1.java +++ b/src/class128/Code05_MaximizeMedian1.java @@ -1,7 +1,5 @@ package class128; -import java.util.Arrays; - // 相邻必选的子序列最大中位数 // 给定一个长度为n的数组arr // 合法子序列定义为,任意相邻的两个数至少要有一个被挑选所组成的子序列 @@ -12,6 +10,9 @@ // 2 <= n <= 10^5 // 1 <= arr[i] <= 10^9 // 来自真实大厂笔试,对数器验证 + +import java.util.Arrays; + public class Code05_MaximizeMedian1 { // 正式方法 From 5f8531add286b0092f72dc3acb651a50e9261a03 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 6 Mar 2025 15:37:30 +0800 Subject: [PATCH 0777/2029] modify code --- src/class138/Other1.java | 91 ++++++++++ src/class138/Other2.java | 88 +++++++++ src/class138/Other3.java | 106 +++++++++++ src/class138/Other4.java | 118 +++++++++++++ src/class138/Other5.java | 122 +++++++++++++ ...04_Measurer.java => Code04_Measurer1.java} | 2 +- src/class142/Code04_Measurer2.java | 167 ++++++++++++++++++ 7 files changed, 693 insertions(+), 1 deletion(-) create mode 100644 src/class138/Other1.java create mode 100644 src/class138/Other2.java create mode 100644 src/class138/Other3.java create mode 100644 src/class138/Other4.java create mode 100644 src/class138/Other5.java rename src/class142/{Code04_Measurer.java => Code04_Measurer1.java} (99%) create mode 100644 src/class142/Code04_Measurer2.java diff --git a/src/class138/Other1.java b/src/class138/Other1.java new file mode 100644 index 000000000..b18b9665f --- /dev/null +++ b/src/class138/Other1.java @@ -0,0 +1,91 @@ +package class138; + +// 题目1,01分数规划模版题,另一种二分的写法 +// 思路是不变的,二分的写法多种多样 +// 代码中打注释的位置,就是更简单的二分逻辑,其他代码没有变化 +// 测试链接 : https://www.luogu.com.cn/problem/P10505 +// 测试链接 : http://poj.org/problem?id=2976 +// 提交以下的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; +import java.util.Comparator; + +public class Other1 { + + public static int MAXN = 1001; + + public static double[][] arr = new double[MAXN][3]; + + public static int n, k; + + public static boolean check(double x) { + for (int i = 1; i <= n; i++) { + arr[i][2] = arr[i][0] - x * arr[i][1]; + } + Arrays.sort(arr, 1, n + 1, new MyComparator()); + double sum = 0; + for (int i = 1; i <= k; i++) { + sum += arr[i][2]; + } + return sum >= 0; + } + + public static class MyComparator implements Comparator { + + @Override + public int compare(double[] o1, double[] o2) { + return o1[2] >= o2[2] ? -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)); + in.nextToken(); + n = (int) in.nval; + in.nextToken(); + k = (int) in.nval; + while (n != 0 || k != 0) { + k = n - k; + for (int i = 1; i <= n; i++) { + in.nextToken(); + arr[i][0] = in.nval; + } + for (int i = 1; i <= n; i++) { + in.nextToken(); + arr[i][1] = in.nval; + } + double l = 0, r = 0, x; + for (int i = 1; i <= n; i++) { + r += arr[i][0]; + } + // 二分进行60次,足够达到题目要求的精度 + // 二分完成后,l就是答案 + for (int i = 1; i <= 60; i++) { + x = (l + r) / 2; + if (check(x)) { + l = x; + } else { + r = x; + } + } + out.println((int) (100 * (l + 0.005))); + in.nextToken(); + n = (int) in.nval; + in.nextToken(); + k = (int) in.nval; + } + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class138/Other2.java b/src/class138/Other2.java new file mode 100644 index 000000000..f033bb195 --- /dev/null +++ b/src/class138/Other2.java @@ -0,0 +1,88 @@ +package class138; + +// 题目2,牛群的才艺展示,另一种二分的写法 +// 思路是不变的,二分的写法多种多样 +// 代码中打注释的位置,就是更简单的二分逻辑,其他代码没有变化 +// 测试链接 : https://www.luogu.com.cn/problem/P4377 +// 提交以下的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 Other2 { + + public static int MAXN = 251; + + public static int MAXW = 1001; + + public static double NA = -1e9; + + public static int[] weight = new int[MAXN]; + + public static int[] talent = new int[MAXN]; + + public static double[] value = new double[MAXN]; + + public static double[] dp = new double[MAXW]; + + public static int n, w; + + public static boolean check(double x) { + for (int i = 1; i <= n; i++) { + value[i] = (double) talent[i] - x * weight[i]; + } + dp[0] = 0; + Arrays.fill(dp, 1, w + 1, NA); + for (int i = 1; i <= n; i++) { + for (int p = w, j; p >= 0; p--) { + j = (int) (p + weight[i]); + if (j >= w) { + dp[w] = Math.max(dp[w], dp[p] + value[i]); + } else { + dp[j] = Math.max(dp[j], dp[p] + value[i]); + } + } + } + return dp[w] >= 0; + } + + 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(); + w = (int) in.nval; + for (int i = 1; i <= n; i++) { + in.nextToken(); + weight[i] = (int) in.nval; + in.nextToken(); + talent[i] = (int) in.nval; + } + double l = 0, r = 0, x; + for (int i = 1; i <= n; i++) { + r += talent[i]; + } + // 二分进行60次,足够达到题目要求的精度 + // 二分完成后,l就是答案 + for (int i = 1; i <= 60; i++) { + x = (l + r) / 2; + if (check(x)) { + l = x; + } else { + r = x; + } + } + out.println((int) (l * 1000)); + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class138/Other3.java b/src/class138/Other3.java new file mode 100644 index 000000000..e5295c334 --- /dev/null +++ b/src/class138/Other3.java @@ -0,0 +1,106 @@ +package class138; + +// 题目3,最优比率生成树,另一种二分的写法 +// 思路是不变的,二分的写法多种多样 +// 代码中打注释的位置,就是更简单的二分逻辑,其他代码没有变化 +// 测试链接 : http://poj.org/problem?id=2728 +// 提交以下的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 Other3 { + + public static int MAXN = 1001; + + public static int[] x = new int[MAXN]; + + public static int[] y = new int[MAXN]; + + public static int[] z = new int[MAXN]; + + public static double[][] dist = new double[MAXN][MAXN]; + + public static double[][] cost = new double[MAXN][MAXN]; + + public static boolean[] visit = new boolean[MAXN]; + + public static double[] value = new double[MAXN]; + + public static int n; + + public static double prim(double x) { + for (int i = 1; i <= n; i++) { + visit[i] = false; + value[i] = cost[1][i] - x * dist[1][i]; + } + visit[1] = true; + double sum = 0; + for (int i = 1; i <= n - 1; i++) { + double minDist = Double.MAX_VALUE; + int next = 0; + for (int j = 1; j <= n; j++) { + if (!visit[j] && value[j] < minDist) { + minDist = value[j]; + next = j; + } + } + sum += minDist; + visit[next] = true; + for (int j = 1; j <= n; j++) { + if (!visit[j] && value[j] > cost[next][j] - x * dist[next][j]) { + value[j] = cost[next][j] - x * dist[next][j]; + } + } + } + return sum; + } + + 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; + while (n != 0) { + for (int i = 1; i <= n; i++) { + in.nextToken(); + x[i] = (int) in.nval; + in.nextToken(); + y[i] = (int) in.nval; + in.nextToken(); + z[i] = (int) in.nval; + } + for (int i = 1; i <= n; i++) { + for (int j = 1; j <= n; j++) { + if (i != j) { + dist[i][j] = Math.sqrt((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j])); + cost[i][j] = Math.abs(z[i] - z[j]); + } + } + } + double l = 0, r = 100, x; + // 二分进行60次,足够达到题目要求的精度 + // 二分完成后,l就是答案 + for (int i = 1; i <= 60; i++) { + x = (l + r) / 2; + if (prim(x) <= 0) { + r = x; + } else { + l = x; + } + } + out.printf("%.3f\n", l); + in.nextToken(); + n = (int) in.nval; + } + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class138/Other4.java b/src/class138/Other4.java new file mode 100644 index 000000000..41de51510 --- /dev/null +++ b/src/class138/Other4.java @@ -0,0 +1,118 @@ +package class138; + +// 题目4,最小圈,另一种二分的写法 +// 思路是不变的,二分的写法多种多样 +// 代码中打注释的位置,就是更简单的二分逻辑,其他代码没有变化 +// 测试链接 : https://www.luogu.com.cn/problem/P3199 +// 提交以下的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 Other4 { + + public static int MAXN = 3001; + + public static int MAXM = 10001; + + public static double MAXE = 1e7; + + public static int[] head = new int[MAXN]; + + public static int[] next = new int[MAXM]; + + public static int[] to = new int[MAXM]; + + public static double[] weight = new double[MAXM]; + + public static int cnt; + + public static double[] value = new double[MAXN]; + + public static boolean[] path = new boolean[MAXN]; + + public static int n, m; + + public static void prepare() { + cnt = 1; + Arrays.fill(head, 1, n + 1, 0); + } + + public static void addEdge(int u, int v, double w) { + next[cnt] = head[u]; + to[cnt] = v; + weight[cnt] = w; + head[u] = cnt++; + } + + public static boolean check(double x) { + Arrays.fill(value, 1, n + 1, 0); + Arrays.fill(path, 1, n + 1, false); + return dfs(0, x); + } + + public static boolean dfs(int u, double x) { + if (u == 0) { + for (int i = 1; i <= n; i++) { + if (dfs(i, x)) { + return true; + } + } + } else { + path[u] = true; + for (int e = head[u]; e != 0; e = next[e]) { + int v = to[e]; + double w = weight[e] - x; + if (value[v] > value[u] + w) { + value[v] = value[u] + w; + if (path[v] || dfs(v, x)) { + return true; + } + } + } + path[u] = false; + } + return false; + } + + 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; + prepare(); + for (int i = 1; i <= m; i++) { + in.nextToken(); + int u = (int) in.nval; + in.nextToken(); + int v = (int) in.nval; + in.nextToken(); + double w = in.nval; + addEdge(u, v, w); + } + double l = -MAXE, r = MAXE, x; + // 二分进行60次,足够达到题目要求的精度 + // 二分完成后,l就是答案 + for (int i = 1; i <= 60; i++) { + x = (l + r) / 2; + if (check(x)) { + r = x; + } else { + l = x; + } + } + out.printf("%.8f\n", l); + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class138/Other5.java b/src/class138/Other5.java new file mode 100644 index 000000000..9c96c0f4b --- /dev/null +++ b/src/class138/Other5.java @@ -0,0 +1,122 @@ +package class138; + +// 题目5,最佳团体,另一种二分的写法 +// 思路是不变的,二分的写法多种多样 +// 代码中打注释的位置,就是更简单的二分逻辑,其他代码没有变化 +// 测试链接 : https://www.luogu.com.cn/problem/P4322 +// 提交以下的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 Other5 { + + public static int MAXN = 3001; + + public static int LIMIT = 10000; + + public static double NA = -1e9; + + public static int[] head = new int[MAXN]; + + public static int[] next = new int[MAXN]; + + public static int[] to = new int[MAXN]; + + public static int edgeCnt; + + public static int[] cost = new int[MAXN]; + + public static int[] strength = new int[MAXN]; + + public static int[] dfn = new int[MAXN]; + + public static int dfnCnt; + + public static double[] value = new double[MAXN]; + + public static int[] size = new int[MAXN]; + + public static double[][] dp = new double[MAXN][MAXN]; + + public static int k, n; + + public static void prepare() { + edgeCnt = 1; + dfnCnt = 0; + Arrays.fill(head, 1, n + 1, 0); + } + + public static void addEdge(int u, int v) { + next[edgeCnt] = head[u]; + to[edgeCnt] = v; + head[u] = edgeCnt++; + } + + public static int dfs(int u) { + int i = ++dfnCnt; + dfn[u] = i; + size[i] = 1; + for (int e = head[u], v; e != 0; e = next[e]) { + v = to[e]; + size[i] += dfs(v); + } + return size[i]; + } + + public static boolean check(double x) { + for (int i = 0; i <= n; i++) { + value[dfn[i]] = (double) strength[i] - x * cost[i]; + } + for (int j = 1; j <= k; j++) { + dp[dfnCnt + 1][j] = NA; + } + for (int i = dfnCnt; i >= 2; i--) { + for (int j = 1; j <= k; j++) { + dp[i][j] = Math.max(dp[i + size[i]][j], value[i] + dp[i + 1][j - 1]); + } + } + return dp[2][k] >= 0; + } + + 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(); + k = (int) in.nval; + in.nextToken(); + n = (int) in.nval; + prepare(); + for (int i = 1; i <= n; i++) { + in.nextToken(); + cost[i] = (int) in.nval; + in.nextToken(); + strength[i] = (int) in.nval; + in.nextToken(); + addEdge((int) in.nval, i); + } + dfs(0); + double l = 0, r = LIMIT, x; + // 二分进行60次,足够达到题目要求的精度 + // 二分完成后,l就是答案 + for (int i = 1; i <= 60; i++) { + x = (l + r) / 2; + if (check(x)) { + l = x; + } else { + r = x; + } + } + out.printf("%.3f\n", l); + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class142/Code04_Measurer.java b/src/class142/Code04_Measurer1.java similarity index 99% rename from src/class142/Code04_Measurer.java rename to src/class142/Code04_Measurer1.java index 521367652..9fa58f560 100644 --- a/src/class142/Code04_Measurer.java +++ b/src/class142/Code04_Measurer1.java @@ -23,7 +23,7 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class Code04_Measurer { +public class Code04_Measurer1 { public static int MAXN = 1002; diff --git a/src/class142/Code04_Measurer2.java b/src/class142/Code04_Measurer2.java new file mode 100644 index 000000000..e31364eba --- /dev/null +++ b/src/class142/Code04_Measurer2.java @@ -0,0 +1,167 @@ +package class142; + +// 题目4,倍杀测量者,另一种二分的写法 +// 思路是不变的,二分的写法多种多样 +// 代码中打注释的位置,就是更简单的二分逻辑,其他代码没有变化 +// 测试链接 : https://www.luogu.com.cn/problem/P4926 +// 提交以下的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 Code04_Measurer2 { + + public static int MAXN = 1002; + + public static int MAXM = 3001; + + public static double INF = 1e10; + + public static int n, m1, m2; + + public static int[][] vow = new int[MAXN][4]; + + public static int[][] score = new int[MAXN][2]; + + public static int[] head = new int[MAXN]; + + public static int[] next = new int[MAXM]; + + public static int[] to = new int[MAXM]; + + public static double[] weight = new double[MAXM]; + + public static int cnt; + + public static double[] dist = new double[MAXN]; + + public static int[] update = new int[MAXN]; + + public static int MAXQ = 1000001; + + public static int[] queue = new int[MAXQ]; + + public static int h, t; + + public static boolean[] enter = new boolean[MAXN]; + + public static void prepare() { + cnt = 1; + h = t = 0; + Arrays.fill(head, 0, n + 2, 0); + Arrays.fill(dist, 0, n + 2, INF); + Arrays.fill(update, 0, n + 2, 0); + Arrays.fill(enter, 0, n + 2, false); + } + + public static void addEdge(int u, int v, double w) { + next[cnt] = head[u]; + to[cnt] = v; + weight[cnt] = w; + head[u] = cnt++; + } + + // 另一种二分的写法 + public static double compute() { + double l = 0, r = INF, m; + // 二分进行60次,足够达到题目要求的精度 + // 二分完成后,l就是答案 + for (int i = 1; i <= 60; i++) { + m = (l + r) / 2; + if (check(m)) { + l = m; + } else { + r = m; + } + } + return l; + } + + public static boolean check(double limit) { + prepare(); + for (int i = 1; i <= n; i++) { + addEdge(0, i, 0); + } + 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])); + } else { + addEdge(vow[i][1], vow[i][2], Math.log(limit + vow[i][3])); + } + } + for (int i = 1; i <= m2; i++) { + addEdge(n + 1, score[i][0], Math.log(score[i][1])); + addEdge(score[i][0], n + 1, -Math.log(score[i][1])); + } + return spfa(0); + } + + public static boolean spfa(int s) { + dist[s] = 0; + update[s] = 1; + queue[t++] = s; + enter[s] = true; + while (h < t) { + int u = queue[h++]; + enter[u] = false; + for (int ei = head[u]; ei > 0; ei = next[ei]) { + int v = to[ei]; + double w = weight[ei]; + if (dist[v] > dist[u] + w) { + dist[v] = dist[u] + w; + if (!enter[v]) { + if (++update[v] > n + 1) { + return true; + } + queue[t++] = v; + enter[v] = true; + } + } + } + } + return false; + } + + 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; + 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; + } + for (int i = 1; i <= m2; i++) { + in.nextToken(); + score[i][0] = (int) in.nval; + in.nextToken(); + score[i][1] = (int) in.nval; + } + double ans = compute(); + if (ans == 0) { + out.println("-1"); + } else { + out.println(ans); + } + out.flush(); + out.close(); + br.close(); + } + +} From f7a5170a3132529b02c1768564a0eb9267b5a004 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 6 Mar 2025 15:40:18 +0800 Subject: [PATCH 0778/2029] modify code --- src/class128/Code05_MaximizeMedian2.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class128/Code05_MaximizeMedian2.java b/src/class128/Code05_MaximizeMedian2.java index 2cd4f9069..4ba28ec9d 100644 --- a/src/class128/Code05_MaximizeMedian2.java +++ b/src/class128/Code05_MaximizeMedian2.java @@ -78,7 +78,7 @@ public static double average() { } public static boolean check1(double x) { - // arr中所有的数字都减去m,得到的数字填入help1 + // arr中所有的数字都减去x,得到的数字填入help1 for (int i = 1; i <= n; i++) { help1[i] = (double) arr[i] - x; } From a73c0cd9fa5e374e391ba30e1e1646193930d16a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 6 Mar 2025 17:11:25 +0800 Subject: [PATCH 0779/2029] modify code --- src/class162/Code03_NationalTour1.java | 431 +++++++++++++++++++++++++ src/class162/Code03_NationalTour2.java | 299 +++++++++++++++++ 2 files changed, 730 insertions(+) create mode 100644 src/class162/Code03_NationalTour1.java create mode 100644 src/class162/Code03_NationalTour2.java diff --git a/src/class162/Code03_NationalTour1.java b/src/class162/Code03_NationalTour1.java new file mode 100644 index 000000000..2844cafa0 --- /dev/null +++ b/src/class162/Code03_NationalTour1.java @@ -0,0 +1,431 @@ +package class162; + +// 国家集训队旅游,java版 +// 一共有n个节点,节点编号从0到n-1,所有节点连成一棵树 +// 给定n-1条边,边的编号从1到n-1,每条边给定初始边权 +// 一共有m条操作,每条操作的类型是如下5种类型中的一种 +// 操作 C x y : 第x条边的边权改成y +// 操作 N x y : x号点到y号点的路径上,所有边权变成相反数 +// 操作 SUM x y : x号点到y号点的路径上,查询所有边权的累加和 +// 操作 MAX x y : x号点到y号点的路径上,查询所有边权的最大值 +// 操作 MIN x y : x号点到y号点的路径上,查询所有边权的最小值 +// 1 <= n、m <= 2 * 10^5 +// -1000 <= 任何时候的边权 <= +1000 +// 测试链接 : https://www.luogu.com.cn/problem/P1505 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.util.StringTokenizer; + +public class Code03_NationalTour1 { + + public static int MAXN = 200001; + public static int n, m; + public static int[][] arr = new int[MAXN][3]; + + // 链式前向星 + 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 cntd = 0; + + // 线段树 + public static int[] sum = new int[MAXN << 2]; + public static int[] max = new int[MAXN << 2]; + public static int[] min = new int[MAXN << 2]; + public static boolean[] negativeTag = new boolean[MAXN << 2]; + + 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; + 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); + } + } + } + + 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; + 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 up(int i) { + int l = i << 1, r = i << 1 | 1; + sum[i] = sum[l] + sum[r]; + max[i] = Math.max(max[l], max[r]); + min[i] = Math.min(min[l], min[r]); + } + + public static void lazy(int i) { + sum[i] = -sum[i]; + int tmp = max[i]; + max[i] = -min[i]; + min[i] = -tmp; + negativeTag[i] = !negativeTag[i]; + } + + public static void down(int i) { + if (negativeTag[i]) { + lazy(i << 1); + lazy(i << 1 | 1); + negativeTag[i] = false; + } + } + + public static void update(int jobi, int jobv, int l, int r, int i) { + if (l == r) { + sum[i] = max[i] = min[i] = jobv; + } else { + down(i); + int mid = (l + r) / 2; + if (jobi <= mid) { + update(jobi, jobv, l, mid, i << 1); + } else { + update(jobi, jobv, mid + 1, r, i << 1 | 1); + } + up(i); + } + } + + public static void negative(int jobl, int jobr, int l, int r, int i) { + if (jobl <= l && r <= jobr) { + lazy(i); + } else { + down(i); + int mid = (l + r) / 2; + if (jobl <= mid) { + negative(jobl, jobr, l, mid, i << 1); + } + if (jobr > mid) { + negative(jobl, jobr, mid + 1, r, i << 1 | 1); + } + up(i); + } + } + + public static int querySum(int jobl, int jobr, int l, int r, int i) { + if (jobl <= l && r <= jobr) { + return sum[i]; + } + down(i); + int mid = (l + r) / 2; + int ans = 0; + if (jobl <= mid) { + ans += querySum(jobl, jobr, l, mid, i << 1); + } + if (jobr > mid) { + ans += querySum(jobl, jobr, mid + 1, r, i << 1 | 1); + } + return ans; + } + + public static int queryMax(int jobl, int jobr, int l, int r, int i) { + if (jobl <= l && r <= jobr) { + return max[i]; + } + down(i); + int mid = (l + r) / 2; + int ans = Integer.MIN_VALUE; + if (jobl <= mid) { + ans = Math.max(ans, queryMax(jobl, jobr, l, mid, i << 1)); + } + if (jobr > mid) { + ans = Math.max(ans, queryMax(jobl, jobr, mid + 1, r, i << 1 | 1)); + } + return ans; + } + + public static int queryMin(int jobl, int jobr, int l, int r, int i) { + if (jobl <= l && r <= jobr) { + return min[i]; + } + down(i); + int mid = (l + r) / 2; + int ans = Integer.MAX_VALUE; + if (jobl <= mid) { + ans = Math.min(ans, queryMin(jobl, jobr, l, mid, i << 1)); + } + if (jobr > mid) { + ans = Math.min(ans, queryMin(jobl, jobr, mid + 1, r, i << 1 | 1)); + } + return ans; + } + + public static void edgeUpdate(int ei, int val) { + int x = arr[ei][0]; + int y = arr[ei][1]; + int down = Math.max(dfn[x], dfn[y]); + update(down, val, 1, n, 1); + } + + public static void pathNegative(int x, int y) { + while (top[x] != top[y]) { + if (dep[top[x]] <= dep[top[y]]) { + negative(dfn[top[y]], dfn[y], 1, n, 1); + y = fa[top[y]]; + } else { + negative(dfn[top[x]], dfn[x], 1, n, 1); + x = fa[top[x]]; + } + } + negative(Math.min(dfn[x], dfn[y]) + 1, Math.max(dfn[x], dfn[y]), 1, n, 1); + } + + public static int pathSum(int x, int y) { + int ans = 0; + while (top[x] != top[y]) { + if (dep[top[x]] <= dep[top[y]]) { + ans += querySum(dfn[top[y]], dfn[y], 1, n, 1); + y = fa[top[y]]; + } else { + ans += querySum(dfn[top[x]], dfn[x], 1, n, 1); + x = fa[top[x]]; + } + } + ans += querySum(Math.min(dfn[x], dfn[y]) + 1, Math.max(dfn[x], dfn[y]), 1, n, 1); + return ans; + } + + public static int pathMax(int x, int y) { + int ans = Integer.MIN_VALUE; + while (top[x] != top[y]) { + if (dep[top[x]] <= dep[top[y]]) { + ans = Math.max(ans, queryMax(dfn[top[y]], dfn[y], 1, n, 1)); + y = fa[top[y]]; + } else { + ans = Math.max(ans, queryMax(dfn[top[x]], dfn[x], 1, n, 1)); + x = fa[top[x]]; + } + } + ans = Math.max(ans, queryMax(Math.min(dfn[x], dfn[y]) + 1, Math.max(dfn[x], dfn[y]), 1, n, 1)); + return ans; + } + + public static int pathMin(int x, int y) { + int ans = Integer.MAX_VALUE; + while (top[x] != top[y]) { + if (dep[top[x]] <= dep[top[y]]) { + ans = Math.min(ans, queryMin(dfn[top[y]], dfn[y], 1, n, 1)); + y = fa[top[y]]; + } else { + ans = Math.min(ans, queryMin(dfn[top[x]], dfn[x], 1, n, 1)); + x = fa[top[x]]; + } + } + ans = Math.min(ans, queryMin(Math.min(dfn[x], dfn[y]) + 1, Math.max(dfn[x], dfn[y]), 1, n, 1)); + return ans; + } + + public static void prepare() { + for (int i = 1; i < n; i++) { + addEdge(arr[i][0], arr[i][1]); + addEdge(arr[i][1], arr[i][0]); + } + dfs3(); + dfs4(); + for (int i = 1; i < n; i++) { + edgeUpdate(i, arr[i][2]); + } + } + + public static void main(String[] args) { + Kattio io = new Kattio(); + n = io.nextInt(); + for (int i = 1; i < n; i++) { + arr[i][0] = io.nextInt() + 1; + arr[i][1] = io.nextInt() + 1; + arr[i][2] = io.nextInt(); + } + prepare(); + m = io.nextInt(); + String op; + for (int i = 1, x, y; i <= m; i++) { + op = io.next(); + if (op.equals("C")) { + x = io.nextInt(); + y = io.nextInt(); + edgeUpdate(x, y); + } else { + x = io.nextInt() + 1; + y = io.nextInt() + 1; + if (op.equals("N")) { + pathNegative(x, y); + } else if (op.equals("SUM")) { + io.println(pathSum(x, y)); + } else if (op.equals("MAX")) { + io.println(pathMax(x, y)); + } else { + io.println(pathMin(x, y)); + } + } + } + io.flush(); + io.close(); + } + + // 读写工具类 + public static class Kattio extends PrintWriter { + private BufferedReader r; + private StringTokenizer st; + + public Kattio() { + this(System.in, System.out); + } + + public Kattio(InputStream i, OutputStream o) { + super(o); + r = new BufferedReader(new InputStreamReader(i)); + } + + public Kattio(String intput, String output) throws IOException { + super(output); + r = new BufferedReader(new FileReader(intput)); + } + + public String next() { + try { + while (st == null || !st.hasMoreTokens()) + st = new StringTokenizer(r.readLine()); + return st.nextToken(); + } catch (Exception e) { + } + return null; + } + + public int nextInt() { + return Integer.parseInt(next()); + } + + public double nextDouble() { + return Double.parseDouble(next()); + } + + public long nextLong() { + return Long.parseLong(next()); + } + } + +} diff --git a/src/class162/Code03_NationalTour2.java b/src/class162/Code03_NationalTour2.java new file mode 100644 index 000000000..16100c9ed --- /dev/null +++ b/src/class162/Code03_NationalTour2.java @@ -0,0 +1,299 @@ +package class162; + +// 国家集训队旅游,C++版 +// 一共有n个节点,节点编号从0到n-1,所有节点连成一棵树 +// 给定n-1条边,边的编号从1到n-1,每条边给定初始边权 +// 一共有m条操作,每条操作的类型是如下5种类型中的一种 +// 操作 C x y : 第x条边的边权改成y +// 操作 N x y : x号点到y号点的路径上,所有边权变成相反数 +// 操作 SUM x y : x号点到y号点的路径上,查询所有边权的累加和 +// 操作 MAX x y : x号点到y号点的路径上,查询所有边权的最大值 +// 操作 MIN x y : x号点到y号点的路径上,查询所有边权的最小值 +// 1 <= n、m <= 2 * 10^5 +// -1000 <= 任何时候的边权 <= +1000 +// 测试链接 : https://www.luogu.com.cn/problem/P1505 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 200001; +//int n, m; +//int arr[MAXN][3]; +// +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int cntg = 0; +// +//int fa[MAXN]; +//int dep[MAXN]; +//int siz[MAXN]; +//int son[MAXN]; +//int top[MAXN]; +//int dfn[MAXN]; +//int cntd = 0; +// +//int sumv[MAXN << 2]; +//int maxv[MAXN << 2]; +//int minv[MAXN << 2]; +//bool negativeTag[MAXN << 2]; +// +//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]; e > 0; e = nxt[e]) { +// int v = to[e]; +// if (v != f) { +// dfs1(v, u); +// } +// } +// for (int e = head[u]; e > 0; e = nxt[e]) { +// int 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; +// dfn[u] = ++cntd; +// if (son[u] == 0) { +// return; +// } +// dfs2(son[u], t); +// for (int e = head[u]; e > 0; e = nxt[e]) { +// int v = to[e]; +// if (v != fa[u] && v != son[u]) { +// dfs2(v, v); +// } +// } +//} +// +//void up(int i) { +// int l = i << 1, r = i << 1 | 1; +// sumv[i] = sumv[l] + sumv[r]; +// maxv[i] = max(maxv[l], maxv[r]); +// minv[i] = min(minv[l], minv[r]); +//} +// +//void lazy(int i) { +// sumv[i] = -sumv[i]; +// int tmp = maxv[i]; +// maxv[i] = -minv[i]; +// minv[i] = -tmp; +// negativeTag[i] = !negativeTag[i]; +//} +// +//void down(int i) { +// if (negativeTag[i]) { +// lazy(i << 1); +// lazy(i << 1 | 1); +// negativeTag[i] = false; +// } +//} +// +//void update(int jobi, int jobv, int l, int r, int i) { +// if (l == r) { +// sumv[i] = maxv[i] = minv[i] = jobv; +// } else { +// down(i); +// 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); +// } +//} +// +//void negative(int jobl, int jobr, int l, int r, int i) { +// if (jobl <= l && r <= jobr) { +// lazy(i); +// } else { +// down(i); +// int mid = (l + r) >> 1; +// if (jobl <= mid) { +// negative(jobl, jobr, l, mid, i << 1); +// } +// if (jobr > mid) { +// negative(jobl, jobr, mid + 1, r, i << 1 | 1); +// } +// up(i); +// } +//} +// +//int querySum(int jobl, int jobr, int l, int r, int i) { +// if (jobl <= l && r <= jobr) { +// return sumv[i]; +// } +// down(i); +// int mid = (l + r) >> 1; +// int ans = 0; +// if (jobl <= mid) { +// ans += querySum(jobl, jobr, l, mid, i << 1); +// } +// if (jobr > mid) { +// ans += querySum(jobl, jobr, mid + 1, r, i << 1 | 1); +// } +// return ans; +//} +// +//int queryMax(int jobl, int jobr, int l, int r, int i) { +// if (jobl <= l && r <= jobr) { +// return maxv[i]; +// } +// down(i); +// int mid = (l + r) >> 1; +// int ans = INT_MIN; +// if (jobl <= mid) { +// ans = max(ans, queryMax(jobl, jobr, l, mid, i << 1)); +// } +// if (jobr > mid) { +// ans = max(ans, queryMax(jobl, jobr, mid + 1, r, i << 1 | 1)); +// } +// return ans; +//} +// +//int queryMin(int jobl, int jobr, int l, int r, int i) { +// if (jobl <= l && r <= jobr) { +// return minv[i]; +// } +// down(i); +// int mid = (l + r) >> 1; +// int ans = INT_MAX; +// if (jobl <= mid) { +// ans = min(ans, queryMin(jobl, jobr, l, mid, i << 1)); +// } +// if (jobr > mid) { +// ans = min(ans, queryMin(jobl, jobr, mid + 1, r, i << 1 | 1)); +// } +// return ans; +//} +// +//void edgeUpdate(int ei, int val) { +// int x = arr[ei][0]; +// int y = arr[ei][1]; +// int downx = max(dfn[x], dfn[y]); +// update(downx, val, 1, n, 1); +//} +// +//void pathNegative(int x, int y) { +// while (top[x] != top[y]) { +// if (dep[top[x]] <= dep[top[y]]) { +// negative(dfn[top[y]], dfn[y], 1, n, 1); +// y = fa[top[y]]; +// } else { +// negative(dfn[top[x]], dfn[x], 1, n, 1); +// x = fa[top[x]]; +// } +// } +// negative(min(dfn[x], dfn[y]) + 1, max(dfn[x], dfn[y]), 1, n, 1); +//} +// +//int pathSum(int x, int y) { +// int ans = 0; +// while (top[x] != top[y]) { +// if (dep[top[x]] <= dep[top[y]]) { +// ans += querySum(dfn[top[y]], dfn[y], 1, n, 1); +// y = fa[top[y]]; +// } else { +// ans += querySum(dfn[top[x]], dfn[x], 1, n, 1); +// x = fa[top[x]]; +// } +// } +// ans += querySum(min(dfn[x], dfn[y]) + 1, max(dfn[x], dfn[y]), 1, n, 1); +// return ans; +//} +// +//int pathMax(int x, int y) { +// int ans = INT_MIN; +// while (top[x] != top[y]) { +// if (dep[top[x]] <= dep[top[y]]) { +// ans = max(ans, queryMax(dfn[top[y]], dfn[y], 1, n, 1)); +// y = fa[top[y]]; +// } else { +// ans = max(ans, queryMax(dfn[top[x]], dfn[x], 1, n, 1)); +// x = fa[top[x]]; +// } +// } +// ans = max(ans, queryMax(min(dfn[x], dfn[y]) + 1, max(dfn[x], dfn[y]), 1, n, 1)); +// return ans; +//} +// +//int pathMin(int x, int y) { +// int ans = INT_MAX; +// while (top[x] != top[y]) { +// if (dep[top[x]] <= dep[top[y]]) { +// ans = min(ans, queryMin(dfn[top[y]], dfn[y], 1, n, 1)); +// y = fa[top[y]]; +// } else { +// ans = min(ans, queryMin(dfn[top[x]], dfn[x], 1, n, 1)); +// x = fa[top[x]]; +// } +// } +// ans = min(ans, queryMin(min(dfn[x], dfn[y]) + 1, max(dfn[x], dfn[y]), 1, n, 1)); +// return ans; +//} +// +//void prepare() { +// for (int i = 1; i < n; i++) { +// addEdge(arr[i][0], arr[i][1]); +// addEdge(arr[i][1], arr[i][0]); +// } +// dfs1(1, 0); +// dfs2(1, 1); +// for (int i = 1; i < n; i++) { +// edgeUpdate(i, arr[i][2]); +// } +//} +// +//int main(){ +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n; +// for(int i = 1; i < n; i++){ +// cin >> arr[i][0] >> arr[i][1] >> arr[i][2]; +// arr[i][0]++; +// arr[i][1]++; +// } +// prepare(); +// cin >> m; +// string op; +// for(int i = 1, x, y; i <= m; i++){ +// string op; +// cin >> op; +// if(op == "C"){ +// cin >> x >> y; +// edgeUpdate(x, y); +// } else { +// cin >> x >> y; +// x++; +// y++; +// if(op == "N"){ +// pathNegative(x, y); +// } else if(op == "SUM"){ +// cout << pathSum(x, y) << "\n"; +// } else if(op == "MAX"){ +// cout << pathMax(x, y) << "\n"; +// } else { +// cout << pathMin(x, y) << "\n"; +// } +// } +// } +// return 0; +//} \ No newline at end of file From 62426ed125657e8ce46ee75b97297b0df6cc1046 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 6 Mar 2025 17:17:14 +0800 Subject: [PATCH 0780/2029] modify code --- .../{Code03_NationalTour1.java => Code02_NationalTour1.java} | 2 +- .../{Code03_NationalTour2.java => Code02_NationalTour2.java} | 0 src/class162/{Code02_UnderMoon1.java => Code03_UnderMoon1.java} | 2 +- src/class162/{Code02_UnderMoon2.java => Code03_UnderMoon2.java} | 0 4 files changed, 2 insertions(+), 2 deletions(-) rename src/class162/{Code03_NationalTour1.java => Code02_NationalTour1.java} (99%) rename src/class162/{Code03_NationalTour2.java => Code02_NationalTour2.java} (100%) rename src/class162/{Code02_UnderMoon1.java => Code03_UnderMoon1.java} (99%) rename src/class162/{Code02_UnderMoon2.java => Code03_UnderMoon2.java} (100%) diff --git a/src/class162/Code03_NationalTour1.java b/src/class162/Code02_NationalTour1.java similarity index 99% rename from src/class162/Code03_NationalTour1.java rename to src/class162/Code02_NationalTour1.java index 2844cafa0..5c2188ccd 100644 --- a/src/class162/Code03_NationalTour1.java +++ b/src/class162/Code02_NationalTour1.java @@ -23,7 +23,7 @@ import java.io.PrintWriter; import java.util.StringTokenizer; -public class Code03_NationalTour1 { +public class Code02_NationalTour1 { public static int MAXN = 200001; public static int n, m; diff --git a/src/class162/Code03_NationalTour2.java b/src/class162/Code02_NationalTour2.java similarity index 100% rename from src/class162/Code03_NationalTour2.java rename to src/class162/Code02_NationalTour2.java diff --git a/src/class162/Code02_UnderMoon1.java b/src/class162/Code03_UnderMoon1.java similarity index 99% rename from src/class162/Code02_UnderMoon1.java rename to src/class162/Code03_UnderMoon1.java index 4933b8cf0..ec7eb363c 100644 --- a/src/class162/Code02_UnderMoon1.java +++ b/src/class162/Code03_UnderMoon1.java @@ -22,7 +22,7 @@ import java.io.PrintWriter; import java.util.StringTokenizer; -public class Code02_UnderMoon1 { +public class Code03_UnderMoon1 { public static int MAXN = 100001; public static int n; diff --git a/src/class162/Code02_UnderMoon2.java b/src/class162/Code03_UnderMoon2.java similarity index 100% rename from src/class162/Code02_UnderMoon2.java rename to src/class162/Code03_UnderMoon2.java From b290eea7961e32b90afbe7c660718fb26a2c3379 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 7 Mar 2025 17:00:40 +0800 Subject: [PATCH 0781/2029] modify code --- src/class162/Code04_DominantIndices1.java | 246 ++++++++++++++++++++++ src/class162/Code04_DominantIndices2.java | 120 +++++++++++ 2 files changed, 366 insertions(+) create mode 100644 src/class162/Code04_DominantIndices1.java create mode 100644 src/class162/Code04_DominantIndices2.java diff --git a/src/class162/Code04_DominantIndices1.java b/src/class162/Code04_DominantIndices1.java new file mode 100644 index 000000000..9eb7c8db6 --- /dev/null +++ b/src/class162/Code04_DominantIndices1.java @@ -0,0 +1,246 @@ +package class162; + +// 哪个距离的点最多,java版 +// 一共有n个节点,给定n-1条边,所有节点连成一棵树,规定1号节点是头 +// 定义d(u, x),以u为头的子树中,到u的距离为x的节点数 +// 那么对于任何点u,都有若干的d(u, x)值,想让x对应的值最大,并且x尽量小 +// 规定任何点到自己的距离为0 +// 打印每个点的答案 +// 1 <= n <= 10^6 +// 测试链接 : https://codeforces.com/problemset/problem/1009/F +// 提交以下的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 Code04_DominantIndices1 { + + public static int MAXN = 1000001; + public static int n; + + 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 cnt = 0; + + public static int[] len = new int[MAXN]; + public static int[] son = new int[MAXN]; + + public static int[] start = new int[MAXN]; + public static int[] dp = new int[MAXN]; + public static int[] ans = new int[MAXN]; + + public static void set(int u, int i, int v) { + dp[start[u] + i] = v; + } + + public static int get(int u, int i) { + return dp[start[u] + i]; + } + + public static void addEdge(int u, int v) { + next[++cnt] = head[u]; + to[cnt] = v; + head[u] = cnt; + } + + // 递归版,C++可以通过,java会爆栈 + public static void dfs1(int u, int fa) { + for (int e = head[u], v; e > 0; e = next[e]) { + v = to[e]; + if (v != fa) { + dfs1(v, u); + } + } + for (int e = head[u], v; e > 0; e = next[e]) { + v = to[e]; + if (v != fa) { + if (son[u] == 0 || len[son[u]] < len[v]) { + son[u] = v; + } + } + } + len[u] = len[son[u]] + 1; + } + + // 递归版,C++可以通过,java会爆栈 + public static void dfs2(int u, int fa) { + // 第一部分,给所有儿子设置start位置 + set(u, 0, 1); + if (son[u] == 0) { + ans[u] = 0; + return; + } + start[son[u]] = start[u] + 1; + int startSum = start[u] + len[u]; + for (int e = head[u], v; e > 0; e = next[e]) { + v = to[e]; + if (v != fa && v != son[u]) { + start[v] = startSum; + startSum += len[v]; + } + } + // 第二部分,先遍历长儿子,得到的答案已经放在dp里了,自动复用 + dfs2(son[u], u); + // 第三部分,处理其他儿子 + for (int e = head[u], v; e > 0; e = next[e]) { + v = to[e]; + if (v != fa && v != son[u]) { + dfs2(v, u); + } + } + // 第四部分,计算答案 + ans[u] = ans[son[u]] + 1; + for (int e = head[u], v; e > 0; e = next[e]) { + v = to[e]; + if (v != fa && v != son[u]) { + for (int i = 1; i <= len[v]; i++) { + set(u, i, get(u, i) + get(v, i - 1)); + if (get(u, i) > get(u, ans[u]) || (get(u, i) == get(u, ans[u]) && i < ans[u])) { + ans[u] = i; + } + } + } + } + if (get(u, ans[u]) == 1) { + ans[u] = 0; + } + } + + // 不会改迭代版,去看讲解118,详解了从递归版改迭代版 + public static int[][] ufe = new int[MAXN][3]; + + public static int stacksize, u, f, e; + + public static void push(int a, int b, int c) { + ufe[stacksize][0] = a; + ufe[stacksize][1] = b; + ufe[stacksize][2] = c; + stacksize++; + } + + public static void pop() { + --stacksize; + u = ufe[stacksize][0]; + f = ufe[stacksize][1]; + e = ufe[stacksize][2]; + } + + // dfs1的迭代版 + public static void dfs3() { + stacksize = 0; + push(1, 0, -1); + int v; + while (stacksize > 0) { + pop(); + if (e == -1) { + e = head[u]; + } else { + e = next[e]; + } + if (e != 0) { + push(u, f, e); + v = to[e]; + if (v != f) { + push(v, u, -1); + } + } else { + for (int ei = head[u]; ei > 0; ei = next[ei]) { + v = to[ei]; + if (v != f) { + if (son[u] == 0 || len[son[u]] < len[v]) { + son[u] = v; + } + } + } + len[u] = len[son[u]] + 1; + } + } + } + + // dfs2的迭代版 + public static void dfs4() { + stacksize = 0; + push(1, 0, -1); + int v; + while (stacksize > 0) { + pop(); + if (e == -1) { // e == -1,表示第一次来到当前节点,对应第一部分 + set(u, 0, 1); + if (son[u] == 0) { + ans[u] = 0; + continue; + } + start[son[u]] = start[u] + 1; + int startSum = start[u] + len[u]; + for (int e = head[u]; e > 0; e = next[e]) { + v = to[e]; + if (v != f && v != son[u]) { + start[v] = startSum; + startSum += len[v]; + } + } + push(u, f, -2); // 设置e = -2,再弹出就表示处理完长儿子了 + push(son[u], u, -1); // 长儿子的任务进入栈,对应第二部分 + continue; + } else if (e == -2) { // e == -2,表示长儿子已经处理完,该处理其他儿子了 + e = head[u]; + } else { // 每个儿子都处理 + e = next[e]; + } + if (e != 0) { // 对应第三部分 + push(u, f, e); + v = to[e]; + if (v != f && v != son[u]) { + push(v, u, -1); + } + } else { // 对应第四部分,计算答案 + ans[u] = ans[son[u]] + 1; + for (int e = head[u]; e > 0; e = next[e]) { + v = to[e]; + if (v != f && v != son[u]) { + for (int i = 1; i <= len[v]; i++) { + set(u, i, get(u, i) + get(v, i - 1)); + if (get(u, i) > get(u, ans[u]) || (get(u, i) == get(u, ans[u]) && i < ans[u])) { + ans[u] = i; + } + } + } + } + if (get(u, ans[u]) == 1) { + ans[u] = 0; + } + } + } + } + + 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; + 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); + } + dfs3(); + start[1] = 1; + dfs4(); + for (int i = 1; i <= n; i++) { + out.println(ans[i]); + } + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class162/Code04_DominantIndices2.java b/src/class162/Code04_DominantIndices2.java new file mode 100644 index 000000000..5968d7768 --- /dev/null +++ b/src/class162/Code04_DominantIndices2.java @@ -0,0 +1,120 @@ +package class162; + +// 哪个距离的点最多,C++版 +// 一共有n个节点,给定n-1条边,所有节点连成一棵树,规定1号节点是头 +// 定义d(u, x),以u为头的子树中,到u的距离为x的节点数 +// 那么对于任何点u,都有若干的d(u, x)值,想让x对应的值最大,并且x尽量小 +// 规定任何点到自己的距离为0 +// 打印每个点的答案 +// 1 <= n <= 10^6 +// 测试链接 : https://codeforces.com/problemset/problem/1009/F +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 1000001; +//int n; +// +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int cnt = 0; +// +//int len[MAXN]; +//int son[MAXN]; +// +//int start[MAXN]; +//int dp[MAXN]; +//int ans[MAXN]; +// +//void setVal(int u, int i, int v) { +// dp[start[u] + i] = v; +//} +// +//int getVal(int u, int i) { +// return dp[start[u] + i]; +//} +// +//void addEdge(int u, int v) { +// nxt[++cnt] = head[u]; +// to[cnt] = v; +// head[u] = cnt; +//} +// +//void dfs1(int u, int fa) { +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// if (v != fa) { +// dfs1(v, u); +// } +// } +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// if (v != fa) { +// if (son[u] == 0 || len[son[u]] < len[v]) { +// son[u] = v; +// } +// } +// } +// len[u] = len[son[u]] + 1; +//} +// +//void dfs2(int u, int fa) { +// setVal(u, 0, 1); +// if (son[u] == 0) { +// ans[u] = 0; +// return; +// } +// start[son[u]] = start[u] + 1; +// int startSum = start[u] + len[u]; +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// if (v != fa && v != son[u]) { +// start[v] = startSum; +// startSum += len[v]; +// } +// } +// dfs2(son[u], u); +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// if (v != fa && v != son[u]) { +// dfs2(v, u); +// } +// } +// ans[u] = ans[son[u]] + 1; +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// if (v != fa && v != son[u]) { +// for (int i = 1; i <= len[v]; i++) { +// setVal(u, i, getVal(u, i) + getVal(v, i - 1)); +// if (getVal(u, i) > getVal(u, ans[u]) || (getVal(u, i) == getVal(u, ans[u]) && i < ans[u])) { +// ans[u] = i; +// } +// } +// } +// } +// if (getVal(u, ans[u]) == 1) { +// ans[u] = 0; +// } +//} +// +//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); +// start[1] = 1; +// dfs2(1, 0); +// for (int i = 1; i <= n; i++) { +// cout << ans[i] << "\n"; +// } +// return 0; +//} \ No newline at end of file From 427965c1562af174816251afc00ec87f2e6c3d2b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 7 Mar 2025 17:34:22 +0800 Subject: [PATCH 0782/2029] modify code --- src/class162/Code04_DominantIndices1.java | 118 +-------- src/class162/Code04_DominantIndices2.java | 288 +++++++++++++--------- src/class162/Code04_DominantIndices3.java | 119 +++++++++ 3 files changed, 303 insertions(+), 222 deletions(-) create mode 100644 src/class162/Code04_DominantIndices3.java diff --git a/src/class162/Code04_DominantIndices1.java b/src/class162/Code04_DominantIndices1.java index 9eb7c8db6..1a294945e 100644 --- a/src/class162/Code04_DominantIndices1.java +++ b/src/class162/Code04_DominantIndices1.java @@ -1,6 +1,6 @@ package class162; -// 哪个距离的点最多,java版 +// 哪个距离的点最多,java递归版 // 一共有n个节点,给定n-1条边,所有节点连成一棵树,规定1号节点是头 // 定义d(u, x),以u为头的子树中,到u的距离为x的节点数 // 那么对于任何点u,都有若干的d(u, x)值,想让x对应的值最大,并且x尽量小 @@ -8,7 +8,7 @@ // 打印每个点的答案 // 1 <= n <= 10^6 // 测试链接 : https://codeforces.com/problemset/problem/1009/F -// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 +// 提交以下的code,提交时请把类名改成"Main",因为递归爆栈所以无法通过 import java.io.BufferedReader; import java.io.IOException; @@ -22,14 +22,17 @@ public class Code04_DominantIndices1 { public static int MAXN = 1000001; public static int n; + // 链式前向星 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 cnt = 0; + // 长链剖分 public static int[] len = new int[MAXN]; public static int[] son = new int[MAXN]; + // 动态规划 public static int[] start = new int[MAXN]; public static int[] dp = new int[MAXN]; public static int[] ans = new int[MAXN]; @@ -111,113 +114,6 @@ public static void dfs2(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 a, int b, int c) { - ufe[stacksize][0] = a; - ufe[stacksize][1] = b; - ufe[stacksize][2] = c; - stacksize++; - } - - public static void pop() { - --stacksize; - u = ufe[stacksize][0]; - f = ufe[stacksize][1]; - e = ufe[stacksize][2]; - } - - // dfs1的迭代版 - public static void dfs3() { - stacksize = 0; - push(1, 0, -1); - int v; - while (stacksize > 0) { - pop(); - if (e == -1) { - e = head[u]; - } else { - e = next[e]; - } - if (e != 0) { - push(u, f, e); - v = to[e]; - if (v != f) { - push(v, u, -1); - } - } else { - for (int ei = head[u]; ei > 0; ei = next[ei]) { - v = to[ei]; - if (v != f) { - if (son[u] == 0 || len[son[u]] < len[v]) { - son[u] = v; - } - } - } - len[u] = len[son[u]] + 1; - } - } - } - - // dfs2的迭代版 - public static void dfs4() { - stacksize = 0; - push(1, 0, -1); - int v; - while (stacksize > 0) { - pop(); - if (e == -1) { // e == -1,表示第一次来到当前节点,对应第一部分 - set(u, 0, 1); - if (son[u] == 0) { - ans[u] = 0; - continue; - } - start[son[u]] = start[u] + 1; - int startSum = start[u] + len[u]; - for (int e = head[u]; e > 0; e = next[e]) { - v = to[e]; - if (v != f && v != son[u]) { - start[v] = startSum; - startSum += len[v]; - } - } - push(u, f, -2); // 设置e = -2,再弹出就表示处理完长儿子了 - push(son[u], u, -1); // 长儿子的任务进入栈,对应第二部分 - continue; - } else if (e == -2) { // e == -2,表示长儿子已经处理完,该处理其他儿子了 - e = head[u]; - } else { // 每个儿子都处理 - e = next[e]; - } - if (e != 0) { // 对应第三部分 - push(u, f, e); - v = to[e]; - if (v != f && v != son[u]) { - push(v, u, -1); - } - } else { // 对应第四部分,计算答案 - ans[u] = ans[son[u]] + 1; - for (int e = head[u]; e > 0; e = next[e]) { - v = to[e]; - if (v != f && v != son[u]) { - for (int i = 1; i <= len[v]; i++) { - set(u, i, get(u, i) + get(v, i - 1)); - if (get(u, i) > get(u, ans[u]) || (get(u, i) == get(u, ans[u]) && i < ans[u])) { - ans[u] = i; - } - } - } - } - if (get(u, ans[u]) == 1) { - ans[u] = 0; - } - } - } - } - public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StreamTokenizer in = new StreamTokenizer(br); @@ -232,9 +128,9 @@ public static void main(String[] args) throws IOException { addEdge(u, v); addEdge(v, u); } - dfs3(); + dfs1(1, 0); start[1] = 1; - dfs4(); + dfs2(1, 0); for (int i = 1; i <= n; i++) { out.println(ans[i]); } diff --git a/src/class162/Code04_DominantIndices2.java b/src/class162/Code04_DominantIndices2.java index 5968d7768..5d2a18e31 100644 --- a/src/class162/Code04_DominantIndices2.java +++ b/src/class162/Code04_DominantIndices2.java @@ -1,6 +1,6 @@ package class162; -// 哪个距离的点最多,C++版 +// 哪个距离的点最多,java迭代版 // 一共有n个节点,给定n-1条边,所有节点连成一棵树,规定1号节点是头 // 定义d(u, x),以u为头的子树中,到u的距离为x的节点数 // 那么对于任何点u,都有若干的d(u, x)值,想让x对应的值最大,并且x尽量小 @@ -8,113 +8,179 @@ // 打印每个点的答案 // 1 <= n <= 10^6 // 测试链接 : https://codeforces.com/problemset/problem/1009/F -// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 -// 提交如下代码,可以通过所有测试用例 - -//#include -// -//using namespace std; -// -//const int MAXN = 1000001; -//int n; -// -//int head[MAXN]; -//int nxt[MAXN << 1]; -//int to[MAXN << 1]; -//int cnt = 0; -// -//int len[MAXN]; -//int son[MAXN]; -// -//int start[MAXN]; -//int dp[MAXN]; -//int ans[MAXN]; -// -//void setVal(int u, int i, int v) { -// dp[start[u] + i] = v; -//} -// -//int getVal(int u, int i) { -// return dp[start[u] + i]; -//} -// -//void addEdge(int u, int v) { -// nxt[++cnt] = head[u]; -// to[cnt] = v; -// head[u] = cnt; -//} -// -//void dfs1(int u, int fa) { -// for (int e = head[u], v; e > 0; e = nxt[e]) { -// v = to[e]; -// if (v != fa) { -// dfs1(v, u); -// } -// } -// for (int e = head[u], v; e > 0; e = nxt[e]) { -// v = to[e]; -// if (v != fa) { -// if (son[u] == 0 || len[son[u]] < len[v]) { -// son[u] = v; -// } -// } -// } -// len[u] = len[son[u]] + 1; -//} -// -//void dfs2(int u, int fa) { -// setVal(u, 0, 1); -// if (son[u] == 0) { -// ans[u] = 0; -// return; -// } -// start[son[u]] = start[u] + 1; -// int startSum = start[u] + len[u]; -// for (int e = head[u], v; e > 0; e = nxt[e]) { -// v = to[e]; -// if (v != fa && v != son[u]) { -// start[v] = startSum; -// startSum += len[v]; -// } -// } -// dfs2(son[u], u); -// for (int e = head[u], v; e > 0; e = nxt[e]) { -// v = to[e]; -// if (v != fa && v != son[u]) { -// dfs2(v, u); -// } -// } -// ans[u] = ans[son[u]] + 1; -// for (int e = head[u], v; e > 0; e = nxt[e]) { -// v = to[e]; -// if (v != fa && v != son[u]) { -// for (int i = 1; i <= len[v]; i++) { -// setVal(u, i, getVal(u, i) + getVal(v, i - 1)); -// if (getVal(u, i) > getVal(u, ans[u]) || (getVal(u, i) == getVal(u, ans[u]) && i < ans[u])) { -// ans[u] = i; -// } -// } -// } -// } -// if (getVal(u, ans[u]) == 1) { -// ans[u] = 0; -// } -//} -// -//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); -// start[1] = 1; -// dfs2(1, 0); -// for (int i = 1; i <= n; i++) { -// cout << ans[i] << "\n"; -// } -// return 0; -//} \ No newline at end of file +// 提交以下的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 Code04_DominantIndices2 { + + public static int MAXN = 1000001; + public static int n; + + // 链式前向星 + 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 cnt = 0; + + // 长链剖分 + public static int[] len = new int[MAXN]; + public static int[] son = new int[MAXN]; + + // 动态规划 + public static int[] start = new int[MAXN]; + public static int[] dp = new int[MAXN]; + public static int[] ans = new int[MAXN]; + + public static void set(int u, int i, int v) { + dp[start[u] + i] = v; + } + + public static int get(int u, int i) { + return dp[start[u] + i]; + } + + public static void addEdge(int u, int v) { + next[++cnt] = head[u]; + to[cnt] = v; + head[u] = cnt; + } + + // 不会改迭代版,去看讲解118,详解了从递归版改迭代版 + public static int[][] ufe = new int[MAXN][3]; + + public static int stacksize, u, f, e; + + public static void push(int a, int b, int c) { + ufe[stacksize][0] = a; + ufe[stacksize][1] = b; + ufe[stacksize][2] = c; + stacksize++; + } + + public static void pop() { + --stacksize; + u = ufe[stacksize][0]; + f = ufe[stacksize][1]; + e = ufe[stacksize][2]; + } + + // 迭代版 + public static void dfs1() { + stacksize = 0; + push(1, 0, -1); + int v; + while (stacksize > 0) { + pop(); + if (e == -1) { + e = head[u]; + } else { + e = next[e]; + } + if (e != 0) { + push(u, f, e); + v = to[e]; + if (v != f) { + push(v, u, -1); + } + } else { + for (int ei = head[u]; ei > 0; ei = next[ei]) { + v = to[ei]; + if (v != f) { + if (son[u] == 0 || len[son[u]] < len[v]) { + son[u] = v; + } + } + } + len[u] = len[son[u]] + 1; + } + } + } + + // 迭代版 + public static void dfs2() { + stacksize = 0; + push(1, 0, -1); + int v; + while (stacksize > 0) { + pop(); + if (e == -1) { // e == -1,表示第一次来到当前节点,对应第一部分 + set(u, 0, 1); + if (son[u] == 0) { + ans[u] = 0; + continue; + } + start[son[u]] = start[u] + 1; + int startSum = start[u] + len[u]; + for (int e = head[u]; e > 0; e = next[e]) { + v = to[e]; + if (v != f && v != son[u]) { + start[v] = startSum; + startSum += len[v]; + } + } + push(u, f, -2); // 设置e = -2,再弹出就表示处理完长儿子了 + push(son[u], u, -1); // 长儿子的任务进入栈,对应第二部分 + continue; + } else if (e == -2) { // e == -2,表示长儿子已经处理完,该处理其他儿子了 + e = head[u]; + } else { // 每个儿子都处理 + e = next[e]; + } + if (e != 0) { // 对应第三部分 + push(u, f, e); + v = to[e]; + if (v != f && v != son[u]) { + push(v, u, -1); + } + } else { // 对应第四部分,计算答案 + ans[u] = ans[son[u]] + 1; + for (int e = head[u]; e > 0; e = next[e]) { + v = to[e]; + if (v != f && v != son[u]) { + for (int i = 1; i <= len[v]; i++) { + set(u, i, get(u, i) + get(v, i - 1)); + if (get(u, i) > get(u, ans[u]) || (get(u, i) == get(u, ans[u]) && i < ans[u])) { + ans[u] = i; + } + } + } + } + if (get(u, ans[u]) == 1) { + ans[u] = 0; + } + } + } + } + + 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; + 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); + } + dfs1(); + start[1] = 1; + dfs2(); + for (int i = 1; i <= n; i++) { + out.println(ans[i]); + } + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class162/Code04_DominantIndices3.java b/src/class162/Code04_DominantIndices3.java new file mode 100644 index 000000000..65249dd28 --- /dev/null +++ b/src/class162/Code04_DominantIndices3.java @@ -0,0 +1,119 @@ +package class162; + +// 哪个距离的点最多,C++版 +// 一共有n个节点,给定n-1条边,所有节点连成一棵树,规定1号节点是头 +// 定义d(u, x),以u为头的子树中,到u的距离为x的节点数 +// 那么对于任何点u,都有若干的d(u, x)值,想让x对应的值最大,并且x尽量小 +// 规定任何点到自己的距离为0 +// 打印每个点的答案 +// 1 <= n <= 10^6 +// 测试链接 : https://codeforces.com/problemset/problem/1009/F +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +//using namespace std; +// +//const int MAXN = 1000001; +//int n; +// +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int cnt = 0; +// +//int len[MAXN]; +//int son[MAXN]; +// +//int start[MAXN]; +//int dp[MAXN]; +//int ans[MAXN]; +// +//void setVal(int u, int i, int v) { +// dp[start[u] + i] = v; +//} +// +//int getVal(int u, int i) { +// return dp[start[u] + i]; +//} +// +//void addEdge(int u, int v) { +// nxt[++cnt] = head[u]; +// to[cnt] = v; +// head[u] = cnt; +//} +// +//void dfs1(int u, int fa) { +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// if (v != fa) { +// dfs1(v, u); +// } +// } +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// if (v != fa) { +// if (son[u] == 0 || len[son[u]] < len[v]) { +// son[u] = v; +// } +// } +// } +// len[u] = len[son[u]] + 1; +//} +// +//void dfs2(int u, int fa) { +// setVal(u, 0, 1); +// if (son[u] == 0) { +// ans[u] = 0; +// return; +// } +// start[son[u]] = start[u] + 1; +// int startSum = start[u] + len[u]; +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// if (v != fa && v != son[u]) { +// start[v] = startSum; +// startSum += len[v]; +// } +// } +// dfs2(son[u], u); +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// if (v != fa && v != son[u]) { +// dfs2(v, u); +// } +// } +// ans[u] = ans[son[u]] + 1; +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// if (v != fa && v != son[u]) { +// for (int i = 1; i <= len[v]; i++) { +// setVal(u, i, getVal(u, i) + getVal(v, i - 1)); +// if (getVal(u, i) > getVal(u, ans[u]) || (getVal(u, i) == getVal(u, ans[u]) && i < ans[u])) { +// ans[u] = i; +// } +// } +// } +// } +// if (getVal(u, ans[u]) == 1) { +// ans[u] = 0; +// } +//} +// +//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); +// start[1] = 1; +// dfs2(1, 0); +// for (int i = 1; i <= n; i++) { +// cout << ans[i] << "\n"; +// } +// return 0; +//} \ No newline at end of file From 5d432cb680c13a18b2ca8ac39f045a7557b268a7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 7 Mar 2025 17:37:18 +0800 Subject: [PATCH 0783/2029] modify code --- src/class162/Code04_DominantIndices1.java | 1 + src/class162/Code04_DominantIndices2.java | 1 + src/class162/Code04_DominantIndices3.java | 1 + 3 files changed, 3 insertions(+) diff --git a/src/class162/Code04_DominantIndices1.java b/src/class162/Code04_DominantIndices1.java index 1a294945e..079ef867c 100644 --- a/src/class162/Code04_DominantIndices1.java +++ b/src/class162/Code04_DominantIndices1.java @@ -7,6 +7,7 @@ // 规定任何点到自己的距离为0 // 打印每个点的答案 // 1 <= n <= 10^6 +// 测试链接 : https://www.luogu.com.cn/problem/CF1009F // 测试链接 : https://codeforces.com/problemset/problem/1009/F // 提交以下的code,提交时请把类名改成"Main",因为递归爆栈所以无法通过 diff --git a/src/class162/Code04_DominantIndices2.java b/src/class162/Code04_DominantIndices2.java index 5d2a18e31..0c66f7abf 100644 --- a/src/class162/Code04_DominantIndices2.java +++ b/src/class162/Code04_DominantIndices2.java @@ -7,6 +7,7 @@ // 规定任何点到自己的距离为0 // 打印每个点的答案 // 1 <= n <= 10^6 +// 测试链接 : https://www.luogu.com.cn/problem/CF1009F // 测试链接 : https://codeforces.com/problemset/problem/1009/F // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class162/Code04_DominantIndices3.java b/src/class162/Code04_DominantIndices3.java index 65249dd28..f699aed8d 100644 --- a/src/class162/Code04_DominantIndices3.java +++ b/src/class162/Code04_DominantIndices3.java @@ -7,6 +7,7 @@ // 规定任何点到自己的距离为0 // 打印每个点的答案 // 1 <= n <= 10^6 +// 测试链接 : https://www.luogu.com.cn/problem/CF1009F // 测试链接 : https://codeforces.com/problemset/problem/1009/F // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From 69d133871aec3b8534e727ba9b539569d06f9f7a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 8 Mar 2025 02:02:27 +0800 Subject: [PATCH 0784/2029] modify code --- src/class162/Code04_DominantIndices1.java | 20 ++++++++++---------- src/class162/Code04_DominantIndices2.java | 20 ++++++++++---------- src/class162/Code04_DominantIndices3.java | 21 +++++++++++---------- 3 files changed, 31 insertions(+), 30 deletions(-) diff --git a/src/class162/Code04_DominantIndices1.java b/src/class162/Code04_DominantIndices1.java index 079ef867c..d64696db6 100644 --- a/src/class162/Code04_DominantIndices1.java +++ b/src/class162/Code04_DominantIndices1.java @@ -2,9 +2,9 @@ // 哪个距离的点最多,java递归版 // 一共有n个节点,给定n-1条边,所有节点连成一棵树,规定1号节点是头 -// 定义d(u, x),以u为头的子树中,到u的距离为x的节点数 -// 那么对于任何点u,都有若干的d(u, x)值,想让x对应的值最大,并且x尽量小 // 规定任何点到自己的距离为0 +// 定义d(u, x),以u为头的子树中,到u的距离为x的节点数 +// 对于每个点u,想知道哪个尽量小的x,能取得最大的d(u, x)值 // 打印每个点的答案 // 1 <= n <= 10^6 // 测试链接 : https://www.luogu.com.cn/problem/CF1009F @@ -36,7 +36,7 @@ public class Code04_DominantIndices1 { // 动态规划 public static int[] start = new int[MAXN]; public static int[] dp = new int[MAXN]; - public static int[] ans = new int[MAXN]; + public static int[] ansx = new int[MAXN]; public static void set(int u, int i, int v) { dp[start[u] + i] = v; @@ -76,7 +76,7 @@ public static void dfs2(int u, int fa) { // 第一部分,给所有儿子设置start位置 set(u, 0, 1); if (son[u] == 0) { - ans[u] = 0; + ansx[u] = 0; return; } start[son[u]] = start[u] + 1; @@ -98,20 +98,20 @@ public static void dfs2(int u, int fa) { } } // 第四部分,计算答案 - ans[u] = ans[son[u]] + 1; + ansx[u] = ansx[son[u]] + 1; for (int e = head[u], v; e > 0; e = next[e]) { v = to[e]; if (v != fa && v != son[u]) { for (int i = 1; i <= len[v]; i++) { set(u, i, get(u, i) + get(v, i - 1)); - if (get(u, i) > get(u, ans[u]) || (get(u, i) == get(u, ans[u]) && i < ans[u])) { - ans[u] = i; + if (get(u, i) > get(u, ansx[u]) || (get(u, i) == get(u, ansx[u]) && i < ansx[u])) { + ansx[u] = i; } } } } - if (get(u, ans[u]) == 1) { - ans[u] = 0; + if (get(u, ansx[u]) == 1) { + ansx[u] = 0; } } @@ -133,7 +133,7 @@ public static void main(String[] args) throws IOException { start[1] = 1; dfs2(1, 0); for (int i = 1; i <= n; i++) { - out.println(ans[i]); + out.println(ansx[i]); } out.flush(); out.close(); diff --git a/src/class162/Code04_DominantIndices2.java b/src/class162/Code04_DominantIndices2.java index 0c66f7abf..ba520f2d8 100644 --- a/src/class162/Code04_DominantIndices2.java +++ b/src/class162/Code04_DominantIndices2.java @@ -2,9 +2,9 @@ // 哪个距离的点最多,java迭代版 // 一共有n个节点,给定n-1条边,所有节点连成一棵树,规定1号节点是头 -// 定义d(u, x),以u为头的子树中,到u的距离为x的节点数 -// 那么对于任何点u,都有若干的d(u, x)值,想让x对应的值最大,并且x尽量小 // 规定任何点到自己的距离为0 +// 定义d(u, x),以u为头的子树中,到u的距离为x的节点数 +// 对于每个点u,想知道哪个尽量小的x,能取得最大的d(u, x)值 // 打印每个点的答案 // 1 <= n <= 10^6 // 测试链接 : https://www.luogu.com.cn/problem/CF1009F @@ -36,7 +36,7 @@ public class Code04_DominantIndices2 { // 动态规划 public static int[] start = new int[MAXN]; public static int[] dp = new int[MAXN]; - public static int[] ans = new int[MAXN]; + public static int[] ansx = new int[MAXN]; public static void set(int u, int i, int v) { dp[start[u] + i] = v; @@ -113,7 +113,7 @@ public static void dfs2() { if (e == -1) { // e == -1,表示第一次来到当前节点,对应第一部分 set(u, 0, 1); if (son[u] == 0) { - ans[u] = 0; + ansx[u] = 0; continue; } start[son[u]] = start[u] + 1; @@ -140,20 +140,20 @@ public static void dfs2() { push(v, u, -1); } } else { // 对应第四部分,计算答案 - ans[u] = ans[son[u]] + 1; + ansx[u] = ansx[son[u]] + 1; for (int e = head[u]; e > 0; e = next[e]) { v = to[e]; if (v != f && v != son[u]) { for (int i = 1; i <= len[v]; i++) { set(u, i, get(u, i) + get(v, i - 1)); - if (get(u, i) > get(u, ans[u]) || (get(u, i) == get(u, ans[u]) && i < ans[u])) { - ans[u] = i; + if (get(u, i) > get(u, ansx[u]) || (get(u, i) == get(u, ansx[u]) && i < ansx[u])) { + ansx[u] = i; } } } } - if (get(u, ans[u]) == 1) { - ans[u] = 0; + if (get(u, ansx[u]) == 1) { + ansx[u] = 0; } } } @@ -177,7 +177,7 @@ public static void main(String[] args) throws IOException { start[1] = 1; dfs2(); for (int i = 1; i <= n; i++) { - out.println(ans[i]); + out.println(ansx[i]); } out.flush(); out.close(); diff --git a/src/class162/Code04_DominantIndices3.java b/src/class162/Code04_DominantIndices3.java index f699aed8d..98dac357c 100644 --- a/src/class162/Code04_DominantIndices3.java +++ b/src/class162/Code04_DominantIndices3.java @@ -2,9 +2,9 @@ // 哪个距离的点最多,C++版 // 一共有n个节点,给定n-1条边,所有节点连成一棵树,规定1号节点是头 -// 定义d(u, x),以u为头的子树中,到u的距离为x的节点数 -// 那么对于任何点u,都有若干的d(u, x)值,想让x对应的值最大,并且x尽量小 // 规定任何点到自己的距离为0 +// 定义d(u, x),以u为头的子树中,到u的距离为x的节点数 +// 对于每个点u,想知道哪个尽量小的x,能取得最大的d(u, x)值 // 打印每个点的答案 // 1 <= n <= 10^6 // 测试链接 : https://www.luogu.com.cn/problem/CF1009F @@ -13,6 +13,7 @@ // 提交如下代码,可以通过所有测试用例 //#include +// //using namespace std; // //const int MAXN = 1000001; @@ -28,7 +29,7 @@ // //int start[MAXN]; //int dp[MAXN]; -//int ans[MAXN]; +//int ansx[MAXN]; // //void setVal(int u, int i, int v) { // dp[start[u] + i] = v; @@ -65,7 +66,7 @@ //void dfs2(int u, int fa) { // setVal(u, 0, 1); // if (son[u] == 0) { -// ans[u] = 0; +// ansx[u] = 0; // return; // } // start[son[u]] = start[u] + 1; @@ -84,20 +85,20 @@ // dfs2(v, u); // } // } -// ans[u] = ans[son[u]] + 1; +// ansx[u] = ansx[son[u]] + 1; // for (int e = head[u], v; e > 0; e = nxt[e]) { // v = to[e]; // if (v != fa && v != son[u]) { // for (int i = 1; i <= len[v]; i++) { // setVal(u, i, getVal(u, i) + getVal(v, i - 1)); -// if (getVal(u, i) > getVal(u, ans[u]) || (getVal(u, i) == getVal(u, ans[u]) && i < ans[u])) { -// ans[u] = i; +// if (getVal(u, i) > getVal(u, ansx[u]) || (getVal(u, i) == getVal(u, ansx[u]) && i < ansx[u])) { +// ansx[u] = i; // } // } // } // } -// if (getVal(u, ans[u]) == 1) { -// ans[u] = 0; +// if (getVal(u, ansx[u]) == 1) { +// ansx[u] = 0; // } //} // @@ -114,7 +115,7 @@ // start[1] = 1; // dfs2(1, 0); // for (int i = 1; i <= n; i++) { -// cout << ans[i] << "\n"; +// cout << ansx[i] << "\n"; // } // return 0; //} \ No newline at end of file From 426e9cdc487e9bae6b6b0116eea61681b6649456 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 8 Mar 2025 17:57:41 +0800 Subject: [PATCH 0785/2029] modify code --- src/class162/Code05_Walkthrough1.java | 205 ++++++++++++++++++++++++++ src/class162/Code05_Walkthrough2.java | 107 ++++++++++++++ 2 files changed, 312 insertions(+) create mode 100644 src/class162/Code05_Walkthrough1.java create mode 100644 src/class162/Code05_Walkthrough2.java diff --git a/src/class162/Code05_Walkthrough1.java b/src/class162/Code05_Walkthrough1.java new file mode 100644 index 000000000..8a65d27ef --- /dev/null +++ b/src/class162/Code05_Walkthrough1.java @@ -0,0 +1,205 @@ +package class162; + +// 攻略,java版 +// 一共有n个节点,给定n-1条边,所有节点连成一棵树,每个点给定点权 +// 规定1号点是头,任何路径都必须从头开始,然后走到某个叶节点停止 +// 路径上的点,点权的累加和,叫做这个路径的收益 +// 给定数字k,你可以随意选出k条路径,所有路径经过的点,需要取并集,也就是去重 +// 并集中的点,点权的累加和,叫做k条路径的收益 +// 打印k条路径的收益最大值 +// 1 <= n、k <= 2 * 10^5 +// 所有点权都是int类型的正数 +// 测试链接 : https://www.luogu.com.cn/problem/P10641 +// 提交以下的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 Code05_Walkthrough1 { + + public static int MAXN = 200001; + public static int n, 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 cnt = 0; + + // 长链剖分的改写,根据money的值来标记最值钱儿子 + public static int[] fa = new int[MAXN]; + public static int[] son = new int[MAXN]; + public static int[] top = new int[MAXN]; + public static long[] money = new long[MAXN]; + + // 每条链的头节点收益排序 + public static long[] sorted = new long[MAXN]; + + public static void addEdge(int u, int v) { + next[++cnt] = head[u]; + to[cnt] = v; + head[u] = cnt; + } + + // 递归版 + public static void dfs1(int u, int f) { + 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) { + if (son[u] == 0 || money[son[u]] < money[v]) { + son[u] = v; + } + } + } + fa[u] = f; + money[u] = money[son[u]] + arr[u]; + } + + // 递归版 + 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); + } + } + } + + 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) { + 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) { + if (son[first] == 0 || money[son[first]] < money[v]) { + son[first] = v; + } + } + } + fa[first] = second; + money[first] = money[son[first]] + arr[first]; + } + } + } + + // 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 long compute() { + int len = 0; + for (int i = 1; i <= n; i++) { + if (top[i] == i) { + sorted[++len] = money[i]; + } + } + Arrays.sort(sorted, 1, len + 1); + long ans = 0; + for (int i = 1, j = len; i <= k; i++, j--) { + ans += sorted[j]; + } + return ans; + } + + 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(); + k = (int) in.nval; + for (int i = 1; i <= n; i++) { + in.nextToken(); + arr[i] = (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); + } + dfs3(); + dfs4(); + out.println(compute()); + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class162/Code05_Walkthrough2.java b/src/class162/Code05_Walkthrough2.java new file mode 100644 index 000000000..486d99f9e --- /dev/null +++ b/src/class162/Code05_Walkthrough2.java @@ -0,0 +1,107 @@ +package class162; + +// 攻略,C++版 +// 一共有n个节点,给定n-1条边,所有节点连成一棵树,每个点给定点权 +// 规定1号点是头,任何路径都必须从头开始,然后走到某个叶节点停止 +// 路径上的点,点权的累加和,叫做这个路径的收益 +// 给定数字k,你可以随意选出k条路径,所有路径经过的点,需要取并集,也就是去重 +// 并集中的点,点权的累加和,叫做k条路径的收益 +// 打印k条路径的收益最大值 +// 1 <= n、k <= 2 * 10^5 +// 所有点权都是int类型的正数 +// 测试链接 : https://www.luogu.com.cn/problem/P10641 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 200001; +//int n, k; +//int arr[MAXN]; +// +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int cnt = 0; +// +//int fa[MAXN]; +//int son[MAXN]; +//int top[MAXN]; +//long long money[MAXN]; +// +//long long sorted[MAXN]; +// +//void addEdge(int u, int v) { +// nxt[++cnt] = head[u]; +// to[cnt] = v; +// head[u] = cnt; +//} +// +//void dfs1(int u, int f) { +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// if (v != f) { +// dfs1(v, u); +// } +// } +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// if (v != f) { +// if (son[u] == 0 || money[son[u]] < money[v]) { +// son[u] = v; +// } +// } +// } +// fa[u] = f; +// money[u] = money[son[u]] + arr[u]; +//} +// +//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); +// } +// } +//} +// +//long long compute() { +// int len = 0; +// for (int i = 1; i <= n; i++) { +// if (top[i] == i) { +// sorted[++len] = money[i]; +// } +// } +// sort(sorted + 1, sorted + len + 1); +// long long ans = 0; +// for (int i = 1, j = len; i <= k; i++, j--) { +// ans += sorted[j]; +// } +// return ans; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> k; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// for (int i = 1; i < n; i++) { +// int u, v; +// cin >> u >> v; +// addEdge(u, v); +// addEdge(v, u); +// } +// dfs1(1, 0); +// dfs2(1, 1); +// cout << compute() << "\n"; +// return 0; +//} \ No newline at end of file From d9536c5753cdd65498505b948671cd4eb71d8b20 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 8 Mar 2025 18:07:34 +0800 Subject: [PATCH 0786/2029] modify code --- src/class111/Code04_QueryModUpdate.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/class111/Code04_QueryModUpdate.java b/src/class111/Code04_QueryModUpdate.java index 729473a76..a707ebd32 100644 --- a/src/class111/Code04_QueryModUpdate.java +++ b/src/class111/Code04_QueryModUpdate.java @@ -7,6 +7,7 @@ // 操作 3 k x : 把arr[k]上的数字设置为x // 1 <= n, m <= 10^5,操作1得到的结果,有可能超过int范围 // 测试链接 : https://www.luogu.com.cn/problem/CF438D +// 测试链接 : https://codeforces.com/problemset/problem/438/D // 请同学们务必参考如下代码中关于输入、输出的处理 // 这是输入输出处理效率很高的写法 // 提交以下的code,提交时请把类名改成"Main",可以直接通过 @@ -67,7 +68,7 @@ public static void mod(int jobl, int jobr, int jobv, int l, int r, int i) { sum[i] %= jobv; max[i] %= jobv; } else { - int mid = (l + r) >> 2; + int mid = (l + r) >> 1; if (jobl <= mid) { mod(jobl, jobr, jobv, l, mid, i << 1); } From f197a95142b5e3c831813238207dadc86f400b75 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 8 Mar 2025 18:20:30 +0800 Subject: [PATCH 0787/2029] modify code --- src/class162/Code05_Walkthrough1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class162/Code05_Walkthrough1.java b/src/class162/Code05_Walkthrough1.java index 8a65d27ef..8316cd88a 100644 --- a/src/class162/Code05_Walkthrough1.java +++ b/src/class162/Code05_Walkthrough1.java @@ -10,7 +10,7 @@ // 1 <= n、k <= 2 * 10^5 // 所有点权都是int类型的正数 // 测试链接 : https://www.luogu.com.cn/problem/P10641 -// 提交以下的code,提交时请把类名改成"Main",因为递归爆栈所以无法通过 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.BufferedReader; import java.io.IOException; From 15863cd8b869fe5630e3e420cb09bee01af44065 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 9 Mar 2025 21:09:54 +0800 Subject: [PATCH 0788/2029] modify code --- src/class162/Code04_TreeKthAncestor1.java | 269 ++++++++++++++++++ src/class162/Code04_TreeKthAncestor2.java | 162 +++++++++++ ...ces1.java => Code05_DominantIndices1.java} | 3 +- ...ces2.java => Code05_DominantIndices2.java} | 2 +- ...ces3.java => Code05_DominantIndices3.java} | 0 ...through1.java => Code07_Walkthrough1.java} | 2 +- ...through2.java => Code07_Walkthrough2.java} | 0 7 files changed, 435 insertions(+), 3 deletions(-) create mode 100644 src/class162/Code04_TreeKthAncestor1.java create mode 100644 src/class162/Code04_TreeKthAncestor2.java rename src/class162/{Code04_DominantIndices1.java => Code05_DominantIndices1.java} (97%) rename src/class162/{Code04_DominantIndices2.java => Code05_DominantIndices2.java} (99%) rename src/class162/{Code04_DominantIndices3.java => Code05_DominantIndices3.java} (100%) rename src/class162/{Code05_Walkthrough1.java => Code07_Walkthrough1.java} (99%) rename src/class162/{Code05_Walkthrough2.java => Code07_Walkthrough2.java} (100%) diff --git a/src/class162/Code04_TreeKthAncestor1.java b/src/class162/Code04_TreeKthAncestor1.java new file mode 100644 index 000000000..208edb9f7 --- /dev/null +++ b/src/class162/Code04_TreeKthAncestor1.java @@ -0,0 +1,269 @@ +package class162; + +// 树上k级祖先,java版 +// 一共有n个节点,编号1~n,给定一个长度为n的数组arr,表示依赖关系 +// 如果arr[i] = j,表示i号节点的父节点是j,如果arr[i] == 0,表示i号节点是树头 +// 一共有m条查询,每条查询 x k : 打印x往上走k步的祖先节点编号 +// 题目要求预处理的时间复杂度O(n * log n),处理每条查询的时间复杂度O(1) +// 题目要求强制在线,必须按顺序处理每条查询,如何得到每条查询的入参,请打开测试链接查看 +// 1 <= n <= 5 * 10^5 +// 1 <= m <= 5 * 10^6 +// 测试链接 : https://www.luogu.com.cn/problem/P5903 +// 提交以下的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 Code04_TreeKthAncestor1 { + + public static int MAXN = 500001; + public static int MAXH = 20; + public static int n, m; + public static long s; + public static int root; + + // 链式前向星,注意是有向图,所以边的数量不需要增倍 + public static int[] head = new int[MAXN]; + public static int[] next = new int[MAXN]; + public static int[] to = new int[MAXN]; + public static int cntg = 0; + + // 倍增表 + 长链剖分 + public static int[][] stjump = new int[MAXN][MAXH]; + public static int[] dep = new int[MAXN]; + public static int[] len = 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 cntd = 0; + + // 查询答案需要 + public static int[] high = new int[MAXN]; + public static int[] up = new int[MAXN]; + public static int[] down = new int[MAXN]; + + // 题目规定如何得到输入数据的函数 + // C++中有无符号整数,java中没有,选择用long类型代替 + public static long get(long x) { + x ^= x << 13; + x &= 0xffffffffL; + x ^= x >>> 17; + x ^= x << 5; + x &= 0xffffffffL; + return s = x; + } + + 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) { + stjump[u][0] = f; + for (int p = 1; p < MAXH; p++) { + stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; + } + dep[u] = dep[f] + 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) { + if (son[u] == 0 || len[son[u]] < len[v]) { + son[u] = v; + } + } + } + len[u] = len[son[u]] + 1; + } + + // 递归版 + public static void dfs2(int u, int t) { + top[u] = t; + dfn[u] = ++cntd; + 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 != stjump[u][0] && 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(root, 0, -1); + while (stacksize > 0) { + pop(); + if (edge == -1) { + stjump[first][0] = second; + for (int p = 1; p < MAXH; p++) { + stjump[first][p] = stjump[stjump[first][p - 1]][p - 1]; + } + dep[first] = dep[second] + 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) { + if (son[first] == 0 || len[son[first]] < len[v]) { + son[first] = v; + } + } + } + len[first] = len[son[first]] + 1; + } + } + } + + // dfs2的迭代版 + public static void dfs4() { + stacksize = 0; + push(root, root, -1); + while (stacksize > 0) { + pop(); + if (edge == -1) { // edge == -1,表示第一次来到当前节点,并且先处理重儿子 + top[first] = second; + dfn[first] = ++cntd; + if (son[first] == 0) { + continue; + } + push(first, second, -2); + push(son[first], second, -1); + continue; + } else if (edge == -2) { // edge == -2,表示处理完当前节点的重儿子,回到了当前节点 + edge = head[first]; + } else { // edge >= 0, 继续处理其他的边 + edge = next[edge]; + } + if (edge != 0) { + push(first, second, edge); + if (to[edge] != stjump[first][0] && to[edge] != son[first]) { + push(to[edge], to[edge], -1); + } + } + } + } + + public static void setUp(int u, int i, int v) { + up[dfn[u] + i] = v; + } + + public static int getUp(int u, int i) { + return up[dfn[u] + i]; + } + + public static void setDown(int u, int i, int v) { + down[dfn[u] + i] = v; + } + + public static int getDown(int u, int i) { + return down[dfn[u] + i]; + } + + public static void prepare() { + dfs3(); + dfs4(); + high[0] = -1; + for (int i = 1; i <= n; i++) { + high[i] = high[i / 2] + 1; + } + for (int u = 1; u <= n; u++) { + if (top[u] == u) { + for (int i = 0, a = u, b = u; i < len[u]; i++, a = stjump[a][0], b = son[b]) { + setUp(u, i, a); + setDown(u, i, b); + } + } + } + } + + public static int query(int x, int k) { + if (k == 0) { + return x; + } + if (k == 1 << high[k]) { + return stjump[x][high[k]]; + } + x = stjump[x][high[k]]; + k -= 1 << high[k]; + k -= dep[x] - dep[top[x]]; + x = top[x]; + return (k >= 0) ? getUp(x, k) : getDown(x, -k); + } + + 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; + in.nextToken(); + s = (long) in.nval; + for (int i = 1, father; i <= n; i++) { + in.nextToken(); + father = (int) in.nval; + if (father == 0) { + root = i; + } else { + addEdge(father, i); + } + } + prepare(); + long ans = 0; + for (int i = 1, x, k, lastAns = 0; i <= m; i++) { + x = (int) ((get(s) ^ lastAns) % n + 1); + k = (int) ((get(s) ^ lastAns) % dep[x]); + lastAns = query(x, k); + ans ^= (long) i * lastAns; + } + out.println(ans); + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class162/Code04_TreeKthAncestor2.java b/src/class162/Code04_TreeKthAncestor2.java new file mode 100644 index 000000000..12b7724b4 --- /dev/null +++ b/src/class162/Code04_TreeKthAncestor2.java @@ -0,0 +1,162 @@ +package class162; + +// 树上k级祖先,C++版 +// 一共有n个节点,编号1~n,给定一个长度为n的数组arr,表示依赖关系 +// 如果arr[i] = j,表示i号节点的父节点是j,如果arr[i] == 0,表示i号节点是树头 +// 一共有m条查询,每条查询 x k : 打印x往上走k步的祖先节点编号 +// 题目要求预处理的时间复杂度O(n * log n),处理每条查询的时间复杂度O(1) +// 题目要求强制在线,必须按顺序处理每条查询,如何得到每条查询的入参,请打开测试链接查看 +// 1 <= n <= 5 * 10^5 +// 1 <= m <= 5 * 10^6 +// 测试链接 : https://www.luogu.com.cn/problem/P5903 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +//#define uint unsigned int +// +//using namespace std; +// +//const int MAXN = 500001; +//const int MAXH = 20; +//int n, m; +//uint s; +//int root; +// +//int head[MAXN]; +//int nxt[MAXN]; +//int to[MAXN]; +//int cntg = 0; +// +//int stjump[MAXN][MAXH]; +//int dep[MAXN]; +//int len[MAXN]; +//int son[MAXN]; +//int top[MAXN]; +//int dfn[MAXN]; +//int cntd = 0; +// +//int high[MAXN]; +//int up[MAXN]; +//int down[MAXN]; +// +//uint get(uint x) { +// x ^= x << 13; +// x ^= x >> 17; +// x ^= x << 5; +// s = x; +// return x; +//} +// +//void addEdge(int u, int v) { +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// head[u] = cntg; +//} +// +//void dfs1(int u, int f) { +// stjump[u][0] = f; +// for (int p = 1; p < MAXH; p++) { +// stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; +// } +// dep[u] = dep[f] + 1; +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// if (v != f) { +// dfs1(v, u); +// } +// } +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// if (v != f) { +// if (son[u] == 0 || len[son[u]] < len[v]) { +// son[u] = v; +// } +// } +// } +// len[u] = len[son[u]] + 1; +//} +// +//void dfs2(int u, int t) { +// top[u] = t; +// dfn[u] = ++cntd; +// 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 != stjump[u][0] && v != son[u]) { +// dfs2(v, v); +// } +// } +//} +// +//void setUp(int u, int i, int v) { +// up[dfn[u] + i] = v; +//} +// +//int getUp(int u, int i) { +// return up[dfn[u] + i]; +//} +// +//void setDown(int u, int i, int v) { +// down[dfn[u] + i] = v; +//} +// +//int getDown(int u, int i) { +// return down[dfn[u] + i]; +//} +// +//void prepare() { +// dfs1(root, 0); +// dfs2(root, root); +// high[0] = -1; +// for (int i = 1; i <= n; i++) { +// high[i] = high[i / 2] + 1; +// } +// for (int u = 1; u <= n; u++) { +// if (top[u] == u) { +// for (int i = 0, a = u, b = u; i < len[u]; i++, a = stjump[a][0], b = son[b]) { +// setUp(u, i, a); +// setDown(u, i, b); +// } +// } +// } +//} +// +//int query(int x, int k) { +// if (k == 0) { +// return x; +// } +// if (k == (1 << high[k])) { +// return stjump[x][high[k]]; +// } +// x = stjump[x][high[k]]; +// k -= (1 << high[k]); +// k -= dep[x] - dep[top[x]]; +// x = top[x]; +// return (k >= 0) ? getUp(x, k) : getDown(x, -k); +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m >> s; +// for (int i = 1, father; i <= n; i++) { +// cin >> father; +// if (father == 0) { +// root = i; +// } else { +// addEdge(father, i); +// } +// } +// prepare(); +// long long ans = 0; +// for (int i = 1, x, k, lastAns = 0; i <= m; i++) { +// x = (get(s) ^ lastAns) % n + 1; +// k = (get(s) ^ lastAns) % dep[x]; +// lastAns = query(x, k); +// ans ^= (long long) i * lastAns; +// } +// cout << ans << '\n'; +// return 0; +//} \ No newline at end of file diff --git a/src/class162/Code04_DominantIndices1.java b/src/class162/Code05_DominantIndices1.java similarity index 97% rename from src/class162/Code04_DominantIndices1.java rename to src/class162/Code05_DominantIndices1.java index d64696db6..766151709 100644 --- a/src/class162/Code04_DominantIndices1.java +++ b/src/class162/Code05_DominantIndices1.java @@ -10,6 +10,7 @@ // 测试链接 : https://www.luogu.com.cn/problem/CF1009F // 测试链接 : https://codeforces.com/problemset/problem/1009/F // 提交以下的code,提交时请把类名改成"Main",因为递归爆栈所以无法通过 +// 迭代版的实现就是本节课Code05_DominantIndices2文件 import java.io.BufferedReader; import java.io.IOException; @@ -18,7 +19,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code04_DominantIndices1 { +public class Code05_DominantIndices1 { public static int MAXN = 1000001; public static int n; diff --git a/src/class162/Code04_DominantIndices2.java b/src/class162/Code05_DominantIndices2.java similarity index 99% rename from src/class162/Code04_DominantIndices2.java rename to src/class162/Code05_DominantIndices2.java index ba520f2d8..b9e0cbfbd 100644 --- a/src/class162/Code04_DominantIndices2.java +++ b/src/class162/Code05_DominantIndices2.java @@ -18,7 +18,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code04_DominantIndices2 { +public class Code05_DominantIndices2 { public static int MAXN = 1000001; public static int n; diff --git a/src/class162/Code04_DominantIndices3.java b/src/class162/Code05_DominantIndices3.java similarity index 100% rename from src/class162/Code04_DominantIndices3.java rename to src/class162/Code05_DominantIndices3.java diff --git a/src/class162/Code05_Walkthrough1.java b/src/class162/Code07_Walkthrough1.java similarity index 99% rename from src/class162/Code05_Walkthrough1.java rename to src/class162/Code07_Walkthrough1.java index 8316cd88a..5c3e5d2b7 100644 --- a/src/class162/Code05_Walkthrough1.java +++ b/src/class162/Code07_Walkthrough1.java @@ -20,7 +20,7 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class Code05_Walkthrough1 { +public class Code07_Walkthrough1 { public static int MAXN = 200001; public static int n, k; diff --git a/src/class162/Code05_Walkthrough2.java b/src/class162/Code07_Walkthrough2.java similarity index 100% rename from src/class162/Code05_Walkthrough2.java rename to src/class162/Code07_Walkthrough2.java From d444db65a15e8fbc0b2f78113ce358da93924fac Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 9 Mar 2025 21:12:58 +0800 Subject: [PATCH 0789/2029] modify code --- src/class162/Code04_TreeKthAncestor2.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/class162/Code04_TreeKthAncestor2.java b/src/class162/Code04_TreeKthAncestor2.java index 12b7724b4..2b05963b4 100644 --- a/src/class162/Code04_TreeKthAncestor2.java +++ b/src/class162/Code04_TreeKthAncestor2.java @@ -13,14 +13,15 @@ // 提交如下代码,可以通过所有测试用例 //#include -//#define uint unsigned int +// +//#define ui unsigned int // //using namespace std; // //const int MAXN = 500001; //const int MAXH = 20; //int n, m; -//uint s; +//ui s; //int root; // //int head[MAXN]; @@ -40,7 +41,7 @@ //int up[MAXN]; //int down[MAXN]; // -//uint get(uint x) { +//ui get(ui x) { // x ^= x << 13; // x ^= x >> 17; // x ^= x << 5; From 36b34d520d2839dfad3f245ae51ca08294a7ec44 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 10 Mar 2025 16:55:41 +0800 Subject: [PATCH 0790/2029] modify code --- src/class162/Code05_DominantIndices1.java | 120 ++++++++- src/class162/Code05_DominantIndices2.java | 288 +++++++++------------- src/class162/Code05_DominantIndices3.java | 121 --------- 3 files changed, 224 insertions(+), 305 deletions(-) delete mode 100644 src/class162/Code05_DominantIndices3.java diff --git a/src/class162/Code05_DominantIndices1.java b/src/class162/Code05_DominantIndices1.java index 766151709..21e1d411c 100644 --- a/src/class162/Code05_DominantIndices1.java +++ b/src/class162/Code05_DominantIndices1.java @@ -1,6 +1,6 @@ package class162; -// 哪个距离的点最多,java递归版 +// 哪个距离的点最多,java版 // 一共有n个节点,给定n-1条边,所有节点连成一棵树,规定1号节点是头 // 规定任何点到自己的距离为0 // 定义d(u, x),以u为头的子树中,到u的距离为x的节点数 @@ -9,8 +9,7 @@ // 1 <= n <= 10^6 // 测试链接 : https://www.luogu.com.cn/problem/CF1009F // 测试链接 : https://codeforces.com/problemset/problem/1009/F -// 提交以下的code,提交时请把类名改成"Main",因为递归爆栈所以无法通过 -// 迭代版的实现就是本节课Code05_DominantIndices2文件 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 import java.io.BufferedReader; import java.io.IOException; @@ -53,7 +52,7 @@ public static void addEdge(int u, int v) { head[u] = cnt; } - // 递归版,C++可以通过,java会爆栈 + // 递归版,C++可以通过,java会爆栈,迭代版是dfs3方法 public static void dfs1(int u, int fa) { for (int e = head[u], v; e > 0; e = next[e]) { v = to[e]; @@ -72,7 +71,7 @@ public static void dfs1(int u, int fa) { len[u] = len[son[u]] + 1; } - // 递归版,C++可以通过,java会爆栈 + // 递归版,C++可以通过,java会爆栈,迭代版是dfs4方法 public static void dfs2(int u, int fa) { // 第一部分,给所有儿子设置start位置 set(u, 0, 1); @@ -116,6 +115,113 @@ public static void dfs2(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 a, int b, int c) { + ufe[stacksize][0] = a; + ufe[stacksize][1] = b; + ufe[stacksize][2] = c; + stacksize++; + } + + public static void pop() { + --stacksize; + u = ufe[stacksize][0]; + f = ufe[stacksize][1]; + e = ufe[stacksize][2]; + } + + // 迭代版 + public static void dfs3() { + stacksize = 0; + push(1, 0, -1); + int v; + while (stacksize > 0) { + pop(); + if (e == -1) { + e = head[u]; + } else { + e = next[e]; + } + if (e != 0) { + push(u, f, e); + v = to[e]; + if (v != f) { + push(v, u, -1); + } + } else { + for (int ei = head[u]; ei > 0; ei = next[ei]) { + v = to[ei]; + if (v != f) { + if (son[u] == 0 || len[son[u]] < len[v]) { + son[u] = v; + } + } + } + len[u] = len[son[u]] + 1; + } + } + } + + // 迭代版 + public static void dfs4() { + stacksize = 0; + push(1, 0, -1); + int v; + while (stacksize > 0) { + pop(); + if (e == -1) { // e == -1,表示第一次来到当前节点,对应第一部分 + set(u, 0, 1); + if (son[u] == 0) { + ansx[u] = 0; + continue; + } + start[son[u]] = start[u] + 1; + int startSum = start[u] + len[u]; + for (int e = head[u]; e > 0; e = next[e]) { + v = to[e]; + if (v != f && v != son[u]) { + start[v] = startSum; + startSum += len[v]; + } + } + push(u, f, -2); // 设置e = -2,再弹出就表示处理完长儿子了 + push(son[u], u, -1); // 长儿子的任务进入栈,对应第二部分 + continue; + } else if (e == -2) { // e == -2,表示长儿子已经处理完,该处理其他儿子了 + e = head[u]; + } else { // 每个儿子都处理 + e = next[e]; + } + if (e != 0) { // 对应第三部分 + push(u, f, e); + v = to[e]; + if (v != f && v != son[u]) { + push(v, u, -1); + } + } else { // 对应第四部分,计算答案 + ansx[u] = ansx[son[u]] + 1; + for (int e = head[u]; e > 0; e = next[e]) { + v = to[e]; + if (v != f && v != son[u]) { + for (int i = 1; i <= len[v]; i++) { + set(u, i, get(u, i) + get(v, i - 1)); + if (get(u, i) > get(u, ansx[u]) || (get(u, i) == get(u, ansx[u]) && i < ansx[u])) { + ansx[u] = i; + } + } + } + } + if (get(u, ansx[u]) == 1) { + ansx[u] = 0; + } + } + } + } + public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StreamTokenizer in = new StreamTokenizer(br); @@ -130,9 +236,9 @@ public static void main(String[] args) throws IOException { addEdge(u, v); addEdge(v, u); } - dfs1(1, 0); + dfs3(); start[1] = 1; - dfs2(1, 0); + dfs4(); for (int i = 1; i <= n; i++) { out.println(ansx[i]); } diff --git a/src/class162/Code05_DominantIndices2.java b/src/class162/Code05_DominantIndices2.java index b9e0cbfbd..98dac357c 100644 --- a/src/class162/Code05_DominantIndices2.java +++ b/src/class162/Code05_DominantIndices2.java @@ -1,6 +1,6 @@ package class162; -// 哪个距离的点最多,java迭代版 +// 哪个距离的点最多,C++版 // 一共有n个节点,给定n-1条边,所有节点连成一棵树,规定1号节点是头 // 规定任何点到自己的距离为0 // 定义d(u, x),以u为头的子树中,到u的距离为x的节点数 @@ -9,179 +9,113 @@ // 1 <= n <= 10^6 // 测试链接 : https://www.luogu.com.cn/problem/CF1009F // 测试链接 : https://codeforces.com/problemset/problem/1009/F -// 提交以下的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 Code05_DominantIndices2 { - - public static int MAXN = 1000001; - public static int n; - - // 链式前向星 - 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 cnt = 0; - - // 长链剖分 - public static int[] len = new int[MAXN]; - public static int[] son = new int[MAXN]; - - // 动态规划 - public static int[] start = new int[MAXN]; - public static int[] dp = new int[MAXN]; - public static int[] ansx = new int[MAXN]; - - public static void set(int u, int i, int v) { - dp[start[u] + i] = v; - } - - public static int get(int u, int i) { - return dp[start[u] + i]; - } - - public static void addEdge(int u, int v) { - next[++cnt] = head[u]; - to[cnt] = v; - head[u] = cnt; - } - - // 不会改迭代版,去看讲解118,详解了从递归版改迭代版 - public static int[][] ufe = new int[MAXN][3]; - - public static int stacksize, u, f, e; - - public static void push(int a, int b, int c) { - ufe[stacksize][0] = a; - ufe[stacksize][1] = b; - ufe[stacksize][2] = c; - stacksize++; - } - - public static void pop() { - --stacksize; - u = ufe[stacksize][0]; - f = ufe[stacksize][1]; - e = ufe[stacksize][2]; - } - - // 迭代版 - public static void dfs1() { - stacksize = 0; - push(1, 0, -1); - int v; - while (stacksize > 0) { - pop(); - if (e == -1) { - e = head[u]; - } else { - e = next[e]; - } - if (e != 0) { - push(u, f, e); - v = to[e]; - if (v != f) { - push(v, u, -1); - } - } else { - for (int ei = head[u]; ei > 0; ei = next[ei]) { - v = to[ei]; - if (v != f) { - if (son[u] == 0 || len[son[u]] < len[v]) { - son[u] = v; - } - } - } - len[u] = len[son[u]] + 1; - } - } - } - - // 迭代版 - public static void dfs2() { - stacksize = 0; - push(1, 0, -1); - int v; - while (stacksize > 0) { - pop(); - if (e == -1) { // e == -1,表示第一次来到当前节点,对应第一部分 - set(u, 0, 1); - if (son[u] == 0) { - ansx[u] = 0; - continue; - } - start[son[u]] = start[u] + 1; - int startSum = start[u] + len[u]; - for (int e = head[u]; e > 0; e = next[e]) { - v = to[e]; - if (v != f && v != son[u]) { - start[v] = startSum; - startSum += len[v]; - } - } - push(u, f, -2); // 设置e = -2,再弹出就表示处理完长儿子了 - push(son[u], u, -1); // 长儿子的任务进入栈,对应第二部分 - continue; - } else if (e == -2) { // e == -2,表示长儿子已经处理完,该处理其他儿子了 - e = head[u]; - } else { // 每个儿子都处理 - e = next[e]; - } - if (e != 0) { // 对应第三部分 - push(u, f, e); - v = to[e]; - if (v != f && v != son[u]) { - push(v, u, -1); - } - } else { // 对应第四部分,计算答案 - ansx[u] = ansx[son[u]] + 1; - for (int e = head[u]; e > 0; e = next[e]) { - v = to[e]; - if (v != f && v != son[u]) { - for (int i = 1; i <= len[v]; i++) { - set(u, i, get(u, i) + get(v, i - 1)); - if (get(u, i) > get(u, ansx[u]) || (get(u, i) == get(u, ansx[u]) && i < ansx[u])) { - ansx[u] = i; - } - } - } - } - if (get(u, ansx[u]) == 1) { - ansx[u] = 0; - } - } - } - } - - 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; - 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); - } - dfs1(); - start[1] = 1; - dfs2(); - for (int i = 1; i <= n; i++) { - out.println(ansx[i]); - } - out.flush(); - out.close(); - br.close(); - } - -} +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 1000001; +//int n; +// +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int cnt = 0; +// +//int len[MAXN]; +//int son[MAXN]; +// +//int start[MAXN]; +//int dp[MAXN]; +//int ansx[MAXN]; +// +//void setVal(int u, int i, int v) { +// dp[start[u] + i] = v; +//} +// +//int getVal(int u, int i) { +// return dp[start[u] + i]; +//} +// +//void addEdge(int u, int v) { +// nxt[++cnt] = head[u]; +// to[cnt] = v; +// head[u] = cnt; +//} +// +//void dfs1(int u, int fa) { +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// if (v != fa) { +// dfs1(v, u); +// } +// } +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// if (v != fa) { +// if (son[u] == 0 || len[son[u]] < len[v]) { +// son[u] = v; +// } +// } +// } +// len[u] = len[son[u]] + 1; +//} +// +//void dfs2(int u, int fa) { +// setVal(u, 0, 1); +// if (son[u] == 0) { +// ansx[u] = 0; +// return; +// } +// start[son[u]] = start[u] + 1; +// int startSum = start[u] + len[u]; +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// if (v != fa && v != son[u]) { +// start[v] = startSum; +// startSum += len[v]; +// } +// } +// dfs2(son[u], u); +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// if (v != fa && v != son[u]) { +// dfs2(v, u); +// } +// } +// ansx[u] = ansx[son[u]] + 1; +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// if (v != fa && v != son[u]) { +// for (int i = 1; i <= len[v]; i++) { +// setVal(u, i, getVal(u, i) + getVal(v, i - 1)); +// if (getVal(u, i) > getVal(u, ansx[u]) || (getVal(u, i) == getVal(u, ansx[u]) && i < ansx[u])) { +// ansx[u] = i; +// } +// } +// } +// } +// if (getVal(u, ansx[u]) == 1) { +// ansx[u] = 0; +// } +//} +// +//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); +// start[1] = 1; +// dfs2(1, 0); +// for (int i = 1; i <= n; i++) { +// cout << ansx[i] << "\n"; +// } +// return 0; +//} \ No newline at end of file diff --git a/src/class162/Code05_DominantIndices3.java b/src/class162/Code05_DominantIndices3.java deleted file mode 100644 index 98dac357c..000000000 --- a/src/class162/Code05_DominantIndices3.java +++ /dev/null @@ -1,121 +0,0 @@ -package class162; - -// 哪个距离的点最多,C++版 -// 一共有n个节点,给定n-1条边,所有节点连成一棵树,规定1号节点是头 -// 规定任何点到自己的距离为0 -// 定义d(u, x),以u为头的子树中,到u的距离为x的节点数 -// 对于每个点u,想知道哪个尽量小的x,能取得最大的d(u, x)值 -// 打印每个点的答案 -// 1 <= n <= 10^6 -// 测试链接 : https://www.luogu.com.cn/problem/CF1009F -// 测试链接 : https://codeforces.com/problemset/problem/1009/F -// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 -// 提交如下代码,可以通过所有测试用例 - -//#include -// -//using namespace std; -// -//const int MAXN = 1000001; -//int n; -// -//int head[MAXN]; -//int nxt[MAXN << 1]; -//int to[MAXN << 1]; -//int cnt = 0; -// -//int len[MAXN]; -//int son[MAXN]; -// -//int start[MAXN]; -//int dp[MAXN]; -//int ansx[MAXN]; -// -//void setVal(int u, int i, int v) { -// dp[start[u] + i] = v; -//} -// -//int getVal(int u, int i) { -// return dp[start[u] + i]; -//} -// -//void addEdge(int u, int v) { -// nxt[++cnt] = head[u]; -// to[cnt] = v; -// head[u] = cnt; -//} -// -//void dfs1(int u, int fa) { -// for (int e = head[u], v; e > 0; e = nxt[e]) { -// v = to[e]; -// if (v != fa) { -// dfs1(v, u); -// } -// } -// for (int e = head[u], v; e > 0; e = nxt[e]) { -// v = to[e]; -// if (v != fa) { -// if (son[u] == 0 || len[son[u]] < len[v]) { -// son[u] = v; -// } -// } -// } -// len[u] = len[son[u]] + 1; -//} -// -//void dfs2(int u, int fa) { -// setVal(u, 0, 1); -// if (son[u] == 0) { -// ansx[u] = 0; -// return; -// } -// start[son[u]] = start[u] + 1; -// int startSum = start[u] + len[u]; -// for (int e = head[u], v; e > 0; e = nxt[e]) { -// v = to[e]; -// if (v != fa && v != son[u]) { -// start[v] = startSum; -// startSum += len[v]; -// } -// } -// dfs2(son[u], u); -// for (int e = head[u], v; e > 0; e = nxt[e]) { -// v = to[e]; -// if (v != fa && v != son[u]) { -// dfs2(v, u); -// } -// } -// ansx[u] = ansx[son[u]] + 1; -// for (int e = head[u], v; e > 0; e = nxt[e]) { -// v = to[e]; -// if (v != fa && v != son[u]) { -// for (int i = 1; i <= len[v]; i++) { -// setVal(u, i, getVal(u, i) + getVal(v, i - 1)); -// if (getVal(u, i) > getVal(u, ansx[u]) || (getVal(u, i) == getVal(u, ansx[u]) && i < ansx[u])) { -// ansx[u] = i; -// } -// } -// } -// } -// if (getVal(u, ansx[u]) == 1) { -// ansx[u] = 0; -// } -//} -// -//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); -// start[1] = 1; -// dfs2(1, 0); -// for (int i = 1; i <= n; i++) { -// cout << ansx[i] << "\n"; -// } -// return 0; -//} \ No newline at end of file From b2ddb2323f9f14296cc5d9f60f6789ec868f5514 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 10 Mar 2025 21:36:59 +0800 Subject: [PATCH 0791/2029] modify code --- ...through1.java => Code05_Walkthrough1.java} | 2 +- ...through2.java => Code05_Walkthrough2.java} | 0 ...ces1.java => Code06_DominantIndices1.java} | 50 ++---- ...ces2.java => Code06_DominantIndices2.java} | 26 +-- src/class162/Code07_HotHotels1.java | 165 ++++++++++++++++++ src/class162/Code07_HotHotels2.java | 149 ++++++++++++++++ 6 files changed, 339 insertions(+), 53 deletions(-) rename src/class162/{Code07_Walkthrough1.java => Code05_Walkthrough1.java} (99%) rename src/class162/{Code07_Walkthrough2.java => Code05_Walkthrough2.java} (100%) rename src/class162/{Code05_DominantIndices1.java => Code06_DominantIndices1.java} (82%) rename src/class162/{Code05_DominantIndices2.java => Code06_DominantIndices2.java} (85%) create mode 100644 src/class162/Code07_HotHotels1.java create mode 100644 src/class162/Code07_HotHotels2.java diff --git a/src/class162/Code07_Walkthrough1.java b/src/class162/Code05_Walkthrough1.java similarity index 99% rename from src/class162/Code07_Walkthrough1.java rename to src/class162/Code05_Walkthrough1.java index 5c3e5d2b7..8316cd88a 100644 --- a/src/class162/Code07_Walkthrough1.java +++ b/src/class162/Code05_Walkthrough1.java @@ -20,7 +20,7 @@ import java.io.StreamTokenizer; import java.util.Arrays; -public class Code07_Walkthrough1 { +public class Code05_Walkthrough1 { public static int MAXN = 200001; public static int n, k; diff --git a/src/class162/Code07_Walkthrough2.java b/src/class162/Code05_Walkthrough2.java similarity index 100% rename from src/class162/Code07_Walkthrough2.java rename to src/class162/Code05_Walkthrough2.java diff --git a/src/class162/Code05_DominantIndices1.java b/src/class162/Code06_DominantIndices1.java similarity index 82% rename from src/class162/Code05_DominantIndices1.java rename to src/class162/Code06_DominantIndices1.java index 21e1d411c..82e53c157 100644 --- a/src/class162/Code05_DominantIndices1.java +++ b/src/class162/Code06_DominantIndices1.java @@ -18,7 +18,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code05_DominantIndices1 { +public class Code06_DominantIndices1 { public static int MAXN = 1000001; public static int n; @@ -27,29 +27,30 @@ public class Code05_DominantIndices1 { 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 cnt = 0; + public static int cntg = 0; // 长链剖分 public static int[] len = new int[MAXN]; public static int[] son = new int[MAXN]; + public static int[] dfn = new int[MAXN]; + public static int cntd = 0; // 动态规划 - public static int[] start = new int[MAXN]; public static int[] dp = new int[MAXN]; public static int[] ansx = new int[MAXN]; public static void set(int u, int i, int v) { - dp[start[u] + i] = v; + dp[dfn[u] + i] = v; } public static int get(int u, int i) { - return dp[start[u] + i]; + return dp[dfn[u] + i]; } public static void addEdge(int u, int v) { - next[++cnt] = head[u]; - to[cnt] = v; - head[u] = cnt; + next[++cntg] = head[u]; + to[cntg] = v; + head[u] = cntg; } // 递归版,C++可以通过,java会爆栈,迭代版是dfs3方法 @@ -73,31 +74,19 @@ public static void dfs1(int u, int fa) { // 递归版,C++可以通过,java会爆栈,迭代版是dfs4方法 public static void dfs2(int u, int fa) { - // 第一部分,给所有儿子设置start位置 + dfn[u] = ++cntd; set(u, 0, 1); if (son[u] == 0) { ansx[u] = 0; return; } - start[son[u]] = start[u] + 1; - int startSum = start[u] + len[u]; - for (int e = head[u], v; e > 0; e = next[e]) { - v = to[e]; - if (v != fa && v != son[u]) { - start[v] = startSum; - startSum += len[v]; - } - } - // 第二部分,先遍历长儿子,得到的答案已经放在dp里了,自动复用 dfs2(son[u], u); - // 第三部分,处理其他儿子 for (int e = head[u], v; e > 0; e = next[e]) { v = to[e]; if (v != fa && v != son[u]) { dfs2(v, u); } } - // 第四部分,计算答案 ansx[u] = ansx[son[u]] + 1; for (int e = head[u], v; e > 0; e = next[e]) { v = to[e]; @@ -173,36 +162,28 @@ public static void dfs4() { int v; while (stacksize > 0) { pop(); - if (e == -1) { // e == -1,表示第一次来到当前节点,对应第一部分 + if (e == -1) { // e == -1,表示第一次来到当前节点 + dfn[u] = ++cntd; set(u, 0, 1); if (son[u] == 0) { ansx[u] = 0; continue; } - start[son[u]] = start[u] + 1; - int startSum = start[u] + len[u]; - for (int e = head[u]; e > 0; e = next[e]) { - v = to[e]; - if (v != f && v != son[u]) { - start[v] = startSum; - startSum += len[v]; - } - } push(u, f, -2); // 设置e = -2,再弹出就表示处理完长儿子了 - push(son[u], u, -1); // 长儿子的任务进入栈,对应第二部分 + push(son[u], u, -1); // 长儿子的任务进入栈 continue; } else if (e == -2) { // e == -2,表示长儿子已经处理完,该处理其他儿子了 e = head[u]; } else { // 每个儿子都处理 e = next[e]; } - if (e != 0) { // 对应第三部分 + if (e != 0) { push(u, f, e); v = to[e]; if (v != f && v != son[u]) { push(v, u, -1); } - } else { // 对应第四部分,计算答案 + } else { // 更新dp、计算答案 ansx[u] = ansx[son[u]] + 1; for (int e = head[u]; e > 0; e = next[e]) { v = to[e]; @@ -237,7 +218,6 @@ public static void main(String[] args) throws IOException { addEdge(v, u); } dfs3(); - start[1] = 1; dfs4(); for (int i = 1; i <= n; i++) { out.println(ansx[i]); diff --git a/src/class162/Code05_DominantIndices2.java b/src/class162/Code06_DominantIndices2.java similarity index 85% rename from src/class162/Code05_DominantIndices2.java rename to src/class162/Code06_DominantIndices2.java index 98dac357c..cf881d494 100644 --- a/src/class162/Code05_DominantIndices2.java +++ b/src/class162/Code06_DominantIndices2.java @@ -22,27 +22,28 @@ //int head[MAXN]; //int nxt[MAXN << 1]; //int to[MAXN << 1]; -//int cnt = 0; +//int cntg = 0; // //int len[MAXN]; //int son[MAXN]; +//int dfn[MAXN]; +//int cntd = 0; // -//int start[MAXN]; //int dp[MAXN]; //int ansx[MAXN]; // //void setVal(int u, int i, int v) { -// dp[start[u] + i] = v; +// dp[dfn[u] + i] = v; //} // //int getVal(int u, int i) { -// return dp[start[u] + i]; +// return dp[dfn[u] + i]; //} // //void addEdge(int u, int v) { -// nxt[++cnt] = head[u]; -// to[cnt] = v; -// head[u] = cnt; +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// head[u] = cntg; //} // //void dfs1(int u, int fa) { @@ -64,20 +65,12 @@ //} // //void dfs2(int u, int fa) { +// dfn[u] = ++cntd; // setVal(u, 0, 1); // if (son[u] == 0) { // ansx[u] = 0; // return; // } -// start[son[u]] = start[u] + 1; -// int startSum = start[u] + len[u]; -// for (int e = head[u], v; e > 0; e = nxt[e]) { -// v = to[e]; -// if (v != fa && v != son[u]) { -// start[v] = startSum; -// startSum += len[v]; -// } -// } // dfs2(son[u], u); // for (int e = head[u], v; e > 0; e = nxt[e]) { // v = to[e]; @@ -112,7 +105,6 @@ // addEdge(v, u); // } // dfs1(1, 0); -// start[1] = 1; // dfs2(1, 0); // for (int i = 1; i <= n; i++) { // cout << ansx[i] << "\n"; diff --git a/src/class162/Code07_HotHotels1.java b/src/class162/Code07_HotHotels1.java new file mode 100644 index 000000000..6e6ad5f59 --- /dev/null +++ b/src/class162/Code07_HotHotels1.java @@ -0,0 +1,165 @@ +package class162; + +// 火热旅馆,java版 +// 一共有n个节点,给定n-1条边,所有节点连成一棵树 +// 三个点构成一个点组(a, b, c),打乱顺序依然认为是同一个点组 +// 求树上有多少点组,两两之间的距离是一样的 +// 1 <= n <= 10^5 +// 答案一定在long类型范围内 +// 测试链接 : https://www.luogu.com.cn/problem/P5904 +// 提交以下的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 Code07_HotHotels1 { + + public static int MAXN = 100001; + public static int n; + + 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[] son = new int[MAXN]; + public static int[] len = new int[MAXN]; + public static int cntd = 0; + + public static int[] fid = new int[MAXN]; + public static int[] gid = new int[MAXN]; + public static long[] f = new long[MAXN]; + public static long[] g = new long[MAXN << 1]; + public static long ans = 0; + + 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; + 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) { + if (son[u] == 0 || len[son[u]] < len[v]) { + son[u] = v; + } + } + } + len[u] = len[son[u]] + 1; + } + + // 递归版,居然不改迭代版也能通过,那就不改了 + public static void dfs2(int u, int t) { + fid[u] = cntd++; + if (son[u] == 0) { + gid[u] = fid[t] * 2; + return; + } + dfs2(son[u], t); + gid[u] = gid[son[u]] + 1; + for (int e = head[u], v; e > 0; e = next[e]) { + v = to[e]; + if (v != son[u] && v != fa[u]) { + dfs2(v, v); + } + } + } + + public static void setf(int u, int i, long v) { + f[fid[u] + i] = v; + } + + public static long getf(int u, int i) { + return f[fid[u] + i]; + } + + public static void setg(int u, int i, long v) { + g[gid[u] + i] = v; + } + + public static long getg(int u, int i) { + return g[gid[u] + i]; + } + + // 递归版,居然不改迭代版也能通过,那就不改了 + public static void dfs3(int u) { + if (son[u] == 0) { + setf(u, 0, 1); + return; + } + dfs3(son[u]); + for (int e = head[u], v; e > 0; e = next[e]) { + v = to[e]; + if (v != son[u] && v != fa[u]) { + dfs3(v); + } + } + ans += getg(u, 0); + setf(u, 0, getf(u, 0) + 1); + for (int e = head[u], v; e > 0; e = next[e]) { + v = to[e]; + if (v != son[u] && v != fa[u]) { + for (int i = 0; i <= len[v]; i++) { + if (i > 0) { + ans += getg(u, i) * getf(v, i - 1); + } + if (i + 1 < len[v]) { + ans += getf(u, i) * getg(v, i + 1); + } + } + for (int i = 0; i <= len[v]; i++) { + if (i > 0) { + setg(u, i, getg(u, i) + getf(u, i) * getf(v, i - 1)); + } + } + for (int i = 0; i <= len[v]; i++) { + if (i < len[v]) { + setg(u, i, getg(u, i) + getg(v, i + 1)); + } + if (i > 0) { + setf(u, i, getf(u, i) + getf(v, i - 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)); + in.nextToken(); + n = (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); + } + dfs1(1, 0); + dfs2(1, 1); + dfs3(1); + out.println(ans); + out.flush(); + out.close(); + br.close(); + } + +} \ No newline at end of file diff --git a/src/class162/Code07_HotHotels2.java b/src/class162/Code07_HotHotels2.java new file mode 100644 index 000000000..0674b96f3 --- /dev/null +++ b/src/class162/Code07_HotHotels2.java @@ -0,0 +1,149 @@ +package class162; + +// 火热旅馆,C++版 +// 一共有n个节点,给定n-1条边,所有节点连成一棵树 +// 三个点构成一个点组(a, b, c),打乱顺序依然认为是同一个点组 +// 求树上有多少点组,两两之间的距离是一样的 +// 1 <= n <= 10^5 +// 答案一定在long类型范围内 +// 测试链接 : https://www.luogu.com.cn/problem/P5904 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +//int n; +// +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int cntg; +// +//int fa[MAXN]; +//int son[MAXN]; +//int len[MAXN]; +//int cntd; +// +//int fid[MAXN]; +//int gid[MAXN]; +//long long f[MAXN << 1]; +//long long g[MAXN << 1]; +//long long 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; +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// if (v != f) { +// dfs1(v, u); +// } +// } +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// if (v != f) { +// if (son[u] == 0 || len[son[u]] < len[v]) { +// son[u] = v; +// } +// } +// } +// len[u] = len[son[u]] + 1; +//} +// +//void dfs2(int u, int t) { +// fid[u] = cntd++; +// if (son[u] == 0) { +// gid[u] = fid[t] * 2; +// return; +// } +// dfs2(son[u], t); +// gid[u] = gid[son[u]] + 1; +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// if (v != son[u] && v != fa[u]) { +// dfs2(v, v); +// } +// } +//} +// +//void setf(int u, int i, long long v) { +// f[fid[u] + i] = v; +//} +// +//long long getf(int u, int i) { +// return f[fid[u] + i]; +//} +// +//void setg(int u, int i, long long v) { +// g[gid[u] + i] = v; +//} +// +//long long getg(int u, int i) { +// return g[gid[u] + i]; +//} +// +//void dfs3(int u) { +// if (son[u] == 0) { +// setf(u, 0, 1); +// return; +// } +// dfs3(son[u]); +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// if (v != son[u] && v != fa[u]) { +// dfs3(v); +// } +// } +// ans += getg(u, 0); +// setf(u, 0, getf(u, 0) + 1); +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// if (v != son[u] && v != fa[u]) { +// for (int i = 0; i <= len[v]; i++) { +// if (i > 0) { +// ans += getg(u, i) * getf(v, i - 1); +// } +// if (i + 1 < len[v]) { +// ans += getf(u, i) * getg(v, i + 1); +// } +// } +// for (int i = 0; i <= len[v]; i++) { +// if (i > 0) { +// setg(u, i, getg(u, i) + getf(u, i) * getf(v, i - 1)); +// } +// } +// for (int i = 0; i <= len[v]; i++) { +// if (i < len[v]) { +// setg(u, i, getg(u, i) + getg(v, i + 1)); +// } +// if (i > 0) { +// setf(u, i, getf(u, i) + getf(v, i - 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); +// } +// dfs1(1, 0); +// dfs2(1, 1); +// dfs3(1); +// cout << ans << "\n"; +// return 0; +//} \ No newline at end of file From c313543fc7232107887ddc27574fd4d0a2c49f11 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 10 Mar 2025 21:44:50 +0800 Subject: [PATCH 0792/2029] modify code --- src/class162/Code07_HotHotels2.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class162/Code07_HotHotels2.java b/src/class162/Code07_HotHotels2.java index 0674b96f3..666f039c8 100644 --- a/src/class162/Code07_HotHotels2.java +++ b/src/class162/Code07_HotHotels2.java @@ -29,7 +29,7 @@ // //int fid[MAXN]; //int gid[MAXN]; -//long long f[MAXN << 1]; +//long long f[MAXN]; //long long g[MAXN << 1]; //long long ans; // From c077fa3c8406840866903936305dda98db25072a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 10 Mar 2025 21:48:23 +0800 Subject: [PATCH 0793/2029] modify code --- src/class162/Code07_HotHotels1.java | 2 +- src/class162/Code07_HotHotels2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class162/Code07_HotHotels1.java b/src/class162/Code07_HotHotels1.java index 6e6ad5f59..85f231a86 100644 --- a/src/class162/Code07_HotHotels1.java +++ b/src/class162/Code07_HotHotels1.java @@ -71,13 +71,13 @@ public static void dfs2(int u, int t) { return; } dfs2(son[u], t); - gid[u] = gid[son[u]] + 1; for (int e = head[u], v; e > 0; e = next[e]) { v = to[e]; if (v != son[u] && v != fa[u]) { dfs2(v, v); } } + gid[u] = gid[son[u]] + 1; } public static void setf(int u, int i, long v) { diff --git a/src/class162/Code07_HotHotels2.java b/src/class162/Code07_HotHotels2.java index 666f039c8..5669ced3b 100644 --- a/src/class162/Code07_HotHotels2.java +++ b/src/class162/Code07_HotHotels2.java @@ -65,13 +65,13 @@ // return; // } // dfs2(son[u], t); -// gid[u] = gid[son[u]] + 1; // for (int e = head[u], v; e > 0; e = nxt[e]) { // v = to[e]; // if (v != son[u] && v != fa[u]) { // dfs2(v, v); // } // } +// gid[u] = gid[son[u]] + 1; //} // //void setf(int u, int i, long long v) { From a45f28870aedf3c18a94a8f8de87d37867c5ee63 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 10 Mar 2025 21:58:26 +0800 Subject: [PATCH 0794/2029] modify code --- src/class162/Code07_HotHotels1.java | 6 +----- src/class162/Code07_HotHotels2.java | 6 +----- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/src/class162/Code07_HotHotels1.java b/src/class162/Code07_HotHotels1.java index 85f231a86..be1f0175d 100644 --- a/src/class162/Code07_HotHotels1.java +++ b/src/class162/Code07_HotHotels1.java @@ -125,15 +125,11 @@ public static void dfs3(int u) { for (int i = 0; i <= len[v]; i++) { if (i > 0) { setg(u, i, getg(u, i) + getf(u, i) * getf(v, i - 1)); + setf(u, i, getf(u, i) + getf(v, i - 1)); } - } - for (int i = 0; i <= len[v]; i++) { if (i < len[v]) { setg(u, i, getg(u, i) + getg(v, i + 1)); } - if (i > 0) { - setf(u, i, getf(u, i) + getf(v, i - 1)); - } } } } diff --git a/src/class162/Code07_HotHotels2.java b/src/class162/Code07_HotHotels2.java index 5669ced3b..e4cd1f2a1 100644 --- a/src/class162/Code07_HotHotels2.java +++ b/src/class162/Code07_HotHotels2.java @@ -118,15 +118,11 @@ // for (int i = 0; i <= len[v]; i++) { // if (i > 0) { // setg(u, i, getg(u, i) + getf(u, i) * getf(v, i - 1)); +// setf(u, i, getf(u, i) + getf(v, i - 1)); // } -// } -// for (int i = 0; i <= len[v]; i++) { // if (i < len[v]) { // setg(u, i, getg(u, i) + getg(v, i + 1)); // } -// if (i > 0) { -// setf(u, i, getf(u, i) + getf(v, i - 1)); -// } // } // } // } From e06c3ba2c4de15748289afce817bd7a57896abb9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 10 Mar 2025 22:02:28 +0800 Subject: [PATCH 0795/2029] modify code --- src/class162/Code07_HotHotels1.java | 4 ++++ src/class162/Code07_HotHotels2.java | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/src/class162/Code07_HotHotels1.java b/src/class162/Code07_HotHotels1.java index be1f0175d..3ebb47014 100644 --- a/src/class162/Code07_HotHotels1.java +++ b/src/class162/Code07_HotHotels1.java @@ -125,6 +125,10 @@ public static void dfs3(int u) { for (int i = 0; i <= len[v]; i++) { if (i > 0) { setg(u, i, getg(u, i) + getf(u, i) * getf(v, i - 1)); + } + } + for (int i = 0; i <= len[v]; i++) { + if (i > 0) { setf(u, i, getf(u, i) + getf(v, i - 1)); } if (i < len[v]) { diff --git a/src/class162/Code07_HotHotels2.java b/src/class162/Code07_HotHotels2.java index e4cd1f2a1..062baea06 100644 --- a/src/class162/Code07_HotHotels2.java +++ b/src/class162/Code07_HotHotels2.java @@ -118,6 +118,10 @@ // for (int i = 0; i <= len[v]; i++) { // if (i > 0) { // setg(u, i, getg(u, i) + getf(u, i) * getf(v, i - 1)); +// } +// } +// for (int i = 0; i <= len[v]; i++) { +// if (i > 0) { // setf(u, i, getf(u, i) + getf(v, i - 1)); // } // if (i < len[v]) { From 0987c52ff695f8be1dc8535eb363127fff3d057b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 11 Mar 2025 00:47:32 +0800 Subject: [PATCH 0796/2029] modify code --- src/class162/Code07_HotHotels1.java | 4 ++-- src/class162/Code07_HotHotels2.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/class162/Code07_HotHotels1.java b/src/class162/Code07_HotHotels1.java index 3ebb47014..4aa05a60f 100644 --- a/src/class162/Code07_HotHotels1.java +++ b/src/class162/Code07_HotHotels1.java @@ -2,8 +2,8 @@ // 火热旅馆,java版 // 一共有n个节点,给定n-1条边,所有节点连成一棵树 -// 三个点构成一个点组(a, b, c),打乱顺序依然认为是同一个点组 -// 求树上有多少点组,两两之间的距离是一样的 +// 三个点构成一个点组(a, b, c),打乱顺序认为是同一个点组 +// 求树上有多少点组,内部任意两个节点之间的距离是一样的 // 1 <= n <= 10^5 // 答案一定在long类型范围内 // 测试链接 : https://www.luogu.com.cn/problem/P5904 diff --git a/src/class162/Code07_HotHotels2.java b/src/class162/Code07_HotHotels2.java index 062baea06..de02cd101 100644 --- a/src/class162/Code07_HotHotels2.java +++ b/src/class162/Code07_HotHotels2.java @@ -2,8 +2,8 @@ // 火热旅馆,C++版 // 一共有n个节点,给定n-1条边,所有节点连成一棵树 -// 三个点构成一个点组(a, b, c),打乱顺序依然认为是同一个点组 -// 求树上有多少点组,两两之间的距离是一样的 +// 三个点构成一个点组(a, b, c),打乱顺序认为是同一个点组 +// 求树上有多少点组,内部任意两个节点之间的距离是一样的 // 1 <= n <= 10^5 // 答案一定在long类型范围内 // 测试链接 : https://www.luogu.com.cn/problem/P5904 From 4d3dcc90af4cfe6d882388d01579a08f90b3ca64 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 11 Mar 2025 00:51:12 +0800 Subject: [PATCH 0797/2029] modify code --- src/class162/Code06_DominantIndices1.java | 2 +- src/class162/Code06_DominantIndices2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class162/Code06_DominantIndices1.java b/src/class162/Code06_DominantIndices1.java index 82e53c157..f0ce088cf 100644 --- a/src/class162/Code06_DominantIndices1.java +++ b/src/class162/Code06_DominantIndices1.java @@ -5,7 +5,7 @@ // 规定任何点到自己的距离为0 // 定义d(u, x),以u为头的子树中,到u的距离为x的节点数 // 对于每个点u,想知道哪个尽量小的x,能取得最大的d(u, x)值 -// 打印每个点的答案 +// 打印每个点的答案x // 1 <= n <= 10^6 // 测试链接 : https://www.luogu.com.cn/problem/CF1009F // 测试链接 : https://codeforces.com/problemset/problem/1009/F diff --git a/src/class162/Code06_DominantIndices2.java b/src/class162/Code06_DominantIndices2.java index cf881d494..51fd963d7 100644 --- a/src/class162/Code06_DominantIndices2.java +++ b/src/class162/Code06_DominantIndices2.java @@ -5,7 +5,7 @@ // 规定任何点到自己的距离为0 // 定义d(u, x),以u为头的子树中,到u的距离为x的节点数 // 对于每个点u,想知道哪个尽量小的x,能取得最大的d(u, x)值 -// 打印每个点的答案 +// 打印每个点的答案x // 1 <= n <= 10^6 // 测试链接 : https://www.luogu.com.cn/problem/CF1009F // 测试链接 : https://codeforces.com/problemset/problem/1009/F From 8783585be39ddcaf0b9222a2bedff527e7207b18 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 11 Mar 2025 00:57:13 +0800 Subject: [PATCH 0798/2029] modify code --- src/class162/Code07_HotHotels1.java | 32 ++++++++++++++--------------- src/class162/Code07_HotHotels2.java | 32 ++++++++++++++--------------- 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/src/class162/Code07_HotHotels1.java b/src/class162/Code07_HotHotels1.java index 4aa05a60f..78014f690 100644 --- a/src/class162/Code07_HotHotels1.java +++ b/src/class162/Code07_HotHotels1.java @@ -37,6 +37,22 @@ public class Code07_HotHotels1 { public static long[] g = new long[MAXN << 1]; public static long ans = 0; + public static void setf(int u, int i, long v) { + f[fid[u] + i] = v; + } + + public static long getf(int u, int i) { + return f[fid[u] + i]; + } + + public static void setg(int u, int i, long v) { + g[gid[u] + i] = v; + } + + public static long getg(int u, int i) { + return g[gid[u] + i]; + } + public static void addEdge(int u, int v) { next[++cntg] = head[u]; to[cntg] = v; @@ -80,22 +96,6 @@ public static void dfs2(int u, int t) { gid[u] = gid[son[u]] + 1; } - public static void setf(int u, int i, long v) { - f[fid[u] + i] = v; - } - - public static long getf(int u, int i) { - return f[fid[u] + i]; - } - - public static void setg(int u, int i, long v) { - g[gid[u] + i] = v; - } - - public static long getg(int u, int i) { - return g[gid[u] + i]; - } - // 递归版,居然不改迭代版也能通过,那就不改了 public static void dfs3(int u) { if (son[u] == 0) { diff --git a/src/class162/Code07_HotHotels2.java b/src/class162/Code07_HotHotels2.java index de02cd101..0e2e26a35 100644 --- a/src/class162/Code07_HotHotels2.java +++ b/src/class162/Code07_HotHotels2.java @@ -33,6 +33,22 @@ //long long g[MAXN << 1]; //long long ans; // +//void setf(int u, int i, long long v) { +// f[fid[u] + i] = v; +//} +// +//long long getf(int u, int i) { +// return f[fid[u] + i]; +//} +// +//void setg(int u, int i, long long v) { +// g[gid[u] + i] = v; +//} +// +//long long getg(int u, int i) { +// return g[gid[u] + i]; +//} +// //void addEdge(int u, int v) { // nxt[++cntg] = head[u]; // to[cntg] = v; @@ -74,22 +90,6 @@ // gid[u] = gid[son[u]] + 1; //} // -//void setf(int u, int i, long long v) { -// f[fid[u] + i] = v; -//} -// -//long long getf(int u, int i) { -// return f[fid[u] + i]; -//} -// -//void setg(int u, int i, long long v) { -// g[gid[u] + i] = v; -//} -// -//long long getg(int u, int i) { -// return g[gid[u] + i]; -//} -// //void dfs3(int u) { // if (son[u] == 0) { // setf(u, 0, 1); From d0da031b44d32cfc9a8ce1df6391efec0e388bef Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 11 Mar 2025 01:01:21 +0800 Subject: [PATCH 0799/2029] modify code --- src/class162/Code04_TreeKthAncestor1.java | 32 +++++++++++------------ src/class162/Code04_TreeKthAncestor2.java | 32 +++++++++++------------ 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/src/class162/Code04_TreeKthAncestor1.java b/src/class162/Code04_TreeKthAncestor1.java index 208edb9f7..dbd1338a0 100644 --- a/src/class162/Code04_TreeKthAncestor1.java +++ b/src/class162/Code04_TreeKthAncestor1.java @@ -57,6 +57,22 @@ public static long get(long x) { return s = x; } + public static void setUp(int u, int i, int v) { + up[dfn[u] + i] = v; + } + + public static int getUp(int u, int i) { + return up[dfn[u] + i]; + } + + public static void setDown(int u, int i, int v) { + down[dfn[u] + i] = v; + } + + public static int getDown(int u, int i) { + return down[dfn[u] + i]; + } + public static void addEdge(int u, int v) { next[++cntg] = head[u]; to[cntg] = v; @@ -186,22 +202,6 @@ public static void dfs4() { } } - public static void setUp(int u, int i, int v) { - up[dfn[u] + i] = v; - } - - public static int getUp(int u, int i) { - return up[dfn[u] + i]; - } - - public static void setDown(int u, int i, int v) { - down[dfn[u] + i] = v; - } - - public static int getDown(int u, int i) { - return down[dfn[u] + i]; - } - public static void prepare() { dfs3(); dfs4(); diff --git a/src/class162/Code04_TreeKthAncestor2.java b/src/class162/Code04_TreeKthAncestor2.java index 2b05963b4..3a80dc215 100644 --- a/src/class162/Code04_TreeKthAncestor2.java +++ b/src/class162/Code04_TreeKthAncestor2.java @@ -49,6 +49,22 @@ // return x; //} // +//void setUp(int u, int i, int v) { +// up[dfn[u] + i] = v; +//} +// +//int getUp(int u, int i) { +// return up[dfn[u] + i]; +//} +// +//void setDown(int u, int i, int v) { +// down[dfn[u] + i] = v; +//} +// +//int getDown(int u, int i) { +// return down[dfn[u] + i]; +//} +// //void addEdge(int u, int v) { // nxt[++cntg] = head[u]; // to[cntg] = v; @@ -91,22 +107,6 @@ // } //} // -//void setUp(int u, int i, int v) { -// up[dfn[u] + i] = v; -//} -// -//int getUp(int u, int i) { -// return up[dfn[u] + i]; -//} -// -//void setDown(int u, int i, int v) { -// down[dfn[u] + i] = v; -//} -// -//int getDown(int u, int i) { -// return down[dfn[u] + i]; -//} -// //void prepare() { // dfs1(root, 0); // dfs2(root, root); From 4213172f94781e88fe7c217f07901f0586096933 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 12 Mar 2025 18:18:24 +0800 Subject: [PATCH 0800/2029] modify code --- src/class162/Code02_NationalTour1.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/class162/Code02_NationalTour1.java b/src/class162/Code02_NationalTour1.java index 5c2188ccd..b10f02479 100644 --- a/src/class162/Code02_NationalTour1.java +++ b/src/class162/Code02_NationalTour1.java @@ -27,6 +27,10 @@ public class Code02_NationalTour1 { public static int MAXN = 200001; public static int n, m; + + // arr[i][0] : 第i条边的其中一点 + // arr[i][1] : 第i条边的另外一点 + // arr[i][2] : 第i条边的初始边权 public static int[][] arr = new int[MAXN][3]; // 链式前向星 From 1a9b56774bdafe06879b19a2e9f719a0f460f36d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 12 Mar 2025 21:24:24 +0800 Subject: [PATCH 0801/2029] modify code --- src/class162/Code03_UnderMoon1.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class162/Code03_UnderMoon1.java b/src/class162/Code03_UnderMoon1.java index ec7eb363c..9efa4f1db 100644 --- a/src/class162/Code03_UnderMoon1.java +++ b/src/class162/Code03_UnderMoon1.java @@ -44,9 +44,9 @@ public class Code03_UnderMoon1 { public static int cntd = 0; // 线段树查询区间最大值 - // 但是需要同时兼顾,区间增加、区间修改,这两种操作 + // 但是需要同时兼顾,区间增加、区间重置,这两种操作 // 那么就牵扯到两种操作相互影响的问题 - // 因为区间修改明显会取消之前的区间增加 + // 因为区间重置操作会取消之前的区间增加操作 // 讲解110,线段树章节,题目5、题目6,重点讲了这种线段树 // 不会的同学可以看看,讲的非常清楚 public static int[] max = new int[MAXN << 2]; From 129f3905827d53638d41f433cd54191cacad2cad Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 13 Mar 2025 15:21:05 +0800 Subject: [PATCH 0802/2029] modify code --- src/class162/Code06_DominantIndices1.java | 49 ++++++++++++++--------- src/class162/Code06_DominantIndices2.java | 14 +++---- src/class162/Code07_HotHotels1.java | 3 +- src/class162/Code07_HotHotels2.java | 3 +- 4 files changed, 38 insertions(+), 31 deletions(-) diff --git a/src/class162/Code06_DominantIndices1.java b/src/class162/Code06_DominantIndices1.java index f0ce088cf..2f60158f7 100644 --- a/src/class162/Code06_DominantIndices1.java +++ b/src/class162/Code06_DominantIndices1.java @@ -39,11 +39,11 @@ public class Code06_DominantIndices1 { public static int[] dp = new int[MAXN]; public static int[] ansx = new int[MAXN]; - public static void set(int u, int i, int v) { + public static void setdp(int u, int i, int v) { dp[dfn[u] + i] = v; } - public static int get(int u, int i) { + public static int getdp(int u, int i) { return dp[dfn[u] + i]; } @@ -75,9 +75,9 @@ public static void dfs1(int u, int fa) { // 递归版,C++可以通过,java会爆栈,迭代版是dfs4方法 public static void dfs2(int u, int fa) { dfn[u] = ++cntd; - set(u, 0, 1); + setdp(u, 0, 1); + ansx[u] = 0; if (son[u] == 0) { - ansx[u] = 0; return; } dfs2(son[u], u); @@ -87,19 +87,28 @@ public static void dfs2(int u, int fa) { dfs2(v, u); } } + // 注意一定要在合并其他儿子dp信息的过程中,去更新ansx + // 千万不要,最后再遍历一遍u的dp信息,然后更新ansx + // 因为任何for循环,都不能是长链的规模! + // 如果for循环是长链的规模,那么u遍历下去,u的重儿子又遍历下去,长链上每个节点都遍历下去 + // 时间复杂度必然不再是O(n),而是O(n^2),长链剖分的优势就不存在了! + // 所以长链信息会被u直接继承,绝对不要有任何与长链的长度等规模的循环出现! ansx[u] = ansx[son[u]] + 1; for (int e = head[u], v; e > 0; e = next[e]) { v = to[e]; if (v != fa && v != son[u]) { for (int i = 1; i <= len[v]; i++) { - set(u, i, get(u, i) + get(v, i - 1)); - if (get(u, i) > get(u, ansx[u]) || (get(u, i) == get(u, ansx[u]) && i < ansx[u])) { + setdp(u, i, getdp(u, i) + getdp(v, i - 1)); + if (getdp(u, i) > getdp(u, ansx[u]) || (getdp(u, i) == getdp(u, ansx[u]) && i < ansx[u])) { ansx[u] = i; } } } } - if (get(u, ansx[u]) == 1) { + // 如果u的某个距离,获得的最大节点数为1 + // 那么u答案就是0距离,因为u到u自己的距离是0,也有1个节点了 + // 根据题目要求,返回尽量小的距离 + if (getdp(u, ansx[u]) == 1) { ansx[u] = 0; } } @@ -123,7 +132,7 @@ public static void pop() { e = ufe[stacksize][2]; } - // 迭代版 + // dfs1的迭代版 public static void dfs3() { stacksize = 0; push(1, 0, -1); @@ -155,26 +164,26 @@ public static void dfs3() { } } - // 迭代版 + // dfs2的迭代版 public static void dfs4() { stacksize = 0; push(1, 0, -1); int v; while (stacksize > 0) { pop(); - if (e == -1) { // e == -1,表示第一次来到当前节点 + if (e == -1) { dfn[u] = ++cntd; - set(u, 0, 1); + setdp(u, 0, 1); + ansx[u] = 0; if (son[u] == 0) { - ansx[u] = 0; continue; } - push(u, f, -2); // 设置e = -2,再弹出就表示处理完长儿子了 - push(son[u], u, -1); // 长儿子的任务进入栈 + push(u, f, -2); + push(son[u], u, -1); continue; - } else if (e == -2) { // e == -2,表示长儿子已经处理完,该处理其他儿子了 + } else if (e == -2) { e = head[u]; - } else { // 每个儿子都处理 + } else { e = next[e]; } if (e != 0) { @@ -183,20 +192,20 @@ public static void dfs4() { if (v != f && v != son[u]) { push(v, u, -1); } - } else { // 更新dp、计算答案 + } else { ansx[u] = ansx[son[u]] + 1; for (int e = head[u]; e > 0; e = next[e]) { v = to[e]; if (v != f && v != son[u]) { for (int i = 1; i <= len[v]; i++) { - set(u, i, get(u, i) + get(v, i - 1)); - if (get(u, i) > get(u, ansx[u]) || (get(u, i) == get(u, ansx[u]) && i < ansx[u])) { + setdp(u, i, getdp(u, i) + getdp(v, i - 1)); + if (getdp(u, i) > getdp(u, ansx[u]) || (getdp(u, i) == getdp(u, ansx[u]) && i < ansx[u])) { ansx[u] = i; } } } } - if (get(u, ansx[u]) == 1) { + if (getdp(u, ansx[u]) == 1) { ansx[u] = 0; } } diff --git a/src/class162/Code06_DominantIndices2.java b/src/class162/Code06_DominantIndices2.java index 51fd963d7..7be2a808f 100644 --- a/src/class162/Code06_DominantIndices2.java +++ b/src/class162/Code06_DominantIndices2.java @@ -32,11 +32,11 @@ //int dp[MAXN]; //int ansx[MAXN]; // -//void setVal(int u, int i, int v) { +//void setdp(int u, int i, int v) { // dp[dfn[u] + i] = v; //} // -//int getVal(int u, int i) { +//int getdp(int u, int i) { // return dp[dfn[u] + i]; //} // @@ -66,9 +66,9 @@ // //void dfs2(int u, int fa) { // dfn[u] = ++cntd; -// setVal(u, 0, 1); +// setdp(u, 0, 1); +// ansx[u] = 0; // if (son[u] == 0) { -// ansx[u] = 0; // return; // } // dfs2(son[u], u); @@ -83,14 +83,14 @@ // v = to[e]; // if (v != fa && v != son[u]) { // for (int i = 1; i <= len[v]; i++) { -// setVal(u, i, getVal(u, i) + getVal(v, i - 1)); -// if (getVal(u, i) > getVal(u, ansx[u]) || (getVal(u, i) == getVal(u, ansx[u]) && i < ansx[u])) { +// setdp(u, i, getdp(u, i) + getdp(v, i - 1)); +// if (getdp(u, i) > getdp(u, ansx[u]) || (getdp(u, i) == getdp(u, ansx[u]) && i < ansx[u])) { // ansx[u] = i; // } // } // } // } -// if (getVal(u, ansx[u]) == 1) { +// if (getdp(u, ansx[u]) == 1) { // ansx[u] = 0; // } //} diff --git a/src/class162/Code07_HotHotels1.java b/src/class162/Code07_HotHotels1.java index 78014f690..2d39e0889 100644 --- a/src/class162/Code07_HotHotels1.java +++ b/src/class162/Code07_HotHotels1.java @@ -98,8 +98,8 @@ public static void dfs2(int u, int t) { // 递归版,居然不改迭代版也能通过,那就不改了 public static void dfs3(int u) { + setf(u, 0, 1); if (son[u] == 0) { - setf(u, 0, 1); return; } dfs3(son[u]); @@ -110,7 +110,6 @@ public static void dfs3(int u) { } } ans += getg(u, 0); - setf(u, 0, getf(u, 0) + 1); for (int e = head[u], v; e > 0; e = next[e]) { v = to[e]; if (v != son[u] && v != fa[u]) { diff --git a/src/class162/Code07_HotHotels2.java b/src/class162/Code07_HotHotels2.java index 0e2e26a35..672e45b40 100644 --- a/src/class162/Code07_HotHotels2.java +++ b/src/class162/Code07_HotHotels2.java @@ -91,8 +91,8 @@ //} // //void dfs3(int u) { +// setf(u, 0, 1); // if (son[u] == 0) { -// setf(u, 0, 1); // return; // } // dfs3(son[u]); @@ -103,7 +103,6 @@ // } // } // ans += getg(u, 0); -// setf(u, 0, getf(u, 0) + 1); // for (int e = head[u], v; e > 0; e = nxt[e]) { // v = to[e]; // if (v != son[u] && v != fa[u]) { From 4344e232ffcae1805d49ed9959d37cc7aff3207b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 13 Mar 2025 16:05:16 +0800 Subject: [PATCH 0803/2029] modify code --- src/class162/Code06_DominantIndices1.java | 2 +- src/class162/Code06_DominantIndices2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class162/Code06_DominantIndices1.java b/src/class162/Code06_DominantIndices1.java index 2f60158f7..0e267e420 100644 --- a/src/class162/Code06_DominantIndices1.java +++ b/src/class162/Code06_DominantIndices1.java @@ -1,6 +1,6 @@ package class162; -// 哪个距离的点最多,java版 +// 长链剖分优化动态规划模版题,java版 // 一共有n个节点,给定n-1条边,所有节点连成一棵树,规定1号节点是头 // 规定任何点到自己的距离为0 // 定义d(u, x),以u为头的子树中,到u的距离为x的节点数 diff --git a/src/class162/Code06_DominantIndices2.java b/src/class162/Code06_DominantIndices2.java index 7be2a808f..efeada7b3 100644 --- a/src/class162/Code06_DominantIndices2.java +++ b/src/class162/Code06_DominantIndices2.java @@ -1,6 +1,6 @@ package class162; -// 哪个距离的点最多,C++版 +// 长链剖分优化动态规划模版题,C++版 // 一共有n个节点,给定n-1条边,所有节点连成一棵树,规定1号节点是头 // 规定任何点到自己的距离为0 // 定义d(u, x),以u为头的子树中,到u的距离为x的节点数 From 799ead275bed35c39598eb5ac0bf0474bc8a400e Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 13 Mar 2025 17:20:13 +0800 Subject: [PATCH 0804/2029] modify code --- src/class162/Code07_HotHotels1.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/class162/Code07_HotHotels1.java b/src/class162/Code07_HotHotels1.java index 2d39e0889..9a7bfd139 100644 --- a/src/class162/Code07_HotHotels1.java +++ b/src/class162/Code07_HotHotels1.java @@ -21,21 +21,24 @@ public class Code07_HotHotels1 { public static int MAXN = 100001; public static int n; + // 链式前向星 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[] son = new int[MAXN]; public static int[] len = new int[MAXN]; public static int cntd = 0; - public static int[] fid = new int[MAXN]; - public static int[] gid = new int[MAXN]; - public static long[] f = new long[MAXN]; - public static long[] g = new long[MAXN << 1]; - public static long ans = 0; + // 动态规划 + public static int[] fid = new int[MAXN]; // 每个点在动态规划表f中的开始位置,就是dfn序 + public static int[] gid = new int[MAXN]; // 每个点在动态规划表g中的开始位置,独特的设计 + public static long[] f = new long[MAXN]; // 动态规划表f + public static long[] g = new long[MAXN << 1]; // 动态规划表g + public static long ans = 0; // 答案 public static void setf(int u, int i, long v) { f[fid[u] + i] = v; @@ -80,6 +83,7 @@ public static void dfs1(int u, int f) { } // 递归版,居然不改迭代版也能通过,那就不改了 + // 给每个节点分配fid和gid public static void dfs2(int u, int t) { fid[u] = cntd++; if (son[u] == 0) { @@ -97,6 +101,7 @@ public static void dfs2(int u, int t) { } // 递归版,居然不改迭代版也能通过,那就不改了 + // 计算每个节点的f信息和g信息,同时统计答案 public static void dfs3(int u) { setf(u, 0, 1); if (son[u] == 0) { From 978ce3b08959eb126398e213d95c89d720595286 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 13 Mar 2025 17:31:28 +0800 Subject: [PATCH 0805/2029] modify code --- src/class162/Code07_HotHotels1.java | 6 +++--- src/class162/Code07_HotHotels2.java | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/class162/Code07_HotHotels1.java b/src/class162/Code07_HotHotels1.java index 9a7bfd139..da4e29295 100644 --- a/src/class162/Code07_HotHotels1.java +++ b/src/class162/Code07_HotHotels1.java @@ -84,13 +84,13 @@ public static void dfs1(int u, int f) { // 递归版,居然不改迭代版也能通过,那就不改了 // 给每个节点分配fid和gid - public static void dfs2(int u, int t) { + public static void dfs2(int u, int top) { fid[u] = cntd++; if (son[u] == 0) { - gid[u] = fid[t] * 2; + gid[u] = fid[top] * 2; return; } - dfs2(son[u], t); + dfs2(son[u], top); for (int e = head[u], v; e > 0; e = next[e]) { v = to[e]; if (v != son[u] && v != fa[u]) { diff --git a/src/class162/Code07_HotHotels2.java b/src/class162/Code07_HotHotels2.java index 672e45b40..026691fb7 100644 --- a/src/class162/Code07_HotHotels2.java +++ b/src/class162/Code07_HotHotels2.java @@ -74,13 +74,13 @@ // len[u] = len[son[u]] + 1; //} // -//void dfs2(int u, int t) { +//void dfs2(int u, int top) { // fid[u] = cntd++; // if (son[u] == 0) { -// gid[u] = fid[t] * 2; +// gid[u] = fid[top] * 2; // return; // } -// dfs2(son[u], t); +// dfs2(son[u], top); // for (int e = head[u], v; e > 0; e = nxt[e]) { // v = to[e]; // if (v != son[u] && v != fa[u]) { From e09b4261f9b1629b88caec1ff4dc561193106b1c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 13 Mar 2025 17:32:37 +0800 Subject: [PATCH 0806/2029] modify code --- src/class162/Code06_DominantIndices1.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/class162/Code06_DominantIndices1.java b/src/class162/Code06_DominantIndices1.java index 0e267e420..5089f8b34 100644 --- a/src/class162/Code06_DominantIndices1.java +++ b/src/class162/Code06_DominantIndices1.java @@ -37,6 +37,8 @@ public class Code06_DominantIndices1 { // 动态规划 public static int[] dp = new int[MAXN]; + + // 答案数组 public static int[] ansx = new int[MAXN]; public static void setdp(int u, int i, int v) { From f61cf14d973c0d3ce48dd5a88bc55c7ea09f74a6 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 13 Mar 2025 19:41:05 +0800 Subject: [PATCH 0807/2029] modify code --- src/class162/Code07_HotHotels1.java | 19 ++++++++++++------- src/class162/Code07_HotHotels2.java | 16 ++++++++-------- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/src/class162/Code07_HotHotels1.java b/src/class162/Code07_HotHotels1.java index da4e29295..7fcfb7257 100644 --- a/src/class162/Code07_HotHotels1.java +++ b/src/class162/Code07_HotHotels1.java @@ -114,17 +114,19 @@ public static void dfs3(int u) { dfs3(v); } } - ans += getg(u, 0); for (int e = head[u], v; e > 0; e = next[e]) { v = to[e]; if (v != son[u] && v != fa[u]) { + // u为头的子树中,选择三个点,u一定不参与 + // 情况1 : u遍历过的所有子树中选一个点,当前子树中选两个点 + // 情况2 : u遍历过的所有子树中选两个点,当前子树中选一个点 for (int i = 0; i <= len[v]; i++) { - if (i > 0) { - ans += getg(u, i) * getf(v, i - 1); - } - if (i + 1 < len[v]) { + if (i > 0 && i + 1 < len[v]) { ans += getf(u, i) * getg(v, i + 1); } + if (i < len[u] && i - 1 >= 0) { + ans += getg(u, i) * getf(v, i - 1); + } } for (int i = 0; i <= len[v]; i++) { if (i > 0) { @@ -132,15 +134,18 @@ public static void dfs3(int u) { } } for (int i = 0; i <= len[v]; i++) { - if (i > 0) { + if (i - 1 >= 0) { setf(u, i, getf(u, i) + getf(v, i - 1)); } - if (i < len[v]) { + if (i + 1 < len[v]) { setg(u, i, getg(u, i) + getg(v, i + 1)); } } } } + // u为头的子树中,选择三个点,u一定要参与 + // 情况3 : u为头的子树中,最上方的点选u + ans += getg(u, 0); } public static void main(String[] args) throws IOException { diff --git a/src/class162/Code07_HotHotels2.java b/src/class162/Code07_HotHotels2.java index 026691fb7..51dd6ec32 100644 --- a/src/class162/Code07_HotHotels2.java +++ b/src/class162/Code07_HotHotels2.java @@ -102,17 +102,16 @@ // dfs3(v); // } // } -// ans += getg(u, 0); // for (int e = head[u], v; e > 0; e = nxt[e]) { // v = to[e]; // if (v != son[u] && v != fa[u]) { -// for (int i = 0; i <= len[v]; i++) { -// if (i > 0) { -// ans += getg(u, i) * getf(v, i - 1); -// } -// if (i + 1 < len[v]) { +// for (int i = 1; i <= len[v]; i++) { +// if (i > 0 && i + 1 < len[v]) { // ans += getf(u, i) * getg(v, i + 1); // } +// if (i < len[u] && i - 1 >= 0) { +// ans += getg(u, i) * getf(v, i - 1); +// } // } // for (int i = 0; i <= len[v]; i++) { // if (i > 0) { @@ -120,15 +119,16 @@ // } // } // for (int i = 0; i <= len[v]; i++) { -// if (i > 0) { +// if (i - 1 >= 0) { // setf(u, i, getf(u, i) + getf(v, i - 1)); // } -// if (i < len[v]) { +// if (i + 1 < len[v]) { // setg(u, i, getg(u, i) + getg(v, i + 1)); // } // } // } // } +// ans += getg(u, 0); //} // //int main() { From 516797fa5b697c4cb49a49f2e2ef4a98253b47f6 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 13 Mar 2025 19:45:13 +0800 Subject: [PATCH 0808/2029] modify code --- src/class162/Code07_HotHotels1.java | 4 ++-- src/class162/Code07_HotHotels2.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/class162/Code07_HotHotels1.java b/src/class162/Code07_HotHotels1.java index 7fcfb7257..4153ba39d 100644 --- a/src/class162/Code07_HotHotels1.java +++ b/src/class162/Code07_HotHotels1.java @@ -129,7 +129,7 @@ public static void dfs3(int u) { } } for (int i = 0; i <= len[v]; i++) { - if (i > 0) { + if (i - 1 >= 0) { setg(u, i, getg(u, i) + getf(u, i) * getf(v, i - 1)); } } @@ -144,7 +144,7 @@ public static void dfs3(int u) { } } // u为头的子树中,选择三个点,u一定要参与 - // 情况3 : u为头的子树中,最上方的点选u + // 情况3 : u为头的子树中,最上方的点选u,下方再选两个点 ans += getg(u, 0); } diff --git a/src/class162/Code07_HotHotels2.java b/src/class162/Code07_HotHotels2.java index 51dd6ec32..abb9f82bf 100644 --- a/src/class162/Code07_HotHotels2.java +++ b/src/class162/Code07_HotHotels2.java @@ -114,7 +114,7 @@ // } // } // for (int i = 0; i <= len[v]; i++) { -// if (i > 0) { +// if (i - 1 >= 0) { // setg(u, i, getg(u, i) + getf(u, i) * getf(v, i - 1)); // } // } From ea6a374dda8c5d9f0c6e2f3f1cda9bfe41e2ea97 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 13 Mar 2025 20:48:32 +0800 Subject: [PATCH 0809/2029] modify code --- src/class162/Code07_HotHotels1.java | 6 +++--- src/class162/Code07_HotHotels2.java | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/class162/Code07_HotHotels1.java b/src/class162/Code07_HotHotels1.java index 4153ba39d..40f4ac0a2 100644 --- a/src/class162/Code07_HotHotels1.java +++ b/src/class162/Code07_HotHotels1.java @@ -132,14 +132,14 @@ public static void dfs3(int u) { if (i - 1 >= 0) { setg(u, i, getg(u, i) + getf(u, i) * getf(v, i - 1)); } + if (i + 1 < len[v]) { + setg(u, i, getg(u, i) + getg(v, i + 1)); + } } for (int i = 0; i <= len[v]; i++) { if (i - 1 >= 0) { setf(u, i, getf(u, i) + getf(v, i - 1)); } - if (i + 1 < len[v]) { - setg(u, i, getg(u, i) + getg(v, i + 1)); - } } } } diff --git a/src/class162/Code07_HotHotels2.java b/src/class162/Code07_HotHotels2.java index abb9f82bf..4b8ecf195 100644 --- a/src/class162/Code07_HotHotels2.java +++ b/src/class162/Code07_HotHotels2.java @@ -105,7 +105,7 @@ // for (int e = head[u], v; e > 0; e = nxt[e]) { // v = to[e]; // if (v != son[u] && v != fa[u]) { -// for (int i = 1; i <= len[v]; i++) { +// for (int i = 0; i <= len[v]; i++) { // if (i > 0 && i + 1 < len[v]) { // ans += getf(u, i) * getg(v, i + 1); // } @@ -117,14 +117,14 @@ // if (i - 1 >= 0) { // setg(u, i, getg(u, i) + getf(u, i) * getf(v, i - 1)); // } +// if (i + 1 < len[v]) { +// setg(u, i, getg(u, i) + getg(v, i + 1)); +// } // } // for (int i = 0; i <= len[v]; i++) { // if (i - 1 >= 0) { // setf(u, i, getf(u, i) + getf(v, i - 1)); // } -// if (i + 1 < len[v]) { -// setg(u, i, getg(u, i) + getg(v, i + 1)); -// } // } // } // } From 2ebf41f855038bbfc403db49192b89b42bca728b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 13 Mar 2025 20:51:03 +0800 Subject: [PATCH 0810/2029] modify code --- src/class162/Code07_HotHotels1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class162/Code07_HotHotels1.java b/src/class162/Code07_HotHotels1.java index 40f4ac0a2..8e18c06a6 100644 --- a/src/class162/Code07_HotHotels1.java +++ b/src/class162/Code07_HotHotels1.java @@ -35,7 +35,7 @@ public class Code07_HotHotels1 { // 动态规划 public static int[] fid = new int[MAXN]; // 每个点在动态规划表f中的开始位置,就是dfn序 - public static int[] gid = new int[MAXN]; // 每个点在动态规划表g中的开始位置,独特的设计 + public static int[] gid = new int[MAXN]; // 每个点在动态规划表g中的开始位置,课上讲的设计 public static long[] f = new long[MAXN]; // 动态规划表f public static long[] g = new long[MAXN << 1]; // 动态规划表g public static long ans = 0; // 答案 From 9f07a67db1a251a1fcedbb03be5d0189842be76f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 14 Mar 2025 01:12:39 +0800 Subject: [PATCH 0811/2029] modify code --- ...345\211\226\345\210\206-\344\270\213.pptx" | Bin 0 -> 56310 bytes src/class162/Code07_HotHotels1.java | 25 +++++++++--------- src/class162/Code07_HotHotels2.java | 12 ++++----- 3 files changed, 18 insertions(+), 19 deletions(-) create mode 100644 "ppt/\347\256\227\346\263\225\350\256\262\350\247\243162\343\200\220\346\214\272\351\232\276\343\200\221\346\240\221\351\223\276\345\211\226\345\210\206-\344\270\213.pptx" diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243162\343\200\220\346\214\272\351\232\276\343\200\221\346\240\221\351\223\276\345\211\226\345\210\206-\344\270\213.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243162\343\200\220\346\214\272\351\232\276\343\200\221\346\240\221\351\223\276\345\211\226\345\210\206-\344\270\213.pptx" new file mode 100644 index 0000000000000000000000000000000000000000..56b4990bd57ae8a80966a61660d0abe1043f8934 GIT binary patch literal 56310 zcmdqJWmKJ8vZ#%_2X}XZ!@}JqxNC5C*8stFVL^ktySuvwcXtgAAHBQJxV`&3`}Doz z{A zq5U!Fx)vMq8(XCu=QKaCyjdyUWimqokyC{?j$fhq?RQFnf=z3MC?d3{VipQSVYa@UXdXK5BXT7^Zy zK|lrwKt5za2eG$zX0&%SaWb)WHgvYIv;8ZH&Qff?tT3SrZd@pfdhiHk5@}77E(ZVT zQxIE%w%08jw@)8(#lAdpa|KdT6je!`(3L8A{eC}pbbF+*nXA1i4A6=RifA)tUEy)D ziD1&HaB4_d61b?8S9-#gY&XaRwAm*V3^6l`r3@?UVA=%Ra>RB!rLpWYSqS|Sh>Z>M)8Bx3v>Y7y#kz9e zLoOQ#khO{UGLJ+ZcQ!Ve-q@o_69%aJMJ2UNZuebq+o!ddA{<&QkJeXT9_red9$EWx zwVEI2cwI7PE&Dvi#jXh2XpQK2O9MIBlWn0ln=t0iyok!k2f)X8Ho0X#H;M%>@XZN3 zFZ)Dz@Byb{p7`o(y`$?v?Onty^;)xB8`G*sxm2(v?Zt4s&WM@xzM1411Li6%N@vOv z3dBGLhhqa&TYcCe)H%{zL)Rl=c@m?p9<`p*88A^+&zw_bbf#erW5jlm!p~pH#wubF zNgz%SF{M`{ixe z;&g9xqAh^KHDU#bY9n12P`g#P(-P=V?mSCJ4l|B34IjCQ*+&c^UdXv=KVG=|2(GxS zq+JCLeyhaZ(E{&L6wyZQ#~vrUW@G*)T=A?~?53u-m*84EZIi^NUnxWpG2io^JFYD}v8 zX9OZmuqisM7TK%`qvSfxSOH_E_pcUz+lGv1nX&SYnLf|XbXjcjVx}7+o82O%7ym4P zk_SJy+KluB?DX0{`Ih_~MofpAAnV4tx2L@5N(uVrLC9iHh&quM!petGNIJ`lf&++w zFaP z`B!`VOaIfpux8myj1GPI%rAE7%T8po98GD$1l5imS?&drobFvE8n|rh^Q_6itvr&A zwVm&G_pk%A?Rm52)(x6x2{|drhA0KnhGH^$64`cf>=LU@a7_U?9ls_b8&YqAbSu=b1bd)O3TiV08QN(y_^Oh& zimG;3F7BA|ZHM29U2<)tw#BK@8BBR9M+o>UBj z^-DNp$qz3jdPT8gscK;ic>Nf)P?om#jDx}W=nl`vUFbjmiKI2UvPVC#-}(=~_g}F5 z!}FdAPc9Q-B|BfnGBD(S|(P zHfv+Yq>A+gpZTt&II6_k(LM5LuC#LU)iJlBH)qs_a*`iIdw1s>Z5V~EO{FkR^L(oA zr9tz+Y5bTtd6ihE^Nd7|dUto8`hd526?3s!=KAmsK>Wb%aDo^N8RqfGwui(t)8dg} zd6Mrm=K^gdA=y_$})>9}GIYS|UBqe|BqxnGK_R z&CGLZht1!e(7FPhl9Iy#PC$Ki7W?U4ZRQ%!0$7%twPtAfF_wN{cFl$`-OKYxCrpbR zWaunbDjlkc$smwx0;RZ5^{P(sVn;y`4C!z-$_SNfhK4JB25V-x6a{C)`YTp&7H^A_ z-V@g7zLfFL@5I7g`Oe>BA>fA=F#ln;Ms_wf9}ZN=#o64>(djQ=j48Rl1qG0sK3^1T z8ZE>`!^>f|NAd}Y^DI6c8u!S)aCHcsNn`czUAhy+ES(cF?Q@EpPI2bYO2^?Soc+oH)JnVb&5wgZ~rKaKG0(C8Njxr(bNVHhesGFERz7kn3W1Vm0XL5%+*QS z(+Y6Z^L}D0jPbdsQpa^a}V+817RfvYQEEXvPj#?OE^%Tqm{F5xSVO%uBT{AEtpBSF2h!z-^ zNGO&aofNm(F&9%ksw8@G^d@7`dw2Usw_f)lZMez9CY$Eohm}PGIr`~ofS0m1n z%_j8{0>j7G7Q*@%!?d~0MXXy1sG#-bNfw$%t0RNEYK~e$93#&av?d{HuxQEL zp8_t+t!vn}#8k)nZ}Nsx@trpWk%r1k9iZ0IWfx_AzhK=RNcjE^Kqv{wuXPyt;kg-c z1i7=2T9wVGCeYyYyJv~jsjfEnreuUpzBu9f&Pq>SIt320L*H*#jXSWru{_<_*?e?W zMc8P6PF~vH*HPa*4uQidbJ))OXFblc;7rtub6&JlRHsv@&H5VgC&Dsjo$c3XtSQ^?(&~;T(UWPC0g{86$={$WS|0s}bNR{8LI8rwWYy;$ zfG;CHWKl>Q-n}^4uakD%nANz5K`bBdH^l1+kjHK_`4Kex4luvNd1kT*T!p%*3JD2u zabSB2cs4ixF`NkKleX&8^qL;huK$FsFwEk_hoa3ezG`w3_Ml zKN2!sBHZ~xOQc$8qQzf)r+g4wZmT{YrLvre$oqM}KT9=@F0aI9vv6_TE%rKWZif`b zv=ckWnH9ay7yqol&h0^)O5j=C@X)dz$31W0;_d17DhYg7fnMFatb6ExhM#{{<;Z`L z%7*u1y{sue9-Vq~5(6-8h}O7C&b7eYKi_@b11IotUyRTe2+}}0F1jPbZ#nnFszY{Q z%ylq75JM{c4a#f~$E%51#h6i|rIL>j>_B_ot21mBybCgZ_!2HlHT5nO*s$9@x^QWvgn;xVmp$F!Y2Qf_3nK-+3&CMb`PtjrqJ^(S1F_ z=$*G~2N0Q~zH!PR=C6;0&vox~dipzV!nQV*=`A{8!TDP-$0w%yFht2(tJnhgFUP#a zH+e|pK=LXVs0i^X+%HxQ932Y}T7mUYR&rVF-xh+jKJ{=9%)H=I8a$fx)(x!B!7&^C;JzWEQN;k>YPHA~Qok5lJHY@!Z&YTr5G^jxJnOi7{xe8lKc!2O?>A zn&7!EZYSBy8RFGh?;x#InXFt?MQJq*oiRnP3>5V?@i`V59rpa5%8ssvUoi^dhGMiv zCOpP&uj2Ehwx+yUse_ZhrcFGl@g?#-t;nV4SJuNU_Dq~-%u!Pnj>E|i5*=T_qL-^^ zjEGq*;wn_CS?yd;g=g(yoNvX0`I!*A&r}UVf!5&P4qmIxS`hNOc)zCrS75#S?BkpA z^Tz5?qY|a+zKCjX*NF5OmUUel*A?o(xk65CeyrS6%cd}Te;c%w(xoK;_Q`T*?s|7r z4Zj!3;`x$r0iObnr98Rm>{LKCt(&HpT9&iUw{VR?xmZciL8LW=lm;$SPdSBGQK`LX z(2}U#vJFXFV#t8vd%;9W%zU2!6>P%2cGCS1^97G1i5b4T(hjr?a6j zB1(y`My^A__;T`XWQ7|-^4OxLA=X3FySJnJjWTE8-Ab<`yP31yQ)hJkw%PNuG!mkv z@9uT>n}jhHHjuFgtxqF^U&?gpVH?pNu$Kio-c2@QGM=eV&rOg9sT=}AdFSpCG@#0i zelpqWpCSJ3DN|5dvnd`Jx-b2vATco3Q%4pGbiUuQ31#o=valL2NyXmfHs&g{mKkIpNkh?4*?gJtztc_wa;zi8l7K9rfuw*L*nq||gDl{Jq<|ZofxbWq zG5Fq>%p?C<>q-R$Wn@qwAR=o2rz+xXZenA?_{Zm8M=?5oL@_=W>M)+VbuB!u3Wbts z*t*1LxKfxtI#XyS#o5#hQU|~9D2lzv2W?ZGwNC;5y`v;%0ABoXk#4(_JV1&VcZFkDg%*Ou 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 literal 0 HcmV?d00001 diff --git a/src/class162/Code07_HotHotels1.java b/src/class162/Code07_HotHotels1.java index 8e18c06a6..d77624207 100644 --- a/src/class162/Code07_HotHotels1.java +++ b/src/class162/Code07_HotHotels1.java @@ -36,8 +36,8 @@ public class Code07_HotHotels1 { // 动态规划 public static int[] fid = new int[MAXN]; // 每个点在动态规划表f中的开始位置,就是dfn序 public static int[] gid = new int[MAXN]; // 每个点在动态规划表g中的开始位置,课上讲的设计 - public static long[] f = new long[MAXN]; // 动态规划表f - public static long[] g = new long[MAXN << 1]; // 动态规划表g + public static long[] f = new long[MAXN]; // 动态规划表f,f[父][i]依赖f[子][i-1] + public static long[] g = new long[MAXN << 1]; // 动态规划表g,g[父][i]依赖g[子][i+1] public static long ans = 0; // 答案 public static void setf(int u, int i, long v) { @@ -117,24 +117,24 @@ public static void dfs3(int u) { for (int e = head[u], v; e > 0; e = next[e]) { v = to[e]; if (v != son[u] && v != fa[u]) { - // u为头的子树中,选择三个点,u一定不参与 - // 情况1 : u遍历过的所有子树中选一个点,当前子树中选两个点 - // 情况2 : u遍历过的所有子树中选两个点,当前子树中选一个点 + // 情况2,u树上,选择三个点,u没被选中,但跨u选点 for (int i = 0; i <= len[v]; i++) { - if (i > 0 && i + 1 < len[v]) { - ans += getf(u, i) * getg(v, i + 1); - } + // 情况2的分支一,之前遍历的子树里选两个点,当前子树里选一个点 if (i < len[u] && i - 1 >= 0) { ans += getg(u, i) * getf(v, i - 1); } + // 情况2的分支二,之前遍历的子树里选一个点,当前子树里选两个点 + if (i > 0 && i + 1 < len[v]) { + ans += getf(u, i) * getg(v, i + 1); + } } for (int i = 0; i <= len[v]; i++) { - if (i - 1 >= 0) { - setg(u, i, getg(u, i) + getf(u, i) * getf(v, i - 1)); - } if (i + 1 < len[v]) { setg(u, i, getg(u, i) + getg(v, i + 1)); } + if (i - 1 >= 0) { + setg(u, i, getg(u, i) + getf(u, i) * getf(v, i - 1)); + } } for (int i = 0; i <= len[v]; i++) { if (i - 1 >= 0) { @@ -143,8 +143,7 @@ public static void dfs3(int u) { } } } - // u为头的子树中,选择三个点,u一定要参与 - // 情况3 : u为头的子树中,最上方的点选u,下方再选两个点 + // 情况1,u树上,选择三个点,u被选中 ans += getg(u, 0); } diff --git a/src/class162/Code07_HotHotels2.java b/src/class162/Code07_HotHotels2.java index 4b8ecf195..0696dc6c2 100644 --- a/src/class162/Code07_HotHotels2.java +++ b/src/class162/Code07_HotHotels2.java @@ -106,20 +106,20 @@ // v = to[e]; // if (v != son[u] && v != fa[u]) { // for (int i = 0; i <= len[v]; i++) { -// if (i > 0 && i + 1 < len[v]) { -// ans += getf(u, i) * getg(v, i + 1); -// } // if (i < len[u] && i - 1 >= 0) { // ans += getg(u, i) * getf(v, i - 1); // } +// if (i > 0 && i + 1 < len[v]) { +// ans += getf(u, i) * getg(v, i + 1); +// } // } // for (int i = 0; i <= len[v]; i++) { -// if (i - 1 >= 0) { -// setg(u, i, getg(u, i) + getf(u, i) * getf(v, i - 1)); -// } // if (i + 1 < len[v]) { // setg(u, i, getg(u, i) + getg(v, i + 1)); // } +// if (i - 1 >= 0) { +// setg(u, i, getg(u, i) + getf(u, i) * getf(v, i - 1)); +// } // } // for (int i = 0; i <= len[v]; i++) { // if (i - 1 >= 0) { From 069c70e2fafd927cc57be8fd8e1a8c28954912f9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 15 Mar 2025 16:09:15 +0800 Subject: [PATCH 0812/2029] modify code --- src/class097/Code02_LargeNumberIsPrime4.java | 105 +++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 src/class097/Code02_LargeNumberIsPrime4.java diff --git a/src/class097/Code02_LargeNumberIsPrime4.java b/src/class097/Code02_LargeNumberIsPrime4.java new file mode 100644 index 000000000..363c2016f --- /dev/null +++ b/src/class097/Code02_LargeNumberIsPrime4.java @@ -0,0 +1,105 @@ +package class097; + +// Miller-Rabin测试,java版,不用BigInteger也能通过的实现 +// 这个文件课上没有讲,课上讲的是,java中的long是64位 +// 所以 long * long 需要128位才能不溢出,于是直接用BigInteger了 +// 但是 +// 如果a和b都是long类型,其实 a * b的过程,用位运算去实现,中间结果都 % mod 即可 +// 这样就不需要使用BigInteger了 +// 讲解033,位运算实现乘法,增加 每一步 % mod 的逻辑即可 +// 重点看一下本文件,代码中有注释的部分,就是位运算实现乘法的改写 +// C++的同学也可以用本文件的方式来实现,也不需要定义128位的long类型了 +// 测试链接 : https://www.luogu.com.cn/problem/U148828 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + +public class Code02_LargeNumberIsPrime4 { + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + int t = Integer.valueOf(br.readLine()); + for (int i = 0; i < t; i++) { + long n = Long.valueOf(br.readLine()); + out.println(millerRabin(n) ? "Yes" : "No"); + } + out.flush(); + out.close(); + br.close(); + } + + public static long[] p = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37 }; + + public static boolean millerRabin(long n) { + if (n <= 2) { + return n == 2; + } + if ((n & 1) == 0) { + return false; + } + for (int i = 0; i < p.length && p[i] < n; i++) { + if (witness(p[i], n)) { + return false; + } + } + return true; + } + + public static boolean witness(long a, long n) { + long u = n - 1; + int t = 0; + while ((u & 1) == 0) { + t++; + u >>= 1; + } + long x1 = power(a, u, n), x2; + for (int i = 1; i <= t; i++) { + x2 = power(x1, 2, n); + if (x2 == 1 && x1 != 1 && x1 != n - 1) { + return true; + } + x1 = x2; + } + if (x1 != 1) { + return true; + } + return false; + } + + // 返回,n的p次方 % mod + // 乘的每一步都用multiply方法,不用语言自带的乘法 + public static long power(long n, long p, long mod) { + long ans = 1; + while (p > 0) { + if ((p & 1) == 1) { + ans = multiply(ans, n, mod); + } + n = multiply(n, n, mod); + p >>= 1; + } + return ans; + } + + // 这个原理来自,讲解033,位运算实现乘法 + // a * b的过程,用位运算实现,让每一个中间过程都 % mod + // 这么写可以防止溢出,这也叫龟速乘 + public static long multiply(long a, long b, long mod) { + a = (a % mod + mod) % mod; + b = (b % mod + mod) % mod; + long ans = 0; + while (b != 0) { + if ((b & 1) != 0) { + ans = (ans + a) % mod; + } + a = (a + a) % mod; + b >>= 1; + } + return ans; + } + +} \ No newline at end of file From 95f97a6bea8bd9ac8e0a88b726c3ff611593f6a4 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 15 Mar 2025 16:12:39 +0800 Subject: [PATCH 0813/2029] modify code --- src/class097/Code02_LargeNumberIsPrime4.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class097/Code02_LargeNumberIsPrime4.java b/src/class097/Code02_LargeNumberIsPrime4.java index 363c2016f..573c87a21 100644 --- a/src/class097/Code02_LargeNumberIsPrime4.java +++ b/src/class097/Code02_LargeNumberIsPrime4.java @@ -2,7 +2,7 @@ // Miller-Rabin测试,java版,不用BigInteger也能通过的实现 // 这个文件课上没有讲,课上讲的是,java中的long是64位 -// 所以 long * long 需要128位才能不溢出,于是直接用BigInteger了 +// 所以 long * long 需要128位才能不溢出,于是直接用BigInteger中自带的方法了 // 但是 // 如果a和b都是long类型,其实 a * b的过程,用位运算去实现,中间结果都 % mod 即可 // 这样就不需要使用BigInteger了 @@ -85,8 +85,8 @@ public static long power(long n, long p, long mod) { return ans; } + // a * b的过程,用位运算实现,让每一个中间结果都 % mod // 这个原理来自,讲解033,位运算实现乘法 - // a * b的过程,用位运算实现,让每一个中间过程都 % mod // 这么写可以防止溢出,这也叫龟速乘 public static long multiply(long a, long b, long mod) { a = (a % mod + mod) % mod; From 61d6edc44d4984216f95cc74ee982e01dfa652a1 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 15 Mar 2025 16:15:25 +0800 Subject: [PATCH 0814/2029] modify code --- src/class097/Code02_LargeNumberIsPrime4.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class097/Code02_LargeNumberIsPrime4.java b/src/class097/Code02_LargeNumberIsPrime4.java index 573c87a21..68ecfdf22 100644 --- a/src/class097/Code02_LargeNumberIsPrime4.java +++ b/src/class097/Code02_LargeNumberIsPrime4.java @@ -7,8 +7,8 @@ // 如果a和b都是long类型,其实 a * b的过程,用位运算去实现,中间结果都 % mod 即可 // 这样就不需要使用BigInteger了 // 讲解033,位运算实现乘法,增加 每一步 % mod 的逻辑即可 -// 重点看一下本文件,代码中有注释的部分,就是位运算实现乘法的改写 -// C++的同学也可以用本文件的方式来实现,也不需要定义128位的long类型了 +// 重点看一下本文件中的 multiply 方法,就是位运算实现乘法的改写 +// C++的同学也可以用这种方式来实现,也不需要定义128位的long类型 // 测试链接 : https://www.luogu.com.cn/problem/U148828 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 From c8e10920fdc89a1030f18c4cae157dbd8f34dd68 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 15 Mar 2025 16:17:19 +0800 Subject: [PATCH 0815/2029] modify code --- src/class097/Code02_LargeNumberIsPrime4.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class097/Code02_LargeNumberIsPrime4.java b/src/class097/Code02_LargeNumberIsPrime4.java index 68ecfdf22..ced6d2ce6 100644 --- a/src/class097/Code02_LargeNumberIsPrime4.java +++ b/src/class097/Code02_LargeNumberIsPrime4.java @@ -4,8 +4,8 @@ // 这个文件课上没有讲,课上讲的是,java中的long是64位 // 所以 long * long 需要128位才能不溢出,于是直接用BigInteger中自带的方法了 // 但是 -// 如果a和b都是long类型,其实 a * b的过程,用位运算去实现,中间结果都 % mod 即可 -// 这样就不需要使用BigInteger了 +// 如果a和b都是long类型,其实 a * b 的过程,用位运算去实现,中间结果都 % mod 即可 +// 这样就不需要使用BigInteger // 讲解033,位运算实现乘法,增加 每一步 % mod 的逻辑即可 // 重点看一下本文件中的 multiply 方法,就是位运算实现乘法的改写 // C++的同学也可以用这种方式来实现,也不需要定义128位的long类型 From 378c7b094fd28c23048a190c67a8e2e1b74d9653 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 16 Mar 2025 19:43:58 +0800 Subject: [PATCH 0816/2029] modify code --- src/class163/Code01_ColorOnTree1.java | 143 ++++++++++++++++++++++++++ src/class163/Code01_ColorOnTree2.java | 124 ++++++++++++++++++++++ 2 files changed, 267 insertions(+) create mode 100644 src/class163/Code01_ColorOnTree1.java create mode 100644 src/class163/Code01_ColorOnTree2.java diff --git a/src/class163/Code01_ColorOnTree1.java b/src/class163/Code01_ColorOnTree1.java new file mode 100644 index 000000000..aeafd5826 --- /dev/null +++ b/src/class163/Code01_ColorOnTree1.java @@ -0,0 +1,143 @@ +package class163; + +// 树上数颜色,java版 +// 测试链接 : https://www.luogu.com.cn/problem/U41492 +// 提交以下的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 Code01_ColorOnTree1 { + + public static int MAXN = 100001; + public static int n, m; + 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 cnt = 0; + + // 重链剖分 + public static int[] fa = new int[MAXN]; + public static int[] siz = new int[MAXN]; + public static int[] son = new int[MAXN]; + + // 启发式合并 + public static int[] colorCnt = new int[MAXN]; + public static int[] ans = new int[MAXN]; + public static int total = 0; + + public static void addEdge(int u, int v) { + next[++cnt] = head[u]; + to[cnt] = v; + head[u] = cnt; + } + + public static void effect(int u) { + if (++colorCnt[arr[u]] == 1) { + total++; + } + for (int e = head[u], v; e > 0; e = next[e]) { + v = to[e]; + if (v != fa[u]) { + effect(v); + } + } + } + + public static void cancle(int u) { + if (--colorCnt[arr[u]] == 0) { + total--; + } + for (int e = head[u], v; e > 0; e = next[e]) { + v = to[e]; + if (v != fa[u]) { + cancle(v); + } + } + } + + public static void dfs1(int u, int f) { + fa[u] = f; + 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 keep) { + for (int e = head[u], v; e > 0; e = next[e]) { + v = to[e]; + if (v != fa[u] && v != son[u]) { + dfs2(v, 0); + } + } + if (son[u] != 0) { + dfs2(son[u], 1); + } + if (++colorCnt[arr[u]] == 1) { + total++; + } + for (int e = head[u], v; e > 0; e = next[e]) { + v = to[e]; + if (v != fa[u] && v != son[u]) { + effect(v); + } + } + ans[u] = total; + if (keep == 0) { + cancle(u); + } + } + + 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; + 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 <= n; i++) { + in.nextToken(); + arr[i] = (int) in.nval; + } + dfs1(1, 0); + dfs2(1, 1); + in.nextToken(); + m = (int) in.nval; + for (int i = 1, cur; i <= m; i++) { + in.nextToken(); + cur = (int) in.nval; + out.println(ans[cur]); + } + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class163/Code01_ColorOnTree2.java b/src/class163/Code01_ColorOnTree2.java new file mode 100644 index 000000000..e9ebc3418 --- /dev/null +++ b/src/class163/Code01_ColorOnTree2.java @@ -0,0 +1,124 @@ +package class163; + +// 树上数颜色,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/U41492 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//int MAXN = 100001; +//int n, m; +//int arr[100001]; +// +//int head[100001]; +//int nxt[200002]; +//int to[200002]; +//int cnt = 0; +// +//int fa[100001]; +//int siz[100001]; +//int son[100001]; +// +//int colorCnt[100001]; +//int ans[100001]; +//int total = 0; +// +//void addEdge(int u, int v) { +// nxt[++cnt] = head[u]; +// to[cnt] = v; +// head[u] = cnt; +//} +// +//void effect(int u) { +// if (++colorCnt[arr[u]] == 1) { +// total++; +// } +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// if (v != fa[u]) { +// effect(v); +// } +// } +//} +// +//void cancle(int u) { +// if (--colorCnt[arr[u]] == 0) { +// total--; +// } +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// if (v != fa[u]) { +// cancle(v); +// } +// } +//} +// +//void dfs1(int u, int f) { +// fa[u] = f; +// 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 e = head[u], v; e > 0; 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 keep) { +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// if (v != fa[u] && v != son[u]) { +// dfs2(v, 0); +// } +// } +// if (son[u] != 0) { +// dfs2(son[u], 1); +// } +// if (++colorCnt[arr[u]] == 1) { +// total++; +// } +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// if (v != fa[u] && v != son[u]) { +// effect(v); +// } +// } +// ans[u] = total; +// if (keep == 0) { +// cancle(u); +// } +//} +// +//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); +// } +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// dfs1(1, 0); +// dfs2(1, 1); +// cin >> m; +// for (int i = 1, cur; i <= m; i++) { +// cin >> cur; +// cout << ans[cur] << "\n"; +// } +// return 0; +//} \ No newline at end of file From e8bf35a3848183e06eee050820825087b9e9ac81 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 16 Mar 2025 19:44:28 +0800 Subject: [PATCH 0817/2029] modify code --- src/class163/Code01_ColorOnTree1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class163/Code01_ColorOnTree1.java b/src/class163/Code01_ColorOnTree1.java index aeafd5826..d6a7c9b68 100644 --- a/src/class163/Code01_ColorOnTree1.java +++ b/src/class163/Code01_ColorOnTree1.java @@ -23,7 +23,7 @@ public class Code01_ColorOnTree1 { public static int[] to = new int[MAXN << 1]; public static int cnt = 0; - // 重链剖分 + // 树链剖分 public static int[] fa = new int[MAXN]; public static int[] siz = new int[MAXN]; public static int[] son = new int[MAXN]; From 1b8136d3aa11d5e751aff66286d0b2ea9f9df482 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 16 Mar 2025 20:44:32 +0800 Subject: [PATCH 0818/2029] modify code --- src/class163/Code01_ColorOnTree1.java | 4 + src/class163/Code01_ColorOnTree2.java | 20 ++-- src/class163/Code02_ColorBanlance1.java | 143 ++++++++++++++++++++++++ src/class163/Code02_ColorBanlance3.java | 118 +++++++++++++++++++ 4 files changed, 275 insertions(+), 10 deletions(-) create mode 100644 src/class163/Code02_ColorBanlance1.java create mode 100644 src/class163/Code02_ColorBanlance3.java diff --git a/src/class163/Code01_ColorOnTree1.java b/src/class163/Code01_ColorOnTree1.java index d6a7c9b68..d6c15b82c 100644 --- a/src/class163/Code01_ColorOnTree1.java +++ b/src/class163/Code01_ColorOnTree1.java @@ -14,7 +14,10 @@ public class Code01_ColorOnTree1 { public static int MAXN = 100001; + public static int n, m; + + // 每个节点的颜色 public static int[] arr = new int[MAXN]; // 链式前向星 @@ -29,6 +32,7 @@ public class Code01_ColorOnTree1 { public static int[] son = new int[MAXN]; // 启发式合并 + // colorCnt[i] = j,表示i这种颜色出现了j次 public static int[] colorCnt = new int[MAXN]; public static int[] ans = new int[MAXN]; public static int total = 0; diff --git a/src/class163/Code01_ColorOnTree2.java b/src/class163/Code01_ColorOnTree2.java index e9ebc3418..403daa8ea 100644 --- a/src/class163/Code01_ColorOnTree2.java +++ b/src/class163/Code01_ColorOnTree2.java @@ -9,21 +9,21 @@ // //using namespace std; // -//int MAXN = 100001; +//const int MAXN = 100001; //int n, m; -//int arr[100001]; +//int arr[MAXN]; // -//int head[100001]; -//int nxt[200002]; -//int to[200002]; +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; //int cnt = 0; // -//int fa[100001]; -//int siz[100001]; -//int son[100001]; +//int fa[MAXN]; +//int siz[MAXN]; +//int son[MAXN]; // -//int colorCnt[100001]; -//int ans[100001]; +//int colorCnt[MAXN]; +//int ans[MAXN]; //int total = 0; // //void addEdge(int u, int v) { diff --git a/src/class163/Code02_ColorBanlance1.java b/src/class163/Code02_ColorBanlance1.java new file mode 100644 index 000000000..8243b9e49 --- /dev/null +++ b/src/class163/Code02_ColorBanlance1.java @@ -0,0 +1,143 @@ +package class163; + +// 颜色平衡的子树,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P9233 +// 提交以下的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 Code02_ColorBanlance1 { + + public static int MAXN = 200001; + + public static int n; + + // 每个节点的颜色 + 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 cnt = 0; + + // 树链剖分 + public static int[] fa = new int[MAXN]; + public static int[] siz = new int[MAXN]; + public static int[] son = new int[MAXN]; + + // 启发式合并 + // colorCnt[i] = j,表示i这种颜色出现了j次 + public static int[] colorCnt = new int[MAXN]; + // cntCnt[i] = j,表示出现次数为i的颜色一共有j种 + public static int[] cntCnt = new int[MAXN]; + // 颜色平衡子树的个数 + public static int ans = 0; + + public static void addEdge(int u, int v) { + next[++cnt] = head[u]; + to[cnt] = v; + head[u] = cnt; + } + + public static void effect(int u) { + colorCnt[arr[u]]++; + cntCnt[colorCnt[arr[u]] - 1]--; + cntCnt[colorCnt[arr[u]]]++; + for (int e = head[u], v; e > 0; e = next[e]) { + v = to[e]; + if (v != fa[u]) { + effect(v); + } + } + } + + public static void cancle(int u) { + colorCnt[arr[u]]--; + cntCnt[colorCnt[arr[u]] + 1]--; + cntCnt[colorCnt[arr[u]]]++; + for (int e = head[u], v; e > 0; e = next[e]) { + v = to[e]; + if (v != fa[u]) { + cancle(v); + } + } + } + + public static void dfs1(int u, int f) { + fa[u] = f; + 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 keep) { + for (int e = head[u], v; e > 0; e = next[e]) { + v = to[e]; + if (v != fa[u] && v != son[u]) { + dfs2(v, 0); + } + } + if (son[u] != 0) { + dfs2(son[u], 1); + } + colorCnt[arr[u]]++; + cntCnt[colorCnt[arr[u]] - 1]--; + cntCnt[colorCnt[arr[u]]]++; + for (int e = head[u], v; e > 0; e = next[e]) { + v = to[e]; + if (v != fa[u] && v != son[u]) { + effect(v); + } + } + if (colorCnt[arr[u]] * cntCnt[colorCnt[arr[u]]] == siz[u]) { + ans++; + } + if (keep == 0) { + cancle(u); + } + } + + 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; + for (int i = 1, color, father; i <= n; i++) { + in.nextToken(); + color = (int) in.nval; + in.nextToken(); + father = (int) in.nval; + arr[i] = color; + if (i != 1) { + addEdge(father, i); + } + } + dfs1(1, 0); + dfs2(1, 1); + out.println(ans); + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class163/Code02_ColorBanlance3.java b/src/class163/Code02_ColorBanlance3.java new file mode 100644 index 000000000..c03402a31 --- /dev/null +++ b/src/class163/Code02_ColorBanlance3.java @@ -0,0 +1,118 @@ +package class163; + +// 颜色平衡的子树,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P9233 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 200001; +//int n; +//int arr[MAXN]; +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int cnt = 0; +//int fa[MAXN]; +//int siz[MAXN]; +//int son[MAXN]; +//int colorCnt[MAXN]; +//int cntCnt[MAXN]; +//int ans = 0; +// +//void addEdge(int u, int v) { +// nxt[++cnt] = head[u]; +// to[cnt] = v; +// head[u] = cnt; +//} +// +//void effect(int u) { +// colorCnt[arr[u]]++; +// cntCnt[colorCnt[arr[u]] - 1]--; +// cntCnt[colorCnt[arr[u]]]++; +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// if (v != fa[u]) { +// effect(v); +// } +// } +//} +// +//void cancle(int u) { +// colorCnt[arr[u]]--; +// cntCnt[colorCnt[arr[u]] + 1]--; +// cntCnt[colorCnt[arr[u]]]++; +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// if (v != fa[u]) { +// cancle(v); +// } +// } +//} +// +//void dfs1(int u, int f) { +// fa[u] = f; +// 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 e = head[u], v; e > 0; 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 keep) { +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// if (v != fa[u] && v != son[u]) { +// dfs2(v, 0); +// } +// } +// if (son[u] != 0) { +// dfs2(son[u], 1); +// } +// colorCnt[arr[u]]++; +// cntCnt[colorCnt[arr[u]] - 1]--; +// cntCnt[colorCnt[arr[u]]]++; +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// if (v != fa[u] && v != son[u]) { +// effect(v); +// } +// } +// if (colorCnt[arr[u]] * cntCnt[colorCnt[arr[u]]] == siz[u]) { +// ans++; +// } +// if (keep == 0) { +// cancle(u); +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n; +// for (int i = 1, color, father; i <= n; i++) { +// cin >> color >> father; +// arr[i] = color; +// if (i != 1) { +// addEdge(father, i); +// } +// } +// dfs1(1, 0); +// dfs2(1, 1); +// cout << ans << "\n"; +// return 0; +//} \ No newline at end of file From 9ac2ff644abb6740284707c4334a244713a2a946 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 16 Mar 2025 21:59:15 +0800 Subject: [PATCH 0819/2029] modify code --- src/class163/Code02_ColorBanlance1.java | 45 ++---- src/class163/Code02_ColorBanlance2.java | 205 ++++++++++++++++++++++++ src/class163/Code02_ColorBanlance3.java | 39 ++--- 3 files changed, 235 insertions(+), 54 deletions(-) create mode 100644 src/class163/Code02_ColorBanlance2.java diff --git a/src/class163/Code02_ColorBanlance1.java b/src/class163/Code02_ColorBanlance1.java index 8243b9e49..c2a052f36 100644 --- a/src/class163/Code02_ColorBanlance1.java +++ b/src/class163/Code02_ColorBanlance1.java @@ -1,8 +1,10 @@ package class163; -// 颜色平衡的子树,java版 +// 颜色平衡的子树,java实现递归版 // 测试链接 : https://www.luogu.com.cn/problem/P9233 -// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 +// 提交以下的code,提交时请把类名改成"Main" +// 因为递归爆栈了,所以会有两个测试用例无法通过 +// 改成迭代的版本就是本节课Code02_ColorBanlance2文件 import java.io.BufferedReader; import java.io.IOException; @@ -27,7 +29,6 @@ public class Code02_ColorBanlance1 { public static int cnt = 0; // 树链剖分 - public static int[] fa = new int[MAXN]; public static int[] siz = new int[MAXN]; public static int[] son = new int[MAXN]; @@ -49,11 +50,8 @@ public static void effect(int u) { colorCnt[arr[u]]++; cntCnt[colorCnt[arr[u]] - 1]--; cntCnt[colorCnt[arr[u]]]++; - for (int e = head[u], v; e > 0; e = next[e]) { - v = to[e]; - if (v != fa[u]) { - effect(v); - } + for (int e = head[u]; e > 0; e = next[e]) { + effect(to[e]); } } @@ -61,30 +59,21 @@ public static void cancle(int u) { colorCnt[arr[u]]--; cntCnt[colorCnt[arr[u]] + 1]--; cntCnt[colorCnt[arr[u]]]++; - for (int e = head[u], v; e > 0; e = next[e]) { - v = to[e]; - if (v != fa[u]) { - cancle(v); - } + for (int e = head[u]; e > 0; e = next[e]) { + cancle(to[e]); } } - public static void dfs1(int u, int f) { - fa[u] = f; + public static void dfs1(int u) { 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]; e > 0; e = next[e]) { + dfs1(to[e]); } 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; - } + siz[u] += siz[v]; + if (son[u] == 0 || siz[son[u]] < siz[v]) { + son[u] = v; } } } @@ -92,7 +81,7 @@ public static void dfs1(int u, int f) { public static void dfs2(int u, int keep) { for (int e = head[u], v; e > 0; e = next[e]) { v = to[e]; - if (v != fa[u] && v != son[u]) { + if (v != son[u]) { dfs2(v, 0); } } @@ -104,7 +93,7 @@ public static void dfs2(int u, int keep) { cntCnt[colorCnt[arr[u]]]++; for (int e = head[u], v; e > 0; e = next[e]) { v = to[e]; - if (v != fa[u] && v != son[u]) { + if (v != son[u]) { effect(v); } } @@ -132,7 +121,7 @@ public static void main(String[] args) throws IOException { addEdge(father, i); } } - dfs1(1, 0); + dfs1(1); dfs2(1, 1); out.println(ans); out.flush(); diff --git a/src/class163/Code02_ColorBanlance2.java b/src/class163/Code02_ColorBanlance2.java new file mode 100644 index 000000000..c3e51bf32 --- /dev/null +++ b/src/class163/Code02_ColorBanlance2.java @@ -0,0 +1,205 @@ +package class163; + +// 颜色平衡的子树,java实现迭代版 +// 测试链接 : https://www.luogu.com.cn/problem/P9233 +// 提交以下的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 Code02_ColorBanlance2 { + + public static int MAXN = 200001; + public static int n; + 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 cnt = 0; + public static int[] siz = new int[MAXN]; + public static int[] son = new int[MAXN]; + public static int[] colorCnt = new int[MAXN]; + public static int[] cntCnt = new int[MAXN]; + public static int ans = 0; + + public static void addEdge(int u, int v) { + next[++cnt] = head[u]; + to[cnt] = v; + head[u] = cnt; + } + + public static int[][] stack1 = new int[MAXN][2]; + + public static int size1; + + public static int cur1, edge1; + + public static int[][] stack2 = new int[MAXN][3]; + + public static int size2; + + public static int cur2, edge2, keep2; + + public static void push1(int u, int e) { + stack1[size1][0] = u; + stack1[size1][1] = e; + size1++; + } + + public static void pop1() { + --size1; + cur1 = stack1[size1][0]; + edge1 = stack1[size1][1]; + } + + public static void push2(int u, int e, int k) { + stack2[size2][0] = u; + stack2[size2][1] = e; + stack2[size2][2] = k; + size2++; + } + + public static void pop2() { + --size2; + cur2 = stack2[size2][0]; + edge2 = stack2[size2][1]; + keep2 = stack2[size2][2]; + } + + public static void effect(int root) { + size1 = 0; + push1(root, -1); + while (size1 > 0) { + pop1(); + if (edge1 == -1) { + colorCnt[arr[cur1]]++; + cntCnt[colorCnt[arr[cur1]] - 1]--; + cntCnt[colorCnt[arr[cur1]]]++; + edge1 = head[cur1]; + } else { + edge1 = next[edge1]; + } + if (edge1 != 0) { + push1(cur1, edge1); + push1(to[edge1], -1); + } + } + } + + public static void cancle(int root) { + size1 = 0; + push1(root, -1); + while (size1 > 0) { + pop1(); + if (edge1 == -1) { + colorCnt[arr[cur1]]--; + cntCnt[colorCnt[arr[cur1]] + 1]--; + cntCnt[colorCnt[arr[cur1]]]++; + edge1 = head[cur1]; + } else { + edge1 = next[edge1]; + } + if (edge1 != 0) { + push1(cur1, edge1); + push1(to[edge1], -1); + } + } + } + + public static void dfs1() { + size1 = 0; + push1(1, -1); + while (size1 > 0) { + pop1(); + if (edge1 == -1) { + siz[cur1] = 1; + edge1 = head[cur1]; + } else { + edge1 = next[edge1]; + } + if (edge1 != 0) { + push1(cur1, edge1); + push1(to[edge1], -1); + } else { + for (int e = head[cur1], v; e > 0; e = next[e]) { + v = to[e]; + siz[cur1] += siz[v]; + if (son[cur1] == 0 || siz[son[cur1]] < siz[v]) { + son[cur1] = v; + } + } + } + } + } + + public static void dfs2() { + size2 = 0; + push2(1, -1, 1); + while (size2 > 0) { + pop2(); + if (edge2 != -2) { + if (edge2 == -1) { + edge2 = head[cur2]; + } else { + edge2 = next[edge2]; + } + if (edge2 > 0) { + push2(cur2, edge2, keep2); + if (to[edge2] != son[cur2]) { + push2(to[edge2], -1, 0); + } + } else { + push2(cur2, -2, keep2); + if (son[cur2] != 0) { + push2(son[cur2], -1, 1); + } + } + } else { + colorCnt[arr[cur2]]++; + cntCnt[colorCnt[arr[cur2]] - 1]--; + cntCnt[colorCnt[arr[cur2]]]++; + for (int e = head[cur2], v; e > 0; e = next[e]) { + v = to[e]; + if (v != son[cur2]) { + effect(v); + } + } + if (colorCnt[arr[cur2]] * cntCnt[colorCnt[arr[cur2]]] == siz[cur2]) { + ans++; + } + if (keep2 == 0) { + cancle(cur2); + } + } + } + } + + 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; + for (int i = 1, color, father; i <= n; i++) { + in.nextToken(); + color = (int) in.nval; + in.nextToken(); + father = (int) in.nval; + arr[i] = color; + if (i != 1) { + addEdge(father, i); + } + } + dfs1(); + dfs2(); + out.println(ans); + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class163/Code02_ColorBanlance3.java b/src/class163/Code02_ColorBanlance3.java index c03402a31..93a33d845 100644 --- a/src/class163/Code02_ColorBanlance3.java +++ b/src/class163/Code02_ColorBanlance3.java @@ -16,7 +16,6 @@ //int nxt[MAXN << 1]; //int to[MAXN << 1]; //int cnt = 0; -//int fa[MAXN]; //int siz[MAXN]; //int son[MAXN]; //int colorCnt[MAXN]; @@ -33,11 +32,8 @@ // colorCnt[arr[u]]++; // cntCnt[colorCnt[arr[u]] - 1]--; // cntCnt[colorCnt[arr[u]]]++; -// for (int e = head[u], v; e > 0; e = nxt[e]) { -// v = to[e]; -// if (v != fa[u]) { -// effect(v); -// } +// for (int e = head[u]; e > 0; e = nxt[e]) { +// effect(to[e]); // } //} // @@ -45,30 +41,21 @@ // colorCnt[arr[u]]--; // cntCnt[colorCnt[arr[u]] + 1]--; // cntCnt[colorCnt[arr[u]]]++; -// for (int e = head[u], v; e > 0; e = nxt[e]) { -// v = to[e]; -// if (v != fa[u]) { -// cancle(v); -// } +// for (int e = head[u]; e > 0; e = nxt[e]) { +// cancle(to[e]); // } //} // -//void dfs1(int u, int f) { -// fa[u] = f; +//void dfs1(int u) { // 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 e = head[u]; e > 0; e = nxt[e]) { +// dfs1(to[e]); // } // for (int e = head[u], v; e > 0; 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; -// } +// siz[u] += siz[v]; +// if (son[u] == 0 || siz[son[u]] < siz[v]) { +// son[u] = v; // } // } //} @@ -76,7 +63,7 @@ //void dfs2(int u, int keep) { // for (int e = head[u], v; e > 0; e = nxt[e]) { // v = to[e]; -// if (v != fa[u] && v != son[u]) { +// if (v != son[u]) { // dfs2(v, 0); // } // } @@ -88,7 +75,7 @@ // cntCnt[colorCnt[arr[u]]]++; // for (int e = head[u], v; e > 0; e = nxt[e]) { // v = to[e]; -// if (v != fa[u] && v != son[u]) { +// if (v != son[u]) { // effect(v); // } // } @@ -111,7 +98,7 @@ // addEdge(father, i); // } // } -// dfs1(1, 0); +// dfs1(1); // dfs2(1, 1); // cout << ans << "\n"; // return 0; From 5e6b1469521253d267fe721dda8a09f6a192b3d0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 16 Mar 2025 22:06:55 +0800 Subject: [PATCH 0820/2029] modify code --- src/class163/Code02_ColorBanlance1.java | 4 +- src/class163/Code02_ColorBanlance2.java | 49 ++++++++++++------------- 2 files changed, 26 insertions(+), 27 deletions(-) diff --git a/src/class163/Code02_ColorBanlance1.java b/src/class163/Code02_ColorBanlance1.java index c2a052f36..e36462f02 100644 --- a/src/class163/Code02_ColorBanlance1.java +++ b/src/class163/Code02_ColorBanlance1.java @@ -3,8 +3,8 @@ // 颜色平衡的子树,java实现递归版 // 测试链接 : https://www.luogu.com.cn/problem/P9233 // 提交以下的code,提交时请把类名改成"Main" -// 因为递归爆栈了,所以会有两个测试用例无法通过 -// 改成迭代的版本就是本节课Code02_ColorBanlance2文件 +// 因为树的深度太大,递归函数爆栈了,所以会有两个测试用例无法通过 +// 迭代版可以完全通过,就是本节课Code02_ColorBanlance2文件 import java.io.BufferedReader; import java.io.IOException; diff --git a/src/class163/Code02_ColorBanlance2.java b/src/class163/Code02_ColorBanlance2.java index c3e51bf32..ae1826614 100644 --- a/src/class163/Code02_ColorBanlance2.java +++ b/src/class163/Code02_ColorBanlance2.java @@ -32,17 +32,16 @@ public static void addEdge(int u, int v) { head[u] = cnt; } + // 不会改迭代版,去看讲解118,详解了从递归版改迭代版 + // stack1、size1、cur1、edge1 + // 用来把effect、cancle、dfs1改成迭代版 public static int[][] stack1 = new int[MAXN][2]; + public static int size1, cur1, edge1; - public static int size1; - - public static int cur1, edge1; - + // stack2、size2、cur2、edge2、keep2 + // 用来把dfs2改成迭代版 public static int[][] stack2 = new int[MAXN][3]; - - public static int size2; - - public static int cur2, edge2, keep2; + public static int size2, cur2, edge2, keep2; public static void push1(int u, int e) { stack1[size1][0] = u; @@ -141,7 +140,23 @@ public static void dfs2() { push2(1, -1, 1); while (size2 > 0) { pop2(); - if (edge2 != -2) { + if (edge2 == -2) { + colorCnt[arr[cur2]]++; + cntCnt[colorCnt[arr[cur2]] - 1]--; + cntCnt[colorCnt[arr[cur2]]]++; + for (int e = head[cur2], v; e > 0; e = next[e]) { + v = to[e]; + if (v != son[cur2]) { + effect(v); + } + } + if (colorCnt[arr[cur2]] * cntCnt[colorCnt[arr[cur2]]] == siz[cur2]) { + ans++; + } + if (keep2 == 0) { + cancle(cur2); + } + } else { if (edge2 == -1) { edge2 = head[cur2]; } else { @@ -158,22 +173,6 @@ public static void dfs2() { push2(son[cur2], -1, 1); } } - } else { - colorCnt[arr[cur2]]++; - cntCnt[colorCnt[arr[cur2]] - 1]--; - cntCnt[colorCnt[arr[cur2]]]++; - for (int e = head[cur2], v; e > 0; e = next[e]) { - v = to[e]; - if (v != son[cur2]) { - effect(v); - } - } - if (colorCnt[arr[cur2]] * cntCnt[colorCnt[arr[cur2]]] == siz[cur2]) { - ans++; - } - if (keep2 == 0) { - cancle(cur2); - } } } } From fbc06b17f9b5d02126511902586ad4fed17fedda Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 16 Mar 2025 22:09:13 +0800 Subject: [PATCH 0821/2029] modify code --- src/class163/Code02_ColorBanlance2.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/class163/Code02_ColorBanlance2.java b/src/class163/Code02_ColorBanlance2.java index ae1826614..97b3fb697 100644 --- a/src/class163/Code02_ColorBanlance2.java +++ b/src/class163/Code02_ColorBanlance2.java @@ -33,13 +33,11 @@ public static void addEdge(int u, int v) { } // 不会改迭代版,去看讲解118,详解了从递归版改迭代版 - // stack1、size1、cur1、edge1 - // 用来把effect、cancle、dfs1改成迭代版 + // stack1、size1、cur1、edge1,用于把effect、cancle、dfs1改成迭代版 public static int[][] stack1 = new int[MAXN][2]; public static int size1, cur1, edge1; - // stack2、size2、cur2、edge2、keep2 - // 用来把dfs2改成迭代版 + // stack2、size2、cur2、edge2、keep2,用于把dfs2改成迭代版 public static int[][] stack2 = new int[MAXN][3]; public static int size2, cur2, edge2, keep2; From 0f09382f62a5afb7f1e152a8642af15c856b6eb5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 17 Mar 2025 17:35:51 +0800 Subject: [PATCH 0822/2029] modify code --- .../Code03_LongestRearrangePalindrome1.java | 231 ++++++++++++++++++ .../Code03_LongestRearrangePalindrome2.java | 135 ++++++++++ 2 files changed, 366 insertions(+) create mode 100644 src/class163/Code03_LongestRearrangePalindrome1.java create mode 100644 src/class163/Code03_LongestRearrangePalindrome2.java diff --git a/src/class163/Code03_LongestRearrangePalindrome1.java b/src/class163/Code03_LongestRearrangePalindrome1.java new file mode 100644 index 000000000..c740463e6 --- /dev/null +++ b/src/class163/Code03_LongestRearrangePalindrome1.java @@ -0,0 +1,231 @@ +package class163; + +// 最长重排回文路径,java版,本题递归函数不会爆栈 +// 测试链接 : https://www.luogu.com.cn/problem/CF741D +// 测试链接 : https://codeforces.com/problemset/problem/741/D +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + +public class Code03_LongestRearrangePalindrome1 { + + public static int MAXN = 500001; + // 字符种类最多22种 + public static int MAXV = 22; + public static int n; + + // 链式前向星 + 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[] weight = new int[MAXN << 1]; + public static int cnt = 0; + + // 树链剖分 + public static int[] siz = new int[MAXN]; + public static int[] dep = new int[MAXN]; + public static int[] eor = new int[MAXN]; + public static int[] son = new int[MAXN]; + + // 统计答案 + public static int[] maxdep = new int[1 << MAXV]; + public static int[] ans = new int[MAXN]; + + public static void addEdge(int u, int v, int w) { + next[++cnt] = head[u]; + to[cnt] = v; + weight[cnt] = w; + head[u] = cnt; + } + + public static void dfs1(int u, int d, int x) { + siz[u] = 1; + dep[u] = d; + eor[u] = x; + for (int e = head[u]; e > 0; e = next[e]) { + dfs1(to[e], d + 1, x ^ (1 << weight[e])); + } + for (int e = head[u], v; e > 0; e = next[e]) { + v = to[e]; + siz[u] += siz[v]; + if (son[u] == 0 || siz[son[u]] < siz[v]) { + son[u] = v; + } + } + } + + public static void effect(int u) { + maxdep[eor[u]] = Math.max(maxdep[eor[u]], dep[u]); + for (int e = head[u]; e > 0; e = next[e]) { + effect(to[e]); + } + } + + public static void cancle(int u) { + maxdep[eor[u]] = 0; + for (int e = head[u]; e > 0; e = next[e]) { + cancle(to[e]); + } + } + + public static int cross(int u, int lcaDep) { + int ans = 0; + if (maxdep[eor[u]] != 0) { + ans = Math.max(ans, maxdep[eor[u]] + dep[u] - lcaDep * 2); + } + for (int i = 0; i < MAXV; i++) { + if (maxdep[eor[u] ^ (1 << i)] != 0) { + ans = Math.max(ans, maxdep[eor[u] ^ (1 << i)] + dep[u] - lcaDep * 2); + } + } + for (int e = head[u]; e > 0; e = next[e]) { + ans = Math.max(ans, cross(to[e], lcaDep)); + } + return ans; + } + + public static void dfs2(int u, int keep) { + for (int e = head[u], v; e > 0; e = next[e]) { + v = to[e]; + if (v != son[u]) { + dfs2(v, 0); + } + } + if (son[u] != 0) { + dfs2(son[u], 1); + } + for (int e = head[u]; e > 0; e = next[e]) { + ans[u] = Math.max(ans[u], ans[to[e]]); + } + if (maxdep[eor[u]] != 0) { + ans[u] = Math.max(ans[u], maxdep[eor[u]] - dep[u]); + } + for (int i = 0; i < MAXV; i++) { + if (maxdep[eor[u] ^ (1 << i)] != 0) { + ans[u] = Math.max(ans[u], maxdep[eor[u] ^ (1 << i)] - dep[u]); + } + } + maxdep[eor[u]] = Math.max(maxdep[eor[u]], dep[u]); + for (int e = head[u], v; e > 0; e = next[e]) { + v = to[e]; + if (v != son[u]) { + ans[u] = Math.max(ans[u], cross(v, dep[u])); + effect(v); + } + } + if (keep == 0) { + cancle(u); + } + } + + public static void main(String[] args) throws IOException { + FastReader in = new FastReader(); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + n = in.nextInt(); + for (int i = 2, fth, edg; i <= n; i++) { + fth = in.nextInt(); + edg = in.nextChar() - 'a'; + addEdge(fth, i, edg); + } + dfs1(1, 1, 0); + dfs2(1, 1); + for (int i = 1; i <= n; i++) { + out.print(ans[i] + " "); + } + out.println(); + 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; + } + + public double nextDouble() throws IOException { + double num = 0, div = 1; + byte b = readByte(); + while (isWhitespace(b)) + b = readByte(); + boolean minus = false; + if (b == '-') { + minus = true; + b = readByte(); + } + while (!isWhitespace(b) && b != '.' && b != -1) { + num = num * 10 + (b - '0'); + b = readByte(); + } + if (b == '.') { + b = readByte(); + while (!isWhitespace(b) && b != -1) { + num += (b - '0') / (div *= 10); + b = readByte(); + } + } + return minus ? -num : num; + } + + private boolean isWhitespace(byte b) { + return b == ' ' || b == '\n' || b == '\r' || b == '\t'; + } + } + +} diff --git a/src/class163/Code03_LongestRearrangePalindrome2.java b/src/class163/Code03_LongestRearrangePalindrome2.java new file mode 100644 index 000000000..4732ef008 --- /dev/null +++ b/src/class163/Code03_LongestRearrangePalindrome2.java @@ -0,0 +1,135 @@ +package class163; + +// 最长重排回文路径,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/CF741D +// 测试链接 : https://codeforces.com/problemset/problem/741/D +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 500001; +//const int MAXV = 22; +//int n; +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int weight[MAXN << 1]; +//int cnt = 0; +//int siz[MAXN]; +//int dep[MAXN]; +//int eor[MAXN]; +//int son[MAXN]; +//int maxdep[1 << MAXV]; +//int ans[MAXN]; +// +//void addEdge(int u, int v, int w) { +// nxt[++cnt] = head[u]; +// to[cnt] = v; +// weight[cnt] = w; +// head[u] = cnt; +//} +// +//void dfs1(int u, int d, int x) { +// siz[u] = 1; +// dep[u] = d; +// eor[u] = x; +// for (int e = head[u]; e > 0; e = nxt[e]) { +// dfs1(to[e], d + 1, x ^ (1 << weight[e])); +// } +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// siz[u] += siz[v]; +// if (son[u] == 0 || siz[son[u]] < siz[v]) { +// son[u] = v; +// } +// } +//} +// +//void effect(int u) { +// maxdep[eor[u]] = max(maxdep[eor[u]], dep[u]); +// for (int e = head[u]; e > 0; e = nxt[e]) { +// effect(to[e]); +// } +//} +// +//void cancle(int u) { +// maxdep[eor[u]] = 0; +// for (int e = head[u]; e > 0; e = nxt[e]) { +// cancle(to[e]); +// } +//} +// +//int cross(int u, int lcaDep) { +// int ret = 0; +// if (maxdep[eor[u]] != 0) { +// ret = max(ret, maxdep[eor[u]] + dep[u] - lcaDep * 2); +// } +// for (int i = 0; i < MAXV; i++) { +// if (maxdep[eor[u] ^ (1 << i)] != 0) { +// ret = max(ret, maxdep[eor[u] ^ (1 << i)] + dep[u] - lcaDep * 2); +// } +// } +// for (int e = head[u]; e > 0; e = nxt[e]) { +// ret = max(ret, cross(to[e], lcaDep)); +// } +// return ret; +//} +// +//void dfs2(int u, int keep) { +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// if (v != son[u]) { +// dfs2(v, 0); +// } +// } +// if (son[u] != 0) { +// dfs2(son[u], 1); +// } +// for (int e = head[u]; e > 0; e = nxt[e]) { +// ans[u] = max(ans[u], ans[to[e]]); +// } +// if (maxdep[eor[u]] != 0) { +// ans[u] = max(ans[u], maxdep[eor[u]] - dep[u]); +// } +// for (int i = 0; i < MAXV; i++) { +// if (maxdep[eor[u] ^ (1 << i)] != 0) { +// ans[u] = max(ans[u], maxdep[eor[u] ^ (1 << i)] - dep[u]); +// } +// } +// maxdep[eor[u]] = max(maxdep[eor[u]], dep[u]); +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// if (v != son[u]) { +// ans[u] = max(ans[u], cross(v, dep[u])); +// effect(v); +// } +// } +// if (keep == 0) { +// cancle(u); +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n; +// int fth; +// int edg; +// char c; +// for (int i = 2; i <= n; i++) { +// cin >> fth; +// cin >> c; +// edg = c - 'a'; +// addEdge(fth, i, edg); +// } +// dfs1(1, 1, 0); +// dfs2(1, 1); +// for (int i = 1; i <= n; i++) { +// cout << ans[i] << " "; +// } +// cout << "\n"; +// return 0; +//} \ No newline at end of file From 6431c80f7ba180facb35fe786446f7bedc57e341 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 17 Mar 2025 17:38:23 +0800 Subject: [PATCH 0823/2029] modify code --- .../Code03_LongestRearrangePalindrome2.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/class163/Code03_LongestRearrangePalindrome2.java b/src/class163/Code03_LongestRearrangePalindrome2.java index 4732ef008..f9c34e2c8 100644 --- a/src/class163/Code03_LongestRearrangePalindrome2.java +++ b/src/class163/Code03_LongestRearrangePalindrome2.java @@ -26,14 +26,14 @@ //int ans[MAXN]; // //void addEdge(int u, int v, int w) { -// nxt[++cnt] = head[u]; -// to[cnt] = v; -// weight[cnt] = w; +// nxt[++cnt] = head[u]; +// to[cnt] = v; +// weight[cnt] = w; // head[u] = cnt; //} // //void dfs1(int u, int d, int x) { -// siz[u] = 1; +// siz[u] = 1; // dep[u] = d; // eor[u] = x; // for (int e = head[u]; e > 0; e = nxt[e]) { @@ -89,21 +89,21 @@ // dfs2(son[u], 1); // } // for (int e = head[u]; e > 0; e = nxt[e]) { -// ans[u] = max(ans[u], ans[to[e]]); +// ans[u] = max(ans[u], ans[to[e]]); // } // if (maxdep[eor[u]] != 0) { -// ans[u] = max(ans[u], maxdep[eor[u]] - dep[u]); +// ans[u] = max(ans[u], maxdep[eor[u]] - dep[u]); // } // for (int i = 0; i < MAXV; i++) { // if (maxdep[eor[u] ^ (1 << i)] != 0) { -// ans[u] = max(ans[u], maxdep[eor[u] ^ (1 << i)] - dep[u]); +// ans[u] = max(ans[u], maxdep[eor[u] ^ (1 << i)] - dep[u]); // } // } // maxdep[eor[u]] = max(maxdep[eor[u]], dep[u]); // for (int e = head[u], v; e > 0; e = nxt[e]) { // v = to[e]; // if (v != son[u]) { -// ans[u] = max(ans[u], cross(v, dep[u])); +// ans[u] = max(ans[u], cross(v, dep[u])); // effect(v); // } // } From 7b9a93e4b57e295b2246b61e61ead13a0fc553f0 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 17 Mar 2025 17:39:11 +0800 Subject: [PATCH 0824/2029] modify code --- src/class163/Code03_LongestRearrangePalindrome1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class163/Code03_LongestRearrangePalindrome1.java b/src/class163/Code03_LongestRearrangePalindrome1.java index c740463e6..cb5921d41 100644 --- a/src/class163/Code03_LongestRearrangePalindrome1.java +++ b/src/class163/Code03_LongestRearrangePalindrome1.java @@ -1,6 +1,6 @@ package class163; -// 最长重排回文路径,java版,本题递归函数不会爆栈 +// 最长重排回文路径,java版,本题写递归函数不会爆栈 // 测试链接 : https://www.luogu.com.cn/problem/CF741D // 测试链接 : https://codeforces.com/problemset/problem/741/D // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 From b9e32d7b67b9f061922a486e5f31842d7c13c447 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 17 Mar 2025 21:09:15 +0800 Subject: [PATCH 0825/2029] modify code --- src/class163/Code03_BloodCousins1.java | 173 ++++++++++++++++++ src/class163/Code03_BloodCousins2.java | 157 ++++++++++++++++ ...> Code06_LongestRearrangePalindrome1.java} | 4 +- ...> Code06_LongestRearrangePalindrome2.java} | 0 4 files changed, 332 insertions(+), 2 deletions(-) create mode 100644 src/class163/Code03_BloodCousins1.java create mode 100644 src/class163/Code03_BloodCousins2.java rename src/class163/{Code03_LongestRearrangePalindrome1.java => Code06_LongestRearrangePalindrome1.java} (97%) rename src/class163/{Code03_LongestRearrangePalindrome2.java => Code06_LongestRearrangePalindrome2.java} (100%) diff --git a/src/class163/Code03_BloodCousins1.java b/src/class163/Code03_BloodCousins1.java new file mode 100644 index 000000000..4a2f713d4 --- /dev/null +++ b/src/class163/Code03_BloodCousins1.java @@ -0,0 +1,173 @@ +package class163; + +// 表亲数量,java版 +// 测试链接 : https://www.luogu.com.cn/problem/CF208E +// 测试链接 : https://codeforces.com/problemset/problem/208/E +// 提交以下的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 Code03_BloodCousins1 { + + public static int MAXN = 100001; + public static int MAXH = 20; + public static int n, m; + + public static boolean[] root = new boolean[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[] headq = new int[MAXN]; + public static int[] nextq = new int[MAXN << 1]; + public static int[] idxq = new int[MAXN << 1]; + public static int[] kthq = new int[MAXN << 1]; + public static int cntq; + + public static int[] siz = new int[MAXN]; + public static int[] dep = new int[MAXN]; + public static int[] son = new int[MAXN]; + public static int[][] stjump = new int[MAXN][MAXH]; + + public static int[] nodeCnt = new int[MAXN]; + public static int[] ans = new int[MAXN]; + + public static void addEdge(int u, int v) { + nextg[++cntg] = headg[u]; + tog[cntg] = v; + headg[u] = cntg; + } + + public static void addQuestion(int u, int idx, int kth) { + nextq[++cntq] = headq[u]; + idxq[cntq] = idx; + kthq[cntq] = kth; + headq[u] = cntq; + } + + public static int kAncestor(int u, int k) { + for (int p = MAXH - 1; p >= 0; p--) { + if (k >= 1 << p) { + k -= 1 << p; + u = stjump[u][p]; + } + } + return u; + } + + public static void dfs1(int u, int fa) { + siz[u] = 1; + 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 = headg[u]; e > 0; e = nextg[e]) { + dfs1(tog[e], u); + } + for (int e = headg[u], v; e > 0; e = nextg[e]) { + v = tog[e]; + siz[u] += siz[v]; + if (son[u] == 0 || siz[son[u]] < siz[v]) { + son[u] = v; + } + } + } + + public static void effect(int u) { + nodeCnt[dep[u]]++; + for (int e = headg[u]; e > 0; e = nextg[e]) { + effect(tog[e]); + } + } + + public static void cancle(int u) { + nodeCnt[dep[u]]--; + for (int e = headg[u]; e > 0; e = nextg[e]) { + cancle(tog[e]); + } + } + + public static void dfs2(int u, int keep) { + for (int e = headg[u], v; e > 0; e = nextg[e]) { + v = tog[e]; + if (v != son[u]) { + dfs2(v, 0); + } + } + if (son[u] != 0) { + dfs2(son[u], 1); + } + nodeCnt[dep[u]]++; + for (int e = headg[u], v; e > 0; e = nextg[e]) { + v = tog[e]; + if (v != son[u]) { + effect(v); + } + } + for (int i = headq[u]; i > 0; i = nextq[i]) { + ans[idxq[i]] = nodeCnt[dep[u] + kthq[i]]; + } + if (keep == 0) { + cancle(u); + } + } + + 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; + for (int i = 1, father; i <= n; i++) { + in.nextToken(); + father = (int) in.nval; + if (father == 0) { + root[i] = true; + } else { + addEdge(father, i); + } + } + for (int i = 1; i <= n; i++) { + if (root[i]) { + dfs1(i, 0); + } + } + in.nextToken(); + m = (int) in.nval; + for (int i = 1, u, k, kfather; i <= m; i++) { + in.nextToken(); + u = (int) in.nval; + in.nextToken(); + k = (int) in.nval; + kfather = kAncestor(u, k); + if (kfather != 0) { + addQuestion(kfather, i, k); + } + } + for (int i = 1; i <= n; i++) { + if (root[i]) { + dfs2(i, 0); + } + } + for (int i = 1; i <= m; i++) { + if (ans[i] == 0) { + out.print("0 "); + } else { + out.print((ans[i] - 1) + " "); + } + } + out.println(); + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class163/Code03_BloodCousins2.java b/src/class163/Code03_BloodCousins2.java new file mode 100644 index 000000000..50bc6c949 --- /dev/null +++ b/src/class163/Code03_BloodCousins2.java @@ -0,0 +1,157 @@ +package class163; + +// 表亲数量,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/CF208E +// 测试链接 : https://codeforces.com/problemset/problem/208/E +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +//const int MAXH = 20; +//int n, m; +// +//bool root[MAXN]; +//int headg[MAXN]; +//int nextg[MAXN << 1]; +//int tog[MAXN << 1]; +//int cntg; +// +//int headq[MAXN]; +//int nextq[MAXN << 1]; +//int idxq[MAXN << 1]; +//int kthq[MAXN << 1]; +//int cntq; +// +//int siz[MAXN]; +//int dep[MAXN]; +//int son[MAXN]; +//int stjump[MAXN][20]; +// +//int nodeCnt[MAXN]; +//int ans[MAXN]; +// +//void addEdge(int u, int v) { +// nextg[++cntg] = headg[u]; +// tog[cntg] = v; +// headg[u] = cntg; +//} +// +//void addQuestion(int u, int idx, int kth) { +// nextq[++cntq] = headq[u]; +// idxq[cntq] = idx; +// kthq[cntq] = kth; +// headq[u] = cntq; +//} +// +//int kAncestor(int u, int k) { +// for (int p = MAXH - 1; p >= 0; p--) { +// if (k >= (1 << p)) { +// k -= (1 << p); +// u = stjump[u][p]; +// } +// } +// return u; +//} +// +//void dfs1(int u, int fa) { +// siz[u] = 1; +// 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 = headg[u]; e > 0; e = nextg[e]) { +// dfs1(tog[e], u); +// } +// for (int e = headg[u], v; e > 0; e = nextg[e]) { +// v = tog[e]; +// siz[u] += siz[v]; +// if (son[u] == 0 || siz[son[u]] < siz[v]) { +// son[u] = v; +// } +// } +//} +// +//void effect(int u) { +// nodeCnt[dep[u]]++; +// for (int e = headg[u]; e > 0; e = nextg[e]) { +// effect(tog[e]); +// } +//} +// +//void cancle(int u) { +// nodeCnt[dep[u]]--; +// for (int e = headg[u]; e > 0; e = nextg[e]) { +// cancle(tog[e]); +// } +//} +// +//void dfs2(int u, int keep) { +// for (int e = headg[u], v; e > 0; e = nextg[e]) { +// v = tog[e]; +// if (v != son[u]) { +// dfs2(v, 0); +// } +// } +// if (son[u] != 0) { +// dfs2(son[u], 1); +// } +// nodeCnt[dep[u]]++; +// for (int e = headg[u], v; e > 0; e = nextg[e]) { +// v = tog[e]; +// if (v != son[u]) { +// effect(v); +// } +// } +// for (int i = headq[u]; i > 0; i = nextq[i]) { +// ans[idxq[i]] = nodeCnt[dep[u] + kthq[i]]; +// } +// if (keep == 0) { +// cancle(u); +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n; +// for (int i = 1, father; i <= n; i++) { +// cin >> father; +// if (father == 0) { +// root[i] = true; +// } else { +// addEdge(father, i); +// } +// } +// for (int i = 1; i <= n; i++) { +// if (root[i]) { +// dfs1(i, 0); +// } +// } +// cin >> m; +// for (int i = 1, u, k, kfather; i <= m; i++) { +// cin >> u >> k; +// kfather = kAncestor(u, k); +// if (kfather != 0) { +// addQuestion(kfather, i, k); +// } +// } +// for (int i = 1; i <= n; i++) { +// if (root[i]) { +// dfs2(i, 0); +// } +// } +// for (int i = 1; i <= m; i++) { +// if (ans[i] == 0) { +// cout << "0 "; +// } else { +// cout << ans[i] - 1 << " "; +// } +// } +// cout << "\n"; +// return 0; +//} \ No newline at end of file diff --git a/src/class163/Code03_LongestRearrangePalindrome1.java b/src/class163/Code06_LongestRearrangePalindrome1.java similarity index 97% rename from src/class163/Code03_LongestRearrangePalindrome1.java rename to src/class163/Code06_LongestRearrangePalindrome1.java index cb5921d41..984e53f0f 100644 --- a/src/class163/Code03_LongestRearrangePalindrome1.java +++ b/src/class163/Code06_LongestRearrangePalindrome1.java @@ -1,6 +1,6 @@ package class163; -// 最长重排回文路径,java版,本题写递归函数不会爆栈 +// 最长重排回文路径,java版 // 测试链接 : https://www.luogu.com.cn/problem/CF741D // 测试链接 : https://codeforces.com/problemset/problem/741/D // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -10,7 +10,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code03_LongestRearrangePalindrome1 { +public class Code06_LongestRearrangePalindrome1 { public static int MAXN = 500001; // 字符种类最多22种 diff --git a/src/class163/Code03_LongestRearrangePalindrome2.java b/src/class163/Code06_LongestRearrangePalindrome2.java similarity index 100% rename from src/class163/Code03_LongestRearrangePalindrome2.java rename to src/class163/Code06_LongestRearrangePalindrome2.java From 0c90e3df8b0262c3e04520050af9eb1318cab0b3 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 17 Mar 2025 21:13:08 +0800 Subject: [PATCH 0826/2029] modify code --- src/class163/Code03_BloodCousins1.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/class163/Code03_BloodCousins1.java b/src/class163/Code03_BloodCousins1.java index 4a2f713d4..7855e1cc7 100644 --- a/src/class163/Code03_BloodCousins1.java +++ b/src/class163/Code03_BloodCousins1.java @@ -136,6 +136,8 @@ public static void main(String[] args) throws IOException { } } for (int i = 1; i <= n; i++) { + // 因为是森林结构,可能有多棵子树彼此是不联通的 + // 所以对每一棵子树进行重链剖分、生成倍增表 if (root[i]) { dfs1(i, 0); } @@ -153,6 +155,10 @@ public static void main(String[] args) throws IOException { } } for (int i = 1; i <= n; i++) { + // 因为是森林结构,可能有多棵子树彼此是不联通的 + // 所以认为每一棵树的头都是轻儿子 + // 这样每棵子树运行完后都会消除影响 + // 不会影响下一棵子树的答案 if (root[i]) { dfs2(i, 0); } From abf2c1b2780115d6faa62e3c677f6e3aebaf5d68 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Mon, 17 Mar 2025 21:19:11 +0800 Subject: [PATCH 0827/2029] modify code --- src/class163/Code03_BloodCousins2.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class163/Code03_BloodCousins2.java b/src/class163/Code03_BloodCousins2.java index 50bc6c949..4c2a955f6 100644 --- a/src/class163/Code03_BloodCousins2.java +++ b/src/class163/Code03_BloodCousins2.java @@ -29,7 +29,7 @@ //int siz[MAXN]; //int dep[MAXN]; //int son[MAXN]; -//int stjump[MAXN][20]; +//int stjump[MAXN][MAXH]; // //int nodeCnt[MAXN]; //int ans[MAXN]; From acce1a69ceab4c6ba786a5a610fd11bd9e02efa7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 18 Mar 2025 17:52:33 +0800 Subject: [PATCH 0828/2029] modify code --- .../{Code03_BloodCousins1.java => Code05_BloodCousins1.java} | 2 +- .../{Code03_BloodCousins2.java => Code05_BloodCousins2.java} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/class163/{Code03_BloodCousins1.java => Code05_BloodCousins1.java} (99%) rename src/class163/{Code03_BloodCousins2.java => Code05_BloodCousins2.java} (100%) diff --git a/src/class163/Code03_BloodCousins1.java b/src/class163/Code05_BloodCousins1.java similarity index 99% rename from src/class163/Code03_BloodCousins1.java rename to src/class163/Code05_BloodCousins1.java index 7855e1cc7..20b327f7e 100644 --- a/src/class163/Code03_BloodCousins1.java +++ b/src/class163/Code05_BloodCousins1.java @@ -12,7 +12,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code03_BloodCousins1 { +public class Code05_BloodCousins1 { public static int MAXN = 100001; public static int MAXH = 20; diff --git a/src/class163/Code03_BloodCousins2.java b/src/class163/Code05_BloodCousins2.java similarity index 100% rename from src/class163/Code03_BloodCousins2.java rename to src/class163/Code05_BloodCousins2.java From 906790132fa3fe346689e359857e8a9c830eb7c7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 18 Mar 2025 19:52:13 +0800 Subject: [PATCH 0829/2029] modify code --- src/class163/Code02_ColorBanlance1.java | 4 ++-- src/class163/Code02_ColorBanlance2.java | 4 ++-- src/class163/Code02_ColorBanlance3.java | 4 ++-- src/class163/Code05_BloodCousins1.java | 10 +++++----- src/class163/Code05_BloodCousins2.java | 10 +++++----- src/class163/Code06_LongestRearrangePalindrome1.java | 6 +++--- src/class163/Code06_LongestRearrangePalindrome2.java | 6 +++--- 7 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/class163/Code02_ColorBanlance1.java b/src/class163/Code02_ColorBanlance1.java index e36462f02..89ab27999 100644 --- a/src/class163/Code02_ColorBanlance1.java +++ b/src/class163/Code02_ColorBanlance1.java @@ -24,8 +24,8 @@ public class Code02_ColorBanlance1 { // 链式前向星 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[] next = new int[MAXN]; + public static int[] to = new int[MAXN]; public static int cnt = 0; // 树链剖分 diff --git a/src/class163/Code02_ColorBanlance2.java b/src/class163/Code02_ColorBanlance2.java index 97b3fb697..39f31ed9a 100644 --- a/src/class163/Code02_ColorBanlance2.java +++ b/src/class163/Code02_ColorBanlance2.java @@ -17,8 +17,8 @@ public class Code02_ColorBanlance2 { public static int n; 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[] next = new int[MAXN]; + public static int[] to = new int[MAXN]; public static int cnt = 0; public static int[] siz = new int[MAXN]; public static int[] son = new int[MAXN]; diff --git a/src/class163/Code02_ColorBanlance3.java b/src/class163/Code02_ColorBanlance3.java index 93a33d845..6811ea1a8 100644 --- a/src/class163/Code02_ColorBanlance3.java +++ b/src/class163/Code02_ColorBanlance3.java @@ -13,8 +13,8 @@ //int n; //int arr[MAXN]; //int head[MAXN]; -//int nxt[MAXN << 1]; -//int to[MAXN << 1]; +//int nxt[MAXN]; +//int to[MAXN]; //int cnt = 0; //int siz[MAXN]; //int son[MAXN]; diff --git a/src/class163/Code05_BloodCousins1.java b/src/class163/Code05_BloodCousins1.java index 20b327f7e..936be844b 100644 --- a/src/class163/Code05_BloodCousins1.java +++ b/src/class163/Code05_BloodCousins1.java @@ -21,14 +21,14 @@ public class Code05_BloodCousins1 { public static boolean[] root = new boolean[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[] nextg = new int[MAXN]; + public static int[] tog = new int[MAXN]; public static int cntg; public static int[] headq = new int[MAXN]; - public static int[] nextq = new int[MAXN << 1]; - public static int[] idxq = new int[MAXN << 1]; - public static int[] kthq = new int[MAXN << 1]; + public static int[] nextq = new int[MAXN]; + public static int[] idxq = new int[MAXN]; + public static int[] kthq = new int[MAXN]; public static int cntq; public static int[] siz = new int[MAXN]; diff --git a/src/class163/Code05_BloodCousins2.java b/src/class163/Code05_BloodCousins2.java index 4c2a955f6..f8f4b6489 100644 --- a/src/class163/Code05_BloodCousins2.java +++ b/src/class163/Code05_BloodCousins2.java @@ -16,14 +16,14 @@ // //bool root[MAXN]; //int headg[MAXN]; -//int nextg[MAXN << 1]; -//int tog[MAXN << 1]; +//int nextg[MAXN]; +//int tog[MAXN]; //int cntg; // //int headq[MAXN]; -//int nextq[MAXN << 1]; -//int idxq[MAXN << 1]; -//int kthq[MAXN << 1]; +//int nextq[MAXN]; +//int idxq[MAXN]; +//int kthq[MAXN]; //int cntq; // //int siz[MAXN]; diff --git a/src/class163/Code06_LongestRearrangePalindrome1.java b/src/class163/Code06_LongestRearrangePalindrome1.java index 984e53f0f..885bc82a3 100644 --- a/src/class163/Code06_LongestRearrangePalindrome1.java +++ b/src/class163/Code06_LongestRearrangePalindrome1.java @@ -19,9 +19,9 @@ public class Code06_LongestRearrangePalindrome1 { // 链式前向星 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[] weight = new int[MAXN << 1]; + public static int[] next = new int[MAXN]; + public static int[] to = new int[MAXN]; + public static int[] weight = new int[MAXN]; public static int cnt = 0; // 树链剖分 diff --git a/src/class163/Code06_LongestRearrangePalindrome2.java b/src/class163/Code06_LongestRearrangePalindrome2.java index f9c34e2c8..aa9cdb6a7 100644 --- a/src/class163/Code06_LongestRearrangePalindrome2.java +++ b/src/class163/Code06_LongestRearrangePalindrome2.java @@ -14,9 +14,9 @@ //const int MAXV = 22; //int n; //int head[MAXN]; -//int nxt[MAXN << 1]; -//int to[MAXN << 1]; -//int weight[MAXN << 1]; +//int nxt[MAXN]; +//int to[MAXN]; +//int weight[MAXN]; //int cnt = 0; //int siz[MAXN]; //int dep[MAXN]; From 2e5632161b5f1a229719fb31adcf11b97e00789b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 18 Mar 2025 22:04:51 +0800 Subject: [PATCH 0830/2029] modify code --- src/class163/Code02_ColorBanlance2.java | 39 ++++--- src/class163/Code03_LomsatGelral1.java | 146 ++++++++++++++++++++++++ src/class163/Code03_LomsatGelral2.java | 132 +++++++++++++++++++++ 3 files changed, 300 insertions(+), 17 deletions(-) create mode 100644 src/class163/Code03_LomsatGelral1.java create mode 100644 src/class163/Code03_LomsatGelral2.java diff --git a/src/class163/Code02_ColorBanlance2.java b/src/class163/Code02_ColorBanlance2.java index 39f31ed9a..2f6fc27be 100644 --- a/src/class163/Code02_ColorBanlance2.java +++ b/src/class163/Code02_ColorBanlance2.java @@ -133,28 +133,17 @@ public static void dfs1() { } } + // 迭代版的dfs2,用edge2变量标记一个节点的不同阶段 + // edge2 == -1,表示第一次来到当前节点,接下来依次处理轻儿子的子树 + // edge2 > 0,表示正在依次处理轻儿子的子树 + // edge2 == 0,表示处理完了所有轻儿子的子树,接下来处理重儿子的子树 + // edge2 == -2,表示处理完了重儿子的子树,轮到启发式合并了 public static void dfs2() { size2 = 0; push2(1, -1, 1); while (size2 > 0) { pop2(); - if (edge2 == -2) { - colorCnt[arr[cur2]]++; - cntCnt[colorCnt[arr[cur2]] - 1]--; - cntCnt[colorCnt[arr[cur2]]]++; - for (int e = head[cur2], v; e > 0; e = next[e]) { - v = to[e]; - if (v != son[cur2]) { - effect(v); - } - } - if (colorCnt[arr[cur2]] * cntCnt[colorCnt[arr[cur2]]] == siz[cur2]) { - ans++; - } - if (keep2 == 0) { - cancle(cur2); - } - } else { + if (edge2 != -2) { if (edge2 == -1) { edge2 = head[cur2]; } else { @@ -171,6 +160,22 @@ public static void dfs2() { push2(son[cur2], -1, 1); } } + } else { + colorCnt[arr[cur2]]++; + cntCnt[colorCnt[arr[cur2]] - 1]--; + cntCnt[colorCnt[arr[cur2]]]++; + for (int e = head[cur2], v; e > 0; e = next[e]) { + v = to[e]; + if (v != son[cur2]) { + effect(v); + } + } + if (colorCnt[arr[cur2]] * cntCnt[colorCnt[arr[cur2]]] == siz[cur2]) { + ans++; + } + if (keep2 == 0) { + cancle(cur2); + } } } } diff --git a/src/class163/Code03_LomsatGelral1.java b/src/class163/Code03_LomsatGelral1.java new file mode 100644 index 000000000..f93d565d4 --- /dev/null +++ b/src/class163/Code03_LomsatGelral1.java @@ -0,0 +1,146 @@ +package class163; + +// 主导颜色累加和,java版 +// 测试链接 : https://www.luogu.com.cn/problem/CF600E +// 测试链接 : https://codeforces.com/problemset/problem/600/E +// 提交以下的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 Code03_LomsatGelral1 { + + public static int MAXN = 100001; + public static int n; + public static int[] color = 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 cnt = 0; + + public static int[] fa = new int[MAXN]; + public static int[] siz = new int[MAXN]; + public static int[] son = new int[MAXN]; + + public static int[] colorCnt = new int[MAXN]; + public static int[] maxCnt = new int[MAXN]; + public static long[] ans = new long[MAXN]; + + public static void addEdge(int u, int v) { + next[++cnt] = head[u]; + to[cnt] = v; + head[u] = cnt; + } + + public static void dfs1(int u, int f) { + fa[u] = f; + 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 effect(int u, int h) { + colorCnt[color[u]]++; + if (colorCnt[color[u]] == maxCnt[h]) { + ans[h] += color[u]; + } else if (colorCnt[color[u]] > maxCnt[h]) { + maxCnt[h] = colorCnt[color[u]]; + ans[h] = color[u]; + } + for (int e = head[u], v; e > 0; e = next[e]) { + v = to[e]; + if (v != fa[u]) { + effect(v, h); + } + } + } + + public static void cancle(int u) { + colorCnt[color[u]] = 0; + maxCnt[u] = 0; + for (int e = head[u], v; e > 0; e = next[e]) { + v = to[e]; + if (v != fa[u]) { + cancle(v); + } + } + } + + public static void dfs2(int u, int keep) { + for (int e = head[u], v; e > 0; e = next[e]) { + v = to[e]; + if (v != fa[u] && v != son[u]) { + dfs2(v, 0); + } + } + if (son[u] != 0) { + dfs2(son[u], 1); + } + maxCnt[u] = maxCnt[son[u]]; + ans[u] = ans[son[u]]; + colorCnt[color[u]]++; + if (colorCnt[color[u]] == maxCnt[u]) { + ans[u] += color[u]; + } else if (colorCnt[color[u]] > maxCnt[u]) { + maxCnt[u] = colorCnt[color[u]]; + ans[u] = color[u]; + } + for (int e = head[u], v; e > 0; e = next[e]) { + v = to[e]; + if (v != fa[u] && v != son[u]) { + effect(v, u); + } + } + if (keep == 0) { + cancle(u); + } + } + + 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; + for (int i = 1; i <= n; i++) { + in.nextToken(); + color[i] = (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); + } + dfs1(1, 0); + dfs2(1, 1); + for (int i = 1; i <= n; i++) { + out.print(ans[i] + " "); + } + out.println(); + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class163/Code03_LomsatGelral2.java b/src/class163/Code03_LomsatGelral2.java new file mode 100644 index 000000000..c89d90ebc --- /dev/null +++ b/src/class163/Code03_LomsatGelral2.java @@ -0,0 +1,132 @@ +package class163; + +// 主导颜色累加和,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/CF600E +// 测试链接 : https://codeforces.com/problemset/problem/600/E +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +//int n; +//int color[MAXN]; +// +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int cnt = 0; +// +//int fa[MAXN]; +//int siz[MAXN]; +//int son[MAXN]; +// +//int colorCnt[MAXN]; +//int maxCnt[MAXN]; +//long long ans[MAXN]; +// +//void addEdge(int u, int v) { +// nxt[++cnt] = head[u]; +// to[cnt] = v; +// head[u] = cnt; +//} +// +//void dfs1(int u, int f) { +// fa[u] = f; +// 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 e = head[u], v; e > 0; 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 effect(int u, int h) { +// colorCnt[color[u]]++; +// if (colorCnt[color[u]] == maxCnt[h]) { +// ans[h] += color[u]; +// } else if (colorCnt[color[u]] > maxCnt[h]) { +// maxCnt[h] = colorCnt[color[u]]; +// ans[h] = color[u]; +// } +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// if (v != fa[u]) { +// effect(v, h); +// } +// } +//} +// +//void cancle(int u) { +// colorCnt[color[u]] = 0; +// maxCnt[u] = 0; +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// if (v != fa[u]) { +// cancle(v); +// } +// } +//} +// +//void dfs2(int u, int keep) { +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// if (v != fa[u] && v != son[u]) { +// dfs2(v, 0); +// } +// } +// if (son[u] != 0) { +// dfs2(son[u], 1); +// } +// maxCnt[u] = maxCnt[son[u]]; +// ans[u] = ans[son[u]]; +// colorCnt[color[u]]++; +// if (colorCnt[color[u]] == maxCnt[u]) { +// ans[u] += color[u]; +// } else if (colorCnt[color[u]] > maxCnt[u]) { +// maxCnt[u] = colorCnt[color[u]]; +// ans[u] = color[u]; +// } +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// if (v != fa[u] && v != son[u]) { +// effect(v, u); +// } +// } +// if (keep == 0) { +// cancle(u); +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n; +// 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); +// } +// dfs1(1, 0); +// dfs2(1, 1); +// for (int i = 1; i <= n; i++) { +// cout << ans[i] << " "; +// } +// cout << "\n"; +// return 0; +//} \ No newline at end of file From 0d1732bae9693c54984d1121b600f8e8039a0d44 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 18 Mar 2025 22:15:58 +0800 Subject: [PATCH 0831/2029] modify code --- src/class163/Code05_BloodCousins1.java | 6 +++--- src/class163/Code05_BloodCousins2.java | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/class163/Code05_BloodCousins1.java b/src/class163/Code05_BloodCousins1.java index 936be844b..352316679 100644 --- a/src/class163/Code05_BloodCousins1.java +++ b/src/class163/Code05_BloodCousins1.java @@ -27,7 +27,7 @@ public class Code05_BloodCousins1 { public static int[] headq = new int[MAXN]; public static int[] nextq = new int[MAXN]; - public static int[] idxq = new int[MAXN]; + public static int[] ansiq = new int[MAXN]; public static int[] kthq = new int[MAXN]; public static int cntq; @@ -47,7 +47,7 @@ public static void addEdge(int u, int v) { public static void addQuestion(int u, int idx, int kth) { nextq[++cntq] = headq[u]; - idxq[cntq] = idx; + ansiq[cntq] = idx; kthq[cntq] = kth; headq[u] = cntq; } @@ -113,7 +113,7 @@ public static void dfs2(int u, int keep) { } } for (int i = headq[u]; i > 0; i = nextq[i]) { - ans[idxq[i]] = nodeCnt[dep[u] + kthq[i]]; + ans[ansiq[i]] = nodeCnt[dep[u] + kthq[i]]; } if (keep == 0) { cancle(u); diff --git a/src/class163/Code05_BloodCousins2.java b/src/class163/Code05_BloodCousins2.java index f8f4b6489..4e1c83afb 100644 --- a/src/class163/Code05_BloodCousins2.java +++ b/src/class163/Code05_BloodCousins2.java @@ -22,7 +22,7 @@ // //int headq[MAXN]; //int nextq[MAXN]; -//int idxq[MAXN]; +//int ansiq[MAXN]; //int kthq[MAXN]; //int cntq; // @@ -42,7 +42,7 @@ // //void addQuestion(int u, int idx, int kth) { // nextq[++cntq] = headq[u]; -// idxq[cntq] = idx; +// ansiq[cntq] = idx; // kthq[cntq] = kth; // headq[u] = cntq; //} @@ -108,7 +108,7 @@ // } // } // for (int i = headq[u]; i > 0; i = nextq[i]) { -// ans[idxq[i]] = nodeCnt[dep[u] + kthq[i]]; +// ans[ansiq[i]] = nodeCnt[dep[u] + kthq[i]]; // } // if (keep == 0) { // cancle(u); From 607afd4ad943e406dedff403b050f3abe78eb8c8 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 18 Mar 2025 23:14:48 +0800 Subject: [PATCH 0832/2029] modify code --- src/class163/Code04_DifferntName1.java | 227 +++++++++++++++++++++++++ src/class163/Code04_DifferntName2.java | 164 ++++++++++++++++++ src/class163/Code05_BloodCousins1.java | 10 +- src/class163/Code05_BloodCousins2.java | 10 +- 4 files changed, 401 insertions(+), 10 deletions(-) create mode 100644 src/class163/Code04_DifferntName1.java create mode 100644 src/class163/Code04_DifferntName2.java diff --git a/src/class163/Code04_DifferntName1.java b/src/class163/Code04_DifferntName1.java new file mode 100644 index 000000000..5e3b2d8b5 --- /dev/null +++ b/src/class163/Code04_DifferntName1.java @@ -0,0 +1,227 @@ +package class163; + +// 不同名字的数量,java版 +// 测试链接 : https://www.luogu.com.cn/problem/CF246E +// 测试链接 : https://codeforces.com/problemset/problem/246/E +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.StringTokenizer; + +public class Code04_DifferntName1 { + + public static int MAXN = 100001; + public static int n, m; + public static boolean[] root = new boolean[MAXN]; + public static int[] arr = new int[MAXN]; + + public static int[] headg = new int[MAXN]; + public static int[] nextg = new int[MAXN]; + public static int[] tog = new int[MAXN]; + public static int cntg; + + public static int[] headq = new int[MAXN]; + public static int[] nextq = new int[MAXN]; + public static int[] ansiq = new int[MAXN]; + public static int[] kq = new int[MAXN]; + public static int cntq; + + public static int[] fa = new int[MAXN]; + public static int[] siz = new int[MAXN]; + public static int[] dep = new int[MAXN]; + public static int[] son = new int[MAXN]; + + public static HashMap nameToId = new HashMap<>(); + public static ArrayList> depSet = new ArrayList<>(); + public static int[] ans = new int[MAXN]; + + public static int nameId(String name) { + if (nameToId.containsKey(name)) { + return nameToId.get(name); + } + nameToId.put(name, nameToId.size() + 1); + return nameToId.size(); + } + + public static void addId(int deep, int id) { + depSet.get(deep).add(id); + } + + public static void removeId(int deep, int id) { + depSet.get(deep).remove(id); + } + + public static int sizeOfId(int deep) { + if (deep > n) { + return 0; + } + return depSet.get(deep).size(); + } + + public static void addEdge(int u, int v) { + nextg[++cntg] = headg[u]; + tog[cntg] = v; + headg[u] = cntg; + } + + public static void addQuestion(int u, int ansi, int k) { + nextq[++cntq] = headq[u]; + ansiq[cntq] = ansi; + kq[cntq] = k; + headq[u] = cntq; + } + + public static void dfs1(int u, int f) { + fa[u] = f; + siz[u] = 1; + dep[u] = dep[f] + 1; + for (int e = headg[u]; e > 0; e = nextg[e]) { + dfs1(tog[e], u); + } + for (int e = headg[u], v; e > 0; e = nextg[e]) { + v = tog[e]; + siz[u] += siz[v]; + if (son[u] == 0 || siz[son[u]] < siz[v]) { + son[u] = v; + } + } + } + + public static void effect(int u) { + addId(dep[u], arr[u]); + for (int e = headg[u]; e > 0; e = nextg[e]) { + effect(tog[e]); + } + } + + public static void cancle(int u) { + removeId(dep[u], arr[u]); + for (int e = headg[u]; e > 0; e = nextg[e]) { + cancle(tog[e]); + } + } + + public static void dfs2(int u, int keep) { + for (int e = headg[u], v; e > 0; e = nextg[e]) { + v = tog[e]; + if (v != son[u]) { + dfs2(v, 0); + } + } + if (son[u] != 0) { + dfs2(son[u], 1); + } + addId(dep[u], arr[u]); + for (int e = headg[u], v; e > 0; e = nextg[e]) { + v = tog[e]; + if (v != son[u]) { + effect(v); + } + } + for (int i = headq[u]; i > 0; i = nextq[i]) { + ans[ansiq[i]] = sizeOfId(dep[u] + kq[i]); + } + if (keep == 0) { + cancle(u); + } + } + + public static void main(String[] args) throws IOException { + Kattio io = new Kattio(); + n = io.nextInt(); + String name; + int father; + for (int i = 1; i <= n; i++) { + name = io.next(); + father = io.nextInt(); + arr[i] = nameId(name); + if (father == 0) { + root[i] = true; + } else { + addEdge(father, i); + } + } + for (int i = 1; i <= n; i++) { + // 因为是森林结构,可能有多棵子树彼此是不联通的 + // 所以对每一棵子树进行重链剖分 + if (root[i]) { + dfs1(i, 0); + } + } + for (int i = 0; i <= n; i++) { + depSet.add(new HashSet<>()); + } + m = io.nextInt(); + for (int i = 1, node, k; i <= m; i++) { + node = io.nextInt(); + k = io.nextInt(); + addQuestion(node, i, k); + } + for (int i = 1; i <= n; i++) { + // 因为是森林结构,可能有多棵子树彼此是不联通的 + // 所以认为每一棵树的头都是轻儿子 + // 这样每棵子树运行完后都会消除影响 + // 不会影响下一棵子树的答案 + if (root[i]) { + dfs2(i, 0); + } + } + for (int i = 1; i <= m; i++) { + io.println(ans[i]); + } + io.flush(); + io.close(); + } + + // 读写工具类 + public static class Kattio extends PrintWriter { + private BufferedReader r; + private StringTokenizer st; + + public Kattio() { + this(System.in, System.out); + } + + public Kattio(InputStream i, OutputStream o) { + super(o); + r = new BufferedReader(new InputStreamReader(i)); + } + + public Kattio(String intput, String output) throws IOException { + super(output); + r = new BufferedReader(new FileReader(intput)); + } + + public String next() { + try { + while (st == null || !st.hasMoreTokens()) + st = new StringTokenizer(r.readLine()); + return st.nextToken(); + } catch (Exception e) { + } + return null; + } + + public int nextInt() { + return Integer.parseInt(next()); + } + + public double nextDouble() { + return Double.parseDouble(next()); + } + + public long nextLong() { + return Long.parseLong(next()); + } + } + +} diff --git a/src/class163/Code04_DifferntName2.java b/src/class163/Code04_DifferntName2.java new file mode 100644 index 000000000..4b7ad2960 --- /dev/null +++ b/src/class163/Code04_DifferntName2.java @@ -0,0 +1,164 @@ +package class163; + +// 不同名字的数量,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/CF246E +// 测试链接 : https://codeforces.com/problemset/problem/246/E +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +//int n, m; +//bool root[MAXN]; +//int arr[MAXN]; +// +//int headg[MAXN]; +//int nextg[MAXN]; +//int tog[MAXN]; +//int cntg; +// +//int headq[MAXN]; +//int nextq[MAXN]; +//int ansiq[MAXN]; +//int kq[MAXN]; +//int cntq; +// +//int fa[MAXN]; +//int siz[MAXN]; +//int dep[MAXN]; +//int son[MAXN]; +//unordered_map nameToId; +//vector> depSet; +//int ans[MAXN]; +// +//int nameId(const string &name) { +// if (nameToId.find(name) != nameToId.end()) { +// return nameToId[name]; +// } +// int newId = nameToId.size() + 1; +// nameToId[name] = newId; +// return newId; +//} +// +//void addId(int deep, int id) { +// depSet[deep].insert(id); +//} +// +//void removeId(int deep, int id) { +// depSet[deep].erase(id); +//} +// +//int sizeOfId(int deep) { +// if (deep > n) { +// return 0; +// } +// return (int)depSet[deep].size(); +//} +// +//void addEdge(int u, int v) { +// nextg[++cntg] = headg[u]; +// tog[cntg] = v; +// headg[u] = cntg; +//} +// +//void addQuestion(int u, int ansi, int k) { +// nextq[++cntq] = headq[u]; +// ansiq[cntq] = ansi; +// kq[cntq] = k; +// headq[u] = cntq; +//} +// +//void dfs1(int u, int f) { +// fa[u] = f; +// siz[u] = 1; +// dep[u] = dep[f] + 1; +// for (int e = headg[u]; e > 0; e = nextg[e]) { +// dfs1(tog[e], u); +// } +// for (int e = headg[u], v; e > 0; e = nextg[e]) { +// v = tog[e]; +// siz[u] += siz[v]; +// if (son[u] == 0 || siz[son[u]] < siz[v]) { +// son[u] = v; +// } +// } +//} +// +//void effect(int u) { +// addId(dep[u], arr[u]); +// for (int e = headg[u]; e > 0; e = nextg[e]) { +// effect(tog[e]); +// } +//} +// +//void cancle(int u) { +// removeId(dep[u], arr[u]); +// for (int e = headg[u]; e > 0; e = nextg[e]) { +// cancle(tog[e]); +// } +//} +// +//void dfs2(int u, int keep) { +// for (int e = headg[u], v; e > 0; e = nextg[e]) { +// v = tog[e]; +// if (v != son[u]) { +// dfs2(v, 0); +// } +// } +// if (son[u] != 0) { +// dfs2(son[u], 1); +// } +// addId(dep[u], arr[u]); +// for (int e = headg[u], v; e > 0; e = nextg[e]) { +// v = tog[e]; +// if (v != son[u]) { +// effect(v); +// } +// } +// for (int i = headq[u]; i > 0; i = nextq[i]) { +// ans[ansiq[i]] = sizeOfId(dep[u] + kq[i]); +// } +// if (keep == 0) { +// cancle(u); +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n; +// string name; +// int father; +// for (int i = 1; i <= n; i++) { +// cin >> name >> father; +// arr[i] = nameId(name); +// if (father == 0) { +// root[i] = true; +// } else { +// addEdge(father, i); +// } +// } +// for (int i = 1; i <= n; i++) { +// if (root[i]) { +// dfs1(i, 0); +// } +// } +// depSet.resize(n + 1); +// cin >> m; +// for (int i = 1, node, k; i <= m; i++) { +// cin >> node >> k; +// addQuestion(node, i, k); +// } +// for (int i = 1; i <= n; i++) { +// if (root[i]) { +// dfs2(i, 0); +// } +// } +// for (int i = 1; i <= m; i++) { +// cout << ans[i] << "\n"; +// } +// return 0; +//} \ No newline at end of file diff --git a/src/class163/Code05_BloodCousins1.java b/src/class163/Code05_BloodCousins1.java index 352316679..312836d9d 100644 --- a/src/class163/Code05_BloodCousins1.java +++ b/src/class163/Code05_BloodCousins1.java @@ -28,7 +28,7 @@ public class Code05_BloodCousins1 { public static int[] headq = new int[MAXN]; public static int[] nextq = new int[MAXN]; public static int[] ansiq = new int[MAXN]; - public static int[] kthq = new int[MAXN]; + public static int[] kq = new int[MAXN]; public static int cntq; public static int[] siz = new int[MAXN]; @@ -45,10 +45,10 @@ public static void addEdge(int u, int v) { headg[u] = cntg; } - public static void addQuestion(int u, int idx, int kth) { + public static void addQuestion(int u, int i, int k) { nextq[++cntq] = headq[u]; - ansiq[cntq] = idx; - kthq[cntq] = kth; + ansiq[cntq] = i; + kq[cntq] = k; headq[u] = cntq; } @@ -113,7 +113,7 @@ public static void dfs2(int u, int keep) { } } for (int i = headq[u]; i > 0; i = nextq[i]) { - ans[ansiq[i]] = nodeCnt[dep[u] + kthq[i]]; + ans[ansiq[i]] = nodeCnt[dep[u] + kq[i]]; } if (keep == 0) { cancle(u); diff --git a/src/class163/Code05_BloodCousins2.java b/src/class163/Code05_BloodCousins2.java index 4e1c83afb..e834487f0 100644 --- a/src/class163/Code05_BloodCousins2.java +++ b/src/class163/Code05_BloodCousins2.java @@ -23,7 +23,7 @@ //int headq[MAXN]; //int nextq[MAXN]; //int ansiq[MAXN]; -//int kthq[MAXN]; +//int kq[MAXN]; //int cntq; // //int siz[MAXN]; @@ -40,10 +40,10 @@ // headg[u] = cntg; //} // -//void addQuestion(int u, int idx, int kth) { +//void addQuestion(int u, int i, int k) { // nextq[++cntq] = headq[u]; -// ansiq[cntq] = idx; -// kthq[cntq] = kth; +// ansiq[cntq] = i; +// kq[cntq] = k; // headq[u] = cntq; //} // @@ -108,7 +108,7 @@ // } // } // for (int i = headq[u]; i > 0; i = nextq[i]) { -// ans[ansiq[i]] = nodeCnt[dep[u] + kthq[i]]; +// ans[ansiq[i]] = nodeCnt[dep[u] + kq[i]]; // } // if (keep == 0) { // cancle(u); From 1d4b949c40a57c6adf02d2b40c788f50e441cefc Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 18 Mar 2025 23:16:12 +0800 Subject: [PATCH 0833/2029] modify code --- src/class163/Code04_DifferntName1.java | 2 +- src/class163/Code04_DifferntName2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class163/Code04_DifferntName1.java b/src/class163/Code04_DifferntName1.java index 5e3b2d8b5..6a820f3b3 100644 --- a/src/class163/Code04_DifferntName1.java +++ b/src/class163/Code04_DifferntName1.java @@ -1,6 +1,6 @@ package class163; -// 不同名字的数量,java版 +// 不同名字数量,java版 // 测试链接 : https://www.luogu.com.cn/problem/CF246E // 测试链接 : https://codeforces.com/problemset/problem/246/E // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class163/Code04_DifferntName2.java b/src/class163/Code04_DifferntName2.java index 4b7ad2960..2944a19c1 100644 --- a/src/class163/Code04_DifferntName2.java +++ b/src/class163/Code04_DifferntName2.java @@ -1,6 +1,6 @@ package class163; -// 不同名字的数量,C++版 +// 不同名字数量,C++版 // 测试链接 : https://www.luogu.com.cn/problem/CF246E // 测试链接 : https://codeforces.com/problemset/problem/246/E // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 From c8ae85cbf45a2e1a1bbbf7afcbe825678044d13f Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 18 Mar 2025 23:28:15 +0800 Subject: [PATCH 0834/2029] modify code --- ...arrangePalindrome1.java => Code06_RearrangePalindrome1.java} | 2 +- ...arrangePalindrome2.java => Code06_RearrangePalindrome2.java} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/class163/{Code06_LongestRearrangePalindrome1.java => Code06_RearrangePalindrome1.java} (99%) rename src/class163/{Code06_LongestRearrangePalindrome2.java => Code06_RearrangePalindrome2.java} (100%) diff --git a/src/class163/Code06_LongestRearrangePalindrome1.java b/src/class163/Code06_RearrangePalindrome1.java similarity index 99% rename from src/class163/Code06_LongestRearrangePalindrome1.java rename to src/class163/Code06_RearrangePalindrome1.java index 885bc82a3..984140154 100644 --- a/src/class163/Code06_LongestRearrangePalindrome1.java +++ b/src/class163/Code06_RearrangePalindrome1.java @@ -10,7 +10,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; -public class Code06_LongestRearrangePalindrome1 { +public class Code06_RearrangePalindrome1 { public static int MAXN = 500001; // 字符种类最多22种 diff --git a/src/class163/Code06_LongestRearrangePalindrome2.java b/src/class163/Code06_RearrangePalindrome2.java similarity index 100% rename from src/class163/Code06_LongestRearrangePalindrome2.java rename to src/class163/Code06_RearrangePalindrome2.java From ea29d330ef37d04209d901ebd7d3948ac7760dc5 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 19 Mar 2025 17:40:03 +0800 Subject: [PATCH 0835/2029] modify code --- .../{Code04_DifferntName1.java => Code02_DifferntName1.java} | 2 +- .../{Code04_DifferntName2.java => Code02_DifferntName2.java} | 0 ...{Code02_ColorBanlance1.java => Code03_ColorBanlance1.java} | 4 ++-- ...{Code02_ColorBanlance2.java => Code03_ColorBanlance2.java} | 2 +- ...{Code02_ColorBanlance3.java => Code03_ColorBanlance3.java} | 0 .../{Code03_LomsatGelral1.java => Code04_LomsatGelral1.java} | 2 +- .../{Code03_LomsatGelral2.java => Code04_LomsatGelral2.java} | 0 7 files changed, 5 insertions(+), 5 deletions(-) rename src/class163/{Code04_DifferntName1.java => Code02_DifferntName1.java} (99%) rename src/class163/{Code04_DifferntName2.java => Code02_DifferntName2.java} (100%) rename src/class163/{Code02_ColorBanlance1.java => Code03_ColorBanlance1.java} (96%) rename src/class163/{Code02_ColorBanlance2.java => Code03_ColorBanlance2.java} (99%) rename src/class163/{Code02_ColorBanlance3.java => Code03_ColorBanlance3.java} (100%) rename src/class163/{Code03_LomsatGelral1.java => Code04_LomsatGelral1.java} (98%) rename src/class163/{Code03_LomsatGelral2.java => Code04_LomsatGelral2.java} (100%) diff --git a/src/class163/Code04_DifferntName1.java b/src/class163/Code02_DifferntName1.java similarity index 99% rename from src/class163/Code04_DifferntName1.java rename to src/class163/Code02_DifferntName1.java index 6a820f3b3..ae0ee1356 100644 --- a/src/class163/Code04_DifferntName1.java +++ b/src/class163/Code02_DifferntName1.java @@ -17,7 +17,7 @@ import java.util.HashSet; import java.util.StringTokenizer; -public class Code04_DifferntName1 { +public class Code02_DifferntName1 { public static int MAXN = 100001; public static int n, m; diff --git a/src/class163/Code04_DifferntName2.java b/src/class163/Code02_DifferntName2.java similarity index 100% rename from src/class163/Code04_DifferntName2.java rename to src/class163/Code02_DifferntName2.java diff --git a/src/class163/Code02_ColorBanlance1.java b/src/class163/Code03_ColorBanlance1.java similarity index 96% rename from src/class163/Code02_ColorBanlance1.java rename to src/class163/Code03_ColorBanlance1.java index 89ab27999..86f2458fd 100644 --- a/src/class163/Code02_ColorBanlance1.java +++ b/src/class163/Code03_ColorBanlance1.java @@ -4,7 +4,7 @@ // 测试链接 : https://www.luogu.com.cn/problem/P9233 // 提交以下的code,提交时请把类名改成"Main" // 因为树的深度太大,递归函数爆栈了,所以会有两个测试用例无法通过 -// 迭代版可以完全通过,就是本节课Code02_ColorBanlance2文件 +// 迭代版可以完全通过,就是本节课Code03_ColorBanlance2文件 import java.io.BufferedReader; import java.io.IOException; @@ -13,7 +13,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code02_ColorBanlance1 { +public class Code03_ColorBanlance1 { public static int MAXN = 200001; diff --git a/src/class163/Code02_ColorBanlance2.java b/src/class163/Code03_ColorBanlance2.java similarity index 99% rename from src/class163/Code02_ColorBanlance2.java rename to src/class163/Code03_ColorBanlance2.java index 2f6fc27be..8eae184dd 100644 --- a/src/class163/Code02_ColorBanlance2.java +++ b/src/class163/Code03_ColorBanlance2.java @@ -11,7 +11,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code02_ColorBanlance2 { +public class Code03_ColorBanlance2 { public static int MAXN = 200001; public static int n; diff --git a/src/class163/Code02_ColorBanlance3.java b/src/class163/Code03_ColorBanlance3.java similarity index 100% rename from src/class163/Code02_ColorBanlance3.java rename to src/class163/Code03_ColorBanlance3.java diff --git a/src/class163/Code03_LomsatGelral1.java b/src/class163/Code04_LomsatGelral1.java similarity index 98% rename from src/class163/Code03_LomsatGelral1.java rename to src/class163/Code04_LomsatGelral1.java index f93d565d4..005dc53c9 100644 --- a/src/class163/Code03_LomsatGelral1.java +++ b/src/class163/Code04_LomsatGelral1.java @@ -12,7 +12,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code03_LomsatGelral1 { +public class Code04_LomsatGelral1 { public static int MAXN = 100001; public static int n; diff --git a/src/class163/Code03_LomsatGelral2.java b/src/class163/Code04_LomsatGelral2.java similarity index 100% rename from src/class163/Code03_LomsatGelral2.java rename to src/class163/Code04_LomsatGelral2.java From b0fa4d32920d12ebf7d5b602ae62d8d6c75be308 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 19 Mar 2025 20:11:14 +0800 Subject: [PATCH 0836/2029] modify code --- src/class163/Code07_Forest1.java | 344 +++++++++++++++++++++++++++++++ src/class163/Code07_Forest2.java | 199 ++++++++++++++++++ 2 files changed, 543 insertions(+) create mode 100644 src/class163/Code07_Forest1.java create mode 100644 src/class163/Code07_Forest2.java diff --git a/src/class163/Code07_Forest1.java b/src/class163/Code07_Forest1.java new file mode 100644 index 000000000..f244a79be --- /dev/null +++ b/src/class163/Code07_Forest1.java @@ -0,0 +1,344 @@ +package class163; + +// 森林,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P3302 +// 提交以下的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_Forest1 { + + public static int MAXN = 80001; + public static int MAXT = MAXN * 110; + public static int MAXH = 20; + public static int testcase; + public static int n, m, t; + + public static int[] arr = new int[MAXN]; + public static int[] sorted = new int[MAXN]; + public static int diff; + + 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[] root = new int[MAXN]; + public static int[] left = new int[MAXT]; + public static int[] right = new int[MAXT]; + public static int[] siz = new int[MAXT]; + public static int cntt = 0; + + public static int[] dep = new int[MAXN]; + public static int[] treeHead = new int[MAXN]; + public static int[] headSiz = new int[MAXN]; + public static int[][] stjump = new int[MAXN][MAXH]; + + public static int kth(int num) { + int left = 1, right = diff, 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 addEdge(int u, int v) { + next[++cntg] = head[u]; + to[cntg] = v; + head[u] = cntg; + } + + public static int insert(int jobi, int l, int r, int i) { + int rt = ++cntt; + left[rt] = left[i]; + right[rt] = right[i]; + siz[rt] = siz[i] + 1; + if (l < r) { + int mid = (l + r) / 2; + if (jobi <= mid) { + left[rt] = insert(jobi, l, mid, left[rt]); + } else { + right[rt] = insert(jobi, mid + 1, r, right[rt]); + } + } + return rt; + } + + public static int query(int jobk, int l, int r, int u, int v, int lca, int lcafa) { + if (l == r) { + return l; + } + int lsize = siz[left[u]] + siz[left[v]] - siz[left[lca]] - siz[left[lcafa]]; + int mid = (l + r) / 2; + if (lsize >= jobk) { + return query(jobk, l, mid, left[u], left[v], left[lca], left[lcafa]); + } else { + return query(jobk - lsize, mid + 1, r, right[u], right[v], right[lca], right[lcafa]); + } + } + + // 递归版,C++可以通过,java无法通过,递归会爆栈 + public static void dfs1(int u, int fa, int treeh) { + root[u] = insert(arr[u], 1, diff, root[fa]); + dep[u] = dep[fa] + 1; + treeHead[u] = treeh; + headSiz[treeh]++; + 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, treeh); + } + } + } + + // 迭代版,都可以通过 + // 讲解118,详解了从递归版改迭代版 + public static int[][] stack = new int[MAXN][4]; + + public static int stackSize, cur, father, treehead, edge; + + public static void push(int cur, int father, int treehead, int edge) { + stack[stackSize][0] = cur; + stack[stackSize][1] = father; + stack[stackSize][2] = treehead; + stack[stackSize][3] = edge; + stackSize++; + } + + public static void pop() { + --stackSize; + cur = stack[stackSize][0]; + father = stack[stackSize][1]; + treehead = stack[stackSize][2]; + edge = stack[stackSize][3]; + } + + // dfs1的迭代版 + public static void dfs2(int i, int fa, int treeh) { + stackSize = 0; + push(i, fa, treeh, -1); + while (stackSize > 0) { + pop(); + if (edge == -1) { + root[cur] = insert(arr[cur], 1, diff, root[father]); + dep[cur] = dep[father] + 1; + treeHead[cur] = treehead; + headSiz[treehead]++; + stjump[cur][0] = father; + for (int p = 1; p < MAXH; p++) { + stjump[cur][p] = stjump[stjump[cur][p - 1]][p - 1]; + } + edge = head[cur]; + } else { + edge = next[edge]; + } + if (edge != 0) { + push(cur, father, treehead, edge); + if (to[edge] != father) { + push(to[edge], cur, treehead, -1); + } + } + } + } + + 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 queryKth(int x, int y, int k) { + int xylca = lca(x, y); + int lcafa = stjump[xylca][0]; + int i = query(k, 1, diff, root[x], root[y], root[xylca], root[lcafa]); + return sorted[i]; + } + + public static void connect(int x, int y) { + addEdge(x, y); + addEdge(y, x); + int fx = treeHead[x]; + int fy = treeHead[y]; + if (headSiz[fx] >= headSiz[fy]) { + dfs2(y, x, fx); // 调用dfs1的迭代版 + } else { + dfs2(x, y, fy); // 调用dfs1的迭代版 + } + } + + public static void prepare() { + for (int i = 1; i <= n; i++) { + sorted[i] = arr[i]; + } + Arrays.sort(sorted, 1, n + 1); + diff = 1; + for (int i = 2; i <= n; i++) { + if (sorted[diff] != sorted[i]) { + sorted[++diff] = sorted[i]; + } + } + for (int i = 1; i <= n; i++) { + arr[i] = kth(arr[i]); + } + for (int i = 1; i <= n; i++) { + if (treeHead[i] == 0) { + dfs2(i, 0, i); // 调用dfs1的迭代版 + } + } + } + + public static void main(String[] args) throws IOException { + FastReader in = new FastReader(); + PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); + testcase = in.nextInt(); + n = in.nextInt(); + m = in.nextInt(); + t = in.nextInt(); + for (int i = 1; i <= n; i++) { + arr[i] = in.nextInt(); + } + for (int i = 1, u, v; i <= m; i++) { + u = in.nextInt(); + v = in.nextInt(); + addEdge(u, v); + addEdge(v, u); + } + prepare(); + char op; + int x, y, k, lastAns = 0; + for (int i = 1; i <= t; i++) { + op = in.nextChar(); + x = in.nextInt() ^ lastAns; + y = in.nextInt() ^ lastAns; + if (op == 'Q') { + k = in.nextInt() ^ lastAns; + lastAns = queryKth(x, y, k); + out.println(lastAns); + } else { + connect(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; + } + + public double nextDouble() throws IOException { + double num = 0, div = 1; + byte b = readByte(); + while (isWhitespace(b)) + b = readByte(); + boolean minus = false; + if (b == '-') { + minus = true; + b = readByte(); + } + while (!isWhitespace(b) && b != '.' && b != -1) { + num = num * 10 + (b - '0'); + b = readByte(); + } + if (b == '.') { + b = readByte(); + while (!isWhitespace(b) && b != -1) { + num += (b - '0') / (div *= 10); + b = readByte(); + } + } + return minus ? -num : num; + } + + private boolean isWhitespace(byte b) { + return b == ' ' || b == '\n' || b == '\r' || b == '\t'; + } + } + +} diff --git a/src/class163/Code07_Forest2.java b/src/class163/Code07_Forest2.java new file mode 100644 index 000000000..883e82276 --- /dev/null +++ b/src/class163/Code07_Forest2.java @@ -0,0 +1,199 @@ +package class163; + +// 森林,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P3302 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 80001; +//const int MAXT = MAXN * 110; +//const int MAXH = 20; +//int testcase; +//int n, m, t; +// +//int arr[MAXN]; +//int sorted[MAXN]; +//int diff; +// +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int cntg = 0; +// +//int root[MAXN]; +//int ls[MAXT]; +//int rs[MAXT]; +//int siz[MAXT]; +//int cntt = 0; +// +//int dep[MAXN]; +//int treeHead[MAXN]; +//int headSiz[MAXN]; +//int stjump[MAXN][MAXH]; +// +//int kth(int num) { +// int left = 1, right = diff, 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 addEdge(int u, int v) { +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// head[u] = cntg; +//} +// +//int insert(int jobi, int l, int r, int i) { +// int rt = ++cntt; +// ls[rt] = ls[i]; +// rs[rt] = rs[i]; +// siz[rt] = siz[i] + 1; +// if (l < r) { +// 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]); +// } +// } +// return rt; +//} +// +//int query(int jobk, int l, int r, int u, int v, int lca_, int lcafa) { +// if (l == r) { +// return l; +// } +// int lsize = siz[ls[u]] + siz[ls[v]] - siz[ls[lca_]] - siz[ls[lcafa]]; +// int mid = (l + r) / 2; +// if (lsize >= 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]); +// } +//} +// +//void dfs(int u, int fa, int treeh) { +// root[u] = insert(arr[u], 1, diff, root[fa]); +// dep[u] = dep[fa] + 1; +// treeHead[u] = treeh; +// headSiz[treeh]++; +// 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]) { +// if (to[e] != fa) { +// dfs(to[e], u, treeh); +// } +// } +//} +// +//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 queryKth(int x, int y, int k) { +// int xylca = lca(x, y); +// int lcafa = stjump[xylca][0]; +// int i = query(k, 1, diff, root[x], root[y], root[xylca], root[lcafa]); +// return sorted[i]; +//} +// +//void connect(int x, int y) { +// addEdge(x, y); +// addEdge(y, x); +// int fx = treeHead[x]; +// int fy = treeHead[y]; +// if (headSiz[fx] >= headSiz[fy]) { +// dfs(y, x, fx); +// } else { +// dfs(x, y, fy); +// } +//} +// +//void prepare() { +// for (int i = 1; i <= n; i++) { +// sorted[i] = arr[i]; +// } +// sort(sorted + 1, sorted + n + 1); +// diff = 1; +// for (int i = 2; i <= n; i++) { +// if (sorted[diff] != sorted[i]) { +// sorted[++diff] = sorted[i]; +// } +// } +// for (int i = 1; i <= n; i++) { +// arr[i] = kth(arr[i]); +// } +// for (int i = 1; i <= n; i++) { +// if (treeHead[i] == 0) { +// dfs(i, 0, i); +// } +// } +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> testcase >> n >> m >> t; +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// for (int i = 1; i <= m; i++) { +// int u, v; +// cin >> u >> v; +// addEdge(u, v); +// addEdge(v, u); +// } +// prepare(); +// char op; +// int x, y, k, lastAns = 0; +// for (int i = 1; i <= t; i++) { +// cin >> op; +// cin >> x; +// cin >> y; +// x ^= lastAns; +// y ^= lastAns; +// if (op == 'Q') { +// cin >> k; +// k ^= lastAns; +// lastAns = queryKth(x, y, k); +// cout << lastAns << "\n"; +// } else { +// connect(x, y); +// } +// } +// return 0; +//} \ No newline at end of file From 6922b43af28d07859e19f4a161643980aaa81870 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 19 Mar 2025 21:11:38 +0800 Subject: [PATCH 0837/2029] modify code --- src/class163/Code01_ColorOnTree1.java | 4 ++++ src/class163/Code01_ColorOnTree2.java | 4 ++++ ...03_ColorBanlance1.java => Code02_ColorBanlance1.java} | 9 +++++++-- ...03_ColorBanlance2.java => Code02_ColorBanlance2.java} | 7 ++++++- ...03_ColorBanlance3.java => Code02_ColorBanlance3.java} | 5 +++++ ...de04_LomsatGelral1.java => Code03_LomsatGelral1.java} | 8 +++++++- ...de04_LomsatGelral2.java => Code03_LomsatGelral2.java} | 6 ++++++ ...de02_DifferntName1.java => Code04_DifferntName1.java} | 8 +++++++- ...de02_DifferntName2.java => Code04_DifferntName2.java} | 6 ++++++ src/class163/Code05_BloodCousins1.java | 9 +++++++++ src/class163/Code05_BloodCousins2.java | 9 +++++++++ src/class163/Code06_RearrangePalindrome1.java | 5 +++++ src/class163/Code06_RearrangePalindrome2.java | 5 +++++ src/class163/Code07_Forest1.java | 9 +++++++++ src/class163/Code07_Forest2.java | 9 +++++++++ 15 files changed, 98 insertions(+), 5 deletions(-) rename src/class163/{Code03_ColorBanlance1.java => Code02_ColorBanlance1.java} (86%) rename src/class163/{Code03_ColorBanlance2.java => Code02_ColorBanlance2.java} (92%) rename src/class163/{Code03_ColorBanlance3.java => Code02_ColorBanlance3.java} (86%) rename src/class163/{Code04_LomsatGelral1.java => Code03_LomsatGelral1.java} (85%) rename src/class163/{Code04_LomsatGelral2.java => Code03_LomsatGelral2.java} (85%) rename src/class163/{Code02_DifferntName1.java => Code04_DifferntName1.java} (91%) rename src/class163/{Code02_DifferntName2.java => Code04_DifferntName2.java} (89%) diff --git a/src/class163/Code01_ColorOnTree1.java b/src/class163/Code01_ColorOnTree1.java index d6c15b82c..5d679bbe6 100644 --- a/src/class163/Code01_ColorOnTree1.java +++ b/src/class163/Code01_ColorOnTree1.java @@ -1,6 +1,10 @@ package class163; // 树上数颜色,java版 +// 一共有n个节点,编号1~n,给定n-1条边,所有节点连成一棵树,1号节点为树头 +// 每个节点给定一种颜色值,一共有m条查询,每条查询给定参数x +// 每条查询打印x为头的子树上,一共有多少种不同的颜色 +// 1 <= n、m、颜色值 <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/U41492 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class163/Code01_ColorOnTree2.java b/src/class163/Code01_ColorOnTree2.java index 403daa8ea..ecc054b7d 100644 --- a/src/class163/Code01_ColorOnTree2.java +++ b/src/class163/Code01_ColorOnTree2.java @@ -1,6 +1,10 @@ package class163; // 树上数颜色,C++版 +// 一共有n个节点,编号1~n,给定n-1条边,所有节点连成一棵树,1号节点为树头 +// 每个节点给定一种颜色值,一共有m条查询,每条查询给定参数x +// 每条查询打印x为头的子树上,一共有多少种不同的颜色 +// 1 <= n、m、颜色值 <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/U41492 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class163/Code03_ColorBanlance1.java b/src/class163/Code02_ColorBanlance1.java similarity index 86% rename from src/class163/Code03_ColorBanlance1.java rename to src/class163/Code02_ColorBanlance1.java index 86f2458fd..97ed83c32 100644 --- a/src/class163/Code03_ColorBanlance1.java +++ b/src/class163/Code02_ColorBanlance1.java @@ -1,10 +1,15 @@ package class163; // 颜色平衡的子树,java实现递归版 +// 一共有n个节点,编号1~n,给定每个节点的颜色值和父亲节点编号 +// 输入保证所有节点一定组成一棵树,并且1号节点是树头 +// 如果一棵子树中,存在的每种颜色的节点个数都相同,这棵子树叫颜色平衡树 +// 打印整棵树中有多少个子树是颜色平衡树 +// 1 <= n、颜色值 <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P9233 // 提交以下的code,提交时请把类名改成"Main" // 因为树的深度太大,递归函数爆栈了,所以会有两个测试用例无法通过 -// 迭代版可以完全通过,就是本节课Code03_ColorBanlance2文件 +// 迭代版可以完全通过,就是本节课Code02_ColorBanlance2文件 import java.io.BufferedReader; import java.io.IOException; @@ -13,7 +18,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code03_ColorBanlance1 { +public class Code02_ColorBanlance1 { public static int MAXN = 200001; diff --git a/src/class163/Code03_ColorBanlance2.java b/src/class163/Code02_ColorBanlance2.java similarity index 92% rename from src/class163/Code03_ColorBanlance2.java rename to src/class163/Code02_ColorBanlance2.java index 8eae184dd..a1fc74999 100644 --- a/src/class163/Code03_ColorBanlance2.java +++ b/src/class163/Code02_ColorBanlance2.java @@ -1,6 +1,11 @@ package class163; // 颜色平衡的子树,java实现迭代版 +// 一共有n个节点,编号1~n,给定每个节点的颜色值和父亲节点编号 +// 输入保证所有节点一定组成一棵树,并且1号节点是树头 +// 如果一棵子树中,存在的每种颜色的节点个数都相同,这棵子树叫颜色平衡树 +// 打印整棵树中有多少个子树是颜色平衡树 +// 1 <= n、颜色值 <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P9233 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -11,7 +16,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code03_ColorBanlance2 { +public class Code02_ColorBanlance2 { public static int MAXN = 200001; public static int n; diff --git a/src/class163/Code03_ColorBanlance3.java b/src/class163/Code02_ColorBanlance3.java similarity index 86% rename from src/class163/Code03_ColorBanlance3.java rename to src/class163/Code02_ColorBanlance3.java index 6811ea1a8..7497f8899 100644 --- a/src/class163/Code03_ColorBanlance3.java +++ b/src/class163/Code02_ColorBanlance3.java @@ -1,6 +1,11 @@ package class163; // 颜色平衡的子树,C++版 +// 一共有n个节点,编号1~n,给定每个节点的颜色值和父亲节点编号 +// 输入保证所有节点一定组成一棵树,并且1号节点是树头 +// 如果一棵子树中,存在的每种颜色的节点个数都相同,这棵子树叫颜色平衡树 +// 打印整棵树中有多少个子树是颜色平衡树 +// 1 <= n、颜色值 <= 2 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/P9233 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 diff --git a/src/class163/Code04_LomsatGelral1.java b/src/class163/Code03_LomsatGelral1.java similarity index 85% rename from src/class163/Code04_LomsatGelral1.java rename to src/class163/Code03_LomsatGelral1.java index 005dc53c9..1d86d5a33 100644 --- a/src/class163/Code04_LomsatGelral1.java +++ b/src/class163/Code03_LomsatGelral1.java @@ -1,6 +1,12 @@ package class163; // 主导颜色累加和,java版 +// 一共有n个节点,编号1~n,给定n-1条边,所有节点连成一棵树,1号节点为树头 +// 每个节点给定一种颜色值,主导颜色累加和定义如下 +// 以x为头的子树上,哪种颜色出现最多,那种颜色就是主导颜色,主导颜色可能不止一种 +// 所有主导颜色的值累加起来,每个主导颜色只累加一次,就是该子树的主导颜色累加和 +// 打印1~n每个节点为头的子树的主导颜色累加和 +// 1 <= n、颜色值 <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/CF600E // 测试链接 : https://codeforces.com/problemset/problem/600/E // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -12,7 +18,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code04_LomsatGelral1 { +public class Code03_LomsatGelral1 { public static int MAXN = 100001; public static int n; diff --git a/src/class163/Code04_LomsatGelral2.java b/src/class163/Code03_LomsatGelral2.java similarity index 85% rename from src/class163/Code04_LomsatGelral2.java rename to src/class163/Code03_LomsatGelral2.java index c89d90ebc..d19c38e37 100644 --- a/src/class163/Code04_LomsatGelral2.java +++ b/src/class163/Code03_LomsatGelral2.java @@ -1,6 +1,12 @@ package class163; // 主导颜色累加和,C++版 +// 一共有n个节点,编号1~n,给定n-1条边,所有节点连成一棵树,1号节点为树头 +// 每个节点给定一种颜色值,主导颜色累加和定义如下 +// 以x为头的子树上,哪种颜色出现最多,那种颜色就是主导颜色,主导颜色可能不止一种 +// 所有主导颜色的值累加起来,每个主导颜色只累加一次,就是该子树的主导颜色累加和 +// 打印1~n每个节点为头的子树的主导颜色累加和 +// 1 <= n、颜色值 <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/CF600E // 测试链接 : https://codeforces.com/problemset/problem/600/E // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 diff --git a/src/class163/Code02_DifferntName1.java b/src/class163/Code04_DifferntName1.java similarity index 91% rename from src/class163/Code02_DifferntName1.java rename to src/class163/Code04_DifferntName1.java index ae0ee1356..105b7b549 100644 --- a/src/class163/Code02_DifferntName1.java +++ b/src/class163/Code04_DifferntName1.java @@ -1,6 +1,12 @@ package class163; // 不同名字数量,java版 +// 一共有n个节点,编号1~n,给定每个节点的名字和父亲节点编号 +// 名字是string类型,如果父亲节点编号为0,说明当前节点是某棵树的头节点 +// 注意,n个节点组成的是森林结构,可能有若干棵树 +// 一共有m条查询,每条查询 x k,含义如下 +// 以x为头的子树上,到x距离为k的所有节点中,打印不同名字的数量 +// 1 <= n、m <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/CF246E // 测试链接 : https://codeforces.com/problemset/problem/246/E // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -17,7 +23,7 @@ import java.util.HashSet; import java.util.StringTokenizer; -public class Code02_DifferntName1 { +public class Code04_DifferntName1 { public static int MAXN = 100001; public static int n, m; diff --git a/src/class163/Code02_DifferntName2.java b/src/class163/Code04_DifferntName2.java similarity index 89% rename from src/class163/Code02_DifferntName2.java rename to src/class163/Code04_DifferntName2.java index 2944a19c1..16ce9aea4 100644 --- a/src/class163/Code02_DifferntName2.java +++ b/src/class163/Code04_DifferntName2.java @@ -1,6 +1,12 @@ package class163; // 不同名字数量,C++版 +// 一共有n个节点,编号1~n,给定每个节点的名字和父亲节点编号 +// 名字是string类型,如果父亲节点编号为0,说明当前节点是某棵树的头节点 +// 注意,n个节点组成的是森林结构,可能有若干棵树 +// 一共有m条查询,每条查询 x k,含义如下 +// 以x为头的子树上,到x距离为k的所有节点中,打印不同名字的数量 +// 1 <= n、m <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/CF246E // 测试链接 : https://codeforces.com/problemset/problem/246/E // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 diff --git a/src/class163/Code05_BloodCousins1.java b/src/class163/Code05_BloodCousins1.java index 312836d9d..39746f40b 100644 --- a/src/class163/Code05_BloodCousins1.java +++ b/src/class163/Code05_BloodCousins1.java @@ -1,6 +1,15 @@ package class163; // 表亲数量,java版 +// 一共有n个节点,编号1~n,给定每个节点的父亲节点编号 +// 如果父亲节点编号为0,说明当前节点是某棵树的头节点 +// 注意,n个节点组成的是森林结构,可能有若干棵树 +// 一共有m条查询,每条查询 x k,含义如下 +// 如果x往上走k的距离,没有祖先节点,打印0 +// 如果x往上走k的距离,能找到祖先节点a +// 那么从a往下走k的距离,有可能找到除了x之外,很多其他的节点 +// 这些节点叫做x的k级表亲,打印这个表亲的数量 +// 1 <= n、m <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/CF208E // 测试链接 : https://codeforces.com/problemset/problem/208/E // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class163/Code05_BloodCousins2.java b/src/class163/Code05_BloodCousins2.java index e834487f0..a11710610 100644 --- a/src/class163/Code05_BloodCousins2.java +++ b/src/class163/Code05_BloodCousins2.java @@ -1,6 +1,15 @@ package class163; // 表亲数量,C++版 +// 一共有n个节点,编号1~n,给定每个节点的父亲节点编号 +// 如果父亲节点编号为0,说明当前节点是某棵树的头节点 +// 注意,n个节点组成的是森林结构,可能有若干棵树 +// 一共有m条查询,每条查询 x k,含义如下 +// 如果x往上走k的距离,没有祖先节点,打印0 +// 如果x往上走k的距离,能找到祖先节点a +// 那么从a往下走k的距离,有可能找到除了x之外,很多其他的节点 +// 这些节点叫做x的k级表亲,打印这个表亲的数量 +// 1 <= n、m <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/CF208E // 测试链接 : https://codeforces.com/problemset/problem/208/E // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 diff --git a/src/class163/Code06_RearrangePalindrome1.java b/src/class163/Code06_RearrangePalindrome1.java index 984140154..99b5f0a90 100644 --- a/src/class163/Code06_RearrangePalindrome1.java +++ b/src/class163/Code06_RearrangePalindrome1.java @@ -1,6 +1,11 @@ package class163; // 最长重排回文路径,java版 +// 一共有n个节点,编号1~n,给定n-1条边,所有节点连成一棵树,1号节点为树头 +// 每条边上都有一个字符,字符范围[a~v],字符一共22种,重排回文路径的定义如下 +// 节点a到节点b的路径,如果所有边的字符收集起来,能重新排列成回文串,该路径是重排回文路径 +// 打印1~n每个节点为头的子树中,最长重排回文路径的长度 +// 1 <= n <= 5 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/CF741D // 测试链接 : https://codeforces.com/problemset/problem/741/D // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class163/Code06_RearrangePalindrome2.java b/src/class163/Code06_RearrangePalindrome2.java index aa9cdb6a7..71f153085 100644 --- a/src/class163/Code06_RearrangePalindrome2.java +++ b/src/class163/Code06_RearrangePalindrome2.java @@ -1,6 +1,11 @@ package class163; // 最长重排回文路径,C++版 +// 一共有n个节点,编号1~n,给定n-1条边,所有节点连成一棵树,1号节点为树头 +// 每条边上都有一个字符,字符范围[a~v],字符一共22种,重排回文路径的定义如下 +// 节点a到节点b的路径,如果所有边的字符收集起来,能重新排列成回文串,该路径是重排回文路径 +// 打印1~n每个节点为头的子树中,最长重排回文路径的长度 +// 1 <= n <= 5 * 10^5 // 测试链接 : https://www.luogu.com.cn/problem/CF741D // 测试链接 : https://codeforces.com/problemset/problem/741/D // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 diff --git a/src/class163/Code07_Forest1.java b/src/class163/Code07_Forest1.java index f244a79be..ed16bab63 100644 --- a/src/class163/Code07_Forest1.java +++ b/src/class163/Code07_Forest1.java @@ -1,6 +1,15 @@ package class163; // 森林,java版 +// 一共有n个节点,编号1~n,初始时给定m条边,所有节点可能组成森林结构 +// 每个节点都给定非负的点权,一共有t条操作,每条操作是如下两种类型中的一种 +// 操作 Q x y k : 点x到点y路径上所有的权值中,打印第k小的权值是多少 +// 题目保证x和y联通,并且路径上至少有k个点 +// 操作 L x y : 点x和点y之间连接一条边 +// 题目保证操作后,所有节点仍然是森林 +// 题目要求强制在线,请不要使用离线算法 +// 1 <= n、m、t <= 8 * 10^4 +// 点权 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P3302 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 diff --git a/src/class163/Code07_Forest2.java b/src/class163/Code07_Forest2.java index 883e82276..648159ee7 100644 --- a/src/class163/Code07_Forest2.java +++ b/src/class163/Code07_Forest2.java @@ -1,6 +1,15 @@ package class163; // 森林,C++版 +// 一共有n个节点,编号1~n,初始时给定m条边,所有节点可能组成森林结构 +// 每个节点都给定非负的点权,一共有t条操作,每条操作是如下两种类型中的一种 +// 操作 Q x y k : 点x到点y路径上所有的权值中,打印第k小的权值是多少 +// 题目保证x和y联通,并且路径上至少有k个点 +// 操作 L x y : 点x和点y之间连接一条边 +// 题目保证操作后,所有节点仍然是森林 +// 题目要求强制在线,请不要使用离线算法 +// 1 <= n、m、t <= 8 * 10^4 +//点权 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P3302 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From 993ec4688727d2d39054c53d2b54ea6607612724 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 19 Mar 2025 21:12:32 +0800 Subject: [PATCH 0838/2029] modify code --- src/class163/Code07_Forest2.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class163/Code07_Forest2.java b/src/class163/Code07_Forest2.java index 648159ee7..769b2377a 100644 --- a/src/class163/Code07_Forest2.java +++ b/src/class163/Code07_Forest2.java @@ -9,7 +9,7 @@ // 题目保证操作后,所有节点仍然是森林 // 题目要求强制在线,请不要使用离线算法 // 1 <= n、m、t <= 8 * 10^4 -//点权 <= 10^9 +// 点权 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P3302 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 From 0eeca7cde3dbd1900183b3cf16667179700e633d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 20 Mar 2025 16:37:28 +0800 Subject: [PATCH 0839/2029] modify code --- .../{Code01_ColorOnTree1.java => Code01_DsuOnTree1.java} | 4 ++-- .../{Code01_ColorOnTree2.java => Code01_DsuOnTree2.java} | 2 +- src/class163/Code05_BloodCousins1.java | 3 +-- src/class163/Code05_BloodCousins2.java | 3 +-- 4 files changed, 5 insertions(+), 7 deletions(-) rename src/class163/{Code01_ColorOnTree1.java => Code01_DsuOnTree1.java} (97%) rename src/class163/{Code01_ColorOnTree2.java => Code01_DsuOnTree2.java} (98%) diff --git a/src/class163/Code01_ColorOnTree1.java b/src/class163/Code01_DsuOnTree1.java similarity index 97% rename from src/class163/Code01_ColorOnTree1.java rename to src/class163/Code01_DsuOnTree1.java index 5d679bbe6..4d81664ce 100644 --- a/src/class163/Code01_ColorOnTree1.java +++ b/src/class163/Code01_DsuOnTree1.java @@ -1,6 +1,6 @@ package class163; -// 树上数颜色,java版 +// 树上启发式合并模版题,java版 // 一共有n个节点,编号1~n,给定n-1条边,所有节点连成一棵树,1号节点为树头 // 每个节点给定一种颜色值,一共有m条查询,每条查询给定参数x // 每条查询打印x为头的子树上,一共有多少种不同的颜色 @@ -15,7 +15,7 @@ import java.io.PrintWriter; import java.io.StreamTokenizer; -public class Code01_ColorOnTree1 { +public class Code01_DsuOnTree1 { public static int MAXN = 100001; diff --git a/src/class163/Code01_ColorOnTree2.java b/src/class163/Code01_DsuOnTree2.java similarity index 98% rename from src/class163/Code01_ColorOnTree2.java rename to src/class163/Code01_DsuOnTree2.java index ecc054b7d..0f441bfc3 100644 --- a/src/class163/Code01_ColorOnTree2.java +++ b/src/class163/Code01_DsuOnTree2.java @@ -1,6 +1,6 @@ package class163; -// 树上数颜色,C++版 +// 树上启发式合并模版题,C++版 // 一共有n个节点,编号1~n,给定n-1条边,所有节点连成一棵树,1号节点为树头 // 每个节点给定一种颜色值,一共有m条查询,每条查询给定参数x // 每条查询打印x为头的子树上,一共有多少种不同的颜色 diff --git a/src/class163/Code05_BloodCousins1.java b/src/class163/Code05_BloodCousins1.java index 39746f40b..5e5deb72d 100644 --- a/src/class163/Code05_BloodCousins1.java +++ b/src/class163/Code05_BloodCousins1.java @@ -6,8 +6,7 @@ // 注意,n个节点组成的是森林结构,可能有若干棵树 // 一共有m条查询,每条查询 x k,含义如下 // 如果x往上走k的距离,没有祖先节点,打印0 -// 如果x往上走k的距离,能找到祖先节点a -// 那么从a往下走k的距离,有可能找到除了x之外,很多其他的节点 +// 如果x往上走k的距离,能找到祖先节点a,那么从a往下走k的距离,除了x之外,可能还有其他节点 // 这些节点叫做x的k级表亲,打印这个表亲的数量 // 1 <= n、m <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/CF208E diff --git a/src/class163/Code05_BloodCousins2.java b/src/class163/Code05_BloodCousins2.java index a11710610..9c11eeda8 100644 --- a/src/class163/Code05_BloodCousins2.java +++ b/src/class163/Code05_BloodCousins2.java @@ -6,8 +6,7 @@ // 注意,n个节点组成的是森林结构,可能有若干棵树 // 一共有m条查询,每条查询 x k,含义如下 // 如果x往上走k的距离,没有祖先节点,打印0 -// 如果x往上走k的距离,能找到祖先节点a -// 那么从a往下走k的距离,有可能找到除了x之外,很多其他的节点 +// 如果x往上走k的距离,能找到祖先节点a,那么从a往下走k的距离,除了x之外,可能还有其他节点 // 这些节点叫做x的k级表亲,打印这个表亲的数量 // 1 <= n、m <= 10^5 // 测试链接 : https://www.luogu.com.cn/problem/CF208E From 2d66edc8cfa1e301909dce5f78612841b55fd970 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 20 Mar 2025 16:59:11 +0800 Subject: [PATCH 0840/2029] modify code --- src/class163/Code01_DsuOnTree2.java | 260 +++++++++++++++------------- src/class163/Code01_DsuOnTree3.java | 127 ++++++++++++++ 2 files changed, 263 insertions(+), 124 deletions(-) create mode 100644 src/class163/Code01_DsuOnTree3.java diff --git a/src/class163/Code01_DsuOnTree2.java b/src/class163/Code01_DsuOnTree2.java index 0f441bfc3..005564b14 100644 --- a/src/class163/Code01_DsuOnTree2.java +++ b/src/class163/Code01_DsuOnTree2.java @@ -1,128 +1,140 @@ package class163; -// 树上启发式合并模版题,C++版 -// 一共有n个节点,编号1~n,给定n-1条边,所有节点连成一棵树,1号节点为树头 -// 每个节点给定一种颜色值,一共有m条查询,每条查询给定参数x -// 每条查询打印x为头的子树上,一共有多少种不同的颜色 -// 1 <= n、m、颜色值 <= 10^5 +// 树上启发式合并模版题,java版 +// 只需要关注有注释的代码 +// 揭示了轻儿子取消自己的影响后 +// 其实全局的信息统计就是空的 +// 所以改成注释的代码也是正确的 // 测试链接 : https://www.luogu.com.cn/problem/U41492 -// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 -// 提交如下代码,可以通过所有测试用例 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 -//#include -// -//using namespace std; -// -//const int MAXN = 100001; -//int n, m; -//int arr[MAXN]; -// -//int head[MAXN]; -//int nxt[MAXN << 1]; -//int to[MAXN << 1]; -//int cnt = 0; -// -//int fa[MAXN]; -//int siz[MAXN]; -//int son[MAXN]; -// -//int colorCnt[MAXN]; -//int ans[MAXN]; -//int total = 0; -// -//void addEdge(int u, int v) { -// nxt[++cnt] = head[u]; -// to[cnt] = v; -// head[u] = cnt; -//} -// -//void effect(int u) { -// if (++colorCnt[arr[u]] == 1) { -// total++; -// } -// for (int e = head[u], v; e > 0; e = nxt[e]) { -// v = to[e]; -// if (v != fa[u]) { -// effect(v); -// } -// } -//} -// -//void cancle(int u) { -// if (--colorCnt[arr[u]] == 0) { -// total--; -// } -// for (int e = head[u], v; e > 0; e = nxt[e]) { -// v = to[e]; -// if (v != fa[u]) { -// cancle(v); -// } -// } -//} -// -//void dfs1(int u, int f) { -// fa[u] = f; -// 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 e = head[u], v; e > 0; 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 keep) { -// for (int e = head[u], v; e > 0; e = nxt[e]) { -// v = to[e]; -// if (v != fa[u] && v != son[u]) { -// dfs2(v, 0); -// } -// } -// if (son[u] != 0) { -// dfs2(son[u], 1); -// } -// if (++colorCnt[arr[u]] == 1) { -// total++; -// } -// for (int e = head[u], v; e > 0; e = nxt[e]) { -// v = to[e]; -// if (v != fa[u] && v != son[u]) { -// effect(v); -// } -// } -// ans[u] = total; -// if (keep == 0) { -// cancle(u); -// } -//} -// -//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); -// } -// for (int i = 1; i <= n; i++) { -// cin >> arr[i]; -// } -// dfs1(1, 0); -// dfs2(1, 1); -// cin >> m; -// for (int i = 1, cur; i <= m; i++) { -// cin >> cur; -// cout << ans[cur] << "\n"; -// } -// return 0; -//} \ No newline at end of file +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 Code01_DsuOnTree2 { + + public static int MAXN = 100001; + public static int n, m; + 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 cnt = 0; + public static int[] fa = new int[MAXN]; + public static int[] siz = new int[MAXN]; + public static int[] son = new int[MAXN]; + public static int[] colorCnt = new int[MAXN]; + public static int[] ans = new int[MAXN]; + public static int total = 0; + + public static void addEdge(int u, int v) { + next[++cnt] = head[u]; + to[cnt] = v; + head[u] = cnt; + } + + public static void effect(int u) { + if (++colorCnt[arr[u]] == 1) { + total++; + } + for (int e = head[u], v; e > 0; e = next[e]) { + v = to[e]; + if (v != fa[u]) { + effect(v); + } + } + } + + public static void cancle(int u) { + colorCnt[arr[u]] = 0; // 出现任何颜色,直接把该颜色的计数重置为0 + for (int e = head[u], v; e > 0; e = next[e]) { + v = to[e]; + if (v != fa[u]) { + cancle(v); + } + } + } + + public static void dfs1(int u, int f) { + fa[u] = f; + 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 keep) { + for (int e = head[u], v; e > 0; e = next[e]) { + v = to[e]; + if (v != fa[u] && v != son[u]) { + dfs2(v, 0); + } + } + if (son[u] != 0) { + dfs2(son[u], 1); + } + if (++colorCnt[arr[u]] == 1) { + total++; + } + for (int e = head[u], v; e > 0; e = next[e]) { + v = to[e]; + if (v != fa[u] && v != son[u]) { + effect(v); + } + } + ans[u] = total; + if (keep == 0) { + total = 0; // 直接把全局的不同颜色数量重置为0 + cancle(u); + } + } + + 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; + 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 <= n; i++) { + in.nextToken(); + arr[i] = (int) in.nval; + } + dfs1(1, 0); + dfs2(1, 1); + in.nextToken(); + m = (int) in.nval; + for (int i = 1, cur; i <= m; i++) { + in.nextToken(); + cur = (int) in.nval; + out.println(ans[cur]); + } + out.flush(); + out.close(); + br.close(); + } + +} diff --git a/src/class163/Code01_DsuOnTree3.java b/src/class163/Code01_DsuOnTree3.java new file mode 100644 index 000000000..f43318634 --- /dev/null +++ b/src/class163/Code01_DsuOnTree3.java @@ -0,0 +1,127 @@ +package class163; + +// 树上启发式合并模版题,C++版 +// 一共有n个节点,编号1~n,给定n-1条边,所有节点连成一棵树,1号节点为树头 +// 每个节点给定一种颜色值,一共有m条查询,每条查询给定参数x +// 每条查询打印x为头的子树上,一共有多少种不同的颜色 +// 1 <= n、m、颜色值 <= 10^5 +// 测试链接 : https://www.luogu.com.cn/problem/U41492 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//const int MAXN = 100001; +//int n, m; +//int arr[MAXN]; +// +//int head[MAXN]; +//int nxt[MAXN << 1]; +//int to[MAXN << 1]; +//int cnt = 0; +// +//int fa[MAXN]; +//int siz[MAXN]; +//int son[MAXN]; +// +//int colorCnt[MAXN]; +//int ans[MAXN]; +//int total = 0; +// +//void addEdge(int u, int v) { +// nxt[++cnt] = head[u]; +// to[cnt] = v; +// head[u] = cnt; +//} +// +//void effect(int u) { +// if (++colorCnt[arr[u]] == 1) { +// total++; +// } +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// if (v != fa[u]) { +// effect(v); +// } +// } +//} +// +//void cancle(int u) { +// colorCnt[arr[u]] = 0; +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// if (v != fa[u]) { +// cancle(v); +// } +// } +//} +// +//void dfs1(int u, int f) { +// fa[u] = f; +// 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 e = head[u], v; e > 0; 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 keep) { +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// if (v != fa[u] && v != son[u]) { +// dfs2(v, 0); +// } +// } +// if (son[u] != 0) { +// dfs2(son[u], 1); +// } +// if (++colorCnt[arr[u]] == 1) { +// total++; +// } +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// if (v != fa[u] && v != son[u]) { +// effect(v); +// } +// } +// ans[u] = total; +// if (keep == 0) { +// total = 0; +// cancle(u); +// } +//} +// +//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); +// } +// for (int i = 1; i <= n; i++) { +// cin >> arr[i]; +// } +// dfs1(1, 0); +// dfs2(1, 1); +// cin >> m; +// for (int i = 1, cur; i <= m; i++) { +// cin >> cur; +// cout << ans[cur] << "\n"; +// } +// return 0; +//} \ No newline at end of file From d1b4644cbf18544ad6f177e87f184ababea9d6d7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 20 Mar 2025 17:22:33 +0800 Subject: [PATCH 0841/2029] modify code --- src/class163/Code01_DsuOnTree1.java | 2 +- src/class163/Code01_DsuOnTree2.java | 2 +- src/class163/Code01_DsuOnTree3.java | 2 +- src/class163/Code02_ColorBanlance1.java | 2 +- src/class163/Code02_ColorBanlance2.java | 32 +++++++++---------- src/class163/Code02_ColorBanlance3.java | 2 +- src/class163/Code03_LomsatGelral1.java | 2 +- src/class163/Code03_LomsatGelral2.java | 2 +- src/class163/Code04_DifferntName1.java | 4 --- src/class163/Code05_BloodCousins1.java | 4 --- src/class163/Code06_RearrangePalindrome1.java | 2 +- src/class163/Code06_RearrangePalindrome2.java | 2 +- 12 files changed, 25 insertions(+), 33 deletions(-) diff --git a/src/class163/Code01_DsuOnTree1.java b/src/class163/Code01_DsuOnTree1.java index 4d81664ce..613a2f775 100644 --- a/src/class163/Code01_DsuOnTree1.java +++ b/src/class163/Code01_DsuOnTree1.java @@ -135,7 +135,7 @@ public static void main(String[] args) throws IOException { arr[i] = (int) in.nval; } dfs1(1, 0); - dfs2(1, 1); + dfs2(1, 0); in.nextToken(); m = (int) in.nval; for (int i = 1, cur; i <= m; i++) { diff --git a/src/class163/Code01_DsuOnTree2.java b/src/class163/Code01_DsuOnTree2.java index 005564b14..1e0ca0644 100644 --- a/src/class163/Code01_DsuOnTree2.java +++ b/src/class163/Code01_DsuOnTree2.java @@ -124,7 +124,7 @@ public static void main(String[] args) throws IOException { arr[i] = (int) in.nval; } dfs1(1, 0); - dfs2(1, 1); + dfs2(1, 0); in.nextToken(); m = (int) in.nval; for (int i = 1, cur; i <= m; i++) { diff --git a/src/class163/Code01_DsuOnTree3.java b/src/class163/Code01_DsuOnTree3.java index f43318634..ed93e03ce 100644 --- a/src/class163/Code01_DsuOnTree3.java +++ b/src/class163/Code01_DsuOnTree3.java @@ -117,7 +117,7 @@ // cin >> arr[i]; // } // dfs1(1, 0); -// dfs2(1, 1); +// dfs2(1, 0); // cin >> m; // for (int i = 1, cur; i <= m; i++) { // cin >> cur; diff --git a/src/class163/Code02_ColorBanlance1.java b/src/class163/Code02_ColorBanlance1.java index 97ed83c32..df2cd37fa 100644 --- a/src/class163/Code02_ColorBanlance1.java +++ b/src/class163/Code02_ColorBanlance1.java @@ -127,7 +127,7 @@ public static void main(String[] args) throws IOException { } } dfs1(1); - dfs2(1, 1); + dfs2(1, 0); out.println(ans); out.flush(); out.close(); diff --git a/src/class163/Code02_ColorBanlance2.java b/src/class163/Code02_ColorBanlance2.java index a1fc74999..d81e0c9f2 100644 --- a/src/class163/Code02_ColorBanlance2.java +++ b/src/class163/Code02_ColorBanlance2.java @@ -44,7 +44,7 @@ public static void addEdge(int u, int v) { // stack2、size2、cur2、edge2、keep2,用于把dfs2改成迭代版 public static int[][] stack2 = new int[MAXN][3]; - public static int size2, cur2, edge2, keep2; + public static int size2, cur2, keep2, edge2; public static void push1(int u, int e) { stack1[size1][0] = u; @@ -58,18 +58,18 @@ public static void pop1() { edge1 = stack1[size1][1]; } - public static void push2(int u, int e, int k) { + public static void push2(int u, int k, int e) { stack2[size2][0] = u; - stack2[size2][1] = e; - stack2[size2][2] = k; + stack2[size2][1] = k; + stack2[size2][2] = e; size2++; } public static void pop2() { --size2; cur2 = stack2[size2][0]; - edge2 = stack2[size2][1]; - keep2 = stack2[size2][2]; + keep2 = stack2[size2][1]; + edge2 = stack2[size2][2]; } public static void effect(int root) { @@ -112,9 +112,9 @@ public static void cancle(int root) { } } - public static void dfs1() { + public static void dfs1(int u) { size1 = 0; - push1(1, -1); + push1(u, -1); while (size1 > 0) { pop1(); if (edge1 == -1) { @@ -143,9 +143,9 @@ public static void dfs1() { // edge2 > 0,表示正在依次处理轻儿子的子树 // edge2 == 0,表示处理完了所有轻儿子的子树,接下来处理重儿子的子树 // edge2 == -2,表示处理完了重儿子的子树,轮到启发式合并了 - public static void dfs2() { + public static void dfs2(int u, int keep) { size2 = 0; - push2(1, -1, 1); + push2(u, keep, -1); while (size2 > 0) { pop2(); if (edge2 != -2) { @@ -155,14 +155,14 @@ public static void dfs2() { edge2 = next[edge2]; } if (edge2 > 0) { - push2(cur2, edge2, keep2); + push2(cur2, keep2, edge2); if (to[edge2] != son[cur2]) { - push2(to[edge2], -1, 0); + push2(to[edge2], 0, -1); } } else { - push2(cur2, -2, keep2); + push2(cur2, keep2, -2); if (son[cur2] != 0) { - push2(son[cur2], -1, 1); + push2(son[cur2], 1, -1); } } } else { @@ -201,8 +201,8 @@ public static void main(String[] args) throws IOException { addEdge(father, i); } } - dfs1(); - dfs2(); + dfs1(1); + dfs2(1, 0); out.println(ans); out.flush(); out.close(); diff --git a/src/class163/Code02_ColorBanlance3.java b/src/class163/Code02_ColorBanlance3.java index 7497f8899..353a5d131 100644 --- a/src/class163/Code02_ColorBanlance3.java +++ b/src/class163/Code02_ColorBanlance3.java @@ -104,7 +104,7 @@ // } // } // dfs1(1); -// dfs2(1, 1); +// dfs2(1, 0); // cout << ans << "\n"; // return 0; //} \ No newline at end of file diff --git a/src/class163/Code03_LomsatGelral1.java b/src/class163/Code03_LomsatGelral1.java index 1d86d5a33..b90737671 100644 --- a/src/class163/Code03_LomsatGelral1.java +++ b/src/class163/Code03_LomsatGelral1.java @@ -139,7 +139,7 @@ public static void main(String[] args) throws IOException { addEdge(v, u); } dfs1(1, 0); - dfs2(1, 1); + dfs2(1, 0); for (int i = 1; i <= n; i++) { out.print(ans[i] + " "); } diff --git a/src/class163/Code03_LomsatGelral2.java b/src/class163/Code03_LomsatGelral2.java index d19c38e37..495d53a39 100644 --- a/src/class163/Code03_LomsatGelral2.java +++ b/src/class163/Code03_LomsatGelral2.java @@ -129,7 +129,7 @@ // addEdge(v, u); // } // dfs1(1, 0); -// dfs2(1, 1); +// dfs2(1, 0); // for (int i = 1; i <= n; i++) { // cout << ans[i] << " "; // } diff --git a/src/class163/Code04_DifferntName1.java b/src/class163/Code04_DifferntName1.java index 105b7b549..f2ac079b9 100644 --- a/src/class163/Code04_DifferntName1.java +++ b/src/class163/Code04_DifferntName1.java @@ -173,10 +173,6 @@ public static void main(String[] args) throws IOException { addQuestion(node, i, k); } for (int i = 1; i <= n; i++) { - // 因为是森林结构,可能有多棵子树彼此是不联通的 - // 所以认为每一棵树的头都是轻儿子 - // 这样每棵子树运行完后都会消除影响 - // 不会影响下一棵子树的答案 if (root[i]) { dfs2(i, 0); } diff --git a/src/class163/Code05_BloodCousins1.java b/src/class163/Code05_BloodCousins1.java index 5e5deb72d..48bb1033a 100644 --- a/src/class163/Code05_BloodCousins1.java +++ b/src/class163/Code05_BloodCousins1.java @@ -163,10 +163,6 @@ public static void main(String[] args) throws IOException { } } for (int i = 1; i <= n; i++) { - // 因为是森林结构,可能有多棵子树彼此是不联通的 - // 所以认为每一棵树的头都是轻儿子 - // 这样每棵子树运行完后都会消除影响 - // 不会影响下一棵子树的答案 if (root[i]) { dfs2(i, 0); } diff --git a/src/class163/Code06_RearrangePalindrome1.java b/src/class163/Code06_RearrangePalindrome1.java index 99b5f0a90..9cf26071c 100644 --- a/src/class163/Code06_RearrangePalindrome1.java +++ b/src/class163/Code06_RearrangePalindrome1.java @@ -136,7 +136,7 @@ public static void main(String[] args) throws IOException { addEdge(fth, i, edg); } dfs1(1, 1, 0); - dfs2(1, 1); + dfs2(1, 0); for (int i = 1; i <= n; i++) { out.print(ans[i] + " "); } diff --git a/src/class163/Code06_RearrangePalindrome2.java b/src/class163/Code06_RearrangePalindrome2.java index 71f153085..c6b520a12 100644 --- a/src/class163/Code06_RearrangePalindrome2.java +++ b/src/class163/Code06_RearrangePalindrome2.java @@ -131,7 +131,7 @@ // addEdge(fth, i, edg); // } // dfs1(1, 1, 0); -// dfs2(1, 1); +// dfs2(1, 0); // for (int i = 1; i <= n; i++) { // cout << ans[i] << " "; // } From a16d35a261035a1d3b3cc765bff227f9b1277ed9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 20 Mar 2025 17:24:42 +0800 Subject: [PATCH 0842/2029] modify code --- src/class163/Code04_DifferntName1.java | 2 -- src/class163/Code05_BloodCousins1.java | 2 -- 2 files changed, 4 deletions(-) diff --git a/src/class163/Code04_DifferntName1.java b/src/class163/Code04_DifferntName1.java index f2ac079b9..3edb8f405 100644 --- a/src/class163/Code04_DifferntName1.java +++ b/src/class163/Code04_DifferntName1.java @@ -157,8 +157,6 @@ public static void main(String[] args) throws IOException { } } for (int i = 1; i <= n; i++) { - // 因为是森林结构,可能有多棵子树彼此是不联通的 - // 所以对每一棵子树进行重链剖分 if (root[i]) { dfs1(i, 0); } diff --git a/src/class163/Code05_BloodCousins1.java b/src/class163/Code05_BloodCousins1.java index 48bb1033a..a3f1734f4 100644 --- a/src/class163/Code05_BloodCousins1.java +++ b/src/class163/Code05_BloodCousins1.java @@ -144,8 +144,6 @@ public static void main(String[] args) throws IOException { } } for (int i = 1; i <= n; i++) { - // 因为是森林结构,可能有多棵子树彼此是不联通的 - // 所以对每一棵子树进行重链剖分、生成倍增表 if (root[i]) { dfs1(i, 0); } From 895bff5a3f73568de3e56308b4c7b1a1be11ec3d Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 20 Mar 2025 17:47:24 +0800 Subject: [PATCH 0843/2029] modify code --- ...ee.java => Code03_WidthOfBinaryTree1.java} | 10 ++--- src/class036/Code03_WidthOfBinaryTree2.java | 40 +++++++++++++++++++ 2 files changed, 45 insertions(+), 5 deletions(-) rename src/class036/{Code03_WidthOfBinaryTree.java => Code03_WidthOfBinaryTree1.java} (81%) create mode 100644 src/class036/Code03_WidthOfBinaryTree2.java diff --git a/src/class036/Code03_WidthOfBinaryTree.java b/src/class036/Code03_WidthOfBinaryTree1.java similarity index 81% rename from src/class036/Code03_WidthOfBinaryTree.java rename to src/class036/Code03_WidthOfBinaryTree1.java index 3cb369ddb..c315690b7 100644 --- a/src/class036/Code03_WidthOfBinaryTree.java +++ b/src/class036/Code03_WidthOfBinaryTree1.java @@ -1,8 +1,8 @@ package class036; -// 二叉树的最大特殊宽度 +// 二叉树的最大特殊宽度,java版 // 测试链接 : https://leetcode.cn/problems/maximum-width-of-binary-tree/ -public class Code03_WidthOfBinaryTree { +public class Code03_WidthOfBinaryTree1 { // 不提交这个类 public static class TreeNode { @@ -18,7 +18,7 @@ public static class TreeNode { public static TreeNode[] nq = new TreeNode[MAXN]; - public static int[] iq = new int[MAXN]; + public static long[] iq = new long[MAXN]; public static int l, r; @@ -29,10 +29,10 @@ public static int widthOfBinaryTree(TreeNode root) { iq[r++] = 1; while (l < r) { int size = r - l; - ans = Math.max(ans, iq[r - 1] - iq[l] + 1); + ans = Math.max(ans, (int) (iq[r - 1] - iq[l] + 1)); for (int i = 0; i < size; i++) { TreeNode node = nq[l]; - int id = iq[l++]; + long id = iq[l++]; if (node.left != null) { nq[r] = node.left; iq[r++] = id * 2; diff --git a/src/class036/Code03_WidthOfBinaryTree2.java b/src/class036/Code03_WidthOfBinaryTree2.java new file mode 100644 index 000000000..420f91ea1 --- /dev/null +++ b/src/class036/Code03_WidthOfBinaryTree2.java @@ -0,0 +1,40 @@ +package class036; + +// 二叉树的最大特殊宽度,C++版 +// 测试链接 : https://leetcode.cn/problems/maximum-width-of-binary-tree/ +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//using ULL = unsigned long long; +// +//class Solution { +//public: +// static const int MAXN = 3001; +// TreeNode* nq[MAXN]; +// ULL iq[MAXN]; +// int l, r; +// +// int widthOfBinaryTree(TreeNode* root) { +// int ans = 1; +// l = r = 0; +// nq[r] = root; +// iq[r++] = 1ULL; +// while (l < r) { +// int size = r - l; +// ans = std::max(ans, static_cast(iq[r - 1] - iq[l] + 1ULL)); +// for (int i = 0; i < size; i++) { +// TreeNode* node = nq[l]; +// ULL id = iq[l++]; +// if (node->left != nullptr) { +// nq[r] = node->left; +// iq[r++] = id * 2ULL; +// } +// if (node->right != nullptr) { +// nq[r] = node->right; +// iq[r++] = id * 2ULL + 1ULL; +// } +// } +// } +// return ans; +// } +//}; \ No newline at end of file From fa623f7e98eaf6016323ef588bfab8a566e7ca2b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 20 Mar 2025 18:26:53 +0800 Subject: [PATCH 0844/2029] modify code --- src/class163/Code01_DsuOnTree1.java | 10 +++++----- src/class163/Code01_DsuOnTree2.java | 10 +++++----- src/class163/Code01_DsuOnTree3.java | 10 +++++----- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/class163/Code01_DsuOnTree1.java b/src/class163/Code01_DsuOnTree1.java index 613a2f775..3efba5f90 100644 --- a/src/class163/Code01_DsuOnTree1.java +++ b/src/class163/Code01_DsuOnTree1.java @@ -39,7 +39,7 @@ public class Code01_DsuOnTree1 { // colorCnt[i] = j,表示i这种颜色出现了j次 public static int[] colorCnt = new int[MAXN]; public static int[] ans = new int[MAXN]; - public static int total = 0; + public static int diffColors = 0; public static void addEdge(int u, int v) { next[++cnt] = head[u]; @@ -49,7 +49,7 @@ public static void addEdge(int u, int v) { public static void effect(int u) { if (++colorCnt[arr[u]] == 1) { - total++; + diffColors++; } for (int e = head[u], v; e > 0; e = next[e]) { v = to[e]; @@ -61,7 +61,7 @@ public static void effect(int u) { public static void cancle(int u) { if (--colorCnt[arr[u]] == 0) { - total--; + diffColors--; } for (int e = head[u], v; e > 0; e = next[e]) { v = to[e]; @@ -102,7 +102,7 @@ public static void dfs2(int u, int keep) { dfs2(son[u], 1); } if (++colorCnt[arr[u]] == 1) { - total++; + diffColors++; } for (int e = head[u], v; e > 0; e = next[e]) { v = to[e]; @@ -110,7 +110,7 @@ public static void dfs2(int u, int keep) { effect(v); } } - ans[u] = total; + ans[u] = diffColors; if (keep == 0) { cancle(u); } diff --git a/src/class163/Code01_DsuOnTree2.java b/src/class163/Code01_DsuOnTree2.java index 1e0ca0644..4cb6666a3 100644 --- a/src/class163/Code01_DsuOnTree2.java +++ b/src/class163/Code01_DsuOnTree2.java @@ -29,7 +29,7 @@ public class Code01_DsuOnTree2 { public static int[] son = new int[MAXN]; public static int[] colorCnt = new int[MAXN]; public static int[] ans = new int[MAXN]; - public static int total = 0; + public static int diffColors = 0; public static void addEdge(int u, int v) { next[++cnt] = head[u]; @@ -39,7 +39,7 @@ public static void addEdge(int u, int v) { public static void effect(int u) { if (++colorCnt[arr[u]] == 1) { - total++; + diffColors++; } for (int e = head[u], v; e > 0; e = next[e]) { v = to[e]; @@ -90,7 +90,7 @@ public static void dfs2(int u, int keep) { dfs2(son[u], 1); } if (++colorCnt[arr[u]] == 1) { - total++; + diffColors++; } for (int e = head[u], v; e > 0; e = next[e]) { v = to[e]; @@ -98,9 +98,9 @@ public static void dfs2(int u, int keep) { effect(v); } } - ans[u] = total; + ans[u] = diffColors; if (keep == 0) { - total = 0; // 直接把全局的不同颜色数量重置为0 + diffColors = 0; // 直接把全局的不同颜色数量重置为0 cancle(u); } } diff --git a/src/class163/Code01_DsuOnTree3.java b/src/class163/Code01_DsuOnTree3.java index ed93e03ce..537cd3929 100644 --- a/src/class163/Code01_DsuOnTree3.java +++ b/src/class163/Code01_DsuOnTree3.java @@ -28,7 +28,7 @@ // //int colorCnt[MAXN]; //int ans[MAXN]; -//int total = 0; +//int diffColors = 0; // //void addEdge(int u, int v) { // nxt[++cnt] = head[u]; @@ -38,7 +38,7 @@ // //void effect(int u) { // if (++colorCnt[arr[u]] == 1) { -// total++; +// diffColors++; // } // for (int e = head[u], v; e > 0; e = nxt[e]) { // v = to[e]; @@ -89,7 +89,7 @@ // dfs2(son[u], 1); // } // if (++colorCnt[arr[u]] == 1) { -// total++; +// diffColors++; // } // for (int e = head[u], v; e > 0; e = nxt[e]) { // v = to[e]; @@ -97,9 +97,9 @@ // effect(v); // } // } -// ans[u] = total; +// ans[u] = diffColors; // if (keep == 0) { -// total = 0; +// diffColors = 0; // cancle(u); // } //} From 83ba1b6413160286550bbfbfe6befcbba66060c8 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 20 Mar 2025 18:55:19 +0800 Subject: [PATCH 0845/2029] modify code --- src/class163/Code05_BloodCousins1.java | 3 +-- src/class163/Code05_BloodCousins2.java | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/class163/Code05_BloodCousins1.java b/src/class163/Code05_BloodCousins1.java index a3f1734f4..bd8ce06a6 100644 --- a/src/class163/Code05_BloodCousins1.java +++ b/src/class163/Code05_BloodCousins1.java @@ -1,8 +1,7 @@ package class163; // 表亲数量,java版 -// 一共有n个节点,编号1~n,给定每个节点的父亲节点编号 -// 如果父亲节点编号为0,说明当前节点是某棵树的头节点 +// 一共有n个节点,编号1~n,给定每个节点的父亲节点编号,父亲节点为0,说明当前节点是某棵树的头 // 注意,n个节点组成的是森林结构,可能有若干棵树 // 一共有m条查询,每条查询 x k,含义如下 // 如果x往上走k的距离,没有祖先节点,打印0 diff --git a/src/class163/Code05_BloodCousins2.java b/src/class163/Code05_BloodCousins2.java index 9c11eeda8..37c2a4b6f 100644 --- a/src/class163/Code05_BloodCousins2.java +++ b/src/class163/Code05_BloodCousins2.java @@ -1,8 +1,7 @@ package class163; // 表亲数量,C++版 -// 一共有n个节点,编号1~n,给定每个节点的父亲节点编号 -// 如果父亲节点编号为0,说明当前节点是某棵树的头节点 +// 一共有n个节点,编号1~n,给定每个节点的父亲节点编号,父亲节点为0,说明当前节点是某棵树的头 // 注意,n个节点组成的是森林结构,可能有若干棵树 // 一共有m条查询,每条查询 x k,含义如下 // 如果x往上走k的距离,没有祖先节点,打印0 From b6c6be33ece6c164c19742e2f8935bf7c18986c9 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Fri, 21 Mar 2025 19:32:53 +0800 Subject: [PATCH 0846/2029] modify code --- src/class163/Code01_DsuOnTree1.java | 10 ++++----- src/class163/Code01_DsuOnTree2.java | 10 ++++----- src/class163/Code01_DsuOnTree3.java | 10 ++++----- src/class163/Code02_ColorBanlance1.java | 27 ++++++++++++------------- src/class163/Code02_ColorBanlance2.java | 27 ++++++++++++------------- src/class163/Code02_ColorBanlance3.java | 27 ++++++++++++------------- src/class163/Code04_DifferntName1.java | 10 ++++----- src/class163/Code04_DifferntName2.java | 10 ++++----- 8 files changed, 64 insertions(+), 67 deletions(-) diff --git a/src/class163/Code01_DsuOnTree1.java b/src/class163/Code01_DsuOnTree1.java index 3efba5f90..8e8aaa88a 100644 --- a/src/class163/Code01_DsuOnTree1.java +++ b/src/class163/Code01_DsuOnTree1.java @@ -22,7 +22,7 @@ public class Code01_DsuOnTree1 { public static int n, m; // 每个节点的颜色 - public static int[] arr = new int[MAXN]; + public static int[] color = new int[MAXN]; // 链式前向星 public static int[] head = new int[MAXN]; @@ -48,7 +48,7 @@ public static void addEdge(int u, int v) { } public static void effect(int u) { - if (++colorCnt[arr[u]] == 1) { + if (++colorCnt[color[u]] == 1) { diffColors++; } for (int e = head[u], v; e > 0; e = next[e]) { @@ -60,7 +60,7 @@ public static void effect(int u) { } public static void cancle(int u) { - if (--colorCnt[arr[u]] == 0) { + if (--colorCnt[color[u]] == 0) { diffColors--; } for (int e = head[u], v; e > 0; e = next[e]) { @@ -101,7 +101,7 @@ public static void dfs2(int u, int keep) { if (son[u] != 0) { dfs2(son[u], 1); } - if (++colorCnt[arr[u]] == 1) { + if (++colorCnt[color[u]] == 1) { diffColors++; } for (int e = head[u], v; e > 0; e = next[e]) { @@ -132,7 +132,7 @@ public static void main(String[] args) throws IOException { } for (int i = 1; i <= n; i++) { in.nextToken(); - arr[i] = (int) in.nval; + color[i] = (int) in.nval; } dfs1(1, 0); dfs2(1, 0); diff --git a/src/class163/Code01_DsuOnTree2.java b/src/class163/Code01_DsuOnTree2.java index 4cb6666a3..44446c9a5 100644 --- a/src/class163/Code01_DsuOnTree2.java +++ b/src/class163/Code01_DsuOnTree2.java @@ -19,7 +19,7 @@ public class Code01_DsuOnTree2 { public static int MAXN = 100001; public static int n, m; - public static int[] arr = new int[MAXN]; + public static int[] color = 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]; @@ -38,7 +38,7 @@ public static void addEdge(int u, int v) { } public static void effect(int u) { - if (++colorCnt[arr[u]] == 1) { + if (++colorCnt[color[u]] == 1) { diffColors++; } for (int e = head[u], v; e > 0; e = next[e]) { @@ -50,7 +50,7 @@ public static void effect(int u) { } public static void cancle(int u) { - colorCnt[arr[u]] = 0; // 出现任何颜色,直接把该颜色的计数重置为0 + colorCnt[color[u]] = 0; // 出现任何颜色,直接把该颜色的计数重置为0 for (int e = head[u], v; e > 0; e = next[e]) { v = to[e]; if (v != fa[u]) { @@ -89,7 +89,7 @@ public static void dfs2(int u, int keep) { if (son[u] != 0) { dfs2(son[u], 1); } - if (++colorCnt[arr[u]] == 1) { + if (++colorCnt[color[u]] == 1) { diffColors++; } for (int e = head[u], v; e > 0; e = next[e]) { @@ -121,7 +121,7 @@ public static void main(String[] args) throws IOException { } for (int i = 1; i <= n; i++) { in.nextToken(); - arr[i] = (int) in.nval; + color[i] = (int) in.nval; } dfs1(1, 0); dfs2(1, 0); diff --git a/src/class163/Code01_DsuOnTree3.java b/src/class163/Code01_DsuOnTree3.java index 537cd3929..3c1fd3d27 100644 --- a/src/class163/Code01_DsuOnTree3.java +++ b/src/class163/Code01_DsuOnTree3.java @@ -15,7 +15,7 @@ // //const int MAXN = 100001; //int n, m; -//int arr[MAXN]; +//int color[MAXN]; // //int head[MAXN]; //int nxt[MAXN << 1]; @@ -37,7 +37,7 @@ //} // //void effect(int u) { -// if (++colorCnt[arr[u]] == 1) { +// if (++colorCnt[color[u]] == 1) { // diffColors++; // } // for (int e = head[u], v; e > 0; e = nxt[e]) { @@ -49,7 +49,7 @@ //} // //void cancle(int u) { -// colorCnt[arr[u]] = 0; +// colorCnt[color[u]] = 0; // for (int e = head[u], v; e > 0; e = nxt[e]) { // v = to[e]; // if (v != fa[u]) { @@ -88,7 +88,7 @@ // if (son[u] != 0) { // dfs2(son[u], 1); // } -// if (++colorCnt[arr[u]] == 1) { +// if (++colorCnt[color[u]] == 1) { // diffColors++; // } // for (int e = head[u], v; e > 0; e = nxt[e]) { @@ -114,7 +114,7 @@ // addEdge(v, u); // } // for (int i = 1; i <= n; i++) { -// cin >> arr[i]; +// cin >> color[i]; // } // dfs1(1, 0); // dfs2(1, 0); diff --git a/src/class163/Code02_ColorBanlance1.java b/src/class163/Code02_ColorBanlance1.java index df2cd37fa..67d3ad27e 100644 --- a/src/class163/Code02_ColorBanlance1.java +++ b/src/class163/Code02_ColorBanlance1.java @@ -25,7 +25,7 @@ public class Code02_ColorBanlance1 { public static int n; // 每个节点的颜色 - public static int[] arr = new int[MAXN]; + public static int[] color = new int[MAXN]; // 链式前向星 public static int[] head = new int[MAXN]; @@ -52,18 +52,18 @@ public static void addEdge(int u, int v) { } public static void effect(int u) { - colorCnt[arr[u]]++; - cntCnt[colorCnt[arr[u]] - 1]--; - cntCnt[colorCnt[arr[u]]]++; + colorCnt[color[u]]++; + cntCnt[colorCnt[color[u]] - 1]--; + cntCnt[colorCnt[color[u]]]++; for (int e = head[u]; e > 0; e = next[e]) { effect(to[e]); } } public static void cancle(int u) { - colorCnt[arr[u]]--; - cntCnt[colorCnt[arr[u]] + 1]--; - cntCnt[colorCnt[arr[u]]]++; + colorCnt[color[u]]--; + cntCnt[colorCnt[color[u]] + 1]--; + cntCnt[colorCnt[color[u]]]++; for (int e = head[u]; e > 0; e = next[e]) { cancle(to[e]); } @@ -93,16 +93,16 @@ public static void dfs2(int u, int keep) { if (son[u] != 0) { dfs2(son[u], 1); } - colorCnt[arr[u]]++; - cntCnt[colorCnt[arr[u]] - 1]--; - cntCnt[colorCnt[arr[u]]]++; + colorCnt[color[u]]++; + cntCnt[colorCnt[color[u]] - 1]--; + cntCnt[colorCnt[color[u]]]++; for (int e = head[u], v; e > 0; e = next[e]) { v = to[e]; if (v != son[u]) { effect(v); } } - if (colorCnt[arr[u]] * cntCnt[colorCnt[arr[u]]] == siz[u]) { + if (colorCnt[color[u]] * cntCnt[colorCnt[color[u]]] == siz[u]) { ans++; } if (keep == 0) { @@ -116,12 +116,11 @@ public static void main(String[] args) throws IOException { PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); in.nextToken(); n = (int) in.nval; - for (int i = 1, color, father; i <= n; i++) { + for (int i = 1, father; i <= n; i++) { in.nextToken(); - color = (int) in.nval; + color[i] = (int) in.nval; in.nextToken(); father = (int) in.nval; - arr[i] = color; if (i != 1) { addEdge(father, i); } diff --git a/src/class163/Code02_ColorBanlance2.java b/src/class163/Code02_ColorBanlance2.java index d81e0c9f2..b157d70ce 100644 --- a/src/class163/Code02_ColorBanlance2.java +++ b/src/class163/Code02_ColorBanlance2.java @@ -20,7 +20,7 @@ public class Code02_ColorBanlance2 { public static int MAXN = 200001; public static int n; - public static int[] arr = new int[MAXN]; + public static int[] color = new int[MAXN]; public static int[] head = new int[MAXN]; public static int[] next = new int[MAXN]; public static int[] to = new int[MAXN]; @@ -78,9 +78,9 @@ public static void effect(int root) { while (size1 > 0) { pop1(); if (edge1 == -1) { - colorCnt[arr[cur1]]++; - cntCnt[colorCnt[arr[cur1]] - 1]--; - cntCnt[colorCnt[arr[cur1]]]++; + colorCnt[color[cur1]]++; + cntCnt[colorCnt[color[cur1]] - 1]--; + cntCnt[colorCnt[color[cur1]]]++; edge1 = head[cur1]; } else { edge1 = next[edge1]; @@ -98,9 +98,9 @@ public static void cancle(int root) { while (size1 > 0) { pop1(); if (edge1 == -1) { - colorCnt[arr[cur1]]--; - cntCnt[colorCnt[arr[cur1]] + 1]--; - cntCnt[colorCnt[arr[cur1]]]++; + colorCnt[color[cur1]]--; + cntCnt[colorCnt[color[cur1]] + 1]--; + cntCnt[colorCnt[color[cur1]]]++; edge1 = head[cur1]; } else { edge1 = next[edge1]; @@ -166,16 +166,16 @@ public static void dfs2(int u, int keep) { } } } else { - colorCnt[arr[cur2]]++; - cntCnt[colorCnt[arr[cur2]] - 1]--; - cntCnt[colorCnt[arr[cur2]]]++; + colorCnt[color[cur2]]++; + cntCnt[colorCnt[color[cur2]] - 1]--; + cntCnt[colorCnt[color[cur2]]]++; for (int e = head[cur2], v; e > 0; e = next[e]) { v = to[e]; if (v != son[cur2]) { effect(v); } } - if (colorCnt[arr[cur2]] * cntCnt[colorCnt[arr[cur2]]] == siz[cur2]) { + if (colorCnt[color[cur2]] * cntCnt[colorCnt[color[cur2]]] == siz[cur2]) { ans++; } if (keep2 == 0) { @@ -191,12 +191,11 @@ public static void main(String[] args) throws IOException { PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); in.nextToken(); n = (int) in.nval; - for (int i = 1, color, father; i <= n; i++) { + for (int i = 1, father; i <= n; i++) { in.nextToken(); - color = (int) in.nval; + color[i] = (int) in.nval; in.nextToken(); father = (int) in.nval; - arr[i] = color; if (i != 1) { addEdge(father, i); } diff --git a/src/class163/Code02_ColorBanlance3.java b/src/class163/Code02_ColorBanlance3.java index 353a5d131..72ade8869 100644 --- a/src/class163/Code02_ColorBanlance3.java +++ b/src/class163/Code02_ColorBanlance3.java @@ -16,7 +16,7 @@ // //const int MAXN = 200001; //int n; -//int arr[MAXN]; +//int color[MAXN]; //int head[MAXN]; //int nxt[MAXN]; //int to[MAXN]; @@ -34,18 +34,18 @@ //} // //void effect(int u) { -// colorCnt[arr[u]]++; -// cntCnt[colorCnt[arr[u]] - 1]--; -// cntCnt[colorCnt[arr[u]]]++; +// colorCnt[color[u]]++; +// cntCnt[colorCnt[color[u]] - 1]--; +// cntCnt[colorCnt[color[u]]]++; // for (int e = head[u]; e > 0; e = nxt[e]) { // effect(to[e]); // } //} // //void cancle(int u) { -// colorCnt[arr[u]]--; -// cntCnt[colorCnt[arr[u]] + 1]--; -// cntCnt[colorCnt[arr[u]]]++; +// colorCnt[color[u]]--; +// cntCnt[colorCnt[color[u]] + 1]--; +// cntCnt[colorCnt[color[u]]]++; // for (int e = head[u]; e > 0; e = nxt[e]) { // cancle(to[e]); // } @@ -75,16 +75,16 @@ // if (son[u] != 0) { // dfs2(son[u], 1); // } -// colorCnt[arr[u]]++; -// cntCnt[colorCnt[arr[u]] - 1]--; -// cntCnt[colorCnt[arr[u]]]++; +// colorCnt[color[u]]++; +// cntCnt[colorCnt[color[u]] - 1]--; +// cntCnt[colorCnt[color[u]]]++; // for (int e = head[u], v; e > 0; e = nxt[e]) { // v = to[e]; // if (v != son[u]) { // effect(v); // } // } -// if (colorCnt[arr[u]] * cntCnt[colorCnt[arr[u]]] == siz[u]) { +// if (colorCnt[color[u]] * cntCnt[colorCnt[color[u]]] == siz[u]) { // ans++; // } // if (keep == 0) { @@ -96,9 +96,8 @@ // ios::sync_with_stdio(false); // cin.tie(nullptr); // cin >> n; -// for (int i = 1, color, father; i <= n; i++) { -// cin >> color >> father; -// arr[i] = color; +// for (int i = 1, father; i <= n; i++) { +// cin >> color[i] >> father; // if (i != 1) { // addEdge(father, i); // } diff --git a/src/class163/Code04_DifferntName1.java b/src/class163/Code04_DifferntName1.java index 3edb8f405..0477bbc86 100644 --- a/src/class163/Code04_DifferntName1.java +++ b/src/class163/Code04_DifferntName1.java @@ -28,7 +28,7 @@ public class Code04_DifferntName1 { public static int MAXN = 100001; public static int n, m; public static boolean[] root = new boolean[MAXN]; - public static int[] arr = new int[MAXN]; + public static int[] id = new int[MAXN]; public static int[] headg = new int[MAXN]; public static int[] nextg = new int[MAXN]; @@ -103,14 +103,14 @@ public static void dfs1(int u, int f) { } public static void effect(int u) { - addId(dep[u], arr[u]); + addId(dep[u], id[u]); for (int e = headg[u]; e > 0; e = nextg[e]) { effect(tog[e]); } } public static void cancle(int u) { - removeId(dep[u], arr[u]); + removeId(dep[u], id[u]); for (int e = headg[u]; e > 0; e = nextg[e]) { cancle(tog[e]); } @@ -126,7 +126,7 @@ public static void dfs2(int u, int keep) { if (son[u] != 0) { dfs2(son[u], 1); } - addId(dep[u], arr[u]); + addId(dep[u], id[u]); for (int e = headg[u], v; e > 0; e = nextg[e]) { v = tog[e]; if (v != son[u]) { @@ -149,7 +149,7 @@ public static void main(String[] args) throws IOException { for (int i = 1; i <= n; i++) { name = io.next(); father = io.nextInt(); - arr[i] = nameId(name); + id[i] = nameId(name); if (father == 0) { root[i] = true; } else { diff --git a/src/class163/Code04_DifferntName2.java b/src/class163/Code04_DifferntName2.java index 16ce9aea4..f2309759c 100644 --- a/src/class163/Code04_DifferntName2.java +++ b/src/class163/Code04_DifferntName2.java @@ -19,7 +19,7 @@ //const int MAXN = 100001; //int n, m; //bool root[MAXN]; -//int arr[MAXN]; +//int id[MAXN]; // //int headg[MAXN]; //int nextg[MAXN]; @@ -94,14 +94,14 @@ //} // //void effect(int u) { -// addId(dep[u], arr[u]); +// addId(dep[u], id[u]); // for (int e = headg[u]; e > 0; e = nextg[e]) { // effect(tog[e]); // } //} // //void cancle(int u) { -// removeId(dep[u], arr[u]); +// removeId(dep[u], id[u]); // for (int e = headg[u]; e > 0; e = nextg[e]) { // cancle(tog[e]); // } @@ -117,7 +117,7 @@ // if (son[u] != 0) { // dfs2(son[u], 1); // } -// addId(dep[u], arr[u]); +// addId(dep[u], id[u]); // for (int e = headg[u], v; e > 0; e = nextg[e]) { // v = tog[e]; // if (v != son[u]) { @@ -140,7 +140,7 @@ // int father; // for (int i = 1; i <= n; i++) { // cin >> name >> father; -// arr[i] = nameId(name); +// id[i] = nameId(name); // if (father == 0) { // root[i] = true; // } else { From cce1c05b2739443b8a4b62f1c2e1db10765883c6 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 22 Mar 2025 18:23:20 +0800 Subject: [PATCH 0847/2029] modify code --- src/class163/Code01_DsuOnTree1.java | 13 ++++- src/class163/Code07_Forest1.java | 85 ++++++++++++++++------------- src/class163/Code07_Forest2.java | 42 +++++++------- 3 files changed, 81 insertions(+), 59 deletions(-) diff --git a/src/class163/Code01_DsuOnTree1.java b/src/class163/Code01_DsuOnTree1.java index 8e8aaa88a..5e355926e 100644 --- a/src/class163/Code01_DsuOnTree1.java +++ b/src/class163/Code01_DsuOnTree1.java @@ -35,7 +35,7 @@ public class Code01_DsuOnTree1 { public static int[] siz = new int[MAXN]; public static int[] son = new int[MAXN]; - // 启发式合并 + // 树上启发式合并 // colorCnt[i] = j,表示i这种颜色出现了j次 public static int[] colorCnt = new int[MAXN]; public static int[] ans = new int[MAXN]; @@ -47,6 +47,7 @@ public static void addEdge(int u, int v) { head[u] = cnt; } + // 子树u每个节点贡献信息 public static void effect(int u) { if (++colorCnt[color[u]] == 1) { diffColors++; @@ -59,6 +60,7 @@ public static void effect(int u) { } } + // 子树u每个节点取消贡献 public static void cancle(int u) { if (--colorCnt[color[u]] == 0) { diffColors--; @@ -71,6 +73,7 @@ public static void cancle(int u) { } } + // 重链剖分 public static void dfs1(int u, int f) { fa[u] = f; siz[u] = 1; @@ -91,26 +94,34 @@ public static void dfs1(int u, int f) { } } + // 树上启发式合并的过程 public static void dfs2(int u, int keep) { + // 遍历轻儿子的子树,统计子树的答案,然后取消贡献 for (int e = head[u], v; e > 0; e = next[e]) { v = to[e]; if (v != fa[u] && v != son[u]) { dfs2(v, 0); } } + // 遍历重儿子的子树,统计子树的答案,然后保留贡献 if (son[u] != 0) { dfs2(son[u], 1); } + // 当前节点贡献信息 if (++colorCnt[color[u]] == 1) { diffColors++; } + // 遍历轻儿子的子树,重新贡献一遍 for (int e = head[u], v; e > 0; e = next[e]) { v = to[e]; if (v != fa[u] && v != son[u]) { effect(v); } } + // 记录子树u的答案 ans[u] = diffColors; + // 如果u是上级节点的轻儿子,子树u的贡献取消 + // 如果u是上级节点的重儿子,子树u的贡献保留 if (keep == 0) { cancle(u); } diff --git a/src/class163/Code07_Forest1.java b/src/class163/Code07_Forest1.java index ed16bab63..a49ba4db7 100644 --- a/src/class163/Code07_Forest1.java +++ b/src/class163/Code07_Forest1.java @@ -8,8 +8,7 @@ // 操作 L x y : 点x和点y之间连接一条边 // 题目保证操作后,所有节点仍然是森林 // 题目要求强制在线,请不要使用离线算法 -// 1 <= n、m、t <= 8 * 10^4 -// 点权 <= 10^9 +// 1 <= n、m、t <= 8 * 10^4 点权 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P3302 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -43,10 +42,12 @@ public class Code07_Forest1 { public static int cntt = 0; public static int[] dep = new int[MAXN]; - public static int[] treeHead = new int[MAXN]; - public static int[] headSiz = new int[MAXN]; public static int[][] stjump = new int[MAXN][MAXH]; + public static int[] treeHead = new int[MAXN]; + public static int[] setSiz = new int[MAXN]; + + // 来自讲解158,题目4 public static int kth(int num) { int left = 1, right = diff, mid; while (left <= right) { @@ -62,12 +63,14 @@ public static int kth(int num) { return -1; } + // 来自讲解158,题目4 public static void addEdge(int u, int v) { next[++cntg] = head[u]; to[cntg] = v; head[u] = cntg; } + // 来自讲解158,题目4 public static int insert(int jobi, int l, int r, int i) { int rt = ++cntt; left[rt] = left[i]; @@ -84,6 +87,7 @@ public static int insert(int jobi, int l, int r, int i) { return rt; } + // 来自讲解158,题目4 public static int query(int jobk, int l, int r, int u, int v, int lca, int lcafa) { if (l == r) { return l; @@ -97,12 +101,44 @@ public static int query(int jobk, int l, int r, int u, int v, int lca, int lcafa } } + // 来自讲解158,题目4 + 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]; + } + + // 来自讲解158,题目4 + public static int queryKth(int x, int y, int k) { + int xylca = lca(x, y); + int lcafa = stjump[xylca][0]; + int i = query(k, 1, diff, root[x], root[y], root[xylca], root[lcafa]); + return sorted[i]; + } + // 递归版,C++可以通过,java无法通过,递归会爆栈 public static void dfs1(int u, int fa, int treeh) { root[u] = insert(arr[u], 1, diff, root[fa]); dep[u] = dep[fa] + 1; treeHead[u] = treeh; - headSiz[treeh]++; + setSiz[treeh]++; stjump[u][0] = fa; for (int p = 1; p < MAXH; p++) { stjump[u][p] = stjump[stjump[u][p - 1]][p - 1]; @@ -146,7 +182,7 @@ public static void dfs2(int i, int fa, int treeh) { root[cur] = insert(arr[cur], 1, diff, root[father]); dep[cur] = dep[father] + 1; treeHead[cur] = treehead; - headSiz[treehead]++; + setSiz[treehead]++; stjump[cur][0] = father; for (int p = 1; p < MAXH; p++) { stjump[cur][p] = stjump[stjump[cur][p - 1]][p - 1]; @@ -164,48 +200,23 @@ public static void dfs2(int i, int fa, int treeh) { } } - 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 queryKth(int x, int y, int k) { - int xylca = lca(x, y); - int lcafa = stjump[xylca][0]; - int i = query(k, 1, diff, root[x], root[y], root[xylca], root[lcafa]); - return sorted[i]; - } - + // x所在的树和y所在的树,合并成一棵树 public static void connect(int x, int y) { addEdge(x, y); addEdge(y, x); int fx = treeHead[x]; int fy = treeHead[y]; - if (headSiz[fx] >= headSiz[fy]) { + if (setSiz[fx] >= setSiz[fy]) { dfs2(y, x, fx); // 调用dfs1的迭代版 } else { dfs2(x, y, fy); // 调用dfs1的迭代版 } } + // 离散化 + // 每棵子树建立可持久化线段树 + // 记录每个节点的所在子树的头节点 + // 记录每棵子树的大小 public static void prepare() { for (int i = 1; i <= n; i++) { sorted[i] = arr[i]; diff --git a/src/class163/Code07_Forest2.java b/src/class163/Code07_Forest2.java index 769b2377a..eb44da6fe 100644 --- a/src/class163/Code07_Forest2.java +++ b/src/class163/Code07_Forest2.java @@ -8,8 +8,7 @@ // 操作 L x y : 点x和点y之间连接一条边 // 题目保证操作后,所有节点仍然是森林 // 题目要求强制在线,请不要使用离线算法 -// 1 <= n、m、t <= 8 * 10^4 -// 点权 <= 10^9 +// 1 <= n、m、t <= 8 * 10^4 点权 <= 10^9 // 测试链接 : https://www.luogu.com.cn/problem/P3302 // 如下实现是C++的版本,C++版本和java版本逻辑完全一样 // 提交如下代码,可以通过所有测试用例 @@ -40,10 +39,11 @@ //int cntt = 0; // //int dep[MAXN]; -//int treeHead[MAXN]; -//int headSiz[MAXN]; //int stjump[MAXN][MAXH]; // +//int treeHead[MAXN]; +//int setSiz[MAXN]; +// //int kth(int num) { // int left = 1, right = diff, mid; // while (left <= right) { @@ -94,22 +94,6 @@ // } //} // -//void dfs(int u, int fa, int treeh) { -// root[u] = insert(arr[u], 1, diff, root[fa]); -// dep[u] = dep[fa] + 1; -// treeHead[u] = treeh; -// headSiz[treeh]++; -// 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]) { -// if (to[e] != fa) { -// dfs(to[e], u, treeh); -// } -// } -//} -// //int lca(int a, int b) { // if (dep[a] < dep[b]) { // int tmp = a; @@ -140,12 +124,28 @@ // return sorted[i]; //} // +//void dfs(int u, int fa, int treeh) { +// root[u] = insert(arr[u], 1, diff, root[fa]); +// dep[u] = dep[fa] + 1; +// treeHead[u] = treeh; +// setSiz[treeh]++; +// 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]) { +// if (to[e] != fa) { +// dfs(to[e], u, treeh); +// } +// } +//} +// //void connect(int x, int y) { // addEdge(x, y); // addEdge(y, x); // int fx = treeHead[x]; // int fy = treeHead[y]; -// if (headSiz[fx] >= headSiz[fy]) { +// if (setSiz[fx] >= setSiz[fy]) { // dfs(y, x, fx); // } else { // dfs(x, y, fy); From 2a7c0a51f38061e9f1ed2761a3810e3e42202c98 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 22 Mar 2025 18:38:03 +0800 Subject: [PATCH 0848/2029] modify code --- src/class163/Code06_RearrangePalindrome1.java | 6 +++--- src/class163/Code06_RearrangePalindrome2.java | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/class163/Code06_RearrangePalindrome1.java b/src/class163/Code06_RearrangePalindrome1.java index 9cf26071c..b2a8b6c1a 100644 --- a/src/class163/Code06_RearrangePalindrome1.java +++ b/src/class163/Code06_RearrangePalindrome1.java @@ -76,7 +76,7 @@ public static void cancle(int u) { } } - public static int cross(int u, int lcaDep) { + public static int answerFromLight(int u, int lcaDep) { int ans = 0; if (maxdep[eor[u]] != 0) { ans = Math.max(ans, maxdep[eor[u]] + dep[u] - lcaDep * 2); @@ -87,7 +87,7 @@ public static int cross(int u, int lcaDep) { } } for (int e = head[u]; e > 0; e = next[e]) { - ans = Math.max(ans, cross(to[e], lcaDep)); + ans = Math.max(ans, answerFromLight(to[e], lcaDep)); } return ans; } @@ -117,7 +117,7 @@ public static void dfs2(int u, int keep) { for (int e = head[u], v; e > 0; e = next[e]) { v = to[e]; if (v != son[u]) { - ans[u] = Math.max(ans[u], cross(v, dep[u])); + ans[u] = Math.max(ans[u], answerFromLight(v, dep[u])); effect(v); } } diff --git a/src/class163/Code06_RearrangePalindrome2.java b/src/class163/Code06_RearrangePalindrome2.java index c6b520a12..e21e4e647 100644 --- a/src/class163/Code06_RearrangePalindrome2.java +++ b/src/class163/Code06_RearrangePalindrome2.java @@ -67,7 +67,7 @@ // } //} // -//int cross(int u, int lcaDep) { +//int answerFromLight(int u, int lcaDep) { // int ret = 0; // if (maxdep[eor[u]] != 0) { // ret = max(ret, maxdep[eor[u]] + dep[u] - lcaDep * 2); @@ -78,7 +78,7 @@ // } // } // for (int e = head[u]; e > 0; e = nxt[e]) { -// ret = max(ret, cross(to[e], lcaDep)); +// ret = max(ret, answerFromLight(to[e], lcaDep)); // } // return ret; //} @@ -108,7 +108,7 @@ // for (int e = head[u], v; e > 0; e = nxt[e]) { // v = to[e]; // if (v != son[u]) { -// ans[u] = max(ans[u], cross(v, dep[u])); +// ans[u] = max(ans[u], answerFromLight(v, dep[u])); // effect(v); // } // } From e41752b2814f0a42e131fc02c76e74a48ecc0dac Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 22 Mar 2025 18:54:06 +0800 Subject: [PATCH 0849/2029] modify code --- src/class163/Code01_DsuOnTree1.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/class163/Code01_DsuOnTree1.java b/src/class163/Code01_DsuOnTree1.java index 5e355926e..bccce3625 100644 --- a/src/class163/Code01_DsuOnTree1.java +++ b/src/class163/Code01_DsuOnTree1.java @@ -120,8 +120,7 @@ public static void dfs2(int u, int keep) { } // 记录子树u的答案 ans[u] = diffColors; - // 如果u是上级节点的轻儿子,子树u的贡献取消 - // 如果u是上级节点的重儿子,子树u的贡献保留 + // 如果u是上级节点的轻儿子,子树u的贡献取消,否则保留 if (keep == 0) { cancle(u); } From a3e0920d2d3d30ba7afa7cb80e01174e06622455 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 22 Mar 2025 19:06:13 +0800 Subject: [PATCH 0850/2029] modify code --- src/class163/Code01_DsuOnTree1.java | 42 +++++++++++------------ src/class163/Code01_DsuOnTree2.java | 40 +++++++++++----------- src/class163/Code01_DsuOnTree3.java | 40 +++++++++++----------- src/class163/Code02_ColorBanlance1.java | 28 +++++++-------- src/class163/Code02_ColorBanlance2.java | 45 +++++++++++-------------- src/class163/Code02_ColorBanlance3.java | 28 +++++++-------- src/class163/Code05_BloodCousins1.java | 20 +++++------ src/class163/Code05_BloodCousins2.java | 20 +++++------ 8 files changed, 129 insertions(+), 134 deletions(-) diff --git a/src/class163/Code01_DsuOnTree1.java b/src/class163/Code01_DsuOnTree1.java index bccce3625..db2fe30d8 100644 --- a/src/class163/Code01_DsuOnTree1.java +++ b/src/class163/Code01_DsuOnTree1.java @@ -47,6 +47,27 @@ public static void addEdge(int u, int v) { head[u] = cnt; } + // 重链剖分 + public static void dfs1(int u, int f) { + fa[u] = f; + 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; + } + } + } + } + // 子树u每个节点贡献信息 public static void effect(int u) { if (++colorCnt[color[u]] == 1) { @@ -73,27 +94,6 @@ public static void cancle(int u) { } } - // 重链剖分 - public static void dfs1(int u, int f) { - fa[u] = f; - 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 keep) { // 遍历轻儿子的子树,统计子树的答案,然后取消贡献 diff --git a/src/class163/Code01_DsuOnTree2.java b/src/class163/Code01_DsuOnTree2.java index 44446c9a5..60b104998 100644 --- a/src/class163/Code01_DsuOnTree2.java +++ b/src/class163/Code01_DsuOnTree2.java @@ -37,6 +37,26 @@ public static void addEdge(int u, int v) { head[u] = cnt; } + public static void dfs1(int u, int f) { + fa[u] = f; + 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 effect(int u) { if (++colorCnt[color[u]] == 1) { diffColors++; @@ -59,26 +79,6 @@ public static void cancle(int u) { } } - public static void dfs1(int u, int f) { - fa[u] = f; - 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 keep) { for (int e = head[u], v; e > 0; e = next[e]) { v = to[e]; diff --git a/src/class163/Code01_DsuOnTree3.java b/src/class163/Code01_DsuOnTree3.java index 3c1fd3d27..eccf6300e 100644 --- a/src/class163/Code01_DsuOnTree3.java +++ b/src/class163/Code01_DsuOnTree3.java @@ -36,6 +36,26 @@ // head[u] = cnt; //} // +//void dfs1(int u, int f) { +// fa[u] = f; +// 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 e = head[u], v; e > 0; 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 effect(int u) { // if (++colorCnt[color[u]] == 1) { // diffColors++; @@ -58,26 +78,6 @@ // } //} // -//void dfs1(int u, int f) { -// fa[u] = f; -// 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 e = head[u], v; e > 0; 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 keep) { // for (int e = head[u], v; e > 0; e = nxt[e]) { // v = to[e]; diff --git a/src/class163/Code02_ColorBanlance1.java b/src/class163/Code02_ColorBanlance1.java index 67d3ad27e..ba5ce2a70 100644 --- a/src/class163/Code02_ColorBanlance1.java +++ b/src/class163/Code02_ColorBanlance1.java @@ -51,6 +51,20 @@ public static void addEdge(int u, int v) { head[u] = cnt; } + public static void dfs1(int u) { + siz[u] = 1; + for (int e = head[u]; e > 0; e = next[e]) { + dfs1(to[e]); + } + for (int e = head[u], v; e > 0; e = next[e]) { + v = to[e]; + siz[u] += siz[v]; + if (son[u] == 0 || siz[son[u]] < siz[v]) { + son[u] = v; + } + } + } + public static void effect(int u) { colorCnt[color[u]]++; cntCnt[colorCnt[color[u]] - 1]--; @@ -69,20 +83,6 @@ public static void cancle(int u) { } } - public static void dfs1(int u) { - siz[u] = 1; - for (int e = head[u]; e > 0; e = next[e]) { - dfs1(to[e]); - } - for (int e = head[u], v; e > 0; e = next[e]) { - v = to[e]; - siz[u] += siz[v]; - if (son[u] == 0 || siz[son[u]] < siz[v]) { - son[u] = v; - } - } - } - public static void dfs2(int u, int keep) { for (int e = head[u], v; e > 0; e = next[e]) { v = to[e]; diff --git a/src/class163/Code02_ColorBanlance2.java b/src/class163/Code02_ColorBanlance2.java index b157d70ce..c5b78e9b6 100644 --- a/src/class163/Code02_ColorBanlance2.java +++ b/src/class163/Code02_ColorBanlance2.java @@ -1,11 +1,7 @@ package class163; // 颜色平衡的子树,java实现迭代版 -// 一共有n个节点,编号1~n,给定每个节点的颜色值和父亲节点编号 -// 输入保证所有节点一定组成一棵树,并且1号节点是树头 -// 如果一棵子树中,存在的每种颜色的节点个数都相同,这棵子树叫颜色平衡树 -// 打印整棵树中有多少个子树是颜色平衡树 -// 1 <= n、颜色值 <= 2 * 10^5 +// 不会改迭代版,去看讲解118,详解了dfs从递归版改迭代版 // 测试链接 : https://www.luogu.com.cn/problem/P9233 // 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 @@ -37,7 +33,6 @@ public static void addEdge(int u, int v) { head[u] = cnt; } - // 不会改迭代版,去看讲解118,详解了从递归版改迭代版 // stack1、size1、cur1、edge1,用于把effect、cancle、dfs1改成迭代版 public static int[][] stack1 = new int[MAXN][2]; public static int size1, cur1, edge1; @@ -72,15 +67,13 @@ public static void pop2() { edge2 = stack2[size2][2]; } - public static void effect(int root) { + public static void dfs1(int u) { size1 = 0; - push1(root, -1); + push1(u, -1); while (size1 > 0) { pop1(); if (edge1 == -1) { - colorCnt[color[cur1]]++; - cntCnt[colorCnt[color[cur1]] - 1]--; - cntCnt[colorCnt[color[cur1]]]++; + siz[cur1] = 1; edge1 = head[cur1]; } else { edge1 = next[edge1]; @@ -88,18 +81,26 @@ public static void effect(int root) { if (edge1 != 0) { push1(cur1, edge1); push1(to[edge1], -1); + } else { + for (int e = head[cur1], v; e > 0; e = next[e]) { + v = to[e]; + siz[cur1] += siz[v]; + if (son[cur1] == 0 || siz[son[cur1]] < siz[v]) { + son[cur1] = v; + } + } } } } - public static void cancle(int root) { + public static void effect(int root) { size1 = 0; push1(root, -1); while (size1 > 0) { pop1(); if (edge1 == -1) { - colorCnt[color[cur1]]--; - cntCnt[colorCnt[color[cur1]] + 1]--; + colorCnt[color[cur1]]++; + cntCnt[colorCnt[color[cur1]] - 1]--; cntCnt[colorCnt[color[cur1]]]++; edge1 = head[cur1]; } else { @@ -112,13 +113,15 @@ public static void cancle(int root) { } } - public static void dfs1(int u) { + public static void cancle(int root) { size1 = 0; - push1(u, -1); + push1(root, -1); while (size1 > 0) { pop1(); if (edge1 == -1) { - siz[cur1] = 1; + colorCnt[color[cur1]]--; + cntCnt[colorCnt[color[cur1]] + 1]--; + cntCnt[colorCnt[color[cur1]]]++; edge1 = head[cur1]; } else { edge1 = next[edge1]; @@ -126,14 +129,6 @@ public static void dfs1(int u) { if (edge1 != 0) { push1(cur1, edge1); push1(to[edge1], -1); - } else { - for (int e = head[cur1], v; e > 0; e = next[e]) { - v = to[e]; - siz[cur1] += siz[v]; - if (son[cur1] == 0 || siz[son[cur1]] < siz[v]) { - son[cur1] = v; - } - } } } } diff --git a/src/class163/Code02_ColorBanlance3.java b/src/class163/Code02_ColorBanlance3.java index 72ade8869..8e79c948a 100644 --- a/src/class163/Code02_ColorBanlance3.java +++ b/src/class163/Code02_ColorBanlance3.java @@ -33,6 +33,20 @@ // head[u] = cnt; //} // +//void dfs1(int u) { +// siz[u] = 1; +// for (int e = head[u]; e > 0; e = nxt[e]) { +// dfs1(to[e]); +// } +// for (int e = head[u], v; e > 0; e = nxt[e]) { +// v = to[e]; +// siz[u] += siz[v]; +// if (son[u] == 0 || siz[son[u]] < siz[v]) { +// son[u] = v; +// } +// } +//} +// //void effect(int u) { // colorCnt[color[u]]++; // cntCnt[colorCnt[color[u]] - 1]--; @@ -51,20 +65,6 @@ // } //} // -//void dfs1(int u) { -// siz[u] = 1; -// for (int e = head[u]; e > 0; e = nxt[e]) { -// dfs1(to[e]); -// } -// for (int e = head[u], v; e > 0; e = nxt[e]) { -// v = to[e]; -// siz[u] += siz[v]; -// if (son[u] == 0 || siz[son[u]] < siz[v]) { -// son[u] = v; -// } -// } -//} -// //void dfs2(int u, int keep) { // for (int e = head[u], v; e > 0; e = nxt[e]) { // v = to[e]; diff --git a/src/class163/Code05_BloodCousins1.java b/src/class163/Code05_BloodCousins1.java index bd8ce06a6..545895386 100644 --- a/src/class163/Code05_BloodCousins1.java +++ b/src/class163/Code05_BloodCousins1.java @@ -59,16 +59,6 @@ public static void addQuestion(int u, int i, int k) { headq[u] = cntq; } - public static int kAncestor(int u, int k) { - for (int p = MAXH - 1; p >= 0; p--) { - if (k >= 1 << p) { - k -= 1 << p; - u = stjump[u][p]; - } - } - return u; - } - public static void dfs1(int u, int fa) { siz[u] = 1; dep[u] = dep[fa] + 1; @@ -88,6 +78,16 @@ public static void dfs1(int u, int fa) { } } + public static int kAncestor(int u, int k) { + for (int p = MAXH - 1; p >= 0; p--) { + if (k >= 1 << p) { + k -= 1 << p; + u = stjump[u][p]; + } + } + return u; + } + public static void effect(int u) { nodeCnt[dep[u]]++; for (int e = headg[u]; e > 0; e = nextg[e]) { diff --git a/src/class163/Code05_BloodCousins2.java b/src/class163/Code05_BloodCousins2.java index 37c2a4b6f..842c81745 100644 --- a/src/class163/Code05_BloodCousins2.java +++ b/src/class163/Code05_BloodCousins2.java @@ -54,16 +54,6 @@ // headq[u] = cntq; //} // -//int kAncestor(int u, int k) { -// for (int p = MAXH - 1; p >= 0; p--) { -// if (k >= (1 << p)) { -// k -= (1 << p); -// u = stjump[u][p]; -// } -// } -// return u; -//} -// //void dfs1(int u, int fa) { // siz[u] = 1; // dep[u] = dep[fa] + 1; @@ -83,6 +73,16 @@ // } //} // +//int kAncestor(int u, int k) { +// for (int p = MAXH - 1; p >= 0; p--) { +// if (k >= (1 << p)) { +// k -= (1 << p); +// u = stjump[u][p]; +// } +// } +// return u; +//} +// //void effect(int u) { // nodeCnt[dep[u]]++; // for (int e = headg[u]; e > 0; e = nextg[e]) { From a4140543d3a53cf9df06e8ba5c8a0ca960d370b7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sat, 22 Mar 2025 23:02:44 +0800 Subject: [PATCH 0851/2029] modify code --- src/class163/Code01_DsuOnTree1.java | 10 +++++----- src/class163/Code01_DsuOnTree2.java | 10 +++++----- src/class163/Code01_DsuOnTree3.java | 10 +++++----- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/class163/Code01_DsuOnTree1.java b/src/class163/Code01_DsuOnTree1.java index db2fe30d8..79bfcf359 100644 --- a/src/class163/Code01_DsuOnTree1.java +++ b/src/class163/Code01_DsuOnTree1.java @@ -22,7 +22,7 @@ public class Code01_DsuOnTree1 { public static int n, m; // 每个节点的颜色 - public static int[] color = new int[MAXN]; + public static int[] arr = new int[MAXN]; // 链式前向星 public static int[] head = new int[MAXN]; @@ -70,7 +70,7 @@ public static void dfs1(int u, int f) { // 子树u每个节点贡献信息 public static void effect(int u) { - if (++colorCnt[color[u]] == 1) { + if (++colorCnt[arr[u]] == 1) { diffColors++; } for (int e = head[u], v; e > 0; e = next[e]) { @@ -83,7 +83,7 @@ public static void effect(int u) { // 子树u每个节点取消贡献 public static void cancle(int u) { - if (--colorCnt[color[u]] == 0) { + if (--colorCnt[arr[u]] == 0) { diffColors--; } for (int e = head[u], v; e > 0; e = next[e]) { @@ -108,7 +108,7 @@ public static void dfs2(int u, int keep) { dfs2(son[u], 1); } // 当前节点贡献信息 - if (++colorCnt[color[u]] == 1) { + if (++colorCnt[arr[u]] == 1) { diffColors++; } // 遍历轻儿子的子树,重新贡献一遍 @@ -142,7 +142,7 @@ public static void main(String[] args) throws IOException { } for (int i = 1; i <= n; i++) { in.nextToken(); - color[i] = (int) in.nval; + arr[i] = (int) in.nval; } dfs1(1, 0); dfs2(1, 0); diff --git a/src/class163/Code01_DsuOnTree2.java b/src/class163/Code01_DsuOnTree2.java index 60b104998..95fbf0763 100644 --- a/src/class163/Code01_DsuOnTree2.java +++ b/src/class163/Code01_DsuOnTree2.java @@ -19,7 +19,7 @@ public class Code01_DsuOnTree2 { public static int MAXN = 100001; public static int n, m; - public static int[] color = new int[MAXN]; + 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]; @@ -58,7 +58,7 @@ public static void dfs1(int u, int f) { } public static void effect(int u) { - if (++colorCnt[color[u]] == 1) { + if (++colorCnt[arr[u]] == 1) { diffColors++; } for (int e = head[u], v; e > 0; e = next[e]) { @@ -70,7 +70,7 @@ public static void effect(int u) { } public static void cancle(int u) { - colorCnt[color[u]] = 0; // 出现任何颜色,直接把该颜色的计数重置为0 + colorCnt[arr[u]] = 0; // 出现任何颜色,直接把该颜色的计数重置为0 for (int e = head[u], v; e > 0; e = next[e]) { v = to[e]; if (v != fa[u]) { @@ -89,7 +89,7 @@ public static void dfs2(int u, int keep) { if (son[u] != 0) { dfs2(son[u], 1); } - if (++colorCnt[color[u]] == 1) { + if (++colorCnt[arr[u]] == 1) { diffColors++; } for (int e = head[u], v; e > 0; e = next[e]) { @@ -121,7 +121,7 @@ public static void main(String[] args) throws IOException { } for (int i = 1; i <= n; i++) { in.nextToken(); - color[i] = (int) in.nval; + arr[i] = (int) in.nval; } dfs1(1, 0); dfs2(1, 0); diff --git a/src/class163/Code01_DsuOnTree3.java b/src/class163/Code01_DsuOnTree3.java index eccf6300e..5bb8dfebf 100644 --- a/src/class163/Code01_DsuOnTree3.java +++ b/src/class163/Code01_DsuOnTree3.java @@ -15,7 +15,7 @@ // //const int MAXN = 100001; //int n, m; -//int color[MAXN]; +//int arr[MAXN]; // //int head[MAXN]; //int nxt[MAXN << 1]; @@ -57,7 +57,7 @@ //} // //void effect(int u) { -// if (++colorCnt[color[u]] == 1) { +// if (++colorCnt[arr[u]] == 1) { // diffColors++; // } // for (int e = head[u], v; e > 0; e = nxt[e]) { @@ -69,7 +69,7 @@ //} // //void cancle(int u) { -// colorCnt[color[u]] = 0; +// colorCnt[arr[u]] = 0; // for (int e = head[u], v; e > 0; e = nxt[e]) { // v = to[e]; // if (v != fa[u]) { @@ -88,7 +88,7 @@ // if (son[u] != 0) { // dfs2(son[u], 1); // } -// if (++colorCnt[color[u]] == 1) { +// if (++colorCnt[arr[u]] == 1) { // diffColors++; // } // for (int e = head[u], v; e > 0; e = nxt[e]) { @@ -114,7 +114,7 @@ // addEdge(v, u); // } // for (int i = 1; i <= n; i++) { -// cin >> color[i]; +// cin >> arr[i]; // } // dfs1(1, 0); // dfs2(1, 0); From 7ca7fbbab7cc835c2fafc8edb2841d429e619021 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 23 Mar 2025 14:51:57 +0800 Subject: [PATCH 0852/2029] modify code --- src/class163/Code04_DifferntName1.java | 18 +++++++++--------- src/class163/Code04_DifferntName2.java | 18 +++++++++--------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/class163/Code04_DifferntName1.java b/src/class163/Code04_DifferntName1.java index 0477bbc86..697eca76c 100644 --- a/src/class163/Code04_DifferntName1.java +++ b/src/class163/Code04_DifferntName1.java @@ -46,16 +46,16 @@ public class Code04_DifferntName1 { public static int[] dep = new int[MAXN]; public static int[] son = new int[MAXN]; - public static HashMap nameToId = new HashMap<>(); + public static HashMap nameId = new HashMap<>(); public static ArrayList> depSet = new ArrayList<>(); public static int[] ans = new int[MAXN]; - public static int nameId(String name) { - if (nameToId.containsKey(name)) { - return nameToId.get(name); + public static int getNameId(String name) { + if (nameId.containsKey(name)) { + return nameId.get(name); } - nameToId.put(name, nameToId.size() + 1); - return nameToId.size(); + nameId.put(name, nameId.size() + 1); + return nameId.size(); } public static void addId(int deep, int id) { @@ -66,7 +66,7 @@ public static void removeId(int deep, int id) { depSet.get(deep).remove(id); } - public static int sizeOfId(int deep) { + public static int sizeOfDeep(int deep) { if (deep > n) { return 0; } @@ -134,7 +134,7 @@ public static void dfs2(int u, int keep) { } } for (int i = headq[u]; i > 0; i = nextq[i]) { - ans[ansiq[i]] = sizeOfId(dep[u] + kq[i]); + ans[ansiq[i]] = sizeOfDeep(dep[u] + kq[i]); } if (keep == 0) { cancle(u); @@ -149,7 +149,7 @@ public static void main(String[] args) throws IOException { for (int i = 1; i <= n; i++) { name = io.next(); father = io.nextInt(); - id[i] = nameId(name); + id[i] = getNameId(name); if (father == 0) { root[i] = true; } else { diff --git a/src/class163/Code04_DifferntName2.java b/src/class163/Code04_DifferntName2.java index f2309759c..5cdd045af 100644 --- a/src/class163/Code04_DifferntName2.java +++ b/src/class163/Code04_DifferntName2.java @@ -36,16 +36,16 @@ //int siz[MAXN]; //int dep[MAXN]; //int son[MAXN]; -//unordered_map nameToId; +//unordered_map nameId; //vector> depSet; //int ans[MAXN]; // -//int nameId(const string &name) { -// if (nameToId.find(name) != nameToId.end()) { -// return nameToId[name]; +//int getNameId(const string &name) { +// if (nameId.find(name) != nameId.end()) { +// return nameId[name]; // } -// int newId = nameToId.size() + 1; -// nameToId[name] = newId; +// int newId = nameId.size() + 1; +// nameId[name] = newId; // return newId; //} // @@ -57,7 +57,7 @@ // depSet[deep].erase(id); //} // -//int sizeOfId(int deep) { +//int sizeOfDeep(int deep) { // if (deep > n) { // return 0; // } @@ -125,7 +125,7 @@ // } // } // for (int i = headq[u]; i > 0; i = nextq[i]) { -// ans[ansiq[i]] = sizeOfId(dep[u] + kq[i]); +// ans[ansiq[i]] = sizeOfDeep(dep[u] + kq[i]); // } // if (keep == 0) { // cancle(u); @@ -140,7 +140,7 @@ // int father; // for (int i = 1; i <= n; i++) { // cin >> name >> father; -// id[i] = nameId(name); +// id[i] = getNameId(name); // if (father == 0) { // root[i] = true; // } else { From 68675f44a0dce8b4497bfd6e01bc601c8c112bc7 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 23 Mar 2025 16:17:43 +0800 Subject: [PATCH 0853/2029] modify code --- src/class163/Code02_ColorBanlance1.java | 18 +++++++++--------- src/class163/Code02_ColorBanlance2.java | 16 ++++++++-------- src/class163/Code02_ColorBanlance3.java | 16 ++++++++-------- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/src/class163/Code02_ColorBanlance1.java b/src/class163/Code02_ColorBanlance1.java index ba5ce2a70..97cd88f75 100644 --- a/src/class163/Code02_ColorBanlance1.java +++ b/src/class163/Code02_ColorBanlance1.java @@ -40,8 +40,8 @@ public class Code02_ColorBanlance1 { // 启发式合并 // colorCnt[i] = j,表示i这种颜色出现了j次 public static int[] colorCnt = new int[MAXN]; - // cntCnt[i] = j,表示出现次数为i的颜色一共有j种 - public static int[] cntCnt = new int[MAXN]; + // colorNum[i] = j,表示出现次数为i的颜色一共有j种 + public static int[] colorNum = new int[MAXN]; // 颜色平衡子树的个数 public static int ans = 0; @@ -67,8 +67,8 @@ public static void dfs1(int u) { public static void effect(int u) { colorCnt[color[u]]++; - cntCnt[colorCnt[color[u]] - 1]--; - cntCnt[colorCnt[color[u]]]++; + colorNum[colorCnt[color[u]] - 1]--; + colorNum[colorCnt[color[u]]]++; for (int e = head[u]; e > 0; e = next[e]) { effect(to[e]); } @@ -76,8 +76,8 @@ public static void effect(int u) { public static void cancle(int u) { colorCnt[color[u]]--; - cntCnt[colorCnt[color[u]] + 1]--; - cntCnt[colorCnt[color[u]]]++; + colorNum[colorCnt[color[u]] + 1]--; + colorNum[colorCnt[color[u]]]++; for (int e = head[u]; e > 0; e = next[e]) { cancle(to[e]); } @@ -94,15 +94,15 @@ public static void dfs2(int u, int keep) { dfs2(son[u], 1); } colorCnt[color[u]]++; - cntCnt[colorCnt[color[u]] - 1]--; - cntCnt[colorCnt[color[u]]]++; + colorNum[colorCnt[color[u]] - 1]--; + colorNum[colorCnt[color[u]]]++; for (int e = head[u], v; e > 0; e = next[e]) { v = to[e]; if (v != son[u]) { effect(v); } } - if (colorCnt[color[u]] * cntCnt[colorCnt[color[u]]] == siz[u]) { + if (colorCnt[color[u]] * colorNum[colorCnt[color[u]]] == siz[u]) { ans++; } if (keep == 0) { diff --git a/src/class163/Code02_ColorBanlance2.java b/src/class163/Code02_ColorBanlance2.java index c5b78e9b6..b18f54cc7 100644 --- a/src/class163/Code02_ColorBanlance2.java +++ b/src/class163/Code02_ColorBanlance2.java @@ -24,7 +24,7 @@ public class Code02_ColorBanlance2 { public static int[] siz = new int[MAXN]; public static int[] son = new int[MAXN]; public static int[] colorCnt = new int[MAXN]; - public static int[] cntCnt = new int[MAXN]; + public static int[] colorNum = new int[MAXN]; public static int ans = 0; public static void addEdge(int u, int v) { @@ -100,8 +100,8 @@ public static void effect(int root) { pop1(); if (edge1 == -1) { colorCnt[color[cur1]]++; - cntCnt[colorCnt[color[cur1]] - 1]--; - cntCnt[colorCnt[color[cur1]]]++; + colorNum[colorCnt[color[cur1]] - 1]--; + colorNum[colorCnt[color[cur1]]]++; edge1 = head[cur1]; } else { edge1 = next[edge1]; @@ -120,8 +120,8 @@ public static void cancle(int root) { pop1(); if (edge1 == -1) { colorCnt[color[cur1]]--; - cntCnt[colorCnt[color[cur1]] + 1]--; - cntCnt[colorCnt[color[cur1]]]++; + colorNum[colorCnt[color[cur1]] + 1]--; + colorNum[colorCnt[color[cur1]]]++; edge1 = head[cur1]; } else { edge1 = next[edge1]; @@ -162,15 +162,15 @@ public static void dfs2(int u, int keep) { } } else { colorCnt[color[cur2]]++; - cntCnt[colorCnt[color[cur2]] - 1]--; - cntCnt[colorCnt[color[cur2]]]++; + colorNum[colorCnt[color[cur2]] - 1]--; + colorNum[colorCnt[color[cur2]]]++; for (int e = head[cur2], v; e > 0; e = next[e]) { v = to[e]; if (v != son[cur2]) { effect(v); } } - if (colorCnt[color[cur2]] * cntCnt[colorCnt[color[cur2]]] == siz[cur2]) { + if (colorCnt[color[cur2]] * colorNum[colorCnt[color[cur2]]] == siz[cur2]) { ans++; } if (keep2 == 0) { diff --git a/src/class163/Code02_ColorBanlance3.java b/src/class163/Code02_ColorBanlance3.java index 8e79c948a..d622af603 100644 --- a/src/class163/Code02_ColorBanlance3.java +++ b/src/class163/Code02_ColorBanlance3.java @@ -24,7 +24,7 @@ //int siz[MAXN]; //int son[MAXN]; //int colorCnt[MAXN]; -//int cntCnt[MAXN]; +//int colorNum[MAXN]; //int ans = 0; // //void addEdge(int u, int v) { @@ -49,8 +49,8 @@ // //void effect(int u) { // colorCnt[color[u]]++; -// cntCnt[colorCnt[color[u]] - 1]--; -// cntCnt[colorCnt[color[u]]]++; +// colorNum[colorCnt[color[u]] - 1]--; +// colorNum[colorCnt[color[u]]]++; // for (int e = head[u]; e > 0; e = nxt[e]) { // effect(to[e]); // } @@ -58,8 +58,8 @@ // //void cancle(int u) { // colorCnt[color[u]]--; -// cntCnt[colorCnt[color[u]] + 1]--; -// cntCnt[colorCnt[color[u]]]++; +// colorNum[colorCnt[color[u]] + 1]--; +// colorNum[colorCnt[color[u]]]++; // for (int e = head[u]; e > 0; e = nxt[e]) { // cancle(to[e]); // } @@ -76,15 +76,15 @@ // dfs2(son[u], 1); // } // colorCnt[color[u]]++; -// cntCnt[colorCnt[color[u]] - 1]--; -// cntCnt[colorCnt[color[u]]]++; +// colorNum[colorCnt[color[u]] - 1]--; +// colorNum[colorCnt[color[u]]]++; // for (int e = head[u], v; e > 0; e = nxt[e]) { // v = to[e]; // if (v != son[u]) { // effect(v); // } // } -// if (colorCnt[color[u]] * cntCnt[colorCnt[color[u]]] == siz[u]) { +// if (colorCnt[color[u]] * colorNum[colorCnt[color[u]]] == siz[u]) { // ans++; // } // if (keep == 0) { From 9554ea897a292f27c81a89e6017fc72182031efd Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 23 Mar 2025 16:20:03 +0800 Subject: [PATCH 0854/2029] modify code --- src/class163/Code02_ColorBanlance1.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/class163/Code02_ColorBanlance1.java b/src/class163/Code02_ColorBanlance1.java index 97cd88f75..382d19ba8 100644 --- a/src/class163/Code02_ColorBanlance1.java +++ b/src/class163/Code02_ColorBanlance1.java @@ -21,23 +21,17 @@ public class Code02_ColorBanlance1 { public static int MAXN = 200001; - public static int n; - - // 每个节点的颜色 public static int[] color = 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 int[] siz = new int[MAXN]; public static int[] son = new int[MAXN]; - // 启发式合并 // colorCnt[i] = j,表示i这种颜色出现了j次 public static int[] colorCnt = new int[MAXN]; // colorNum[i] = j,表示出现次数为i的颜色一共有j种 From b47251d6bc55f2802c439ae684d994c4649308f2 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 23 Mar 2025 16:21:04 +0800 Subject: [PATCH 0855/2029] modify code --- src/class163/Code02_ColorBanlance2.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/class163/Code02_ColorBanlance2.java b/src/class163/Code02_ColorBanlance2.java index b18f54cc7..721ad2a13 100644 --- a/src/class163/Code02_ColorBanlance2.java +++ b/src/class163/Code02_ColorBanlance2.java @@ -33,11 +33,13 @@ public static void addEdge(int u, int v) { head[u] = cnt; } - // stack1、size1、cur1、edge1,用于把effect、cancle、dfs1改成迭代版 + // stack1、size1、cur1、edge1 + // 用于把effect、cancle、dfs1改成迭代版 public static int[][] stack1 = new int[MAXN][2]; public static int size1, cur1, edge1; - // stack2、size2、cur2、edge2、keep2,用于把dfs2改成迭代版 + // stack2、size2、cur2、keep2、edge2 + // 用于把dfs2改成迭代版 public static int[][] stack2 = new int[MAXN][3]; public static int size2, cur2, keep2, edge2; From fb02cd96a4c4e3ab4223b7538cef3aedfe491d60 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 23 Mar 2025 18:48:38 +0800 Subject: [PATCH 0856/2029] modify code --- src/class163/Code04_DifferntName1.java | 7 ++++++- src/class163/Code04_DifferntName2.java | 4 +++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/class163/Code04_DifferntName1.java b/src/class163/Code04_DifferntName1.java index 697eca76c..1d6d6115d 100644 --- a/src/class163/Code04_DifferntName1.java +++ b/src/class163/Code04_DifferntName1.java @@ -27,26 +27,31 @@ public class Code04_DifferntName1 { public static int MAXN = 100001; public static int n, m; + + public static HashMap nameId = new HashMap<>(); public static boolean[] root = new boolean[MAXN]; public static int[] id = new int[MAXN]; + // 链式前向星 public static int[] headg = new int[MAXN]; public static int[] nextg = new int[MAXN]; public static int[] tog = new int[MAXN]; public static int cntg; + // 问题列表 public static int[] headq = new int[MAXN]; public static int[] nextq = new int[MAXN]; public static int[] ansiq = new int[MAXN]; public static int[] kq = new int[MAXN]; public static int cntq; + // 树链剖分 public static int[] fa = new int[MAXN]; public static int[] siz = new int[MAXN]; public static int[] dep = new int[MAXN]; public static int[] son = new int[MAXN]; - public static HashMap nameId = new HashMap<>(); + // 树上启发式合并 public static ArrayList> depSet = new ArrayList<>(); public static int[] ans = new int[MAXN]; diff --git a/src/class163/Code04_DifferntName2.java b/src/class163/Code04_DifferntName2.java index 5cdd045af..035a3dac8 100644 --- a/src/class163/Code04_DifferntName2.java +++ b/src/class163/Code04_DifferntName2.java @@ -18,6 +18,8 @@ // //const int MAXN = 100001; //int n, m; +// +//unordered_map nameId; //bool root[MAXN]; //int id[MAXN]; // @@ -36,7 +38,7 @@ //int siz[MAXN]; //int dep[MAXN]; //int son[MAXN]; -//unordered_map nameId; +// //vector> depSet; //int ans[MAXN]; // From 7ade0b3b007e2f98d62b65f09414ef23751b25b3 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 23 Mar 2025 18:55:27 +0800 Subject: [PATCH 0857/2029] modify code --- src/class163/Code05_BloodCousins1.java | 15 +++++++++------ src/class163/Code05_BloodCousins2.java | 12 ++++++------ 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/class163/Code05_BloodCousins1.java b/src/class163/Code05_BloodCousins1.java index 545895386..5459c91d5 100644 --- a/src/class163/Code05_BloodCousins1.java +++ b/src/class163/Code05_BloodCousins1.java @@ -24,26 +24,29 @@ public class Code05_BloodCousins1 { public static int MAXN = 100001; public static int MAXH = 20; public static int n, m; - public static boolean[] root = new boolean[MAXN]; + // 链式前向星 public static int[] headg = new int[MAXN]; public static int[] nextg = new int[MAXN]; public static int[] tog = new int[MAXN]; public static int cntg; + // 问题列表 public static int[] headq = new int[MAXN]; public static int[] nextq = new int[MAXN]; public static int[] ansiq = new int[MAXN]; public static int[] kq = new int[MAXN]; public static int cntq; + // 树链剖分 public static int[] siz = new int[MAXN]; public static int[] dep = new int[MAXN]; public static int[] son = new int[MAXN]; public static int[][] stjump = new int[MAXN][MAXH]; - public static int[] nodeCnt = new int[MAXN]; + // 树上启发式合并 + public static int[] depCnt = new int[MAXN]; public static int[] ans = new int[MAXN]; public static void addEdge(int u, int v) { @@ -89,14 +92,14 @@ public static int kAncestor(int u, int k) { } public static void effect(int u) { - nodeCnt[dep[u]]++; + depCnt[dep[u]]++; for (int e = headg[u]; e > 0; e = nextg[e]) { effect(tog[e]); } } public static void cancle(int u) { - nodeCnt[dep[u]]--; + depCnt[dep[u]]--; for (int e = headg[u]; e > 0; e = nextg[e]) { cancle(tog[e]); } @@ -112,7 +115,7 @@ public static void dfs2(int u, int keep) { if (son[u] != 0) { dfs2(son[u], 1); } - nodeCnt[dep[u]]++; + depCnt[dep[u]]++; for (int e = headg[u], v; e > 0; e = nextg[e]) { v = tog[e]; if (v != son[u]) { @@ -120,7 +123,7 @@ public static void dfs2(int u, int keep) { } } for (int i = headq[u]; i > 0; i = nextq[i]) { - ans[ansiq[i]] = nodeCnt[dep[u] + kq[i]]; + ans[ansiq[i]] = depCnt[dep[u] + kq[i]]; } if (keep == 0) { cancle(u); diff --git a/src/class163/Code05_BloodCousins2.java b/src/class163/Code05_BloodCousins2.java index 842c81745..d991d176a 100644 --- a/src/class163/Code05_BloodCousins2.java +++ b/src/class163/Code05_BloodCousins2.java @@ -20,8 +20,8 @@ //const int MAXN = 100001; //const int MAXH = 20; //int n, m; -// //bool root[MAXN]; +// //int headg[MAXN]; //int nextg[MAXN]; //int tog[MAXN]; @@ -38,7 +38,7 @@ //int son[MAXN]; //int stjump[MAXN][MAXH]; // -//int nodeCnt[MAXN]; +//int depCnt[MAXN]; //int ans[MAXN]; // //void addEdge(int u, int v) { @@ -84,14 +84,14 @@ //} // //void effect(int u) { -// nodeCnt[dep[u]]++; +// depCnt[dep[u]]++; // for (int e = headg[u]; e > 0; e = nextg[e]) { // effect(tog[e]); // } //} // //void cancle(int u) { -// nodeCnt[dep[u]]--; +// depCnt[dep[u]]--; // for (int e = headg[u]; e > 0; e = nextg[e]) { // cancle(tog[e]); // } @@ -107,7 +107,7 @@ // if (son[u] != 0) { // dfs2(son[u], 1); // } -// nodeCnt[dep[u]]++; +// depCnt[dep[u]]++; // for (int e = headg[u], v; e > 0; e = nextg[e]) { // v = tog[e]; // if (v != son[u]) { @@ -115,7 +115,7 @@ // } // } // for (int i = headq[u]; i > 0; i = nextq[i]) { -// ans[ansiq[i]] = nodeCnt[dep[u] + kq[i]]; +// ans[ansiq[i]] = depCnt[dep[u] + kq[i]]; // } // if (keep == 0) { // cancle(u); From 1ac15b4003e483454544e93e61e9a00681ae9a49 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 23 Mar 2025 20:13:14 +0800 Subject: [PATCH 0858/2029] modify code --- src/class163/Code06_RearrangePalindrome1.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/class163/Code06_RearrangePalindrome1.java b/src/class163/Code06_RearrangePalindrome1.java index b2a8b6c1a..6ac7a625f 100644 --- a/src/class163/Code06_RearrangePalindrome1.java +++ b/src/class163/Code06_RearrangePalindrome1.java @@ -102,9 +102,12 @@ public static void dfs2(int u, int keep) { if (son[u] != 0) { dfs2(son[u], 1); } + // 每一个儿子的子树,里得到的答案 for (int e = head[u]; e > 0; e = next[e]) { ans[u] = Math.max(ans[u], ans[to[e]]); } + // 选择当前节点,再选择重儿子树上的任意一点,得到的答案 + // 枚举所有可能得到的异或值 if (maxdep[eor[u]] != 0) { ans[u] = Math.max(ans[u], maxdep[eor[u]] - dep[u]); } @@ -113,7 +116,9 @@ public static void dfs2(int u, int keep) { ans[u] = Math.max(ans[u], maxdep[eor[u] ^ (1 << i)] - dep[u]); } } + // 当前点的异或值,更新最大深度信息 maxdep[eor[u]] = Math.max(maxdep[eor[u]], dep[u]); + // 选择遍历过的部分里的任意一点,再选择当前遍历到的子树里的任意一点,得到的答案 for (int e = head[u], v; e > 0; e = next[e]) { v = to[e]; if (v != son[u]) { From c90ea6210fca2ddf660e6803b59a329e3401e7b1 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 23 Mar 2025 22:56:40 +0800 Subject: [PATCH 0859/2029] modify code --- src/class163/Code06_RearrangePalindrome1.java | 14 ++++++-------- src/class163/Code06_RearrangePalindrome2.java | 12 +++++------- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/src/class163/Code06_RearrangePalindrome1.java b/src/class163/Code06_RearrangePalindrome1.java index 6ac7a625f..fc4a14eff 100644 --- a/src/class163/Code06_RearrangePalindrome1.java +++ b/src/class163/Code06_RearrangePalindrome1.java @@ -35,7 +35,7 @@ public class Code06_RearrangePalindrome1 { public static int[] eor = new int[MAXN]; public static int[] son = new int[MAXN]; - // 统计答案 + // 树上启发式合并 public static int[] maxdep = new int[1 << MAXV]; public static int[] ans = new int[MAXN]; @@ -76,20 +76,18 @@ public static void cancle(int u) { } } - public static int answerFromLight(int u, int lcaDep) { - int ans = 0; + public static void answerFromLight(int u, int h) { if (maxdep[eor[u]] != 0) { - ans = Math.max(ans, maxdep[eor[u]] + dep[u] - lcaDep * 2); + ans[h] = Math.max(ans[h], maxdep[eor[u]] + dep[u] - dep[h] * 2); } for (int i = 0; i < MAXV; i++) { if (maxdep[eor[u] ^ (1 << i)] != 0) { - ans = Math.max(ans, maxdep[eor[u] ^ (1 << i)] + dep[u] - lcaDep * 2); + ans[h] = Math.max(ans[h], maxdep[eor[u] ^ (1 << i)] + dep[u] - dep[h] * 2); } } for (int e = head[u]; e > 0; e = next[e]) { - ans = Math.max(ans, answerFromLight(to[e], lcaDep)); + answerFromLight(to[e], h); } - return ans; } public static void dfs2(int u, int keep) { @@ -122,7 +120,7 @@ public static void dfs2(int u, int keep) { for (int e = head[u], v; e > 0; e = next[e]) { v = to[e]; if (v != son[u]) { - ans[u] = Math.max(ans[u], answerFromLight(v, dep[u])); + answerFromLight(v, u); effect(v); } } diff --git a/src/class163/Code06_RearrangePalindrome2.java b/src/class163/Code06_RearrangePalindrome2.java index e21e4e647..9e62d0db8 100644 --- a/src/class163/Code06_RearrangePalindrome2.java +++ b/src/class163/Code06_RearrangePalindrome2.java @@ -67,20 +67,18 @@ // } //} // -//int answerFromLight(int u, int lcaDep) { -// int ret = 0; +//void answerFromLight(int u, int h) { // if (maxdep[eor[u]] != 0) { -// ret = max(ret, maxdep[eor[u]] + dep[u] - lcaDep * 2); +// ans[h] = max(ans[h], maxdep[eor[u]] + dep[u] - dep[h] * 2); // } // for (int i = 0; i < MAXV; i++) { // if (maxdep[eor[u] ^ (1 << i)] != 0) { -// ret = max(ret, maxdep[eor[u] ^ (1 << i)] + dep[u] - lcaDep * 2); +// ans[h] = max(ans[h], maxdep[eor[u] ^ (1 << i)] + dep[u] - dep[h] * 2); // } // } // for (int e = head[u]; e > 0; e = nxt[e]) { -// ret = max(ret, answerFromLight(to[e], lcaDep)); +// answerFromLight(to[e], h); // } -// return ret; //} // //void dfs2(int u, int keep) { @@ -108,7 +106,7 @@ // for (int e = head[u], v; e > 0; e = nxt[e]) { // v = to[e]; // if (v != son[u]) { -// ans[u] = max(ans[u], answerFromLight(v, dep[u])); +// answerFromLight(v, u); // effect(v); // } // } From 7660da6b8f4e8a5f97ab336283df5e8e75ef201c Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 23 Mar 2025 22:59:54 +0800 Subject: [PATCH 0860/2029] modify code --- src/class163/Code06_RearrangePalindrome1.java | 14 +++++++------- src/class163/Code06_RearrangePalindrome2.java | 14 +++++++------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/class163/Code06_RearrangePalindrome1.java b/src/class163/Code06_RearrangePalindrome1.java index fc4a14eff..7467426ef 100644 --- a/src/class163/Code06_RearrangePalindrome1.java +++ b/src/class163/Code06_RearrangePalindrome1.java @@ -76,17 +76,17 @@ public static void cancle(int u) { } } - public static void answerFromLight(int u, int h) { - if (maxdep[eor[u]] != 0) { - ans[h] = Math.max(ans[h], maxdep[eor[u]] + dep[u] - dep[h] * 2); + public static void answerFromLight(int light, int u) { + if (maxdep[eor[light]] != 0) { + ans[u] = Math.max(ans[u], maxdep[eor[light]] + dep[light] - dep[u] * 2); } for (int i = 0; i < MAXV; i++) { - if (maxdep[eor[u] ^ (1 << i)] != 0) { - ans[h] = Math.max(ans[h], maxdep[eor[u] ^ (1 << i)] + dep[u] - dep[h] * 2); + if (maxdep[eor[light] ^ (1 << i)] != 0) { + ans[u] = Math.max(ans[u], maxdep[eor[light] ^ (1 << i)] + dep[light] - dep[u] * 2); } } - for (int e = head[u]; e > 0; e = next[e]) { - answerFromLight(to[e], h); + for (int e = head[light]; e > 0; e = next[e]) { + answerFromLight(to[e], u); } } diff --git a/src/class163/Code06_RearrangePalindrome2.java b/src/class163/Code06_RearrangePalindrome2.java index 9e62d0db8..9f97f353a 100644 --- a/src/class163/Code06_RearrangePalindrome2.java +++ b/src/class163/Code06_RearrangePalindrome2.java @@ -67,17 +67,17 @@ // } //} // -//void answerFromLight(int u, int h) { -// if (maxdep[eor[u]] != 0) { -// ans[h] = max(ans[h], maxdep[eor[u]] + dep[u] - dep[h] * 2); +//void answerFromLight(int light, int u) { +// if (maxdep[eor[light]] != 0) { +// ans[u] = max(ans[u], maxdep[eor[light]] + dep[light] - dep[u] * 2); // } // for (int i = 0; i < MAXV; i++) { -// if (maxdep[eor[u] ^ (1 << i)] != 0) { -// ans[h] = max(ans[h], maxdep[eor[u] ^ (1 << i)] + dep[u] - dep[h] * 2); +// if (maxdep[eor[light] ^ (1 << i)] != 0) { +// ans[u] = max(ans[u], maxdep[eor[light] ^ (1 << i)] + dep[light] - dep[u] * 2); // } // } -// for (int e = head[u]; e > 0; e = nxt[e]) { -// answerFromLight(to[e], h); +// for (int e = head[light]; e > 0; e = nxt[e]) { +// answerFromLight(to[e], u); // } //} // From a9564aefe5b8e75ab52eaf585e1efd7fb5669c82 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Sun, 23 Mar 2025 23:48:32 +0800 Subject: [PATCH 0861/2029] modify code --- ...70\345\205\263\351\242\230\347\233\256.pptx" | Bin 0 -> 56040 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "ppt/\347\256\227\346\263\225\350\256\262\350\247\243163\343\200\220\346\214\272\351\232\276\343\200\221\346\240\221\344\270\212\345\220\257\345\217\221\345\274\217\345\220\210\345\271\266\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\243163\343\200\220\346\214\272\351\232\276\343\200\221\346\240\221\344\270\212\345\220\257\345\217\221\345\274\217\345\220\210\345\271\266\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\243163\343\200\220\346\214\272\351\232\276\343\200\221\346\240\221\344\270\212\345\220\257\345\217\221\345\274\217\345\220\210\345\271\266\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..4f93db08743c2f8e3ff722464770391d5e6a95b3 GIT binary patch literal 56040 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%0ABoXk#4(_JV1&VcZFkDg%*Ou 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 twm-Og4;$|<9-v#=z<`h4U| Date: Mon, 24 Mar 2025 12:33:09 +0800 Subject: [PATCH 0862/2029] modify code --- src/class104/Code04_TopKOddLengthProduct.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class104/Code04_TopKOddLengthProduct.java b/src/class104/Code04_TopKOddLengthProduct.java index 8d483ee79..e7afc2910 100644 --- a/src/class104/Code04_TopKOddLengthProduct.java +++ b/src/class104/Code04_TopKOddLengthProduct.java @@ -53,12 +53,12 @@ public static int compute(String s) { } long ans = 1; long sum = 0; - for (int len = (m & 1) == 1 ? m : (m - 1); len >= 0 && k >= 0; len -= 2) { + for (int len = (m & 1) == 1 ? m : (m - 1); len >= 1 && k > 0; len -= 2) { sum += cnt[len]; ans = (ans * power(len, Math.min(k, sum))) % MOD; k -= sum; } - return k < 0 ? (int) ans : -1; + return k > 0 ? -1 : (int)ans; } public static void manacher(String str) { From fa54d0479ffd15ad05fd053ae82996b53b201451 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 25 Mar 2025 23:14:41 +0800 Subject: [PATCH 0863/2029] modify code --- src/class164/Code01_KruskalRebuildTree1.java | 304 +++++++++++++++++++ src/class164/Code01_KruskalRebuildTree2.java | 142 +++++++++ 2 files changed, 446 insertions(+) create mode 100644 src/class164/Code01_KruskalRebuildTree1.java create mode 100644 src/class164/Code01_KruskalRebuildTree2.java diff --git a/src/class164/Code01_KruskalRebuildTree1.java b/src/class164/Code01_KruskalRebuildTree1.java new file mode 100644 index 000000000..3f2d09274 --- /dev/null +++ b/src/class164/Code01_KruskalRebuildTree1.java @@ -0,0 +1,304 @@ +package class164; + +// Kruskal重构树模版题,java版 +// 测试链接 : https://www.luogu.com.cn/problem/P2245 +// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例 + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Arrays; + +public class Code01_KruskalRebuildTree1 { + + public static int MAXN = 200001; + public static int MAXM = 300001; + public static int n, m, q; + public static int[][] arr = new int[MAXM][3]; + + // 并查集 + public static int[] father = new int[MAXN]; + public static int[] nodeKey = new int[MAXN]; + public static int cnth = 0; + + // 链式前向星 + public static int[] head = new int[MAXN]; + public static int[] next = new int[MAXN]; + public static int[] to = new int[MAXN]; + 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 find(int i) { + if (i != father[i]) { + father[i] = find(father[i]); + } + return father[i]; + } + + public static void addEdge(int u, int v) { + next[++cntg] = head[u]; + to[cntg] = v; + head[u] = cntg; + } + + public static void kruskalRebuild() { + for (int i = 1; i <= n; i++) { + father[i] = i; + } + Arrays.sort(arr, 1, m + 1, (a, b) -> a[2] - b[2]); + cnth = n; + for (int i = 1, fx, fy; i <= m; i++) { + fx = find(arr[i][0]); + fy = find(arr[i][1]); + if (fx != fy) { + father[fx] = father[fy] = ++cnth; + father[cnth] = cnth; + nodeKey[cnth] = arr[i][2]; + addEdge(cnth, fx); + addEdge(cnth, fy); + } + } + } + + 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(int u, int f) { + stacksize = 0; + push(u, f, -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(int u, int t) { + stacksize = 0; + push(u, t, -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 main(String[] args) throws IOException { + FastIO io = new FastIO(System.in, System.out); + n = io.nextInt(); + m = io.nextInt(); + for (int i = 1; i <= m; i++) { + arr[i][0] = io.nextInt(); + arr[i][1] = io.nextInt(); + arr[i][2] = io.nextInt(); + } + kruskalRebuild(); + for (int i = 1; i <= cnth; i++) { + if (i == father[i]) { + dfs3(i, 0); // 防止递归爆栈,所以调用dfs1的迭代版 + dfs4(i, i); // 防止递归爆栈,所以调用dfs2的迭代版 + } + } + q = io.nextInt(); + for (int i = 1, x, y; i <= q; i++) { + x = io.nextInt(); + y = io.nextInt(); + if (find(x) != find(y)) { + io.write("impossible\n"); + } else { + io.writelnInt(nodeKey[lca(x, y)]); + } + } + 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); + } + } + } + +} \ No newline at end of file diff --git a/src/class164/Code01_KruskalRebuildTree2.java b/src/class164/Code01_KruskalRebuildTree2.java new file mode 100644 index 000000000..069e9ec6e --- /dev/null +++ b/src/class164/Code01_KruskalRebuildTree2.java @@ -0,0 +1,142 @@ +package class164; + +// Kruskal重构树模版题,C++版 +// 测试链接 : https://www.luogu.com.cn/problem/P2245 +// 如下实现是C++的版本,C++版本和java版本逻辑完全一样 +// 提交如下代码,可以通过所有测试用例 + +//#include +// +//using namespace std; +// +//struct Edge { +// int u, v, w; +//}; +// +//const int MAXN = 200001; +//const int MAXM = 300001; +//int n, m, q; +//Edge arr[MAXM]; +// +//int father[MAXN]; +//int nodeKey[MAXN]; +//int cnth = 0; +// +//int head[MAXN]; +//int nxt[MAXN]; +//int to[MAXN]; +//int cntg = 0; +// +//int fa[MAXN]; +//int dep[MAXN]; +//int siz[MAXN]; +//int son[MAXN]; +//int top[MAXN]; +// +//bool cmp(Edge x, Edge y) { +// return x.w < y.w; +//} +// +//int find(int i) { +// if(i != father[i]) { +// father[i] = find(father[i]); +// } +// return father[i]; +//} +// +//void addEdge(int u, int v) { +// nxt[++cntg] = head[u]; +// to[cntg] = v; +// head[u] = cntg; +//} +// +//void kruskalRebuild() { +// for (int i = 1; i <= n; i++) { +// father[i] = i; +// } +// sort(arr + 1, arr + m + 1, cmp); +// cnth = n; +// for (int i = 1, fx, fy; i <= m; i++) { +// fx = find(arr[i].u); +// fy = find(arr[i].v); +// if (fx != fy) { +// father[fx] = father[fy] = ++cnth; +// father[cnth] = cnth; +// nodeKey[cnth] = arr[i].w; +// addEdge(cnth, fx); +// addEdge(cnth, fy); +// } +// } +//} +// +//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 e = head[u], v; e > 0; 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] == 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 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; +//} +// +//int main() { +// ios::sync_with_stdio(false); +// cin.tie(nullptr); +// cin >> n >> m; +// for (int i = 1; i <= m; i++) { +// cin >> arr[i].u >> arr[i].v >> arr[i].w; +// } +// kruskalRebuild(); +// for (int i = 1; i <= cnth; i++) { +// if (i == father[i]) { +// dfs1(i, 0); +// dfs2(i, i); +// } +// } +// cin >> q; +// for (int i = 1, x, y; i <= q; i++) { +// cin >> x >> y; +// if (find(x) != find(y)) { +// cout << "impossible\n"; +// } else { +// cout << nodeKey[lca(x, y)] << "\n"; +// } +// } +// return 0; +//} \ No newline at end of file From 8c513e1f346122ccc4b1870fe7f23692b55fcd63 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 26 Mar 2025 15:39:51 +0800 Subject: [PATCH 0864/2029] modify code --- ...346\237\245\351\233\206-\344\270\212.pptx" | Bin 47133 -> 47167 bytes ...346\237\245\351\233\206-\344\270\213.pptx" | Bin 43666 -> 43628 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243056\343\200\220\345\277\205\345\244\207\343\200\221\345\271\266\346\237\245\351\233\206-\344\270\212.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243056\343\200\220\345\277\205\345\244\207\343\200\221\345\271\266\346\237\245\351\233\206-\344\270\212.pptx" index b1281e2c5a426cb813592f189bdbf4524f024e67..0f5ced922b7df69fbc6438da0ef0fd96aef59234 100644 GIT binary patch delta 5033 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 delta 5150 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 diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243057\343\200\220\345\277\205\345\244\207\343\200\221\345\271\266\346\237\245\351\233\206-\344\270\213.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243057\343\200\220\345\277\205\345\244\207\343\200\221\345\271\266\346\237\245\351\233\206-\344\270\213.pptx" index 6f571d2284b07112ec60d6827d70952a013dea8b..9d28106e821bd0d529feb70e3c1c686d2e7e9818 100644 GIT binary patch delta 2860 zcmZ8jdpuKp9G+ojxfIfCii%d`7IJ%u-0u}3x8<@*#Y>YA8C~R7;Yh|dml=&NY9W`( zn@f>I%q3JyQYfOx46iw-+S~qm&hve~&-4AAb3Xf?bS8Yf3of?Tj$c3u27@7CU!zZZ z+!2%H6W{`13*Q_FHp5$10Amt)zQh%=yy(JzF8&?h7u>YNZ>1Z7`Q?m{4Pl)yu> z2FXJRkW)o(7Fa>RS5-~mf?O9!d&?7e=qqFtuwD@wU{ukCrxd0HbvP*JL34doML;q0 zYVYB{&69FbfV?K;@>$b~*G2cIi=GbXvNFy<9tu##O9S$@_rS5z3~@Z=?IvAoxOeH` zG2|06KMW=&4ufq1cDTqh)OXkM=+p{OfVu?~ykPMRDz!Um0ZTSeaF6YGkY=j=VN2sGdus7Y|{x0H%`al8HFp!L)sB`d|uwn&TS>&NELEKk|V40275 zJ7vJ{aK96Nv{NF_LEYrjmUtae!Sp(UaAu(Ku=>gHush_euFk1;>9O54Q8OfJXd7kX z#=Yv(L0-;P=_x9W?OL^63R9#TW(v1ID#$E8$Y0!>{-`@@xP(~IWoSi+2-_~I8NJ3| zOBE@t(t<8KE#lnW?Dek+x(=6MdEOB2Z+@`|<-0Fs6?*T<*MJrIsqBTb@L^fRdM0i| zjcw`;xc&IOq@<&BuUZ}N5v?l{(3rtC#m^Jj=9uJ%5*sZJI#ZQa%Vh4WGiq-)6paZ? zK-he1ElXqf>ex^6buwDyzIc zR=+AaxSS=;5kfkM)38-d*3@#=!sX3$!g`du>9U`Sj(Cu{0Q?WvE}q^JQ+_} z!hp4DO1#vKmf8se^15vKfbv-^D*0=Gax*8XiMnRTOLRh6hOKqMUtvZf$v9HF2S?zj zr2CJez<~9iaS@7Ut|iJ*JD&Yby8hbN%fK?t?Vr>1#Kh4 zk5~WIb|#etunyQ0q==_nUJz4HsYr^MwqA|39a!^exNlv^>bZXN=Ng_$kH1uydz;Dd zrMCIG!%`bU>)QFWYxl;6V)DY;&hN}GC$EWi_L}yZ7>EISFg1}ZpX2dSo|@-SK9~=v z9F>w7Z9(I{*BN-$#^J?Y`WH3V%Wg}`gXi0(6A@QG08*E&2!+;$uXU)3x>N}qmSZJs z(Lootzw&N3cP-txH5TxD(25r3y`%8AW;b+*Tw z>9QGqt|>FKw1OVv&DA@dgggC_Sr|Ir%$#CQKPaexof5RD96C$q>%E(Ao$jgQeXg0G zlS$+t#zRI4{nZu{9`-Na4t?M|CMTjR9xIlN@ME3}Ps`ZQX!+<}V=psWZd;sz>5NN5 zrB$(zKI*RZ0M$LdfIas{g0Z&s4P)FYD zIACf!rxzxaVYM|lK&8N33||=+f#+ zEPnp!IMO`GCo0k}tdAp#ukYi~Dke_^O*A}D+Ne-67EZqO=JU<(?C|5vOL$%V>P75X z)4q&_8N%XSttINh*n%CIeW_h#!iDlr|8Q8;mpnZCrdIjvRNrX@tn8t?&3ZZ0g+9IW zrB~~7ksVlK)LdYqt*ZL|++86vnf%pSOEP^YNWq6ouQ+-I4Z=IWSB?euyjl9u-!Xmvf^o`(te?{f%ryu zgIl+ANe;KVd&Ednk`lU8O`e0^H(sdq4M&c2Mt%D{d-4$#Se1W5LtVRVG(QOu8(G?5 z-_dKAA0w~Ou_tJDGC%RcHVczVDfWZWrJ;}Ca{9HKa5yw--l*e8mCpyQTFgkK*n7J( zCGa=1myHExJd0;ra{s@ZfwEW(uo2G$7t$R5u^_nNxU|uA6fhC-3@km2`~vRS<&Jrf zx*g~Ci^2dJ36P0!q8zxPSG*_b+&_BAL^-V)^k>Xw9)q^QA>vLjl0y6&1cO8a5Xffl z0)cn74G2oIACk{^9>hB2@vs#?*%@B;U_PYH&F9e~3n13Iz#cr( z1Pu+`EieKvrg>R!D#TK#JX&NS#M%_{u#BJVH(nM?gS5G{Us^XX$+ifZidY1lf4XSb zpPSjZ7O(N z!GMQx(ts>og4{kU;-I*p6uBxVDlth8gxXJpy4yA Y0H$OUcx_jL=Boz|mtYX;MDEf510)nHIsgCw delta 3025 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�BlAVGPky`|A($ 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%0D3I8A;#{if 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