From 12d2ec1a1ca8c33a884f0009e2166e183e7e5683 Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Thu, 19 Jun 2025 16:17:14 +0800 Subject: [PATCH 001/749] 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 002/749] 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 003/749] 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 004/749] 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 005/749] 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 006/749] 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 007/749] 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 008/749] 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 009/749] 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 010/749] 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 011/749] 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 012/749] 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 013/749] 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 014/749] 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 015/749] 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 016/749] 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 017/749] 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 018/749] 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 019/749] 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 020/749] 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 021/749] 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 022/749] 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 023/749] 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 024/749] 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 025/749] 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 026/749] 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 027/749] 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 028/749] 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 029/749] 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 030/749] 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 031/749] 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 032/749] 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 033/749] 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 034/749] 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 035/749] 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 036/749] 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 037/749] 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 038/749] 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 039/749] 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 040/749] 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 041/749] 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 042/749] 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 043/749] 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 044/749] 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 045/749] 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 046/749] 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 047/749] 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 048/749] 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 049/749] 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 050/749] 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 051/749] 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 052/749] 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 053/749] 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 054/749] 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 055/749] 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 056/749] 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 057/749] 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 058/749] 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 059/749] 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 060/749] 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 061/749] 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 062/749] 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 063/749] 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 064/749] 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 065/749] 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 066/749] 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 067/749] 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 068/749] 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 069/749] 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 070/749] 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 071/749] 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 072/749] 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 073/749] 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 074/749] 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 075/749] 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 076/749] 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 077/749] 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 078/749] 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 079/749] 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 080/749] 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 081/749] 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 082/749] 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 083/749] 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 084/749] 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 085/749] 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 086/749] 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 087/749] 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 088/749] 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 089/749] 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 090/749] 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 091/749] 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 092/749] 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 093/749] 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 094/749] 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 095/749] 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 096/749] 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 097/749] 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 098/749] 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 099/749] 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 100/749] 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 101/749] 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 102/749] 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 103/749] 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 104/749] 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 105/749] 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 106/749] 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 107/749] 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 108/749] 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 109/749] 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 110/749] 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 111/749] 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 112/749] 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 113/749] 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 114/749] 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 115/749] 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 116/749] 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 117/749] 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 118/749] 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 119/749] 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 120/749] 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 121/749] 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 122/749] 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 123/749] 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 124/749] 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 125/749] 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 126/749] 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 127/749] 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 128/749] 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 129/749] 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 130/749] 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 131/749] 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 132/749] 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 133/749] 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 134/749] 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 135/749] 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 136/749] 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 137/749] 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 138/749] 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 139/749] 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 140/749] 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 141/749] 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 142/749] 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 143/749] 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 144/749] 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 145/749] 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 146/749] 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 147/749] 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 148/749] 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 149/749] 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 150/749] 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 151/749] 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 152/749] 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 153/749] 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 154/749] 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 155/749] 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 156/749] 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 157/749] 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 158/749] 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 159/749] 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 160/749] 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 161/749] 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 162/749] 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 163/749] 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 164/749] 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 165/749] 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 166/749] 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 167/749] 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 168/749] 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 169/749] 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 170/749] 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 171/749] 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 172/749] 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 173/749] 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 174/749] 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 175/749] 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 176/749] 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 177/749] 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 178/749] 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 179/749] 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 180/749] 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 181/749] 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 182/749] 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 183/749] 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 184/749] 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 185/749] 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 186/749] 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 187/749] 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 188/749] 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 189/749] 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 190/749] 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 191/749] 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 192/749] 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 193/749] 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 194/749] 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 195/749] 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 196/749] 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 197/749] 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 198/749] 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 199/749] 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 200/749] 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 201/749] 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 202/749] 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 203/749] 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 204/749] 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 205/749] 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 206/749] 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 207/749] 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 208/749] 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 209/749] 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 zcmZvec|6oxAIE2gu_yaFJ!Ffz*>?)p64FgVmKL()id3jbhK2{(CO=tnX-)Rbd$AoAHP#~JomZJ{PX>t_xXIj=X=iU%=mx85sEx2m}ja z)3uy~ABoy@g(Q(*;2@6b+6@)UsQV0XyvdXX&sK1;aDezPRz^7HNU?#T47(#UJdNY= z1LG~;D@^eCvWOJpZiM9ZRU!E%HfURi4C4f`P&zh~8ibLU^f@{TX{IahAI^r?2MHYH zfl^W71L`kip$w3OiZ$I#)BxzdrY7C^Q3s$_U3ah-d3_d8q^7|#U2@(SNR&+|K!P-9 z1rm;v8$g0ISA)7b=v8r9>VoxPtY?XaBCUJiJ=oji($%W=AR(KBA{|jW*`T`@zyX}N z=nwV)Cs=g?$_{61u(X&PBa(H~^^?Q2np4uj1U``p6L%wUm@!`2Xn5m_H+SIG6nx1r z-W|$9l7T}o+79gdp^$~vLICOtt)rvgBZfHP%z-Yhl~0)vh#FDIDN_Ji=|Mw}MEIci zOm^(o-sHn0(JS(tY@yWa0{Etd#KQ zN%)#fuD$i!wqT&U`dxKVux{o;rsgJ`$!m zWKE25|InWmEr~l8)f-jk(zcYCb43%cmY$e~<(yWkI;*=P8!&`Vzu0MeYPQp%9j|14 zCay<3fWuEnTY>fG7!6kn$JSKenO4UUBB3Dvr#z1h*jH8P=9u*Jg zLqxP+KxVCaYOLC;p*;36FY{V^`CPSZ1vU;ROCUTGgFKY=eyNU+z%Ejr(2>02(1HjErlwvLb!_0;B@+~K?wa|P!S zigmdoFH3%EB_K>=Rrk&FW0}mh2oC5cBq`>XndA)>(t2*=Z9e7en65UkZ&oGql&0J` zFc#Iq5K(7@o=G5zS#$?(lm-^DujLgjW5;mYU)44~SloL)|Lx=3hMd~9={3TXk!Zxp zL&ZFyd2@OJqXC@B-j;<#!F5!Dd=xBY*E~DaCXdF>re(PCYRSA}2=CWOe6a$XGdQ zLsJd0==bx3#*;xNl(_bsruPIxRyh%V#=;945#Hf^7)N0%#dC@N*H4IJ>+YRm6~ZD1 zWBSb)Z>%%=A9W)gg)XN);wP=9xse}C8y>9BF}(4vZz3@^?pTl$n@W5@8`=Bf+s|zg zxNhNP9nW5_3n`wif!=I)5UOHfvtO_%HEzbjFJGp%2j)iC8{ZpCU_V<*-hnK6^X%+6 z+Abf!opNmuhzOp*U5*VyXqdbc*q9mV6_>uDZD#tgDQogA(g79CW_mKBPBgML@7o>K z5#ELP2gkV2n124e!EV*_v>`a_QX~hbl;oj$W-1e{XHY1?TlD4>OAK=&lfTvsw#`k& zMofz$^6aLEFpqJPS8Bt@`{QP(g7+6|?hxnniR`SXyaWd=3>rQ+X&@H89X>7f&GDY~IVAJ)?Dl@Hf&JGq z0*{~6=32qBn2a1I>1|!EsT#Ax_MyXNW~N`^I)qo=`B&K9v#o!&HnSkyyy}G?d7_E-OjKud>oOR^nnre$CyL0_EIqs8T6iO(}(i<){4^N!fAJV z{*ceMmugFoEKeN~r-nnDJ(<`Eqmt$u=O3(=#506d?)a~)C&iC0F~6JS)3>jGG1uL5 zW>9qD?i$tK$Fpt_UB1t#gSos)g*i2o_RF=}N9e{CvWnBKsiDr+Z&Gb`J@*Jx3Yr3q zKk?(8?v=eBzC)vm-o{?MnSW7zeSNIMCdu}NX7vPyDXlZacV}xgA;TVr^&(4D+fwBj ze#8Izs#bLE5`p?O-Bzf+hI2T<>yNS1yb@hJb9EIRVK3~ekKgnBawImk^LW+J$o95j zg6?fW;chASUmKlJ%)GTm?$6nTptAR)L>r%K+j^(Cm(QOpfBngxNpAVtbcxQYi=dy# zcqu_tG@7}3-N^ul&|@_J*o0-G`BPr1W?m&rbLO?b<4mWJUYn~loH**s9hy_NwXV0| zT>V=UE;1c=bNHDbaU?h84aO@=nc6_B#K=;nm4?jYtE^R2yxbk$qW+}T#4ldQ3{S?y z#;(nykDL>Cd~&gc=It6gU)Zo;+GV1-UL*hEfZ0L$dse=qYa0wZ(zVztm2>4p*}|wC zYxzr-9o#zJD`uwL!wbq+-Nrmmn;8Ge;-DZ@?5-pb7sfDt|6I_6r{fgJVcECDzQo2y z-$7a@O!VCN6p1<_6MfzdvU$~#%nb3HR#)ysyqk`dOc(j1xQMULzczbzHq9$T!3yFC z+^3@dq+O0hN6?cOnP;k@ejt{XHf}p#&~~s&jUe&1e>U7|LA(9mG?xP5cGuMGj3lE! zJsXj{@jK}Me!NtK#H)jbU4yS-+6VWzo-QlW%8X^%6R6I`J52lM!d_XJ3WPF!f zXI=v1O2YT?Qobj>rv~-2LD40ha9_161+BJ1s!9W-xlr8+H`R*6udtwv7u9RPotRdC z3=WbcT{t+C^x=?0Itho5BrvDY0K&C~pJDi{;S?N@jdpNwYy^h%MgZ|G7>K0_WHM=@ zlk)FmWsf*C15HXZUBl12c6_~07Ba%mSjNU$v-squvxp4?jUr6`RP4!rV9{!7pUcZ7pPu~ z0*>Y`#Q^r-=)pjv6h-)xqnl2yb_0^WN4|b1@;yH^7T{*kUq2AJM_nAgD=crbKYiG} zE2BsRLVP#w{e0q~@?IfGvsVCK%(54Q%!j;trNsVr!~WrNhRS*sV8g_&;W6~>hv6`5 z4C((b!wwnrDS)IkHF_Z;yHB$%5d?yNua4a>Lnyva3Y2TTDeepBq5WgwTmmSUN??N? zG;@H2%&3$h>D`1#%>O1FgT(u#ejF#tv;;VV`UQY1{7r6F*sd#T*Cp_`GEP9{{nD^& yxF3V!tpYC20YTtWDy&_ML?aNyTL=X2-&_`u(SQW(@)*D%g`w~P8K#taSn(f=V8G=7 delta 3129 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 uLOc@!Q5u9maPAv+-^?JLAu-^IrM(^1Kp_y-Jpb Date: Fri, 18 Jul 2025 13:05:06 +0800 Subject: [PATCH 210/749] 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 211/749] 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 212/749] 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 213/749] 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 214/749] 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 215/749] 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 216/749] 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 217/749] 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 218/749] 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 219/749] 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 220/749] 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 221/749] 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 222/749] 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 223/749] 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 224/749] 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 225/749] 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 226/749] 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 227/749] 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 228/749] 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 229/749] 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 230/749] 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 231/749] 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 232/749] 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 233/749] 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 234/749] 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 235/749] 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 236/749] 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 237/749] 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 238/749] 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 239/749] 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 240/749] 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 241/749] 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 242/749] 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 243/749] 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 244/749] 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 245/749] 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 246/749] 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 247/749] 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 248/749] 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 249/749] 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 250/749] 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 251/749] 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 252/749] 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 253/749] 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 254/749] 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 255/749] 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 256/749] 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 257/749] 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 258/749] 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 259/749] 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 260/749] 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 261/749] modify code --- ...71\345\217\267\345\210\206\346\262\273.pptx" | Bin 0 -> 52612 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "ppt/\347\256\227\346\263\225\350\256\262\350\247\243175\343\200\220\346\214\272\351\232\276\343\200\221\345\210\206\345\235\227\344\270\223\351\242\2304-\346\240\271\345\217\267\345\210\206\346\262\273.pptx" diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243175\343\200\220\346\214\272\351\232\276\343\200\221\345\210\206\345\235\227\344\270\223\351\242\2304-\346\240\271\345\217\267\345\210\206\346\262\273.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243175\343\200\220\346\214\272\351\232\276\343\200\221\345\210\206\345\235\227\344\270\223\351\242\2304-\346\240\271\345\217\267\345\210\206\346\262\273.pptx" new file mode 100644 index 0000000000000000000000000000000000000000..ef506834435332aac705106e78fc455beffe719a GIT binary patch literal 52612 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 Apa1{> literal 0 HcmV?d00001 From 994f427912bf2e0a95b798639b68f09ba786e26b Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Tue, 12 Aug 2025 17:24:55 +0800 Subject: [PATCH 262/749] 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 263/749] 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 264/749] 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 265/749] 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 266/749] 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 267/749] 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 268/749] 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 269/749] 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 270/749] 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 271/749] 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 272/749] 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 273/749] 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 274/749] 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 275/749] 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 276/749] 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 277/749] 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 278/749] 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 279/749] 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 280/749] 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 281/749] 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 282/749] 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 283/749] 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 284/749] 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 285/749] 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 286/749] 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 287/749] 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 288/749] 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 289/749] 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 290/749] 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 291/749] 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 292/749] 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 293/749] 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 294/749] 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 295/749] 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 296/749] 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 297/749] 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 298/749] 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 299/749] 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 300/749] 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 301/749] 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 302/749] 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 303/749] 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 304/749] 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 305/749] 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 306/749] 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 307/749] 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 308/749] 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 309/749] 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 310/749] 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 311/749] 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 312/749] 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 313/749] 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 314/749] 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 315/749] 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 316/749] 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 317/749] 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 318/749] 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 319/749] 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 320/749] 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 321/749] 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 322/749] 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 323/749] 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 324/749] 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 325/749] 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 326/749] 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 327/749] 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 328/749] 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 329/749] 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 330/749] 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 331/749] 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 332/749] 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 333/749] 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 334/749] 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 335/749] 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 336/749] 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 337/749] 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 338/749] 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 339/749] 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 340/749] 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 341/749] 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 342/749] 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 343/749] 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 344/749] 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 345/749] 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 346/749] 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 347/749] 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 348/749] 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 349/749] 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 350/749] 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 351/749] 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 352/749] 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 353/749] 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 354/749] 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 355/749] 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 356/749] 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 357/749] 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 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 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 358/749] 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 359/749] 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 360/749] 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 361/749] 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 362/749] 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 363/749] 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 364/749] 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 365/749] 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 366/749] 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 367/749] 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 368/749] 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 369/749] 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 370/749] 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 371/749] 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 372/749] 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 373/749] 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 374/749] 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 375/749] 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 376/749] 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 377/749] 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 378/749] 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 379/749] 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 380/749] 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 381/749] 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 382/749] 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 383/749] 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 384/749] 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 385/749] 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 386/749] 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 387/749] 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 388/749] 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 389/749] 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 390/749] 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 391/749] 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 392/749] 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 393/749] 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 394/749] 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 395/749] 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 396/749] 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 397/749] 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 398/749] 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 399/749] 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 400/749] 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 401/749] 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 402/749] 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 403/749] 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 404/749] 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 405/749] 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 406/749] 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 407/749] 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 408/749] 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 409/749] 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 410/749] 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 411/749] 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 412/749] 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 413/749] 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 414/749] 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 415/749] 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 416/749] 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 417/749] 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 418/749] 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 419/749] 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 420/749] 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 421/749] 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 422/749] 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 423/749] 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 424/749] 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 425/749] 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 426/749] 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 427/749] 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 428/749] 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 429/749] 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 430/749] 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 431/749] 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 432/749] 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 433/749] 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 434/749] 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 435/749] 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 436/749] 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 437/749] 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 438/749] 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 439/749] 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 440/749] 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 441/749] 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 442/749] 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 443/749] 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 444/749] 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 445/749] 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 446/749] 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 447/749] 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 448/749] 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 449/749] 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 450/749] 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 451/749] 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 452/749] 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 453/749] 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 454/749] 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 455/749] 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 456/749] 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 457/749] 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 458/749] 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 459/749] 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 460/749] 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 461/749] 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 462/749] 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 463/749] 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 464/749] 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 465/749] 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 466/749] 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 467/749] 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 468/749] 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 469/749] 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 470/749] 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 471/749] 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 472/749] 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 473/749] 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 474/749] 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 475/749] 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 476/749] 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 477/749] 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 478/749] 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 479/749] 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 480/749] 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 481/749] 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 482/749] 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 483/749] 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 484/749] 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 485/749] 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 486/749] 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 487/749] 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 488/749] 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 489/749] 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 490/749] 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 491/749] 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 492/749] 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 493/749] 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 zf1JrcDh#0{A=tIb_rb9B$+a_pzimIFiIJlJvVag&8!VSI^bJdFx^Hc0-cZl#V4_NJ zDQ(v-&o-oj5v0*rrVDaLkH?=jw2NW5r3@$7@?Q#0*XuhGHYL^FrPc1>UL(ZQVX=y#D%FU1Zs zz8-osDiUqly`spgh|A(HwaktQc>o>wSRc4oA9$w@w#0#5b-M7LYnJN5w^~r)2x8lK z_kBpc-pZ7giS`5Ptyye_b;xEC{i8*IN1frm%;yKgL>LSY)iJ`eqvxc z2X9^QuRIhc)#c)%)B^c*Loh#LrK=Hm;b10lXp%(0+H2R|cuB?8Vuv<=L~PRK`@gid z|8o*a_urZG|5M|D{zy@o%jPZ=bCSz;Di!!vHcI zm#~#(RM@=GYI#IKW>BY+}$7P==+A$jcRkhoA zMjqEG%2*R*vJTuR(3gXm%}j4_6Mxc%&rvafuF-CCCjBz!sq8Dyo0HtX$VHW@j!}E_ zY>bi5&`L!c6T1)Af>$M^$&$E|BiR}DrAzhz#W53bA+kd_2pz*+w+dE?%S$I)mW!qz zem|NPA4gO;EDTcJ*FnUyn?p*uzT487#-mG11-w5@c1i?692~txT*7~lDBhxL;=Q3| z=`vcVroojysaZ^*16Z=HFfHwiP9sjDBM97che|nL^l&2s9u4C`{BU0~)MujurlJ8? zLP%GllKBEk6SyR@x>D!NyU-iDRJz6N)C)AKFUCU!khvD_z+O6lh~5otRen@yhWqR+ zwGFfmXr$hokqU9Wf|wn(zJ7=($ejE)D@A&6rXMKALUpyh{d01>z1cVUrHr|!;;N<6 z^@>)V6%C^=t9&JWR(eV_16@w?a$ z>STl3We0pQJ7CCr6Q!0$`v?Z!k5m<)wW$>a5=bQh>Oy2SDpS4f3}?L=PwwB6PnS-d5sCf*^`H`cuz5sPA1NVM*1n2`RcroV`l)RQT^vT&U-J>nESwdw+x{F&d z$=tYvlf~b(On@=yn*$6`A44B%g<0@}9CqF+xRqZuslAS#jgG8ZK$r2#xC6}4Ng*9S z&?^%kf?SM2u6iTQhCVjZA>}nN@aOZtxUTMwd44aGODWSu_mECMrPCIg;3G52K894W zn|SBu)2B|t-vfW9_q8(jhu^dtHs^;m+wLdK@WVtH(8ELkxU=Gr4%?&uOd6()Vt99r z9wQ_rvlkJFqPJW%S8-Wkcm8ZA=^vkPG;ScvT%|H>d6KSI1hLJEtg1m^5o=rL)quZQFKM+O}=G(zb2ewkvI`(l-A58f&_H^*23h z&DB45=fw3nv19Ld#}j$jRt4X18dLI8)x<`Nl89#k5s75T`kB|q$w|ffh`SpZqAu_d zN~xBb1jBRcSU7#WBX}pjay3*YEAT2K%)q_x;v>pP#E4!@&QeT6wZ3$#9#q6Po#eff zd9eOipXGD~QtZe~$)x1OT7g-ZA=}GZ81}v6&3An^n)0w8I0)El6p0okF6 zFUwn`E}AZhuVD)NOD&X!RLQ+bK}?C*R_Ezm z4+Zux75}Hg&91ts?VuUs;9JZF?Qf~In7~by^%W<`l8N}LZBm7`{E52)?`<5g@D3S| zs^sdHu$UKB=?lZ@l?!Q*>IPPQbDzEgi{~Cd;;uVaAuOkhJSD-u1CqGYPM{Nt!Q|y_ zOEc9~ik{Ei8r`kDC3E$vWe*HAccH5yPBD1beO_cTQA)-*V?WR$Ipns9tBRRVNVO4u zJ|rVV=FdR9Dd%aQ1zB5u5=HXlH_wDSm31DIc&89$&UlBo1Axk9j#!UIJyHZ$i&j1o zh?1WTSGTO{suhi>Zi8Z~uu)>p{tAxjFWhCzSdKODRo3Y@=(U)82MvhA>_lLb$l-)L z=9bR6eC?(5%LjG`^81(rCTY4Y>#+lT_v_g<1H`5c(fI@(Mu&=eKjB^fY|cTbq_jK^ ze%bl>jII9Mw&1(EuxO9A3k-Ob2fHkU`EY=tJ=e|a3Q$ur3XT*OT$~~4E^zZhN9Yh) zJ3DGm%$`+K)fvV6=_ax8`U5L#`n}bMK6GljLtOv$19&z2nJB8$ZM!?VpRDa^Xkv>dHv2evr?hW^GcQ1f07CAl%$9D@mUO^m%?Wj@wm1rPV%ZMIQ8UmaP=r{+Wm+e-BAj?*=$P2Gx-~%L-$I*88!1&W< zZU^e2%WTJsV;@Vkc6JTP9^k&IoQ_iVdZ>NTj_Qp3Ij}r&om36rxw%U2?0g3wXb!KS zg%V`S)#OkX{vr}tbwX3sRQIX|*~QNGXB!6itP@P2r_QzwHDeEW@B;oL`5>X@rXLom z*$+aId?J{*9IyaTCK!LPE8-n0$hwN3#AAI_GP54rHLWa*od*&GysEnW4nI3HthO|k z(xXVUl$}RL&y&m8T*sN;z6oAe)k0>-sUke+vqIzt_6=ZJEQ(@WZj_8Kme%1co&>lB z)mR_E_`87ozL>i#u@<>tz#}Y=w!_@mYsyDjPAubRe;xB1jylbnDodwEy-e5f?gyPH5Zqu>s|htrZSppeI)}29Gpy1Mard&FVX&!{>LS z8#D$>?LLLG)A!gRm2q2i?H_UF<10jveYSBV*YyLtIo`0RqQP%LaUF+oxd|7fSD_58!x?ws(zPthADGeHcM3<|N7a#0seWc_dh)O{a@|jx3n>QZhrMJfWCSd|8c|m(;|MQ zl9kO@5#wW1NAKC86cLyl69^h=~zkuk%Nc;+ut-ZAvp9Q^bcaxociwY-*>N;V-;~bpQc0CcWiO zeflQO2q~K8=y}zmpqSKV1GCgTF<8_b*Z*S3w>-!yYU8u-W!;q*+Cn_i)FwVA@=l~ORPL_R!v z>HD}cs__qiv#s++N?=Mw)lZ-uy*4y_4pet6J~MlJGyjepiUp1J2klMJ0W!+ zY-qv!Gq%5AMdj!qqR4Xb9CkY--P&sz_9nHMQ#j#`t&4*tVCgKD0%jW1kz+OUlH@;A zr3t%qUcWidv_s{Uu%bsBca9p;VTwG)|8n(wMC|^`Vv~FJFcXP>#tNRq?vE4Q5h_h5 zPS;%3TU;oOMRu;<=>q1YB?Y(dti#+tM#&R5OHq!#b9rYLiSXBfNYdw-F{54$rEBA7 z`qZD+>-?`bkN>N+c;}~J8^W*6WALje`yV%tKkdb5Dvp1(xc<1s!?haV+p^6-pNf`d zd7~SA2ZW?Hl%^Uj(U;=kH2sTPRHdukMhJOfLbb{;Y^WbTETw?r z$UZ&q@-jLAc!SpZ;%;5}nUTFDGaLZ_Jfon*QD&OHslm{HId@j7PdhgP4<^Yt+(Gc6 zhlqj;J+ep@jz;b$>(aK8ob8x$*adKW6)}AU0ZdsV@lun?+)|BMKh+HIU18k7XA*F_ z(GP*4YhEUQh5QPN^%#m@^mm&8{jT$gJ1}X5Bg|xVg{$3grztDG4cBhET0CMjp0?kX z1Xz`D#0dbBm4v*5a~3Xx>3QSt<9}gxvfw{9YNv-B`PB^Kty?*owSWXcd_Z=c7aMLO zi9Ep<2uX+Kn8AF6dqptQ0Pt|mmz#&T7Ad?P$T5uR23u3@55m2HCSBKYo!2kN^vW2 zr-98BHsdu8H``^mHm~qK27`e5ak|_mX^984@?pYsus@um3#^>KLYF;EOq-TchPVB- z-{doYa1!@_{SW-VT2lvp*=7X#@*6n+P)M-0aWr!HJEHay0=nf@qFJdqaWwIFz~>HjK9Eov+NLpN4((l#tKIx5QT5^b&<*fCv&rukuy2Q`hNlxOt zY_wT1KFoq_&KTFc^kXThN3DfmKH8g7Az6yKZFCad;-t%e4wT|adua#+d=f>;ScMuF z`DhX0)PflGhQIOR^*%tr2sAw?Hi!8KJxOOiETNXXMNH>iBI9q*`0~}N8R*plG-q!M zpU}alA-qLDOFp&hdp;^k9_$d33lPIQ`SCJ~3xG^A=Rg#YL@c!)`n6mm6*av2M7Z+u zGs(`rsIvRGYsfpjrY_u|tflLeq4?!BLL6yh{?q2bJ~A;bn`D$s$-+ry8*{@*B+4nM zCN`}t^SPk5m?qK<7ef{m>88e5NmUJPM{Touy0x%o*t+-M57k}-f+%(vAL65iI-~p0 z606p9v$W(N*HXyq4p0jfiaylVyP|T{R!DtYT`h>TVt}O9z#8zMI=gW@53xG}brKtL zp-GgygNc4?CM>!}KXj>8{00HTK~R9g89?{G5xDo``w40r2>c9$3B^KSH{6X06)b{D z)mKz3boI|QK#jO5YWodf;?%wsb)_7loZxg207bU)jZ>e=GoZfphDtwP)$rtG+VB9o(W{3 z#a~AWN>kz;C*VfTVOjSZ`2@1~_*SvSM=Ku^ zE;=wZw*}h3!LYGSvLv)&smXw9s~c46}eRnch_cWw1LH0qEH|mK@;N~NfgdQ zV;WjFFPorTFh``*EqH=68k$bBfx-y`cWXa_4g>phSN1BsnU$Qe$_zg)f>!GFet?M# zwvKKmJ?MGq;AUaM)8lRp)1J&AO&(}Q6DuwVT{0C{JqbJ~C1goWhJ9XGEfxV{Mc*I@ zO zJAo^)oIW6Qlo(B}PzC%t(%2?p-mnzILjZjE)mc!)`=VtZCsEk#$Ha*O__@OAZp5dO zybV*%j5V|=&$3A3GO8ueIpf=)b0eyo#nuvO3gk{5H%$s1&=XOXa<3QRaabXxzGaL& z5spwe-KYUu@-$xqe4BV;9Xt>*Z4se2k}_$Tk69>fucGHs&0jCD1gG z9~IcslX?g1?lW8YS!nb42{*hO{yqe}-HL?D!WzEKy^H6Ml^r)wU2Y{v7vs;L>Z*^$ zNh0vj`%!T$kWNOV`Hj=CO+!o?Hc7m-bB|dKrW*X4&1^8!xDHsi&yS@w(YGfd4nv}6 zPaj>@6r>C+^SpRo^1u}vtF-kFDPH;4vB8=t)y773rr(!xZYvns78asc`Hka~w_G@f zoL$g77~IeeUJ08Xa9J9eHS?5@58jUcZ*N!xnL*E4nb4$Cu*Nkb!Z`nDTlEHj|3P2ZazkU zw-SKJAt{&`J(IqLtAf55DvdGiRb@wnAPyM$STmyAxE9-XGS0cqsF9WY@RS`NeS) zBSKjtC=tfEfloB$M6iP|(ZGOFFa~QseM;M zW%x=c{%X>EJV1nhdGaP_o=FuX;3sE!w5tjtrK-4`T#50I<_ESo*zK~_dlXk!H-p6A z;q4@)Q%ur_3PYtb5_MIjz$k2B0hRY9i$b!ln)w|0sbjeiXw@W2&(z`jVP$QQnf?fL zIj3Z|R;MH?YfR$xv__Iu{)AMm`MByD_s3gTo{ujlK@{#aAFIn{yXGUX**KBWOj1q1 z^Zy`4`hAfiNv-GpMv7GWB1Nt|dkYzVks__8*OG@=X1_?09uHrn$WH0AyuXnm*+$^^ zzetf8NrW`^!0cb7$mWBPpIH2VkRmPEcL_yfzDSYR8c|ZQgd=~DA~mA0@cy#)2Psl8 z3hxh6qy;;J=wClgpMH@dsZN0Rj+hwYu8RI3McQ`%L5lQGO=qz3m6$#(s%fRuecPPm zC!O!!gLx_qUa^~eq0}btxp6$YPxL>+UA}#h$SqTIvFQ3O!4E@&%I>jd=g9ewGj1B3nTDQ3xuNHhq7LXxyh{2K_}N6@7XUKUc(M1 zRh<3FkJ)DwSeHgx!k3RgSx+|~m*hT!`y*>FW&UxoOSekGcsM?|xH<#F8<6?0Bk&Oy zgran9(OA95Jodoxj#KWARU6^O7h)1P6W0&Y8W(bdEKh&z*M3yar8q;Se+V2Q zwK3oYj0Zk17MyhqR$8AY(IjOb*z2Yd$ZedIn85&FyGjGYp(}!7PdD#QoPX-1G@;D? zJW1gOkMaozD?q3WD7-DdPRCS7#XqWBctPswAa8e9eBnMp4uzd72^qkQ%ccd!*Bb4+ ztpM2FkK-$oGe2$#!!WuZuB2o1)!ZMb!2#9i=sYm6EMZr*0s+HOrC-ZHbI1(wwLWN&v1#$vW-pOWKF z9yNAy!V`Al|E0;0nHSNreT;55FJ{!BDI_VU#{lESY;aeeB2?A_L(Z?8d(lL4jeU+n z@k5|b$12|!o3s>R*j!BE6uZC-{G!Y1hItAK@8B6?((Sex6671;`9iPz)ugkDvlic8 z^~$tHd-`O*m7JGTjcddE>90iv>i90-(dVF08NJ!nCz|EUULse|>Q;|OG${sDI`(cl zaru-$4JiY9*AFibhwcrwh+IMszo`1VPS4OpJ9Z^swspQv6(4$L%So;#PE zZ;~#@mbg&h#QxWE8bDKUapS^nQifXV>6hO2yldK)QoSbTUH}*PU)MBrKp=S=z1?if5J?JM67%k?zu<*70GGy@ znC7<@De#*EQ(^<9a#Dd5gFV;M&NFZu5}6M*0}jP-51R2hWcO789rpZ9a%xF@tvvc) zT*9k$i5*nC{^WnXtNLSDA;0o(Y)-s?-k1NO9QdD%PwyWu0SR5c|DDJAWqkZeOL5_5 ztuQR(V+!;?|IXvwq;tAWCA}Gfi>$|@PzU5M*R-iPygIY~$;gyfg3C6VKyAmw6PHmN z+n*BGO^31&QXetz*6_^OLN}f;os*h;Ld;xepq8b&%)ob+QgF^5*i`N7SU&8tY>oB> z;ZzupV0kamwPWDkJUB^8sAVvf!Xn!^;ZzWI0HKqs-_Vrv{FkA2R}d9C%9kv$VEubp z`g8lEwqgARCF;6V0B@tldRI;IkuA2JYelQ6;Lqd+5FBlyd-v1FG8y#EK^0!DJPkv! zXtEYd)>HF!x`5LaODFl=4i$UeF(@WcSExD~L5*hK&{6*(aQ*DU?RN9uoe_$JX22mG_1{{yk0V?)^woEDzz)9I#=RLv@tkS2JQ{8+5p^)*gIi~ zWyUuACRJBLYzkfhhn++|l2`H_h0c=4GP=m@k|`Z@-iE_=W!4IdjK2+nu6E7>vkKMB zq4?J!!3LqZ>M2uvg^xJ`d=nutpFGLDDyUG@5z{r4V}-0>AoMT1&|GxwHMLYQoJF|+ zHljgDlvU=n8q*yrbkJow=9l|*;et~pBNuD@<{cV5l8=^pUp7Gl4oltNN?E7^{HoI6 z7`1`6Wp0!b{u0fhR4>FV4jU9dcJ&jxK-7y|=)nR6*l2>z*T|jpUIP+V1?K(WP7~ab z(UNy%a^cvS-cFX{BPV;?fj&>2d_GsUSEfdUSEKqjFlCYf>24CdH&}kEXw72jH<;=w z91(t&YKA6f!4|Bu8SGq~KU@D=C=#jv|*kV(x4OPr}GndXCd1 z3n7@ZUWG=T4Ls@t32B9)3*{v65_lD17JKCsnnb{)k>`Fwa569o6lUqKgTU)`*sT5L zC_vVO4tSi2f2CZh7z&q)kb>%pT412veumuFI|MZ?6AWe*q_)NvFrE{Mhn!c#N&7TU z_Vm_y-aCal{QBdA<}mPgz}MZO0ExJTjs%s3`IBL0LY{U(e zR76Tj@D`fXOB8VrfB6mIN;*K%xyyNlVh~+@v)BS%KxiluY#|-v8+PE`30SLWp+?ob z?LAk}K}N}Is2aUBe#`GWKpYE6wF;~P5kQkB^oS|cb$tXpnR)n^WOFy>s)y`FxeL&9 zhUoL^X^e8d8ECjgLXDpsoT6{70P-lJ1)f)?w#%57A6%YZpVN)!kOf8ZG>qnB2l}N% z;iVG^K*mY8=6-Pa`G+8K3gk$I_5(wBf~U)dq9STbOms_*mg~Mf^P=VG!zgu}ZB0=0 zYrjN%rR^0$ewvQR-1>}6(X|kM43@+R^h$<|)HHLx9gxz~IF%YLMb_GJ_=A-8@6$NFFyT9r!~+QC)(}(c=f)F{un1kUo@yFBp6Kd z{r!2x1*#gmyW;b_=+hx;_`cy{hmQU8qq#G_@zVc&qi~4v_A&0N@bkTVr{AN0Ni+fU z(r20^_8Jz)g_)f;{;aq2JX zJ1nj94v0Aij57#1kt}@c`-pf&h9SiLmghZN>sXgjvvib(Da3S~ZthHPc0Y+^Y;X}v zO3}?B=KH!c%N;2taW z&M<5r#{Ol7_CM2>|5OtC|5jV#9OJIvzqCaT{oiZLpB96@ERPN1m*qK9sd&hRt&H2a z-=KkE$Q2Qj4z+bHQ#Y$`|LVzfnmSvOR#JeN;=>_aG}}@W!&4K7mZ1oM?{qh8Honhy z&oI`vHvt6~QNxz7!EUx@I2>l!OtChfZ891WR2Ath)l_oPLWgq|tA$l!C=*ZPW|6@d zJ#iDZJ9Dz5mST;lTgyz{a^TCzz-bCENv&WvVNd#Z)kR9D@*%4LBab`P=n>$Pgpv0q zK!?NLU(4K`+powrcs0p0Glv6<)C3y>dbhRhw8S!-kS=0XwCV<%JvxlOHPi4H9U5kDT^1qz0+QWY$_492 zFYN=eS|klG1A&ofU7m+~Mp%BFeHV+8_bo7s-%QcZ!K+W)INw(t5_WCrf+^d|{m8g8 zQgTufmIGg&J4))jv6u`XQ|$NBFLs7=-!_4(K>nB^(d#+yTo=V=USN4CDdIYG6itG} zknrns(}4m@b%a47IAf_mcjZ--iVTMu$p?$3(O&{t!)XGpt29eIPU3hNp>)OTGsGD2 z9MZ(3JL88kQ~1dVBTTcZt-(YX9c786`=hfeZaj#RB*L+3qROLkroB!Hc0snx==^L1 z?~w1OV!j{vbc~}#kOKj-Or+h{SxCTkXVume)`4+>Ads3}_u1dhQ-)*ECTiIg*-cYCR-Mh5R4F)f=+=nusqYH&rcN+x@*c(`-oX%)t8o1Zm?pf+nEmF#a9}# zFOlMxdEhcESxip3)`TMd9c89R4-M~yA$f}r4+gtNbHtopu$QzGd0iv*ta2nNZ!Luy z-;=LcAaPlkaDc7mjl+1X1dx;J@Ku3nAKOTs3%RM4g<(F=53YQBY@e*}o4x)elNF-J z(#p!tv<9A$Nw~#U`(j5e!8=d=8;V-$h%q{)!HOdZBI0Wt14;}7<_}^&ARy%~Vr7yz zGjdFL`Vv`mNEm|zTcZG5qcs9zVG(r`!o6i2XEBBH?|MI1z-v^@$nT6z#H8jWrO+53 zc=3!=*75HJlJ4*~J-|gAEP6HEH#OfDb-345v#&2c*?NL@ZqC}8>%c>p7JbZhymzdq zSQlBTdPY4Q8=n~!z3m`A9Bv~XH}-~J@*l2`J{py5&MRDYIl!OFZ-J0jXqr7Iy1f|r zet9^;$XaA)JXTjcL!x%9l;bD-IO=eKq~^0l0cPpIY<{OC?>MFWh+7)}eZN@)~M09yI=NlOMu6@OKV|3c~ym*(h5!(deot-|wWN{r+gs_jJL0 zJJ#@7>e~$R_`+CR8@2;Y@bp;f^U%r5u4&jaj`@HhlpK1>E7)4~^KpgFKe%_64Fhqu zHQ9O>PVe;;8!46C?JILVd3IeEKTDe#22l$HpxP?j(Y=!zdHEou*RM2ZlXMRM&bN3Nz4g+vL#k@{$1G4 ztdEX!)Qi>IhNZDw%PHa;5Nb2I2~Rz4%0RBE=px`wvj#VH^9<-Xg&YzGY%8kZBKXh5NQqSEwuxok~|B=67&oiHKaB3_)3?JqCR)U|HSkRcYx0w1~?v^m{QbdFP3HkQeQMTiq+YjHam zO^l~9ZYQ4)-JirJ`%3iTrX9~J@E#=r87wD%Nw=pUPes5y76uXqTw*yh;w-|?H+Dv( zAxk8*q08Mh#Oal4ckf}aBp_qymm<{_kevus`olnmhY=AAOEO#GTmE>M-6Thnnq)gP zH5#um%LznNEz~VmVbG$TJ-iT3mxO|yzgpaos{5!EmsJf*D6xM7VNNQAA9ncOpyTit zXJ;ByI0IF^ulS=3hgl2JY|L)=a09+CoVO|h z&hSL@XQjG`GTcB7UIhtgq^rQ2#;tyWB4Z<9?J}yRNMi+n9sSgYFbShMl9`{Zg=FJw zDUDO(>`yK8a5*r2(c+2no)(%5B7;~#jay!;Emd@v(3Hn|?$U*>Z zi3KGP$_m!Ff7!PzQf!Td47l(2#2{&paey}KC+Y+uMZkw3n;^eos3QgKwsZyA{hFOm^DW1k=OyEm6k@b zv`bS){v`_fs2~Fg7e`_^+8d^gIt7tYDX)!Y!Xq9HGVp{q4CasNWM2PR5EFlvNXR2dT7U|8<;5Dl{M2W#=A0QU=~^j4M5rA>}td>;G~LPHYP9<3X! zD=E5vRGbk~?)_#mDU8DrD?}=#Bv15B_^rzD4ePkpK3f(22h_;#kP!ahg<3tvA#fEs zatbzr2kZQ9*t~U5+ zl?xC)*0oNzvy1T_YfCB~IkvJaUAHPWEQ_QVr@Yp*ABRgS7^hB{eC9M&jVv^!fp4ws zUovgB**UwMlKei(+zy7Nvrxqa77_-^?F)-<5554CM+Mlz)BFCuf3|og{JA(c^um;b zil=s4J+EH%`O~5CJbYTCdBx=2oWHI$_wKXe?Am0eQ%;3UX$CBjnyY>#l5b@ z>s}>g+BdPCFZ9D7l-P3hD7dCHQ;?{C>g$nH7}4)@pt#cSP~Sv%X3(uob`sPJ`iWZR z1n2GOn6;9qQgNI{*tS}eCkV)>lgO6FXlF(R>}m82Oh)3)y=i~_V!9o%#zLi^EaYm^JE z+&J)mCRemrHV)b|phOGz2y1o3zV?;2E*=JcS}tUFL~M$Fs6?;u7~kA1_TzqNXm@6| zJnF7*T|rmR7JHjj$-F|czFnFuSKT}qIL8B!nrN>sFJBcWW1c!_j7O_Ko_<(*y}l@T zLves7Hj@|wxf#6kU{MJ2Of0?^63=XJ`5aeMV_i)^)-VV89DLEnKn5Rflb5~W=jhl= z+lndHoxh&rfVP8gKlpy}&QazopSPMdy0~~uY*)RcRi(fja+>l6U-SMI{Sa87b5tz5 z6Ki@OT*Zz8A#OeYi-?25qkaBo5&!S&qyH@87ygA}^_?aEy@d;v0-sss&4wL zh_C)t#A_2=huxG3|0?1Py8k8O9TsWKKa!zVX;TcVL8Lu4r~TPR;{~brKZnFN#&YQ zT%}xX_#M$UZ@Aya`-o^M;mCl<$81e`Ugvq=L;SOdQ zU#x>xUHj5-%i4I)Rh{M5F6Wckp0Y|Y(*k*ittoDvqt+w#uE&?BP&qXL5Pnu6C2@I6 zRzZCJorQ)H!}$4R!FMhC6QSwcJ@vkrS#U#S!d~Li3^Q|xG?u3fJO`2HGKlXHMv7X8 zQl=+r9F-1)If6;Y0R2Lysffs9nbnsjU1_5s9kvn&w{~f4;R;%6( zW^KB@7$(k~@%ug&2vCPy#8{ZC`64K8TFmniE0g7Q<-Pr&Of?Y}!LbUWQ?|k6#{t`L zr%oF2O9PyFPOl7g7CAm5e}`pmR2=RqA!p2GWlqXruC1$PYb#pN0}x5IuJ ze(@r7(zEW%H1(PC$6J8Yf0@Slx1jZRGhHBxNDsuzco!#6XIc@CAMscbN_)WOc)<>8 z!|$!OAcnfbFk64jXK0nElr2`;SvZvOG|t+?PYWI%i#s6!&D`?#U(T2@FgE0G+e7kE_w-{tk9imo*Bc z6qi7CjqiKc+;Qk9%F7BdNZ3gW^pc3y8%0W(TD5~1r30I!7q>kD2_2j&4w`^V#^A~> z(D$=V(Zf2AV<@?9(Kmequ*m}?_2Y#4a5%RR?|E~`AvvHz4T(pXKPLl1A%{sqj{@VG zF8MxOPJ^_L3F^8B4K$Rp?i~0ag?|WtDYkLcc=*<0%VuHxa0U&_HSTzb0G$R@2}XV% zw6W$-dkB(!|7!1bAYyg<>J!H9{>dK{JIFr>O2E&87TN$!nG~pmG?e;@q~u!r3*1|M zUQ13bkSTyD!%(0-psx|A!4>7eiC)}m4K)hXJ%7hlrGRz9IY^acabay7xJ~B%k)czn zq?;Cp;~D!n37?ci#8GArZwtEDldn`~x6T^4Y4);9p?KoDU7MOp5`l~!4QD$sYSacF zE{;b5D#V;5xR>=EdSgrM88f5rNO40PA1PPCW>fK17}X%}S$bl>fT}~!sf=4#Yg4ZX zgwQ%WS3T+5Ew@V7oKu(pB&2teC*ec6EK}#swKiSFQP0ZfQuBO5*6Kk zQ|~CyF^e^GvI1;bTYdK9*fEs+ITT_V>J2vJH)yjYcQUb6$m2JEy+oFD#%W@03rnjN z*eW#(Ol-}X&-*cKi+gLUPE`$`*^JF5mSl_5bcy#1qtm0*7X{Nd^OP5z1$hIH#jI>R z`^9}>kCzo&FupUNbEVb~^Thfx;nQn})1L@t#bRsGgubTKIt`c8Yq!D?cZtP|i8>Xb z_MPg$^#0r&8O*%md3rHc+MbGQXuN&cf~ENn@8b_ol`>adQSaKCbR%mjY2nBo&R@?2 zHd!YEXw(t8n(i4{d4=hImvka>g0d5>93{P9Ku1{d=BDec^~`mvwB)8)qJ)fG7=$^7 zIc7~ZKV?1hkc@#feBI3J{Bq_V;Jz!cWy($nvtV&CQ3&7&!z%JF%^yzrj-zQF+8W(a z$-4HH%4%gw6qCEaJ7N}2XQ6A#&tLR7y>q-@Ox4oPF~cAA$2Ea-0XHVseKi`edC_p= zo{0SW(}=Mf2*G{WSI&N5zB@j+0+wikq6kh77Zg$3P#n>U38EwnGpb;GKObqWnHG!E zo15{z0kmJU_xc9(jf{vjC#clBdGZ|}BCF3WBoK|<@ue66;W9abUC{ExLr_PvXQ3i7 zo{b#b0Cq({cRYRF2qfH|_~~ znFj^7DOIdGtTm1iewMhn2fUvEW*r|}Poe4|uA$LtEJ$LDbd0axt%Z5H#hnF>KBFz> zT%W~pzhh++Q%ElEJH7S>YiS4JKUM1Zm}z;`Toa$Ny8K{r}r=d@bFf1ounZ0so{A^ry7-KMeZ3 z$X{>G9!n-JZ{BN~#z=%NUj>%z-@7lN>_P6WXp~8i10$ye`T~6OvnQ3M0IcK- z42=7nt?FDU{s_uKUu#b{&Xr3CQ*_34{&MH+4pXd0m>xqOkIYg73ruGiO^JJjau@h9O6Sr}?Qd_7b ze(D?qYAuuR78sRkjkGliwj}hYA7w0|?D+$hs$r!EuG-+70?hbm0~CE*!76!WaaIYn z;*wXX7W=Lv;Uw>n<>8QTP0ZisyrN6WOfZ%RCDAWh7bNZClMg-{|w zF+tAi7&@eAE6gzanO!RA8Qr%609Hq#?lOstigrGjE!asjD?6f4F zV#oZuzpc>AS2%9o^F*jyG?D~4AAm4%AMq`mD%eO(?%T9rQ(?(hIDQiav*0EAbBzh? z0X&w{&x7BQzmwMd=X;QC4Kty^+FU>sfu-eth2yl(`f@jJ)k$m7N9q=+pX5h@nWV_V zNhFC#l0${A4D5831$dS6GqfMY6?x&43%@N(ZH1+Qn$Tf>NsDZzA?4!g65o`BMPhwU zx)LCd7bB#`8uH*rj>M(lj2;axkNAalq@W&zUPp9%YJ6qmSt*qUgLb;z>HgQgv%vBc zdZ5nDTi7<4MS0e44Px>&exNY@z;dIS-mrdbjx+Z7<%3Kh*>|kAKKaXAvQ$dV^lJi7 zzB11gwWJYndp$SpDWy5zx%B9HQ~ol2-5r%ZTpb~kMgy+}twI`xhlxRaO*RW({W z9MrRs=U8tlH?MbXiw6wiauU2`#Xg#CZX0hA=UNEouk#+C##Z^%FB}w z=+ESEpmapY^(8|0C0d0eDT0`7fT0g(>4`STD-oX=u>e|fQU`sUL4}6CghDtBeSi%> z#d8*DkHmc&cm?mhI$YvV(RpGu=>UuFcwWk6gcQ^?eLKHD-5irY8Vhc2T36SqUzM!? zNIW{fS38JKy=>F3r=;<3Y2=tw_uA#{gw6YnAHnniSHF0oP~!HZngyT;uBNKuE53BI zc~0;-H4b=9u&~d@yHSfu2Q@pIe_uSU|EN^^JPQI?*9&{-7I<6L)`5b9xPj{do>wo2 z+}y2SeCeNhgxm}WTC~Bux|rT)+)UMZOFxo%;oZEq;a&H1hAsHWWZg^`?&)siU>!(2 zpb7{U#5%0gOsN>2IVR)zf^x35U*|Qx2=cCH77F_~*D^XxWxtjtU%X>{v`TLFIW!H^ zfQ*A^309cB$&WZwQWXkO;Y$cwzSPp|O>?0y{=Bjb5M?*U0t*b|r^hCadvY=kL0p^C zp0eU;pKZNcB`Swr0XR>%I7%~10CY&-FxhJ0+p(lMCBH$ z6n~GJD>edytqB*T_7zYS%j4dsUATAL(Um(9Dl010i~0Zliqbdr8K1>CNcw*nQQ9&o}dCjExbBueclaiw!@&HGie zysgQV3s$tt{(I+L&;4(m_r-COhNX7zs63%t4SjqYVqK0P`E}N91?Uw6V+7nu!SKFO zsSyL0gi`|OQ=OT$TbtpG^$?K5PGx}}9>C=mH2 z&bF=siWrwwos`D3Y1nJxiAZlk_V0Pq#pv)6K5~- zSRvp4HoN|dI&(UV?huaCB(0)AU~f^5t4kyjk28ACU8fm6Pslq};o+w8I_#%9Th96PE>ZY*GEC#9Z7ma=q`$#XjQN{mT~W zG{vStb39)FqLwaC*Tj^QKgARhCXX6V8QlEo*o>t0bAjl%0g+g2yd!7G32OJJcR&%; zRwOggvM;D~qz5RUBv))Z3+SCwf{}^&SXJ|#5nYB9qlp|b+S=NIPybz4U0vpM6fB7 zNM*2>d02&>50kLEIEm~KiIFzMUQtW@GzrYP_N&q5;?VYr%-zPI>Fdz;P=4+oh27-n zmvJcH+~PCLWdtn<-4_1QIKf(C(vNy?BhN)!4&bz^Lxw>>7n=C-f`vOGj5g&7i?TF$ z>l2Fk@YTTj5~P?IoMulI{h&H2s(`Ty>_%RgQaEX$7CAjjgxgU~y*Q_*n?^xmtXT}L zUKHBq+Mx{A${~cZB_7Ig5bks(r7CQX#va`uIyw|+ibi-)7sUtEHP!^*>tcTCOj^{C zaM}_~av&5ptZ`5Vfa&T-i98YeX?H`ifpFa_uk^+fThP+`k3GjXc(1TtzLp7`lYl+TuSG%BO!4(QU< z6G{|iJT4XLa+KypZL$+s?|_c&F^H1b{{8?r8we3#31w)^d*E0_TR_D!sOX4)>+1$X z#L==o69dOxLC^-4C__Sda%ki4CBC?VxCNghW(gSb7fXb{D3K1Snr=p?g0t%VB))MB z8|pBSl04dNni-B#bD}#$o~@wOC5TZNPBs%bvobk~;kEHicn(bPfVGCcur&JA-tY{l zm_Q28NOY&yAv-=%lt1xL7<8n8#7e2Xfv#nUpR^bZ49V*=+l}C@BN=b3eNTDnK_!?Sct<&G@CrRONa)OIoMz?ofyg)%7 zer~Uvn_6@(X`MUyY-+qxu5O+=HFx&D1bwW|_0~g%#2j&|ye#27v?aej;yhex+rK_u zJhI|k@VNDGcrS-KcSW*v2VS6OP569^3?#NyE0ZKH_4)1Ycu&6Vic&1UzkZQeoyXbz z(6$9I(0LK<`?7r<`SBjkc$e}yyPxeVV&K>Gz@)wbzb)*7n<9tTP3PU-G$1cp#j8j%wBz3~Qa=`pa5uPk33Gv*rU|KHXIgJKZUSsrd2EA6f8gAbn3x#G-s}Ds;a4HpPkJ1+vw1}lB`U4Ykv|o{`H~n`j`QPhHfLlq= z=ox02oCyOBM#kV_q~IPqe%>B`+VyHjN4yU9A75G*`+n{9BUMb0H_=c;mUmKG^^(X_ zG7j?-f#wb(dP(ay36k$Sl@H63+x2B{`Lljgk#AfSErf0CL!QpZ*fA*uSMZG zFDWyV5Gh8Bf#JAb-4HLAKqhgb}3g+Ou0g^j$)4(gKq0&s%w8;CehN~Nirb6isrxa^J57rp)*@$WnsbC%`J!O5!}r$ii2d@C}k9=NKO%Yq?OIdG?L8ATrYYd&me+ zWc=2eGFy|&kE><>S;f{d*u;xV3jR#_6cs<@x1ZVQXw9ZvbKt!V=NpuLv`c72=VImH^1}FE=q1g z@t+VcItzne7Jov#Gy-v6qyQmaOXDA(n}FE6FGIX8ma(lsh!^fs{oC1aDQ_UeOO>wg z-N5&T^_(HewU^4FneeDqUpUdQn(BH>sUm$aC&PaseZ;2vzv)#Bw^!BZFypx0RYpX0t6U zBJ%4oYW9ZL!ekAhjsm8-_r20a87=zq2Lm6p`BQs3mYTD}5VHHa)aAas^NDo~i48H+ z>A53~#;o{0u%C!VZz5ZAqRd)OMtj?<8~zMkq`+1)_Itk_{CIC=%##WpTKX+I`Y_@X z3M?MQt;i=-3ddO6x8bv@;7|PMyxn`}bciV1795L|1V*=x)?Lo}M!F{bR@U^^<5ByM z?wBs*?D+-M@FXS9sQ!HM)>Ex~O?R&32x*rzrSnPQ31$;k4DcQw9x% zPw$ZZV$!)2mrv>KmgUk?-qBI}cbG5^_9-BLm}mW=k4S7Q`qv*Np%!ZG9Xs!>q;8H( z6+I_Rs^LHF7xG@lV?_gwS(w9n3f&b1k<{vhjot^zphO5o(0^6d-veiiyf-m^c94Y($#2! zUpyWCiy10WE%F#fYXLo*)X`*=?ZhW$?w)SVPmhF(+}@3oy_Sx6?e|>iq=S)v1ouWy z*{PUNcB}hTCDk2ukvo(sf{_8bw*^}@t)k!$^>4V{QdEk^M<2?S}B4SJBnrC;1Pxc$`g%ujG$`Ea(ss4P2(CQv$6d3 z4mZWK3ee%_xqzJapZT=kSL)OKKUV5cCYVacBE9iH` z*Osq$q=jd`BnXr(CZT9iks(J<`=I8jXBMS<1`;N@<%+4OuA^k)kPWb zzLNHS*gx#gJ>2dJoZ6hC+>0aW$qG*#PK`t$QwTXsvE=iOPc-&dVSuCOP+*ImS1s`4 zeb<$f=E>s}UWf!k+SF;sLtycYpPK?L;&@5V6QM zha_7e17nNb=xN@Bwp`DI)6f0mwv`X5UlZ$Y_IKbt$-NPAbB@g8%z0+o9l{tBa;)9I zVvK8K#7DIOV|-o2*Ja5DSQsGn?UkPkV~i(oxuLxGF`hZGcecjvBhE#@S4SX&bWYF4 z##V4$&*F@djwT8|x}20GbFkzqwHs{D39zXjD&Vr8=k#wZ=X+ZyR_B_*UYj(~ z=|`rMoUUYiq9a$M;rQ{P8|eoWjB1S=5A^W%w1JSXUOarc7ol-B*Q~Yi#-#~PVYy*ev8Mfy8KOyFD}Cv2>CKo zaVe6J3PuM)zTW*4^7ZK<#zn|iR!)(xZAQIHW>A#k9wVm8?=X4QQJL&MFk;o_Ql%RH`h|_J2+k?OL6wcf$#QRDxT&rwmExRjrNa*i*i%M~E$X0grX}Ad*5bx2 zgpX0!#?y3ts~UR{hkR$4+b9V{pK6vl1HvAM)sYPSFy4(khxQ&vo*!EQy`zHbF(tD? z&vQF1HN=JV&9mt$3Npl^FBdl#G zp#iga=pJ_y2||##2f4z31sf-^`h_mG)30>PrM3@iZc1JFh_|1|ltsq$PmQhHCWnaU z@z2t*WaZ@ zoMf|B9Dr8Fw^5nKVe9|2FVJT*FK3)M6_%_2KM`LbC!}Fi?azK56jVf20TW$?eCH>& zXMUZNi|Hq?Rn8BqEf1@`4>`7Z<0(!;<86DDPZdP=1B#E=IwwDm&JA*G+be?*&VE>q z!b)R}j**}6=vFQ7PiE11KOtYD{9)-mHI?S4b>?Sog|Tma{Nd?&8*`>PhgR(yOwoPu zQ0{L_C;PVpi`6zpZF@4d=9ee0IKU(&KyBU8V@_ zqtblTlbjE>Y6xc7B%_4s$DyeE6lupp$`Ym&t6Hy_Q(+5S5$F|wtb&oD`x#khV~_6t z>enQ9>Cd@;Hh^ekx|d(o?5WzBfUv2z*_Aq}T%onuRXo`*5*}0o($V$a5^q^>^g`-< z$~p19|1~H#>}{ALf-yoOwm%JH_>GiDxgz&@P!={cy`L4f95iC&go$zWSQ4AHi&`OA zKR7NJoMdOq8=-p5DI&R5!8#5N7P<@Ov$%){@M_4wByB`J{zr=+d9 z-4Ic`baYZL-tU&2g3OeBGA5*0(s)}w zk)pGlxBX4M^3Y_~&{Ga~YVWMgVehl3*V@m)tz%M_@c#JleqEKNLB%nPbF1mo&h%#; z_kX~pqP*B#=O}whlbiT6do8Vi(}mUDjlWO&M@(q?iJJy&j&{{;zX5@Hr3Fw#gI->N z=@{2IozV%(U_i+G&wHGq%Pg%iv`F!aLICGf(Kx**itv zM3-cyYn#uv$?1P$Uz*V5>h1+>MO*vHx3Oi=+DpFHlLoe;X(dqW_6(V~C;xYe9hA$2 z`DPq*cH&}2C2d{moi1OX2vaB2B--DfM7}pvekvR^$pt7}`GFPh7aWFLjwn zmjxsFfD=nAq5j%TptrG^1-X~-*>oOw7sGM$68&{>) zT>BNd7L&E+Kp4`Glp)Q;?w^WMV(l{*SOsa_w9p870&|Bxz$PHlg*yMR)}_(bwC-U{ z@6sA2=_)!J`p&shd27hHyFO{QpdW4T~cHd=mh0i7J9j@t44fJJK2MhZ1 z=p9-4E;`jP4~IZ$4`q4Jlvs6w>K^NnVIdvaJ#9^7<@M$74E(#&aM%_xo5|8oKZL9H zsCtywMXPtyKj043&|;?v5l&a%qxo)iP{^B(ER&VlT}eY@%T#Hk`{Au*ZF$%`vZyn! z6CIq7=b~?j&4&;cW^sqBVqrtk0?iGyU6!OsXt_Sc_XKA&t4k4c(cB3{jE;()^Kl?^HYxBm@AdT(xN!=bLq$vY z3)wE`VnwuN*)e@b`pb-(J2Y2+GBqc^FmtC+87pRpXm7{jgymC*5KPEHe0m}Ss zVRQM8Tc5qcZug&Xsoz1+Hs+d3%@hNU>b7yU4Dd(Ak$%Q9;i%;l4t^VyGA^X#*)jXb zz53@KhHN65?1Yz~p`o7KFQMjN7!Qc$=!sdRdOWDHaT;E6FGX<^zm$0ncU!BOM(a-I zLndOZPo5dvh!>W9nXheG$7)GgYc(7rj*27cVx@y6`%cESc5H$yHMZ-ERr`j?E~P2` z%ag~su!40iw)@2j++E)GhAxh*BcrADkK(6A)ayMDpL;symmNp)zxDO>o|;H=k86R; zATJp9#w5JAfE8579KSG~uRE~MC$YyfJQpGEsF&B?YuRpoAYxM*KQ9Atg7a^d`knot=qA}EaLSM zFc==SoUz2D#2s@dkSGb_I~g_p0;>~#AC(O`b#-KN^p!}U-60!MfS$g5?h0O0nB0V5Rn(%WxW2! zg3^qyHw+AS3u$*ltuSfhh|X#!wNq_pCj+*bWl=pPZk{z_$Yc`}B1PruEjhh#@ZC+k zwE^OT^BQ(0btFQi5(H7)|b5^PPK`JhsJ*v@2ut9pdR20=xK5hph`^&tNa zyY15C34^yCw?vIE{{{j}th_jLVgSwz+yP6Vk+BP2em&+pli}+>uig1g3;sb@Ju`=&`MgY zX`=DmqQMw7wR}j3vft@8{=HVb$){=}(QE1KXSPuD$avFDr5*ewvGgq4gHv?N;~bu& zrW3o~LdU0MeC`Y>eD$WzC8F-{TkL<`kbfrlF(m6_vkvZLjXg@6rTMyE;)CJ}+d7bz zjPl1uo=yyGl^5piqgEss4osL&Vk{Ez@pW^%*omgb{0Npz_4`52gR!TIY)6FJ{0SaQ zR|2{+zK$LK$HGI@I{!~1K`?vue>L&uGJv!B|Fw;Nzs7Z{l>h${<}C~7HNz_)n#yC< zV)QDNfOpeXq2~;5p2O}IV&NC^ktM1a)PJ1K^BVs+n+HxpFP+UC$;E)Px#+^#{Oi)$ zJh0a{?Qdc7$JxAE(y+yF9#&rc7;rWhxdXWv|1t5d z#wK>=>aLIN%w4XnGMK9Cm@JFuGk3y*wXM$1^A2kyzc#%5v%~#0i<6hTSTqmIU>J(E zPPcnIAHH47cJ~Z^D0+vx!{UqIyRST!h(C9BZR6w*8;f31r}s>HYQ}kx6=B=?-p za!W5qjBShg-`^KK%{zU3Q!qN-t*KruhFRx3YtbwrOPau3r%Ymi+n(j) zJk}3884tALnClCYx?k^xX6l9zFSitNIYuZqZ8kW5mqd zAy!a@etLc%ebTA^7OEEtk61KC{L(Db=5Twt?9ry^rdYT`%K=Nm;8LJr+^c8P&xi>h zpC-OnEB`4RT|vw7VQaCVG1=3aX(nh@QL7<-npJy(z~gc5CiBTYCjE@e#Jz0Ml7@%u zw|UPkW^7)_tJWsVID3C9)LtTZ)G$BUUKNuT=xgLFs2d-})Mk7-T| z*%JalCCK19tc4884h>vMJmA;sL9oOu{pPS7%gwLxxr#EfD)R1+5H{@K)Tfm6 z+`4Td>fZ+f%&MhNl`9u-ZZ;;lyMrdh481~e?qCnv7Q@{eo0xkz?Ol=>qaEQNA%js| zNfyn7>ih09(*f22(VdR(x24(irN%SG9xBd^?4u6Es7_-H@z9A91~bi<87bZzM6i_i z;FnN;iSP&`k-J6J6egKz%Cw{Tg)T##hPUpnU>HgJ?9Pw0F*!W>^q)xz-n%m81IOX> z^TvBJBUF1#%4m7qth-ajzJZ!k#!mtf-rwM66(oFZ+&V#tE`l=+D*J|kY>r_Zbh4%9 z?3#Hvq3q&%QoxHFc4OY#Mp`*?HFs6I$c?{@K$K9n2q9ws;5OnQ;Q@PyoUMqYPV5Q53+wBP zckh4~{%*wNs4oMrPcoFf+6C@C&0t?Q5XW8^P^5Y94-!#S4t}{R`0}<8)stGXTn1?m zc0sDP3RskfthHIDl7k~;y$A!xP0v}@>DL%M*duB6UGOGOUS>v*J!pMIXq1Ydf?hr# zj5EzK`~ZpTrpBwSUyBSs1(%iHEAIsHgr$FZM3|EPWdi1umtgwSvvT`>u5m%3DvNlP zXdFyzLmq4{z88$u#A@h%h_HKJ1PKfI7z@>DEg|^Do<;6YROR}k@(%apM{Go9;zC;IP1nCo^|~uWG=8BdIHYSAs8TK(s$cO@!hLJwt2i zPwFX^pC>{X_OY3IudzBgD5oYoOK&CP2CQx-EzhFFtI3y+_#9&0+jz5rH!kj_UcMJTo2*Vh}SbUC4P9TH7ZlK@8JYbSECp z(e`xZZA!Y{X^*)v!KQwhy6vY^29{YCVo}_ATwJxcCP&_?Hk{MV}4rtNSb)UR4VrJ@NsmrCMgZ#Tw&BHUasn2|59ap93c+ zM{LM&3lYgm)ZVC;kVJqw9bWL}aM4m5aL2&EX;EJa7$ta;y1uV^Q-_%{!~ljU4ym&y z{MfIBQU-TtD}=k{rqmo3-=Vy0_*X;FTd^Obvls=Mn6xC%x$$NrY)q+jD9CGF@{9`O zB+4zTW9U03tzrmn-u)Wi|8|(7kvPMPA|aDRKN7FY9^PZXP?*X?z=0+hq2jnyp#p1d ziHHISSx0;PVZPPQSx`u}r#@WrtKdPC^`3?*?w>>fn_qW{0+e*A2@!wj z;>-I*-_KZT8XIWbk`rinh}`<-k#FeiO?FR)+O<@pX^~d9ZTRTfn+{JHf&)*fe$kSa z@z#re%LO?!iTCn4N3OPkautvgOKzEwh;+MdQVw;1a!HXAg>B~VO4g0{&=BfAUNYf` z(6d`nO`idd^@|8^_S$LxLb@$}0)#Ta-Vg(34KOgsFdMI=bW8kf1SWw`62MJ}dS$C0 z2IhB8v&-q%)rRm?qxkhe15)6qJvKx`Lf}7Uj;1Qkj!rHdrjE|$7kBa1=7%q1IKqHt zW56GzlK~G<^1scEot&Vxz9DE-Ee2$G&jq$QF22j3p9P?`lanille4)C@EjStT01&G zBTykvPAdUIlW)SnQ2c2Qyt4qdPc8_*zx!1V)V`3{ewWb;G;R2+FW`~?$hqtgXj(ds zozdHY=4pR5#{tw`XmPhTe{^m0(f#7Zi!1R8Xbub`U_V4a!L5ttrjGXZKxcs5T&*0P zFK38XFULk4IW-DU?WS1?28IfZ00Tn;+!Ys$%jx)k66k|{xXg8T6=&}mlu881p$7!8 zLf{_ZK*9a)>Z?$wU9FazTSNm~At|k^SAG-sH`&$7+}@ny@)fE!(hy(J5OD95UseYI z7pFx6rVUyNZ)g_}yl61wSM>tUVg7H={Rap3Re%5MPp-hLop|GX)tnP3B4P$SUXa%$ z5V&LiB42jjZ{}r=sH?c^h2Ervg8NJ8pTtvF$*qfxoUm(V}yJ+6{*^50mi0++rCxGf=tx-&x|g9*JnZG07Xy-*T%D7e3b{yD;Y zmF&;|87>wW$##G{9a1PQ2NW`x(9080S8>-1MdOBo`%CDbV^vql;{oVJaKNQE2kJya z3MJryLIx9h8AW~-cfC+M0Vue?g#HOlze>L67Qp!x=+RIW?;QkW&Cpz#d84;~C1|PUbj{(a8DYRY`3K>l3Wst*F-1S1KC7|H`68a}{;wstD z2Kjv|AQa=Tag-GVg$yS2(rt4UcfHVCGEi`T3H{>>x=I#3&HCmE2=xMnCu;EV9)|u7 z6f&65-`l$oiw;Qk68Jpuwg7tAT=)x~C0=_qWvREfi$s zL2#*O51^pIrT(jlf|Sas4~6%))az{&WSui`sUikY(BM-4)kr}~EjNO~`&;VuRtmBp z6u8tTYgU>~49Rgjf%z;U?dP;kGMUWGz^{voT&fRl+Wev`pww@@D=$ie~O z1Rp!FUIZ^AaCLlxJZcS&AaaI4fL(&?#|g-k(cm;f7YN$r4FdH$T`$Ph0|Egi==#wB zGS4WuAeYAwv`axy2LQ-4bKr;?ZwLgKpzEJ`$mDC_v~3><+NB_fg94e!Z(BHRSFwIKZkA1_sJrvWfx%u%d*4kpzCv 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 494/749] 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 495/749] 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 496/749] 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 497/749] 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 498/749] 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 499/749] 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 500/749] 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 501/749] 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 502/749] 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 503/749] 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 504/749] 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 505/749] 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 506/749] 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 507/749] 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 508/749] 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 509/749] 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 510/749] 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 511/749] 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 512/749] 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 513/749] 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 514/749] 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 515/749] 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 516/749] 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 517/749] 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 518/749] 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 519/749] 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 520/749] 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 521/749] 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 522/749] 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 523/749] 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 524/749] 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 525/749] 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 526/749] 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 527/749] 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 528/749] 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 529/749] 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 530/749] 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 531/749] 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 532/749] 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 533/749] 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 534/749] 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 535/749] 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 536/749] 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 537/749] 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 538/749] 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 539/749] 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 540/749] 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 541/749] 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 542/749] 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 543/749] 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 544/749] 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 545/749] 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 546/749] 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 547/749] 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 548/749] 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 549/749] 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 550/749] 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 551/749] 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 552/749] 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 553/749] 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 554/749] 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 555/749] 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 556/749] 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 557/749] 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 558/749] 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 559/749] 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 560/749] 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 561/749] 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 562/749] 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 563/749] 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 564/749] 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 565/749] 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 566/749] 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 567/749] 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 568/749] 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 569/749] 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 zcmdqJWmIKLvZ#x@7w+y9?(XjHP`JB$LE*Zv!rk57-JQbST?>at@9r~h?|x^WzIU8| z%^0klnd?^sGro|FKtUQ53>63n2nuM#Kta1Q(2{-Sb0+`-1Oy9&3Z(C7V(mo#^>3fR zKuDio{Q0K>FlGtL2q*gR1e50@7LO_geQm4^vz!R<^{-(?#9kFrlYV|+4VXm;LNZTo zZRJY;(b%TUlZpsn+BY^_s5hW|!YyRcaOdTrBQW?y*GTW|tVLsz-u%-uKKzGbB75jS z463dLlX7VqpR}`oJH z)l8Vw4{j_8x}dWxE1k)xLI5y5Y=s@hs1Lt~=lDCX(yX+evyxOmuM63b_r%c!f7C$~ z0hXyKIyEa#Q`Zms-%#s2unK=t3mDNNTI;9iIKV(a$e(I4wlh+2w6k}jH?ngy`RZX-m%R3;bhK!P=e)<- znU=4z@vd&wN~VMNXb^(G15sJa zWYE}tQH+{&v_o+Ab)ngJN;*cK>{?Ij=j^1bgwl+ zGdEp<9h}2a6M_W^CwJ9OPl~X=#>Q5CJDH+IxkvacY%=~yXqe;VVQRmp!C0Wb_IlcAF$oToBN^T?^%GPtG@?t6f{ zn>(ykWJvmU=U*P};-gf}oDHlTOhDQ7t?s(3nCR^(`C^X7SpI$h=U=3mq{id|1p*4j z1NxK&70BM+ncm*f#L2|g+0fa-&i1b)I#02YUu8fV+PqX2@!%HBB+!~6UJCx%uOPY% zX|G!}VV^$iig|VH<_aJuE3TG2r72VL`u%a?==MZrGhcUG^j#|^D5Bk%d6nD6CW1ky z(y1|Jng6m%PU*$_{kS|;EghTpDAH<9e+oInb2^ zw$mv6z1=>caF~%^G-X6t2i+#vmMyl&DUIoX!9wsCe{5`!pZ+G)ljYFpFXq*UUQ(Gr z4jG#W`2_^ZxbyL;^rl`-sxXfFUlfunq;@|9c6{1O$ig8-^QnFHt3V9 z*>*egJYbPV`i-35KhEES2dWO~HK{WDy}-4#jFC4VGC|%52ta z=UjfJz?$^N;g_iUz#-EX8tPW7KlcJJ2l>BtKw>LB*tCluZ z2_H?UO5!fJ!$1stC6oYP<#^NT)vOsi;aTe$oMfS#ds3(#z}crNXIb&0Ev2d`JfuSD zxn*ibZ#-15IU4@E+}#Xqnlzk=`W)Yw_Xx{+EPdDpE8f8EWShTZz;_eXo<3X{Qb)h# z`)`!_c+`VhgCS#ZE{bGImUXC(XbBzSXn5~Pq+}@J{IAGAjwZF;Aa!9aB!f8zQ(E`T ze=qh%@HH4{mLmm@>jC10d2C>wGtMm zqC8$pZ@@%_9o-|3=gX?5 z-W>B9`*O!@$fx+wwD)!csKdx?ZK{N*S{71uuMAoS&*I0$NUKFNooB^s)q8sK)d#)J zs~JnoGB-wcIm8a#jwT5~5TTxqZF`AKGcBI*R;GC0mA-#ak1&iQt(NOEAmI`1YFLI` zk&drJf3AP^is~@`yB_u}93K#hi7-)F^i_hzSc7*Ty)JEn%X~WgR#O;69#!QcG zF9RIJ7Pq|OzT8|cv@F_>KJrQ2M##|b(!>i6#*m}CQ#j`q+}U^}haY!i8+aESYU~DK z37&I{Q6+>PTtm*s6Nf_%ZoCbh1CrzK^v0Fw~koJF&| zYs_5ZnK)Kt=d9^ke~zagn%%I#&Gd0U(Fjo^1{pewmPv(bqSNu`nLsEWP`s&=z1orC z1%o@BkI_TqnW11yokN=$E=R%GF#n1bn8Vp-r}cz3dMKm+^EFS_h>Qqeqppw(H%W7-H<^voc!B?{fwLrh zVi-supiWsJAfkV0z{%Re*hJRQ$=SrwiTZGP6^CUEXc! zD2-f6!p*&vo}5$)40xx$-<}#*U{6y;y0NqQ*qVxv(ZRf&l)bN`zIhxRn^We9oq1LR z){4Mv)T?uTv~5u0{HSq}Y!bmmwQN$?rs4S!NV-~1t*XnuE&I^iM2bL>!YMUcq^&mj z1YHd$JzMSiD#YleqeWO6%4^U~by9w-hHCCG-wiR1sL`c4WRb3?i<>&(6g+5?EvaK( zXTn44fbbhsi|w3VkPpF+cfGQa?7c*H*@$sK@ALr+a^rmby$PA6vJLS9Z4=)ZfMi&e z&#WX;Hwk2KDUo0HH?18tNXrp*g*#V$mmXLgd-!)>dR*}0kT{$NF_K@W9oR8zaS=lp zKHl%}H_Se96dnf)!bZ3!W8bgdwOk(;I#!WV%GS^M;m6wo*llz4}i3z_;F2 ze?3lRIu(}l^Zs~|Y#v)#jm=@=WV>JLbJ*GmDURtNbdEDC{#YoICeMVU_EUfT4~ zvYx=cXyoMS?eQuN{7`{h+rO%R9C(3Ucu{35c$Lh7^b(VAvF?b(5HH zg?f0o|F#c`=i|Nz5nj#ekywMugD^PxmfIWUl(=8J(!VJ_0W1gVWjB z@3=|Zx>Sbu=!8Y*fMB*S3=d)O5_MLwg|PA`JSDgJ2&4egY8QwIv1x31t46lY#Ye5c z1_&$JY}SCqAgwRGT!XW(*yILJCVlmT8}l%93&`NW&XTs_iSFFWb*Gty8?wZ>+e?Uy zU=Rcn@P6F4wjP(u5Vm8Bm(`+l+G~cV4c37O+Fd3%u1h;fHuHu!_13!xtJNl}m(@{P zjl<^*(W`^Sea*a%#YRWHzo&DeYhYK6LbxF4tr780FgvPwJt?ipZ&&MKmWnxxlxo+yHd0}kd+8V2aGC;D(sN7_3C{tM4uR_jiQtQgyC+V`vWMx2?RXWPo*kIJ6k#MBO;kigu@v`( zPbT_sAjfK$agSv$h}$t2!IAhZ4ZfC0JpRl1a2Nr(_%|ch;b2@@xptDGO+h(K5z`Rs z;hDX=v4bY*bI=~8x6!@Kxt{5B8h_iIg*hs5k+Ki>diyQ>m`WS)*u%Ex(INSAU0UcS zlt;`J{>~4R&6tcA%Cid-gdqxt@1Z>N4{#a~m%ctUmu(ZT_+9{$rK>W3A(bwI=xBJnw38)%plMKU?Pivvala3dz9y3@ylE zfPiTKJLmfMyx?D5>|f>u1B+8ufefhK*IpkmBR*kMjf>Hi^hOFx7S4VG(}#$KVWh_z zA1~lAc|sm%4DJ{`KY92my6~en=YD$U+y=510HuV3$=am#I2Sx}bn&6>XjC9va-1MF zJ^KFiL7BqT59bSd(xlRV;IN=Sk0j@_s7P}TZK_nRtK@eHp_ZQ0X?elQ)f$(PlcicK z0gg+rVtzMiv{}s=#L(6!XW8zdQ3*9;M3}GaQ-GneqiLcU=8!KQiag`T^2NpWo>TXN zh8v&dR{#5KJ(9e|czi$}KVGzudHK}BIBKkI+5 zod#grK!_y*T0{X#0Wq)vj%5T|#0E+MH8=-;g%G6keJEW({Ik}T3Jc3gAb@~`)&5Tb z#M#`$#)STl&%cghbpD89d@j|YJay|^xm^{CB+@W-3D2=5(S3BLQA|p5DCr~*f8Udp zc##g-raEh%arpO*5t(uD;D!tL*ln(x_BRhk7I9{zP2#MwFu>nZ7M!*`J?!t?&wIPw zozQWiLQhr`%_I=ywxmEQ;%cEInlSFz-GC@-VjR*63z;sjgk!eGbr|M2!iIjkxu zu_RgySzRINykG2>UZG9^#axM;lGao5%v_Pzqy|d(EmZqR{znyJ=H%YpmN3EQ@g~j|#pK9*+TE32#DloC1Jmsq{)XLk z50vlDOA)X4^bQ4y`zEier#rlqgjAJSxzTEr3${dhd`#ZeKrX1AqFRW6i5Io&G?lQv zQ)4U#?+~DF9?1n+^9glz}zDE%KTIYc}O?_ z+nxO`UZ9C*H7fdzutAsOOB1Ti6%sNoRa-LN{M^lV<-Mg0PAP>T@o?^4r?r$%HQ5DVM=G||Lbaq+@Ly98o zBRN|{OM1Te>A}X9*|7;MLR+3Zwa7JK#mR+x%tBj3J151r>OoIqw z)_6R&mR8Lo6_a`Clkk&TPbXywKEwp5?D@3YKgJWo$Z#reLJ-f+kJ_qdm$@zkHn!*T+lKa?;L( z1t(4u&?1wh^c$^NC;L;c1G4)S6 zhcG!*exZumV@VcD&6tS2lCE!UPL`HvgQ{j;3GlE7e`Hp=TwdXUlDR$>?z#M&E!FZX?F=Dv*%itjZRtXJcle|G)C&^ z=5FMzVNCJ0BocgkFb<|cXxzV_ zahh{7fky+04{|Wsa591Z{fXwpnSx>b6fEbEgKhSxk;&fU{HnSfl}$j3ncZXsC^2*5 zGix*yI0{S)lq>cd!@E+3uiH<(cWYOQ9h*yAP>1og-x@!m`B7@RQ1Mhr1J2m2kloU% z5Sn!=1pGSwF)}4kj86%Y8DI*h^mm0=@o_ zb=cgOZsgDlP;tUmMBIQQK6|i#J^+pua3_E#klA&N7A`b}r8U$esVb`Ae^}psxG3+}Zb%3ao?sxxqJ*OZ3b-0(`c=xC1hq zj0;7LxP|n5i4J{f?yToGDINe&Kt9SgNiML6coUj#$FezYUhMH5F ztC3;ETo15X^0s=iOIgF8-sLq#o;zAK9bj7k4n<6EZi%5(8@3x--pz_)mS70tg)?eJ zx}CJi#VPJ)P*RDz=|WN@MplEv;|G&z%VrWxZ_!x67&iztga+8Epp+ulvO1$$#2f+{ zH@}OOzIW37K9S4%z5Oa6rFEPG&6#A1NsAqQWyv3W%4RJVGPtOb*5rqcH0s?2GYZNr zS@rERY{bs@ga$31ka6QN>L#dC;MQ4%2Fj&yqjJ*Pm;Pk{UGrkc23@o2!Af?|l3d+P zF(*Vm_#yslBif8{*LK4*B-^5|rSLlL{DPvDJAK7Ct?9a@+8W%E=>R?GirfoO(SyRk zCn3hNQKrBfU8OT9uD-bD^%nCt#2_7t4lhO&?h}?uS%Ss3L=6DgU5*1 z0$&Dyyarj=P#Ib}rAum8Q+$)^pGO#~NftW3w{!n6 zU2mJ|R1^BTpVO9q7qfCN%hqA*XsVSg$>3XRx*uHJ^7m zWR&fysfCpj4N=JzhO1PQLXDB^-7yF%8udJLUX3-vmLX<+jJR zqw21>(R&CZ=3)ETr-+X2drc_g}C@)QTc z%dm!DG?AuG^=i6vh96?|P`dQlC-l!)Cy@47{Ev=^yHdIH*dlj2=ZoXl*A9^?%bWv%}U z68#t45t|GXC4z$jeC+j?D}u%>a+2$_{khyRergS^$lfvuETf+AVn(NI=L$O+csjK1 z)+Cz)*9D9}2j(Cj$0iJ5KtRUG|DKmje^qN-(9pHrWkd4aR7UbVN+VJHaQvm&FX^U8 zn1<=%38a-vl9M|OsQn)d6sK&O#wYVaJClTha|ymfZlDa^;${ z;Uno{L2ou#D27?8fTn24jb;FlAj-ctE#HZIy3TNS5`FDJU^PxEEpTU7F0r)-1 zBosO#%wPEqmGf9pn{vtL&_1<)RS?G9vZdBlz5_Mf5oe)kIam}3!;vhpU_F&r8Xu6+ zT3hfWS5(zFq}y<43z!_Y5p3M%^WXd}%d|mD#;l(GgY63>n6uft?wmL~_P&i-=jp`Q zDe!9ht3~(9IlKXd?HPnGxQ7 ze^gZ42M6o8PmlvDnVz&&&>JmG2V~0CE@`AsRbHqOVv#1&nvv9?5cOM_W3Y_Tjzp@} z&|Um}!EA+v-8WEWT@6p>{eg@coo+M~rH{4Zu=s6;VFBIWK zI?G$l8YagDD(-YP7v_~vepe-ibU3*oH~WO)QzdL-ST?fL$EjX-2odc%8wGLcFxem% zlb(1Nu$VEAq)cbLDc<*WVur=u^Xw-Nb=Ym{?ZkZJr zmK%c2jiIR>k(54vK#Qw}`&~EhS29ZBu&9P_L_a9#sPM!QHL>%JngG%v$+(K!sx6F* z!Ky9oP4k8B2cg(rfv#d%p?~iRxx_&*?Lq9=d`#p9U3N;u8jFBrolYKW2@zW6(>>Qp z-OpJQyE0X))wFXljIyU+X;G_eRqk_NaWV`r&Kn^F!KUI*Kw011GJ-qg;K6ifSu18- zgg>56FEJFUeXq$zWo~HuVk#9eBWs8K$V%R`Ow5Gc3AtDAAfdZ?>Q;ZJnQmWdfCbVT z^dWBYL>LSa;~E2()va%CutnL6lVBIdJzG26fPV-TY$ftu*~Oen0cncCLdJdb(Nll2 zYs2$-Y1zA5@A@->{@-Ez2Z;UyVcfIZjt}t(;|YX+4`b%Pg7Jj7Tqi}OIr-wNi=<+vNL@?C0V@@7V8#{s@p=lJQa;^I|_-ink1GdjQs!yw4GFEG$W)yPVB9u5< z!l<@lf=vD5l5#m?bP$tK{fkcTl#8SddIj>4IRDQclfjZ~D~~wEH4Ss4JlaRS-QYE5 z7Kgn_;N0w0c?F4n4472Eb_V)NiLm>ff?P6f6;47Vnhp~x8Zh60pKmY+;EAX@sWxCt$s-7EHMrg_Lt6#%T}&63R~VUCRo&P6+L_%rh8RuQi^ z=X>lG$=KzAa_x!mHvHxC#|rTk8$|mUgoWaAC;ndOK=i2uTbgP*6JW4%1~S6HtT^{F zGX_6c!Vy75Bb^A)t1t7<6XC%aYNpXlRq3$aMNuJ14lx}_Z$#G}iYWP+qTEpJ3cBfY zkB6cHJzJ^UjwGFu zCK%;=Zsad!d*a&?>)gy?JN@ckeB0}|R%TX$^cDb>V+XWWGIlCLU-vqNAW)bQy)4GZ z&w1>%ckpxQt&g=;Orrf;mMFl0ZDfbWkBg+R;S~fJ%YNj$Pg0rI#_`8Ab>j@e+xW)1 zZ#>jT0gUr8;H?}|Ap}u6Q7vMP!BxYYOmy8T5A3aDhsW}+j)n6%!};SAieCzEc$)=r zR06oacfP&c(^|5iCQf$Bq<4K5!1$~>sXqLQXs(0x(%}g5Xk>ONL-j%{zeJC_D?f1w zVcy`xZ%YBnu)hU!YSC|7=JWy}YQzjshrgS65^AtbkuG&hnE`&Iv=*T#*V~#DRM%E$ zG_{pt=qGXiLa?K%Nfys|4{@|Mk&bfgZJx$8?63s_>i|;uKK*p&k_W|wYDf>0c$=#p zLwu$n(n0yka2-;GFE-y3`eK+bnA+)ySrf3G>3fJ+v?JO9Ks4T!gQskhz2Gk97bN0P zC*n~jdQRz0K_la%yKQ3CD{-`!V^ow4n?0eS=y8$?ITX)}qr1;Z9u&mPM31rmIjCoC zCH_;S595XRMbbmR%+D9Er)zH88e2B+RFJ6+29kt69KwPr9buLweQ+kk`6ubG4~`In z63Q=VmEyi*Yn7VzHcp01#g7!j7i{F#OU^{hb^XquMxxxvCJDmCQtPG-=gZ1z#9~dM z%v!0FC({_vh27s0xPcDRG*wNr+WZ2A^*x^s{-x;s|Bl!{@bVvsSd@}t3&qd+K*wkK z|4(=8{}uWFQTYG+hUKpiyP!7axXOmQen`Wh<4h5lUu;HVM%*&uJXph8@C=Luoszzz z3Y1&m%r#ea9I`L%2n;|;q^#ICj&mmh+2VzK(829}*e}B~E6!a>P#XV!L=A_8mNG7V z%>e7G-*FrjsQ!yyue8MQiEeqULewA0RLWG)up;%Fb?tY@Z=?de6hB+3 zt6FnOi3D%4zA+hT687KJ@$H7@R-kZ-OZkQm;gcY3u(4EoyWHPs7pNp6T4Bd_8Yo+| z+k=fpl#)mUIkwaaOibMOGiws|dH-x=!DzzuRbUIuKVE@($j2F{vO(H_jc)$JrR&or+Cxv{yF zp6u}@$M;ucCM0r-c7BDl_=>;0u5*!o6)5zeBI*T#9{}?WUE7FE-*P0;X2$`xd;MHi z8MYwGN19CBmI0P!!g^~_(#6WUq7eQXuCS*q@}?s~r*BR@T_&ZbWS#khV)TQ>?p5!1 zE6FsY_EgoWE{~6N#On7q@#W_t6X_-^FNb}d8-vA%x~(a?nXN^jW+J}mO!Z0maB0)Owlio&TU`TGs?N+9p=&2(e9Ejz7e7G?A=XY*Z30<*QX z6oW6o->#;*rWi^eOz(ERkFESFNMK$0l}AWWdZ1Z}5#Z#3`jbJPlR*F8?pXb~yv%&q@t3+k+$kQauI(A+4@P9|>fP5bWqV1Fqs03>?07DwAV<=! z?O9r%xH%{T0Z`MyT{=46)`<4&GLN&2Z_&jsqgH#Jry7rB``AfbcbFjgsZh$Tjiok2 znJZvaPZAA)g3EjapIAl0q&Xe|(kk@w@plg2xDdX(=K=BmZ9w>krTz!fDu`_sH1V@5 z{_6AU?BCIf^{;5vp(<_r*+jg4hzjClPKnS$X~*T>>Ugas~%m4~Z^H zXH}WlV{Ce1kP+^=0Z>cAv(NY0?PXRG$mS1ND4*f4G<} z4y;{N`}=nj-<$5f&3P6sHrHS*h@&-nK@EVuVQ;jNVSanM6MYU{%)-d7c(0otrI@N_ zddT6EQbrZh&~SwVUWUtqW}fhJC6rG>wP0LkVsX{DcT+pp%@w%Jt|sh}!H{TQ4d^nXB{6-w*3^nasOL zDQCR^_!ZxB$Q|;gbJiNYrMG^eSh-QIW@5c}y}K7dF51$%w{7l@5J$}(m9p#VM0=XO zQJxIUNv=ffDsn|v?v6Nn-hI91t(si3yhu-%0j5!_Y4*2ge0D@ ze&t^%;g$^cqWYq^eR*AKDcOTvkU}?nv=uK>oTM$n0^=w{FDKM@EpmA|P0f0R_}^Om zA8-4Apv5o!fG-FAOaV>c|GmYt{guW4Ed~6n$N6kl5#CJ~akOeA8M|eOo;hQH*M=#! z5eP`DkR~(%?&w4Vd}aB|^=FC5o@QO@BxC7LAiYE;;mjs+;fF5yt+7O{a-HcOmtg5Z z5s@<^at{!VE)NHW^bUNQJs6x=~GG4JyTCA@>JE*gHHaQ@DvJxyN=^&Ws?kNP4?$%a%>X<5Q;cf+}nPmI0B zaq2`=^D7uEP4y5gQQ+dvFDbHDtbb z_lKs-gq0~qRW|KYI(n!Pgloi#f@1(Vja1mo5%>7sgSi?sNqS)ttY~QB<8wT~iBoy9 zXWg?{Vws1F zpBQ_UFGt?F8|0&S$Vz$YR;LUFbgTD4{a2{es-!{U`l-oO!n%ymiV2^r{I^6^?T7+O zSD^RZr5BeUXxWzmcGEFHJzHSl?x6-wBg>hk(Wtgy9Iu+*9=y;ybhT zg(2i6^2LROz=UKyIgb~=FGp56yF9JWxOwx8zC&@5ph2(fv1Oa2Oy4d1)J{MsY1mpP~2Q)khfZrI{+@skxX1w-ciYC}i*QdKm{oL1^I>boyZEdY+g*&CWYv zPI|CPCUKg(o~M)K)?hD%M6)kt_|<^-(bfe&g|}F+ghVEKPX7MZUP(qeCb3PVQ(ja* z>BrfQ{qiBLe);~t=IbA9`48l)oXZb}!_SDS;1H^(V2r#sVMtSB4M@C zyf~BLtZvo$@?>@}l*3dhui7ygbr!34$CMv=rlf_cIF=c-P8&n>(H0A}RTG5n7y79d zg7QZb9L|jBYGN9VZP9&@&%`fBs{s;~?v+zeX1YIo*$Tg3y4W0LWK+#+L#g!WUsTVk zR7SCUxO`L9StP3)Y2ie#tz=R#GIh6-DrZVo+fh`q%xi6l`$nfWn{%0#2xf91)kquK zih~E&K#Gyges{>%UuW|*r30JMAWg_9E#pm;O}q&^mQC`vrVKmBJU0xP1dO;K=Fh7l z#l4|IL2-sE`E&9lqi==3f2hGPko9b3+EO;>X|@<V?BX1{^6g z+w)HzxF6h|J_WeZ3UX^nquY+YIV)ZccDXZQ@@OVvfj{8<7TM?5oTb(6vy9mqf{?y_ z7FJ&6IwC2&do|~Bsk{@W$AUC;Hy>k=8{BASHQ@-``8XH>#mRLWic8BdrFf(XOO7x{ z){P<`8?$G*&oxhw*%_de>>c1}mD?HFJ7LESHYwCW#OLtTGw;GyY~xwCP`N>f2pNou zYN2a$rZU8EhFuqyQ4F(E3(QBn2s(wgh_=Yt>*sWPtE_LJ66eQ? zmPvIFe*tC+?MBt5{yZr9(3A9!!YPvVyag>+YZLc!#i*G2%9ihFNozb}4%e=X!SS<@ zmgZO(j*qSilBk)3pL17P)1=9KY;kl3Uqwz44yND{RVW4hC!xnEN1-RZ*>}Q%Zf}aEdf#PL*{d~&v!9g)v8W$$Ap8sZ^*LqQENuGjuEaCcZa$s zc&^9mspZbe9R=d|3iEp6ZFj%mpRzhHbr7M1AFMc1re0J0SfLJ*^91*v-wEN!>jW{Q zO^rUd(!qKb*sF~Sm4#T@9~~XHeTTbEQI_XbcR+U@8ulg5hEuiC*yk!4*VD`u0*YxT zWG+mftSBhWVl?d4Rv6oHasgJgU}oKdn!Ht`cen4JOK)ME{7(q~TjKm-ZU2G9(YJ&e z%J?J>!v95A8|PmU=l^uIL3MIJHyP(iA#<g4ph zPn{4=(aix}m&`^={F#S&pj6vp62>wF7REekU$EGi@P%|Cc2f&W+-($vitblq5xSr# zxb`1CZB3%#^cJlo&44K6Xlc^KCSv-ZN98p|8b-LVCWF~SI>ev%f^-KN$a{~7*a$IA_@qHB^$pYhC~wH@-jb*nfinT%?H1C`Z76b|e8<9kslOT! z2&=L}zS$jfwkH$Xkk9$DP1uP!&%MSV+mx+#V_TPMvQF~me-XXXL+WmgCF66P10sBY zZT&SKgL)souR9M9vL`|7CZtrmlfbZiqK(&$eL+7MxZV7lr5YzS8gH`Ro1USP85VEV z7K^(RgX6c)hWTW3>?H%404(DkN20=1-m}!OSc5X7Uf3eV1QWOUM3iSLORfi%F)<<; z8>s2~3fgWL4}q9$T9PT~hPBa|n`^~a_!v^7-@;6Qb+OEJ#Pd$-mnp{AdSRUfUX?-F ztM>=e7QLg%!V4qGR1aUww^H1I8y~W7N02#rLKGpOe7M#SfnFZ0j=Ef2lkRM_is75eLEfT`1t zh0tI1mN0VX?~0s_7L$zoB1m`IEPCuW{u3mkE2?vTm2)ZU3njt+G&;K|YbuXfc7FVM zO0o`ob!>hkWA9$!y`}n@tKdmm^LXaRwpQqaB3I+D#YV<)H~pxL+cP8i zr3SBs%$}8&9(mIY(q;F=W~2?jq`T)a}Tx1&+R}mxLJ&Amvc!i?35=$5&p+&6q>;1lezE*%$Yd&D5gs=Y>D^ zf}SYWelg0Ai@DbKixOS5Jhz|BT0a-hmNcLXhf&f6{cAln(U0}tI=ro|r}TXw|F`7( z!|MM7$;b1ScjWa+KJU+#2;zSp*ZFVm>lhjS3VrA5(vF`Ey`Lp;$_tY#iZCTnIZ;P| z=3^eV2Le!F_6W>1*5`d)zEa}cc+UZ8AR^VM(V|G^>?}?xc>Axj2LY+|Oa3!+cx+!5(@wL!wthZ-!G5NtK-^H8Lm*o<%_MTl#NOie@){c zON$jrVTtBdL3!&UOPQ#Z{+@d$imhchf<}J_eo#L#?P0_uVyGRw0b2`o_Z6sgPo7=E zf|y-Q%elS!D}QbH%7C;J?dQ;fKar(7PG00v?piR)0{{u9<{$zUrzQ!(Z?&AP*fDwj z7G%k`p5aLHtN%wXzbjGdC5+^GQ5>jiL^ltIm)8&1s56#sU*w0f=60O!otrrzY*%)F zarTB%ZwLDQ@mjelz@eADEVfc0x7hpp(=Wkn6W|W*n~X%iX$yYQ<<<{_rNIlk10+RV zF!CnQK$MaNH4C|40Og!ju<9|Om@=h4bWsNmtPnkKu82Nb+00cm@j46C;0i=ZHraSe zp96?g*pfSpUaIOI;#jcNTQR439h&nTynfY!mDKVxZ@W0PoNHi49miYrZ*)Fr4YN2M zRbdfnT(zc(q*d!ZDzxnKNwA7E`P%m*n;9quE(-}kwZZZ@!rrh%XZqKM7Yy~R4koJwmeP0a@@+#a89`g;?`mPCBZzI&UBIwQBkc#& zTZ`x{%dpK9`bR52w>tfOxzBg{$xa5k*2EXywDP25rVeabb%OXATA4XTwhUTv%_Q2P z<3nqv481ofgwaT{v(GljRM;0jf@jTcP4zJx(hKaOxYiuQ{iL7_cAol>pZO?^s>>zC zX@znbhG2fgN>`)sLLrP|&?HHKwb$;wiPFleU!B@~k#WhF@BcE|{?CmFbpM?>|Nk3r z|1j$RK(Zl0&ZZQ6l5OR)(*JMC_CJg&DE@6!;q7x&0r<_Cas)tz;}X8Ij0&3{RwIWf zpj=O;f~pB{Jwt^(v-oY`1^Dc}Ey%Y#1v?h^%_m~DW3l7dgWK%btm|D?EOFG6)BPBC z!qY;@JlHoq@$KxuCB1mLWxwnfK|4m{yQ**nQY?keY)x7G_C1yu%S0o?K~Va!@c>{5 zFWe$n((h&vhW1&OLjJ}sBEu@%b5K%d#Ob5I@|PO!c{#!08ykl_1iUh(rOu(j+d4 zjIQK4(=POeE|qQx8}%ZM>WlGkA!MF~JFu4yAhK^mTa^!0ivB()TWtfa6B?=SX0%dF zuP}B;t$zR_8Zx)w%}VhrIOBH|W5N2mzJYmJp1z!$f-;7@Q!&*tsRl)>uFA%-msQ@< zek(mCnnLF{437FzSARlfHzbj*sMe5T(Tq*i%wMG6^-v5^AvdfHQ0irZJ7flZF*{+% z`;sJ=#`*~c-;Y!kptY$L`4dSc0P2EdwJOtn9rR~?nNRNDQcj#W;y18)Z5n7IkEpo~ zD)^9NvcCZJCP6X%!D|j*G7M8x2H}=cgFy5mrwp&7FN4bkxFiPLJM35!iv`&K2 z>ze}%P#?n{>V%l_gB^C>D!G(jHL1Oho{f&IT0xib%DDo~&`BX3KhUd^9)ewrL9Y6u z%!WTUG9cwNFz^=&zPPULj(Y}_%chp=qI*bXoYH9vPV$l&1fZpbDIal1$Amy|Sh%*Fgm3D_*eG(qW2A5B;}( zSLG$pV_UtwJ!vluTzZQ`yZ8Sgxck3k;2-AyAIQMHWgFI$PXx6RH~!03{}S1GM2nZtfIc%32^n$y*kr^AUCN$XB-pW7r^(L~)` zJez!A{DzxOM)Xhw!@+qUft+g65c+srUCm|@$tZR5mWRr~Co}QnkAwFE3Ofmz4N-Rs>%d$2~K_=cq@~4q8`T`%NjC!$2 zC?dCxmCM&Bl5hO0uZF>F4OL}~6SxZ_F{Fw{g6hreBF#Kd`;&gflbYnFgQ9ypAJHH1 z`HQ|#ngg9Vg^YqkComf)bZbcm+hOo(EKzF~3B03CQ1C~m|4e3Ykg>gLiZD%fPgCJ9 zN+t{8uFJ<@$qEecwrxzRUmIRqR{hD^h8P(nY$MW;R^HOT+NQfJ79?;MFfN)q!irZj zQJsSoBhSacrqAZ46)oMUq8fChL*^TPfA22trz0}^<@?k5N?t`JV@;exb_&CZl!R_E zYGudUdZascm1Dhpn}XNFtG&5L5;W;|8?2PkvzRtK==# z6w8nz&@w}u)(E2|Q}Jk05?3LyQ+QX6NIQm%OZa(&K=-uW|FR``s0rN?-v(ppsl*Yk z=KoZ*(OEaK6*OfMe2ded3!GMq1J+boUvYvil|-Q4DqU17khCNC-pYxH?3nqePN8Xq zh;vbuF+Z45IiC)zX=vRu`}wnP;oK8c!fpF1l=XChw>0=TAekrq1U|6@Qc=;aEK5_Z z`1#zu(ZkwDD$k%=e&0}g2fixu6q|3&_eD1ATj>Z_+y`b9r@|IVRSC-pnJ!AmLkdb% z!4&kHYQFASkd4(RaTISs^HhX$dB+i{PbzWNluxJ!5QIY3kj-%PBV};4Smh(37{%FO z_3ssZjp8BoEeISnb}F2i>EP(zq8;|kr8vW%s(QVK-IlZO5CPFR9VqOQxm-v`JTkeL zuiaFB1z;Yaejl@7q)oTwUG^aFeqCGUAh>j)dY@o}Sa8wrCwyz4&ABL*R8~j9FWVoV zan+w&mi$*2mTfWifdQ|Ike5XWAC3rg=lc1b0U9dC!BHYY3sa59a5x8_rv!L*7XPuH12lsyC&=0qWcOsnuZ`5`E7tnoZlr&Ebzomr z%XXF?&F4@}-ADKE_jqHz&?y8|*l1x7q8(~USdF0}SI5t%OTb~Ba{)HaPE<-CFI zcV}iw^@CzA4O^4yILPcR5Yfh7d1=Nti0|{8N&Jo)2A%Fn3wpn&i+rWf*7OpG*479I z4_V&o($$fLf)+LVtLC+oTaH|$X<MO-+k`m$!eD%5*h z-brqzPVDbK4CJ;R?L1Va!i9H7-pQ{2>5q;rP4t#)x^E}-8(>MCGk=KrK z;5yU(;?%=ht(#Lrx(l*rrl6;ivlix1ysbW^cn+pWQYT#la&DoPH#67H50T3!WT^t1 zdNn?fO|XDQUY*!fHSuRfi~M4H>$4RbYQ`BM&`WR2mWHVdDtMmYk)oeSd&3VvW-do0 zT0o2tp9>iP!HnP!c}22K4O>?cLNd}rEj#16Rnx+{(6KK`$fvH~>lo6JX}zhnm=R5? zqv|p=e4bLy?l#Ku1}t=4RSTP`ppNqJgAKYMu%{1Txgdspxn4TDP*(SS;UvI4sK#a= z!QU19_+s|5)JF7z5ufN+j6Kf!Zc_o;Qc}49$LomSVDxGBM0rwO;}M6ps&pbz-0UGL zM+6A_AWvL9wM2=8Q;s+`kedO$l^ti10>9FWuOb#7cX7J;xO8{W7JXCn{hR+7j1T|m zLN^1KkmxfG(vk6Ii&d#03d4;U8KS}L>E>V# zQ1Z**zz@!$F+=Ej273v1mvGNf9xv;K}6=*1m_%`1c6fVbs*v+~a5_z7ctgUM*6 z+oN=L`W`o+Hfo2ZD;NK3beR~o$1a}q+9AHU-WaV@Vwbq(Bg~cxR2;kX9NB4j-B9+0 z?N5MgDx$RSiVMp~702%r;gv`9j^iw7FqVqi#!H`ps^hYba8)jwhVr)H!zP_t?C_-a zu2A$a-9!Lwr-DiocF%rC)3i35(6_P%sf&nD;^^G|P6G71AB9hNA>+Dos;r;C^9w4ub5Q%qm?mP?td@%!bZbnG~ve9x9zC~irnB8G`d6(vFG z_dyd}O$uFZaBebQTi0ifX=j792+$iM7?{U5yu)T|vqU5+r4d$$eR&Ns_V8rY z6COZjTIP&ZAYBQw1m;K^;(gUGIDd3(*Wht%ht_?tV+IRM z*-aygDbPblQ{*XqCH3{|_-#-P$5A4(vQ={;D`m7$@lwru>e|wzA155Zsp!dglSv0s z448ihF5C(-148hRE{4k;ciN@g+iDqi$8}gzxsV2E&vof@;%{rgkYk&YZB?9> zRGlc?My6(q)fv2%iT18ss?y}tU`fBZbl88g%gihl2Mv3o;R3?)qYp&`o zFH}aNI#%xVL2}cRgWI;(5bhtN6-k<rdYbW#H;6czIu$|{6MjL3N zPsoMBGU2)A2puh!r&|zV5dDmruUC-}7B#TF>CwAub zo4kJGdg1n8Ulx#mWo#GTM0emlStfD}kR<-U{An z;WCF$d5q2Hm5gp8EmtJi(<8|kFf03YjF%R!Hm2wHWipO3SG zgb6szmLC$y)$U)#0$z^yiOfRSXw3eE@L8a+8o$JF3xS6@-0iMXq?5?!YB%j zY67l_U1!r`HmEhWiEQ1~h*eFdsWDDUT}#(V*Swy7HM|+I?)~_o+M7`5n?3f2#ITXx z@E*M6iVgh?9mU7BH2Rt&+z|(E!*?y8Sx5ElR562GK<2C>SFb#0QG^QA%50XJ?=)Y7(G9Id3*rX z*3yK4H3u4bvD*U5Fyr@}#O|P+UpzPTS6)j_mc)E;up_BFw{UJa$l7yuoDeUEE6?;OA z>H%Sai9mVV+)#QsXU)?%P_03{&mPiiEd*mb=tu9vtPxsvhlje;^B{Dx6b7ukXjB?# z(WyxmJPo&gzH!E8-^IVkdG=ZKlL`Lb75VpV;Qw$%ZdN1RwVD~P1Gq|+3S}Z`V_l+% zBY0`e!s_Pa6IBamiS_;noqQh-%OG9<#)W`%>oA0cfEcnPf0fb9M!{5NP7ohSC;fWg z$4rh`N57pB^t`x#Ge73#dAEw=KyH|>2s)(=h!4V&O2gAkhRRJ1UDS}}m=n>6LxEoY zVHgDd4AW6K=0KWImJ}bDq4N48=RpIF1ej;o-&(STnu~&*2!$ElJ|1>3`wm+-W2?vxO@O>#7Oy1|EQ^i+$Q*3`;^hA}=Epml1y zY|)IIAeCB8?h`pl4yRP8gM7Wx*d^oKu$CZ01AX|_SyCqa#LPKLrnKLSjTZy*b3@W! zPe>zu8>E^VX=qiQVU@yT(nzFtA+W{bLDe*mt0mSJ%$qoB8W-MYAf_tgSu4ipv_?yN z%N%+lB;^pVZw!noZQXz(ngpBbU0ZH;A%aesAF0Fz&JBA@4Kl7>bw-k5<7`IO5vV%R z*E6{2euS=<+RC1>^3_iN%w_&%D5Fjcp|Bdn<19HH3t2vRpnaRui~awZKg+GLX+l?#H4{MZsN=UJe5F_?kRP<4tlt1IBW1wfHBC% zVuo#EqRC8j4c$8ouB1O7yd+ zbK_|1W33t6t9RZ54TQN_vZ}9g1Zfk3@mD~5NvqMd;}J%vqb9g}gIdrJ`}#piEY>uBr^|8#`n`<$dXbu)Ldg0cSzlNFFq1HL1!oO~hV!c`Iy| zKMH;BDfzASDXH2jvqU|eu~d~m5p_!eo~G9Q(dL!c89g?zf6&SU#3Vho7w*`MXG$6BA1_igiXFok=B!|DFduCU#3XUhc8oPhs;_2f0!cK zhmiNaOp%$%M6?cI9ABo$=KatRfWTj-NK1|#BC*&nQ{=T)v~(QN&|juVt!M!Lzpedc ziWG{*|H~9<$-yZ0@1G`5zf6(TCt$mW%#86@#ebP1?f(2_iu6y*V6^@zIeAcA(?YNR zwlOY1Huq;2;i)Wm*?#Gnl3uUx~`vh!F{0D%_Gt(X=q|FBh_ zpYPW9h6%G=EL^|zJBNRs#~xJhNgUDFLi9f^3?akK6N&j8$a|yarLe^Wom{WK=e(?Y z4?3DwarLG==A2OiE{%0WE+0X&pKd-bDSZ3)hE`w7{o~^nZ&gI_zx(3h>Gch+!xp>_ zAxB;iiP5*l0J@KO9l-u^K_FV+36JB(@}EqRKCk}*+oSFS_vfzyQX2;d2>lNHuYqsFN$8gyqH#C%N=Ab_6I2aLq>eJT!$| z>$wK-8SUJ{e2l=r8CSoGMQ_-H8q4Z3RO%sci*}3+4xiW0&9}`lw}Z2ms#9@XScBC^ z$~xA9k@$Uq&4vzD5g*^YY>JUXlgUi@ktGI_m4#ko`MA|UFk_MK8tWFI$tS=4>DJ;H zZGN+FjcBNT#^KwX;Z^1C{oqYxgYVPC@9!qF!3&v)DcYk%AYd8@_;a#rO`w^%;0d|l zLp^B0kKaw>Uu|Xblg`1w%m#4itKj2e-bvH^I&p}I*W|%uqQ<+deVIjf3i)F!g&GmT@3qhw9WvPPO?3h*HJcUpgkZni%t?U_WJcA)od z*R>>265C|<>ew1JPE?JsF{sYe42)G%#O2X?3@EJhzR!MZ+QgdGl;F)R&oUO(zK-Nwk6PGRe*=8gG&5wxh+?(?E^XJ@)a+Z!wX*uH6O1lMkInM)Iw z^ixp4|C`m0xUozLw4bpa9q73|;STmexWwwmMM zHA_!5gc$eQvML;{yDT6>DC|FPW5sc|MczLtupP0b;q}nFoQo zB+!Gq{)%$`jBmzNE4o~3e_rLTOQgT+M;d?APtTsTSoZR<3N9NDcT4szC4K}GI$Kcmg^TYo$GiH#iGnET^zmhq z@0_QTqli>QCQrO9@AcQ!bUIdG#_M##JO!V*kEB0d>nC%D?r&eyk%?GbnTUczyGxhf zt>1aQg|V!iM}h zHnAgePAdg))m(|&@K8=uBuLs9c0$@dDvG-zXIp}R{lav4c`$CPdf(6C@##V`Ous)? zd0oxVMUz(}r1VsEmT7fhW3uD5+w)KK65A=p^`;;Ha+o1Es8mq-9}Z3Yf8Ia;A;kCJ z6)4?*P3#fAeE(nG%&!8)pR5cIX~r7cDj~M;$LIg@W^T|s-=>k>3?N0-11L2?1b%7T zRvcWN*@Q4L=a=HK4=2*tGxNr0*2eXw#{Z%JHXm9aIp^N+%=DXnG;uOFE#-uSrOr?z zTYZU<|17oeoFlNQ`lr*cLEj}C%r9A{(r6^>d#S!XBhSYENpfN>qnR{-eEoz=NyHJH zUZH+nTfysJ4xh6bB5?G;fq?2U|8so&eVL-6rGzGi=JTi~JVEJZ?@npAbHN%?(S^&YWSQ&u0GOI2^-<` zK~CJ`9MDxz@KR^9+QM_;>CH1_!B_^GCB;@Lhl*6fZ7Mn{Pgk+h=X7Ak!!_#E`js}t ze$m6QYF8ug4+pDnQKHAj!?$pNE1VGmms7r7-SYWYO( zbS^Fw2|u4(7Ki1tj>`w_Wt9u#EH32&H$NI}UO(Z}3Rm+(MdR4BcZgnn+&q(Cw;xB) z>*;g=DSnJ{aT{ore7Ft;Uie3NY9G}|=W&5OIvSb9kO@hnMmqU0GcDZr79HT#s}S?+M2taOe4>*+hdU)=&IqP3vz z&roMHSe9>kIo7t6SigwG{5fSoqyu|03lK#%nGPgBn?FdqDbUL$))m=#6_KP>IK7-3 z*$H$t&j)IE_afY*FS~Lo#MnKQ_4g2tV70K`YaxNOsDSu(pC#Q4L{_>_r8f#lMEYPx zSbCYs;s#~bRhB+xov?k2F&1J?PlSa!oT)k>4lIQQX_zAqv;O4DoJL=e@e;!VI+oevFki%>0 zGlvgMG%fwI?J5O!t_ z`D^YooFSwm4+!4As>4($q`SwhWmO?VVx1~3mrlCU)N`6?ezVP;jsu2;-kaNFJV$>0 z!_?TD6T?5U#+62BHr}iS>nqFi7J4R)0h5{KL69;@)70<=6Yon+nK5`~BS2aHOF5`ua ze~SF~BbiipGOh3%oWS&l$JgnRH^q|nMoXt`4E**ljyg9V&kx|`rzl+FstVhj92+@X z`C22U_Upt97|fH9wziGc8*7jyM{t^z zS7$$_+VPn2V1YTYt;R03eI*3o)r$QqBa99(7;oF(x3JUF&Vk3?fk323@}WCaH6q%7i&& zeJIJQbYyl9aa7tK$&9@uz9esyYjp9^B*v-sKLBy>5WV0#>0XmKfllq6kFqo12?Lm0 zH|2~)h#Ny&7|YBZL*sk#cDx^bZ*kKaJ11Bf-WmNR;8@>#aV}=s+sL)IObF^}Lutl? z|A^6}HEVQB@Vv{J=KZa`MSxbDYl=j3*;_=_1ur=-NEYN$Ibc=)7UKwbqn|cl$0HLd zPZHVAD`CBK2l6>!1BS> zc+^=ue52(B;pVtNKNn6zas0$UsTu9i;UHp!LM)3RW{h3ZD?Lq#yXIa{9{U%k%`hd8 znZ$auqjHmYxoPmxnFKgP7;uH{@q~2Ra{N*A;2y0hmK*7Xt--EfLMDRbC$;v{sf{IMUY?@z(LQ0$NaqKHX%QS>Qy|T#JtxJ z_A;5vV850R#z=k^1rr2|>lDakCsBsVP-ckG2E!NuJO|ye_f7nu4GkAjq<}i2a@0Z; zL%w$|h@d+^yd7@4=4kSZ#Ti<39lU}l4{lE?Q3NWXvJLN_Gga`$8 z3ku>WcuZ~pq892&%sFEdp*i^J#eS8p;f*JUZq(i563T+x3+NgJJAR5QjI0$<_N~JdG+P){+f1IN&*B&N}DlfIyLJ?h0F}hIGCg+N3gBnk z=oR8CE4`_P1bdpUx;H<0nxCUOFvpAQM+c*HT)Tyy zi%%ovnGpgaK!{oa@4|p6Vb2y}eyJG&PD;Qs(z`>v$UgJ@2vj?DQxiMPr42^^S*iXu zkuA`YK|JGm%gL;=O$kLi(;Z)KS(uJ<1!3S0BCz1Zo3-s}T^pz8*9G7viY@DlrN)+n`R9STruw?wO1?(Rq=6T& z=1hR_$oszeuKhesrBLlXt6s|}td2H4E$n2+bJ4&+unrZjI6zrfRrOqR-J1t`P{h=9 zq0FXjl+S&h=GB|6a)s5dr0&9sM)&D#<`9YrE>9`V6;GPuo&~e0GuMblu1wrxSZ71{ zPnfMrM+=31rKjgFcXWX$7XG6RAMjbf`HKS6jRRDTt?6t0ngyEM!PiuEcafQas&P<* zEQ{sI)RJmMa;M|4U#stU>ut7YuEwr5RYcO`WQds~xTZGqX+EOz5R@MCIiR{Jz{YJ4 z`PXOBOgyV1E{Mw}WoPHQ_b!)tG6fDrwalPh-JJ%PXRR^GXD^bsHt0HUN!7pUO18B9 z3m@5l1la3hVY{#JiX>*j*|q4-AKRj|CeL5s7>*~BGMi6zN)_H>{Ws2nJ>6H*+^rX@ z^1w)zTb}aW|Lj%DDAs6oArcWfHf{3Tn?Y9@bOWH$A1TKn5r-{e`w1k0es}PkN+(aF zSZ_Ei6eCb8--$O1k8PNum|TvA;o}6f`{acRDO`~y`)~(da14#hWx!yvxXmX{84FzX zAD3c$Z)GLLZYAB05%J9NxU&jZ?W2~tUjFfi8am~zjSRxq=#=aFUz%h8Gj9HO;k5r_ zxjEd(5QO}71f}~o-2B@>+7~x%QNN12L$%00n##sB1J-gE|rYS;sd3p zq00}lO3EN8adTSYA~YyAA*s0t;ZkyIeEv_VQynh3cUT^#`cw9;snY#C3u}!wM-In> zOxp=ICN9Ujr3&l3RspYBXPEeOd152>^j{gWjrdt<)bLT_gQ78j`2FbPf<8s=EV4UqRzXW=@T>*P{$TbDgV~H!OePdF!g)<<<@2)l zaq||J_i@R)2z%MGX=**cc`uBVYK5|Ja10zfI_!DXJ63huFuiKmI$LnH-P%1rJzfub ztJDey?dCqK|w9kADm6OA)ic-(VM;0nTp&GnL^r93tM7Bx9OY8HRIZWL{Yky|n zY2Tk^%&LdWuF|4()McYga4Uba7r>SkX|c(DS@4ElHc2pQhvcVLudV9g&9CZQU!yjY`fWD&h-Yw}I0 z3L!J)jEu_El*4(~iV75z$201*-fv1%*1g(kwn%60^oX*8p8RD-+ZJe1>*mi>O65_F z-cr%!;bAJ6aJYT8Ha9p!ffbLqc!b(m23xZmaL41)_a-$3^V&Tns1owO*oD^Pu?(o0 z@%j|4R1Ee>6n$Go0Y(*4#s!RCaJLo0%F%bDH@_q@^VV z9PgW-$D4;noM;C%(#GIpB8iha3#DNc4-}W-?DV@vn)^naOw`Bwh0(A`ce_ZVkgI+u zD%;~~F4P!1VX*Wq*3Sm>e!XW6M*(|gB|F$UiS{*kgh6|geuDNz`g7&$_Qmt|z2f;# z>*~PRbpDJIv~y)y(#8DQ^JZ&335nqYXRG6&xw`4ft7k^X{l5F`;CU!|W!HzyG-EkYA6q0fvpd8xhIuVjnDe!uAN>+o4)764FQ4iPBhRCV)h-Iaf(zaal%!1h@LW-k&saz=2%c z9h9TRr6<7I-r4B+D%))Flj;`l{=HF`Ibc+)G7EA$g{xb#9)p#?!SNGP0YRKeyPBnU zP|fv_jq@=XGWR2~^bW&mSJd?HrPAI2!Bv8hPgSQD3lYIyLmp3dmLb#u$Dt)BbFzh8j9**?G@ z_lg-6OpB{C**FJ#bCWWQJ%n-@V>NNBj+B>O1G{+FtU^k@A;DWDA4|t*6thN&XXA#& zKHe7wN<(@v-!p*$l8~Z1gGq#cH3;{q0Owa(D$E)Vrynb&j9nvsrfYx~&13ItK6BJ; z9~p~nzNSaN6c=3QTG0O9K^eb#j^k%8>=bA#fHkCw!8>Ue+i1Ir{Td#`9Ff_#QO0?> zbdW+~*dCgt7mAwo9a&zoW;bK({ORJT1`;cKl|J+^{cXkca%KSZ(^?3U{@x=n5?hDl zNq;Af?_ZjR)2*xoQxDG15)tiJG#Mzi3=54oQY?dpa7ks zFaOxYMesocani#k7fe6x-B$OiSNrYQ=$MD&jjWdQpAr{_bzb!AZ5&?4Q+mL9^?CWO@ykzpXN!KocpnFq)TtdKk?v>7Hr&*{MHkrXZ+ z{_Uq)NUx6he`FxD{3K_no~-El8??+Rv??b0$bh zjZJ&E7Z=%@=u>Rv;Fy#P!@es;<3)Src|hCGZ|puWK8-kl%aurS9O2!vzp6Ap{Y$Tz zqCeH+{;Q6K!v4>jt$&;G{NFsTc*sLc+Ue+f+`&i14pf#5?6oW!zF5&UwjGl_D^wv# zfPeuLC(q}H3UYuhRgozF*560L7hJVCtn?{3Id;a0z|L&pUaI-p?a1Z$@P%Vn7n6sp zIIL9^3y24qMT$^K!EfNb)7tA!l;GE6eM|DH+>8!KH7SoYIzSqOlLh|jBz>b&@zpBu zIM2|FOaM%(wk1)p^xuTXnDYW5))M8^B_ud$(U{|dkZG66qs1lw$42v2J18}Ocv$3` z+3NIcJj+{z{PEskM2n>}AJS#tMPkf~0m;~SFR3VNi>3Q@MhUYjT=URcVEAxA+P2#I zi^Lu(Xi67BQL|yYrjvArOLP~b8HrR$(WQ)jZ!SxT3&4}a7Er$}XSu6R?_As~(4>GQ zLV+FHN6Z_hQpi@UwnI5GnOG|$Rilwg5sHLSf2Wu4JphNyyis=kU@@=cZPa)&=v`R! z1gtnIRHnA}#p6PzTA@|f0b%SSFLjFnC8<2CE1$O!8a*(up{v^?>KnZH0$lBap#cFULUv@MVSu#hB12e`fKyt_+kwm}i8HV--Op+qI8#OHY5d-z)I0(0FC)~moWHhrJ;PFkPNTp+CNYTO(sTr z>v@7KNW~$Rx0quL?TUctOPCQWK;n7S{6u|_{_Trie~!}?PyzWYkkZ^;4P&P4BRoS; zh&sf;zAu`A({>Q2w#dCeBU?}o&G~-ntk6u&e)FB^G~@y8TOVo> zRq%~=^)tD}(11ke-s8Xetx9-IG!ZOz#tw5m0FD;dw1?35)wGrUNl$!ZT2hjdmY3Gr zm+xOF-p8bx*Cx$S+3ze==AdxwJx2Qr$B%s@MwA76KL~FilI-;pM4{DK!{l9X6=!0N zo%Ad~Jae*G@64lWWNhG;RvQvM3YZ9s=cT0GieK>XP0-em?+KId2sS>EA|G~3&ZEd; z!y)YCKLbn(ygv@@_Ty2ReV0197t=hS2N#lLPi0@9>zE1yA3G6kdCcf^Hhn~1d!^u! z_J3q8c)8g_AB4o{c73-3B8#Y+Z@FqqdKh7fM)rrNsFs1C!*H>AU$L=v@zI9*qqAvF zeVN$?9D6aw1EZ@8ry1kFAnN8xW5#@F-8E{2NPdl%Bi|@( zYB9&yNCA9!Oz}NuY8%O#bE}{%r+cfEJogBQ45mRwC(gU9@~E#!;2;c>eebE{8Og90&Y*;;Hhhv{da z{TGMeh-*#oxb$+yd6@o!R`0xhwxAbN}n0c4b_*(Y1zqDcpbyBIINafHBBGD{-A ze5p0Pe7e!otOz?df>UL?%kuDVk3?=>*s zs|HTXjmhJ5*Mxy-C*?yD|-ie2ssL`w$8_ZzwqA*kZ|Q$lR8~Ts0T4 zON_S|k{zm3L0y6Q#%KhmqKtMUUiA}B2%{$-69Z0z$^8!>r?~Gg`6;yf)S^WA`95hV zMQ5ylY*~r=EdF$FBy(0pTqGe+SEb>nYDxh^3M4|Q>E=GnbbsnW%B|QRSe=1DII;L) zo!GL&<(Y}N75M;6VrP_KNev|?s9L;Yf#GBK8|O2F!tz3+Xk0OuiSL39&!@Enedg|z zy@~KFy|@0GTlLTts5DTYN4jv~4j%14;cmdQTCU*`eHa8jzy*~C8A|B$XNoC{lyuyZ zW>R#12k8Ul8Or}aSE`EO2ul_i=Ze@ExgXdOd0gojcr$(sSss{4_B>v`2w06OYD{hs zh6ovq(cA@#OrGDfOkw9X2p|V9Fn~X$#M2j836h1+ys#5DVE8UWQkFOE#!M*sK!}>G z2rYqDFt%3%b)VQUXvbkq1c|3c6F?LM7o!Y*8%P`Dy{|ujT_axv&?EVw z=PbTSpe$}pJzc0JY(OX@MKZVsFt?m$afLcB+6^y!c)eTzlYx^pGKfm5#~7#TMa@dF zFE7Ap!tS$8CrG?Y86m+$DHYT$s0(*4+($_i-hBa3!dMcCtqb+_)k2}v;YyK)}wOFgwSjdn(zFg+gQISm?E%WCt ziuu?i9;s;J+P)FAU|@ebm1o@UzGE_JNN#Oulq-8vaA#FfPO7@HL~7w#=t)5;t$~Hy z1H&=mON^pA-M}P_>-FCG7y%ULxZiS))HWrR^$E0jPXXiC&oE@`>(j83n24h#B`1Ia~4?>eM z@w9%A(Ei&UnO3T{?g`DFc1W+MS}Kn-O1ADJ6}Im)nY^3qpC{Fe^-(LhuGZ6M3GHo< z9a>ZuZ}$fXd7h_^{C5sDrqG#>-&q#% z8fuJGZ1)>qJtlN`^fuFv4MckrcY2~6>iUKaXwhKoZ^%;)LQQp-t8DeYgZoz6>Np>o z4qxE8ys<56UYvG%Xl%Ah=<8__bJwS=J?oLU+9cTDA(1{f>iFKXQC+NgbUc{3+E28x zH*00xn0yy1W%Jdu*vN4vt9Ik#C4ia*!Pl$isaRxPk1E+XcTPt3IJ$_TrSAQS6R^7P2(H58nF~ByHVo-jn&=MX%j+6s(BUN*~Zd!6_5YE zDI$3{-l_Zyi=z|&Vxj^<(J%*k)=)2l0#mmrjW2{>9yi&m7+Q9(2zThxJ530U)L^1Vc@625=k= zqE-tip>4C1+3eZuj!Sd87HD~`Z=>P)>FlDC;eMYP}=|+O_&a2IAFh4LnzUKOx zd^{fnXxJib#370=|3GRmh9^Nnv%rbWwQU=Wz-c{JJ5{r*n-l+TJyv)TNPVO(*}lvD z3%Pv^jwp~5i{4$sA`LD^@w^ClgJqmWt^{s{F4gE4xQy1iVjY+06D&?hH|1|J7I&!q zG3e~9`77cW_N4HnVSePq+Sw1nxjGO3n_H80-}I=Y#7y{Cy=pqEsx|lQw2Ucf={!@) ztJJG?zeBq9{quRb4=iUDcXl*!0Uxg0{)m@(vVVSV0U@kqHebwF{r;ab|8I@>|C{+= zeQ(6doquCK%>T>$v#N8Ihk>&tSxptmmJqObv>p;LD78j$;#_|e@$|PZ<~RLyTx?>x z=+c#^kRe&Rgt*a?$>BJ`c9?P6EwmdPO-bp(JUV9oLwGCJVk9{~tsmfOVN^;tj(fsq zH#Nc8>d(L6RHqnCh5W z(2TJO@Qa_Y&KL|^(275R9L$8BUiu+-ojkq4@7?8+ zN+$c{O}7v955NAD!5J1(bRsA*&H)Cm1w`-%>P3D0eM{UKq$QWHL0FG4tVDM?5O#j} zf7~`m~K7uyuYl0 zKbEAuWH~>+RgZ@>pSY@OUMS**M&dOMP+-zjA1~4pFd768gDYV1O#`CRxz;_Fxm_)dR@I# z&=>M6w}q5a-N(3+FRoS|K0(;u7>M5S5YWs0o;*@nS3@`gQxN|x*#s9bqvNUh>E8O_ z@^QHnv+4O$A<_J2*tC&!BuRpfkhBp&vcJc+o(Lwcn{rV{k^eLcbE;3QELqOe1Q7HY z5KW$lamD`cOGwnRBYw)bV<`mUzRus|g|840fo7X=dB6tzp@{G%J0ZS6>kwl}%aqAh zI0xOxW{BkQ$BGQ00}Bo9hhNa&!W?y z42i5J7}F{*}^y0p~gz&NUov~O0Rmw(gxtp zF$l>X0g7>d;BhHwy)8p377HperVsk&c(ukvgMK*q#vYgU}xT%H(AqINJ^K) zq<2{Fct}i87e76KrCO0LQNaqDdygiDWc-MO)UncDY48>96&_v?I!6XdHBg~L=y|g?%4d4Xpn|%7SGW?=^ zy!U~v?le*bm*yAfKwI&FNXF~`xGQOG%orJZb}G%Zy#^NHVC1w|(s`CDeJU*C^%c3= z4!7|wro#gb0Zo6)lv29b6+!xmY$hw~KKo~m&GvV_CH_HY>N!|v$lZmwr_$mY6`lXm zdFU~Ihg)>_B~81TZss|##Q#&>S;tk?bbX&zx}*dJq(nLdq`SLAknqsm-3=n00^&tT zN=SDoAT8Y~4T7W~_-yfcZqLEPeZBv_`+PWX_%L67d(WO(vuD<!u_2!q*s92 zhxcB#(YgaA$~?9EZKnqvV`dy>dz3yGVi?( z^eGaO8t*L=(v9oH>i^6}%b(j4qsZ1OA@?MxRS83?)h|h!a?qo5na?aMi#0X z=-yoTFFx>Zu*|ynY|v_2xzTr*o5uz+X*?=C)ShAbDkHIMYYZBb&eqM43T;I!*W;M_ zV91L9GN>g;*E4=Z)Ad8u_rrpt{X%^!?P*&kCeEs_r8=5*Be;R8f=5*heLlOE0_szx+k^#h7Rk!U_>?TJ!VWDR@IKcj)rVLtx&PhR|Mz4R z#W4fF9`HlHdWBQD#9hGue!zcArc6pkT`@UGi5puq-PEXrRX-ST>m}Pknhk&Q(dxG4 z5iASQ;Vbs{)OfC8pIrO8r|n!$1UW9uFHqE1aHRf0&VR(iZ^ybya-T@X9)Sku15A@F zQl$KfvUs0=G)c>SJqx~;>|0PQ_p1tnX!jlp{Vk; z`eGx|PqGf{nr}aT|B7t8O6xq+*oa)r;>X7L7HS%bONNO#%?NJ7`rAW#QP1jy37K){ zS-{w$g5~evH#8l!nE*-G}!Op^ZwATvaem5e0ct@KUD!*!t=T|KqW> zewI=Xyg8@xSVjt4=bGo5r^$9o<9P@}9Pvnu372z5(v(=nu+``gT7B}G!l83D==9?J zc-zS#Bj1k9!s7|mKoYaFga1N4)vR)ZbLXfPAsttjGBdl9(qJ?z0yn)%v=|G6X1Kw@ zqUZax@A6stZ_iAkxb-(UjHRQk9}#XJN(XO=P0h@jI>hYy-Q})Nks1?tjEp1`gCi#0 zl=YESb;VU4wz@D1&pfmg7Cn|Qbur;p7Daf7(+E6<)Qfwa(&<$OG5uaxNR^!j zF(q+49(!2!9y3Ov7(OhnXm-KkP7~odYi@eCZwa&b$-UuhvlxyTDvl*)B#U_3YHZCl zAfgu;{mk!hqdi$gD^L5Ynv6tRS3ypITz1eptZ=(Xm_~06^{(S{iV*X0eE(^J0#u{R zUPGtdA|JZ~cduDepE|D-^P@BSZN{P2#YOmjW>|{j)TgsJArem&a|}l;^i|d<=(}nL zP5s76Fr@H@yDfvcQ)Ovz4Gn2n%j0*VMOnI^CW@Jwc?~xYy$9n%4^s8k)y~|T`VNSmB;be@ z%)a+{nlR&9;x7AP=Cz?e&x7x%I}ud+mv)N762MaTHp=GaCtoFw59P1l`mSMjs;klj z3cL0AZZ?8ih|5x=ZpYB}@~+;ix7nM@5g-S`*|^Tvs|1<0sA3MUDkoF820gqt9}`c+ zA}#G>m49~d9JJgv|0T2Z9D(9t975cRqp)=Lu$+plA?+CK@>26BW*k@RP~KvS$P$p? z_eEJ{&sZK@%J=Z^Me)(eCrHc$6or98ILnWuy&riz`&(r}?*b@9=zh?xMlr zw%{>nB~;vtPX56u3*)%WQ!sy8HQa#XBgk!>YE*dyF!_{aZJ*GBZ;5J{f8*)uNC~mR zWPRF;wP$Ap|CrLS~@*;NG!Y zl$q&lu-Rv%N5@Vnq2x3i!Db;7A^juC0$=^&_dj=pP)P&dH*s*zhz4pbP=-o!?o1DtlW*K=2Qli zV95vMHA3oxGs9)0F-Ce8!FGAJA;6g@Sq~&qnnPZ-Id>p1f2SASfAG)X!1IDHW%`B~ z)VBoq;7twK)g5DHbsC=O)XJ$^*t;7!r zFDmH!LSW^7e#x1t4Y{0(V}5!tAQjrrTg;Gd_*vEw0S+ahLD?Iau|s-I6d9f26mM=p zcUj2dV?LAVA)5M5uchrICQP7DLM-L=Ms9aKBi8`*v{05c}G;fVe_>pieNq$9Ghg`wZ|zdc@{WU!(}Wm00Cp zrQF{dBS1U%cjM5~scrDuP-Aw;?6F(nnGL`^%F4=ec4(o+h{im09>ssUa+p#_<>(}X zti?M4_YT>WM=;ELA~4o$;zBn!>)7F;#Butdf!ykob|g~t9RxTDH+kf05?2fYJ5Iwj z77}L?Tw=yr2BQ1UgSTgOX^F%XwdoBC60EDXs>X~gju;~LCS9N1Q5%KTAj#gmKkI^Q zw7J2B!Gv70_cLnO<0NU@ZKJF+ykL_XdKdM?=p&tCXj?C915)ee$hl;igV2R4nOy&jW`eZO-^2<2S!~ z?j73i9i;2q4>ea~S@wP)&9^)*arO#2E6Y<9Kvt7;6t#Pap}b7*{(MTTzKfB1dfW;N zHb=6IFJOI|LmA+U5 z)+<*2>w3k1&vXO$2w1c;qy6#`5I@n9LNSWuZhRjg>_Rk)xkp09@p+4$M&Y`7WIJ_tI~H*^n6?K`fFPpD zaTL#Xi&}UmqmIvTjTX4mrhadh;eulLI|ZaW&t z%)dRkty7dyr8ZcTDGjB1yjx?8ZXyGf>YdNb^0wB_5-Q~6MRHugh7mA%5qQJo#f^z^ zfbopVv^v(6vwM~eSvRL8C-ri4?1tt16^1 zh!#|>Zyw3!7Vyp&Q_T1QeVYCqJ!P|>p37Wo7D4`$p=<0}*`WnuuL$4t>R{z*#XGX? z<&t)$S%*^Bw3@h}N`22G_bVslTCAPG<_xDKOwGqD@)lC@#DwKo@H4t#?tP3^=>D327pc)2s~*jYyy?iBeR0&J8-8h5C(VCQ6`5e=;I{^e&Vr)z~x0 z=3{i+p6?UKGgs!7;Zgsr*AyMHYHaKyfU~{0-J_?2n71V z1VEsSg}UsxNF?OSW*u9N)rKI8{+(NM+vsa)I&&Af4i{^U5(je^Yw3`GN*-1WQ1P+=DMo|w*uu07qFZSx z>5^P0^Q}Erp(jnn4~>MBxOEEWhU*&nPF#*UNt#=*KD}+Jk$mt;3^%NV>SGKJF$~}N zyGLjYylO%k#CsYVF|RKaSft$?coiXHL;pH=BwX8|%^KQ;ELx~pLzjnN|VI~1|LmYqQAkxz;AR+@mTd&WHA>V7|j z=beyCUg3aHN1bU~Qc5cQmk=tgkGMvjmXaK|?JZqXFp?X;%I@r~AxIKoN=lh#oHkau z`xiy#C?_Yxj0mz48PvzJ3QMMhQ!o9R!cYiJC_9BoLJ5_m?h+3QVHd6Of3AcmS7{H& z6p@~GH|VQLQirEh>7Ix+%!HCQ>*D5N7;Q)x@_6KrTcH~S)e3x>RJx%j0toGsrcVZv zW{ii^f%Q_M@6&y$4i`c7T*Xs;q*I(UjotH?Gqqw!WR+?29u{nK5s4K~Z`HC@BA&M5 z5}4Au&b`@QmDL<;KP1cbdR2co*jT;P+h6&NTz~cjlB7PG_F=Ol9&(i6QWiLUW;{xrFkRyXB)rIU zNR1yJy_~}PK4`R66G~Q_}l=9QXZA0#$L& z_bghf$uXwvZB07sgY}scurCP^lq#1dN;GkXjF}Tps3=%mRVcy^#+rEX)_z#2)Mjr- z)QYm>qmPl*ba=dfz(=T1Q>wALz1r84UX7YpxpSc@QH=X_PMK)46mebB$EsOxu8@IC zpbx3O!O3QAlE>%aZh{x)M_gA>O5GykfOD}?b=BDAm;7_X^2Xx{-KX;&>^?=hO2$7c z$SQv3C`P|PZSXFOWGY-x2p7=|bpGDeWYUH3>TZL%v}qyzX`B1Z4!>?;XmE+t>GJwz zo*Z9h79NX&if0oqrA!;hXDy+XG~t%Q1tO%S`hWAT|F@J*|KEDovlP^ChXUSwMb1E| ztN-0O?r30W2~u%%vjjQZn8Ybv$0kkkj_>?A9oAPBMz$8L(fpbh<)5uJHjU4t_OU4J z%3x@U)i1vGe6TCs%y#w&wc{0M?J!;lXjx-3K|0;rw@8#eX()<)kl8)up_b@+A1{Kk zIj#HW9INP;m*Zdg12v9#FY+!EzX=p-n}1pvRpW|Fa%!woj(?>6jlO7(fG&e`{)1Rb zkkf&QTOR$Vy(}&D#7A`nsnYn=wGFh-?khKiE>kXfV;8e!j9&;#X9NR_gA8$MR5Gad z2UdQfrM=AsadkbWC&pGmkCyX9ClVcZ8tCZVOaJ=qNM9zq!0V^c&>iag$Brt)So=k* zFWivcC^6VK|`8{8SQMyhOByh(hR-kB)+R#?#`q0BTVX9u}S%C z-jaGdMn3kR#X{-F6jB9)S*iPYL-h-27dL=LIg$&U+(J=AHP(yP5NcFt@}7eP#~V z1~Y7zvL`u#L|dV?SW8*L9jds(cYv3tR;b8$wt<=t#E8X5d3}e6! zP4^xDHLNs*lb-SLEIHxxK@Taj84fnWw2TKKo+j z{bw&07Yz=?M#&Fo70~in>G!7%{Dak|4cvnfJKhxv`&(t^We+~m91mk24NV4 zobM{zJH9!YRB&)SFJQ-wgj@767gdPf$lVYva^fh%=OvIVLVS62%!f39v|d)W5EWG^ zJ6c`l^t{N)bevP%sn3PhkkS_0E;N{=&k4&oqa6;_=q>`m%u(NClJ*q+;agk;vI>~C z^sh7SFFf^?BVDkJmLsKTy;m%_%1l>^sj<+N((I*1_<5)2OR9|yh&c<1{Gu(S_;F(J z&NHhbY&Q{dd*Jo00`G~_tXDVedP5f090>JmSCfCA!G>(va1_>Dj#$Y99oj&e2fXAB z2YB}@x`(jm{3fL%btO7Wf-QB&v09CN-xYynlE6jKC`ZhP2OQ{MIyFkOa|WQ zU;p~41$g7=LQ0ES=zo2lrQq4lDeslVxTPn6z0@yD(HSVjBdZV^wZRp|_k`TN=3Xw1 zs4F8Ed0Pc6iXDB;KSsg>qxX6c`_CHv=(eagX5Vpw71s8%>nG2IJ7wq^mL*C_9eJm4PPb!U* z6ytC(v7fPFvpf!eSVg3a9)JXU;EA8Sl#j7gmC+oASL{*b?5-r$7n65#AU$f%Gn+)* z@4lo%5h-$Um%tx*Zpk2E8I1@UXy&kV-yyRuq*0|)rOOZ{-^F!5E?e&AL;Z*Tbe@Ww zYX21qc}_)W`GSJ?zUwQQI-XWkT@KlKRPW}@SLFwTlUpu7uSM&#UPI$z2V(Iu=|)YU?HDJ7V+acuIP7IKn#85`vFY`+56vlzB)OsAy;lpzfkV90?CUw{!9+?dVc@P)-lpUKSrv#BizqS=e?KDdo8{_HuOBSQ zr_~1)8_UxE$F_{)YyzC(-pC^N)>=X_0uiDp@)aWqEeq)5DK8~hZ%ecgGY zD4)Y`qu`ntZAGbQoODcIfgiTghcZ21ICS3GF+$_P?)_WFB=AtzX`;&`bet{iI?5COtn1Sy-Qn%+`)ZaF2ExO!lTM@o@ zZ}}e&f(UX2MBZdISczNtS}scKa6CTPR(oL@Hlm%z1#T|tNTmOiUhVUr{2BuiBAxaSdzj%e4WV-Nau|6VVC5*5!B2^1R#zJSC< zV8cba0!rK3Ix^YXgB*YsWZ-CKV-1aex=a{{RKh+9dZY9Xt4e1>6*)7?_!IHyI$1e4w}=9$ArbZKHNTAeo9t)`vH~$(y+hST9Of@H4BR{AS7DdI z#mNFYWBzlh&~l?ft32?06p*KC56q$cg#$a)-~Zv}Q-%Av0b&M%>pcgW7i67y0(b0R zWMxz-vkkOz7`q*w=aBN*Ta$ zFk4bkcz-GVO@%s;fXrtL&OVlgf(Dlg)z;lC^{YG--rrJhwoZ^~C&8tjDL_GkOZ`{# z1bJ1tRH5+xmU^>&f=uiNE>%Pg3L0GMzZxh=sT-P5cz;X1*+N04bOM)ps09TLF7;nc z6r@yYT`0W2rQU3#AQQ-dOJ&i6f(DoRuSN<|>RWv%yuYR1Y^5MGZGcOyF!+rIO9$Y< z1oi=HtAb210FFZjLBai2dL0V2{X>TB2Pb11|0aWtZlN|K$cW6~1ZPXIs|X&S`Fj5b zIkOIqsIr4VfK|cG{RCu;PjFhLJp}FQ27!7`Hw)5ng+PD_y16%ijOPX}NZSp9b|naE z2XM2XI3EZEn4p{6JY=98a6z%Y5VR{nP@6eqOaySmW-tT-Owi3O8!}P=IPF0w1no)? z)W!_CVH6yp7X^U;6LfR?h1^C7PD^|VLAw$Jbz}*-n*|)9oCtvc6Lj-v5^|3RI4wL0 zf_5bc>If3j;}#qtkO6@J6Lj;a5z-G8oaT}VLAw$Jb)*RCGXsvm$b&$D3A%Z72 Date: Fri, 17 Oct 2025 13:35:20 +0800 Subject: [PATCH 570/749] 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 571/749] 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 572/749] 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 573/749] 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 574/749] 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 575/749] 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 576/749] 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 577/749] 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 578/749] 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 579/749] 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 580/749] 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 581/749] 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 582/749] 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 583/749] 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 584/749] 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 585/749] 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 586/749] 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 587/749] 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 588/749] 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 589/749] 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 590/749] 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 591/749] 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 592/749] 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 593/749] 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 594/749] 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 595/749] 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 596/749] 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 597/749] 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 598/749] 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 599/749] 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 600/749] 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 601/749] 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 602/749] 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 603/749] 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 604/749] 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 605/749] 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 606/749] 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 607/749] 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 608/749] 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 609/749] 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 610/749] 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 611/749] 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 612/749] 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 613/749] 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 614/749] 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 615/749] 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 616/749] 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 617/749] 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 618/749] 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 619/749] 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 620/749] 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 621/749] 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 622/749] 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 623/749] 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 624/749] 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 625/749] 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 626/749] 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 627/749] 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 628/749] 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 629/749] 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 630/749] 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 631/749] 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 632/749] 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 633/749] 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 634/749] 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 635/749] 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 636/749] 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 637/749] 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 638/749] 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 639/749] 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 640/749] 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 641/749] 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 642/749] 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 643/749] 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 644/749] 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 645/749] 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 646/749] 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 647/749] 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 648/749] 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 649/749] 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 650/749] 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 651/749] 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 652/749] 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 653/749] 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 654/749] 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 655/749] 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 656/749] 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 657/749] 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 658/749] 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 659/749] 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 660/749] 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 661/749] 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 662/749] 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 663/749] 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 664/749] 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 665/749] 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 666/749] 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 667/749] 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 668/749] 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 669/749] 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 670/749] 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 671/749] 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 672/749] 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 673/749] 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 674/749] 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 675/749] 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 676/749] 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 677/749] 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 678/749] 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 679/749] 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 680/749] 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 681/749] 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 682/749] 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 683/749] 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 684/749] 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 685/749] 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 686/749] 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 687/749] 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 688/749] 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 689/749] 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 690/749] 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 691/749] 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 692/749] 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 693/749] 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 694/749] 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 695/749] 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 696/749] 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 697/749] 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 698/749] 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 699/749] 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 700/749] 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 701/749] 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 702/749] 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 703/749] 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 704/749] 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 705/749] 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 706/749] 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 707/749] 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 708/749] 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 709/749] 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 710/749] 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 711/749] 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 712/749] 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 713/749] 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 714/749] 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 715/749] 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 716/749] 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 717/749] 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 718/749] 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 719/749] 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 720/749] 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 721/749] 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 722/749] 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 723/749] 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 724/749] 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 725/749] 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 726/749] 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 727/749] 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 728/749] 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 729/749] 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 730/749] 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 731/749] 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 732/749] 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 733/749] 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 734/749] 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 735/749] 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 736/749] 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 737/749] 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 738/749] 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 739/749] 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 740/749] 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 741/749] 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 742/749] 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 743/749] modify code --- ...1\345\210\206\346\262\273-\344\270\212.pptx" | Bin 0 -> 55381 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "ppt/\347\256\227\346\263\225\350\256\262\350\247\243183\343\200\220\346\214\272\351\232\276\343\200\221\351\235\231\346\200\201\347\202\271\345\210\206\346\262\273-\344\270\212.pptx" diff --git "a/ppt/\347\256\227\346\263\225\350\256\262\350\247\243183\343\200\220\346\214\272\351\232\276\343\200\221\351\235\231\346\200\201\347\202\271\345\210\206\346\262\273-\344\270\212.pptx" "b/ppt/\347\256\227\346\263\225\350\256\262\350\247\243183\343\200\220\346\214\272\351\232\276\343\200\221\351\235\231\346\200\201\347\202\271\345\210\206\346\262\273-\344\270\212.pptx" new file mode 100644 index 0000000000000000000000000000000000000000..14378fcb7c0f8572bf267c0d7b1023828596833e GIT binary patch literal 55381 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%0ABoXk#4(_JV1&VcZFkDg%*Ou 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 z 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 Date: Thu, 20 Nov 2025 10:43:15 +0800 Subject: [PATCH 744/749] 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 745/749] 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 746/749] 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 747/749] 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 748/749] 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 749/749] 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];