棋盘(二维差分)
此文章用于个人学习
题目描述
小蓝拥有 n × n 大小的棋盘,一开始棋盘上全都是白子。小蓝进行了 m 次操作,每次操作会将棋盘上某个范围内的所有棋子的颜色取反 (也就是白色棋子变为黑色,黑色棋子变为白色)。请输出所有操作做完后棋盘上每个棋子的颜色。
输入格式
输入的第一行包含两个整数 n, m,用一个空格分隔,表示棋盘大小与操作数。
接下来 m 行每行包含四个整数 x1, y1, x2, y2,相邻整数之间使用一个空格分隔,表示将在 x1 至 x2 行和 y1 至 y2 列中的棋子颜色取反。
输出格式
输出 n 行,每行 n 个 0 或 1 表示该位置棋子的颜色。如果是白色则输出 0,否则输出 1 。
代码
//差分矩阵
package fourteen;
import java.util.*;
import java.io.*;
public class C{
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StreamTokenizer st = new StreamTokenizer(br);
static int nextInt() throws Exception {st.nextToken();return (int) st.nval;}
static PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));
public static void main(String args[]) throws Exception {
int n = nextInt();
int m = nextInt();
int b[][] = new int[n+2][n+2];
//二维差分
for(int i=0;i<m;i++) {
int x1 = nextInt();
int y1 = nextInt();
int x2 = nextInt();
int y2 = nextInt();
b[x1][y1]++;
b[x2+1][y1]--;
b[x1][y2+1]--;
b[x2+1][y2+1]++;
}
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
b[i][j]+=b[i-1][j]+b[i][j-1]-b[i-1][j-1];
pw.print(b[i][j]&1);
}
pw.println();
}
pw.flush();
}
}
参考链接:https://blog.csdn.net/qq_63786973/article/details/127667301