admin 题解分享 · 2024/4/17
拼十字(编程题) - 题解
视频中标准程序代码如下: ```java import java.util.*; class Main { static final int N = 100010; static int[][] tree = new int[3][N]; static void add(int id, int p) { for (int i = p; i < N; i += (i & -i)) { tree[id][i] += 1; } } static int get(int id, int p) { int s = 0; for (int i = p; i > 0; i -= (i & -i)) { s += tree[id][i]; } return s; } static class Node { int x, y, z; Node(int x, int y, int z) { this.x = x; this.y = y; this.z = z; } } static class NodeComparator implements Comparator<Node> { public int compare(Node a, Node b) { return (a.x == b.x) ? (a.y > b.y ? -1 : (a.y == b.y ? 0 : 1)) : (a.x > b.x ? -1 : 1); } } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int ans = 0; int mod = (int) 1e9 + 7; Node[] a = new Node[N]; for (int i = 1; i <= n; i++) { int x = scanner.nextInt(); int y = scanner.nextInt(); int z = scanner.nextInt(); a[i] = new Node(x, y, z); } Arrays.sort(a, 1, n + 1, new NodeComparator()); for (int i = 1; i <= n; i++) { if (a[i].z != 0) ans += get(0, a[i].y - 1); if (a[i].z != 1) ans += get(1, a[i].y - 1); if (a[i].z != 2) ans += get(2, a[i].y - 1); ans %= mod; if (a[i].z == 0) add(0, a[i].y); if (a[i].z == 1) add(1, a[i].y); if (a[i].z == 2) add(2, a[i].y); } System.out.println(ans % mod); } } ```
查看全文
0 0 1 10
ccj 题解分享 · 2024/4/19
拼十字(编程题) - 题解
``` import java.io.PrintWriter; import java.util.*; public class Main { static int N = 100010; static long mod = (int) 1e9 + 7; static long[] a = new long[N]; static long[] b = new long[N]; static long[] c = new long[N]; static int lowbit(int x) { return x & -x; } static void add(long[] tr, int x, long v) { for (int i = x; i < N; i += lowbit(i)) tr[i] += v; } static long sum(long[] tr, int x) { long ans = 0; for (int i = x; i > 0; i -= lowbit(i)) ans += tr[i]; return ans; } public static void main(String[] args) { Scanner f = new Scanner(System.in); PrintWriter w = new PrintWriter(System.out); List<int[]> tr = new ArrayList<>(); int n = f.nextInt(); for (int i = 1; i <= n; i++) { int l = f.nextInt(); int r = f.nextInt(); int c = f.nextInt(); tr.add(new int[]{l, r, c}); } Collections.sort(tr, (o1, o2) -> o1[0] == o2[0] ? o1[1] - o2[1] : o1[0] - o2[0]); long ans = 0; List<int[]> pre = new ArrayList<>(); pre.add(new int[]{tr.get(0)[1], tr.get(0)[2]}); for (int i = 1; i < n; i++) { int p_l = tr.get(i - 1)[0]; int l1 = tr.get(i)[0], r1 = tr.get(i)[1], c1 = tr.get(i)[2]; pre.add(new int[]{r1, c1}); if (p_l == l1) { } else { for (int[] x : pre) { int r = x[0], col = x[1]; if (col == 0) add(a, r, 1); if (col == 1) add(b, r, 1); if (col == 2) add(c, r, 1); } pre.clear(); } if (c1 == 0) { ans += sum(b, N - 1) - sum(b, r1); ans %= mod; ans += sum(c, N - 1) - sum(c, r1); ans %= mod; } if (c1 == 1) { ans += sum(a, N - 1) - sum(a, r1); ans %= mod; ans += sum(c, N - 1) - sum(c, r1); ans %= mod; } if (c1 == 2) { ans += sum(a, N - 1) - sum(a, r1); ans %= mod; ans += sum(b, N - 1) - sum(b, r1); ans %= mod; } } w.println(ans); w.flush(); } } ```
查看全文
0 0 0 5