二维差分学习

棋盘(二维差分)

此文章用于个人学习

题目描述

小蓝拥有 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

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值