题解分享
题解分享简介
拼十字(编程题) - 题解
视频中标准程序代码如下:
```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
拼十字(编程题) - 题解
```
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



