列表

详情


NC25723. 矩形异或

描述

Pi 有一个 n*n 的表格
第 x 行第 y 列写着正整数 x+y-1
m 次询问,每次给出 xl, yl, xr, yr
求第 xl 行到第 xr 行中第 yl 列到第 yr 列这 (xr-xl+1)*(yr-yl+1) 个正整数的异或和

输入描述

第一行两个正整数 n, m
接下来 m 行每行四个正整数依次为 xl, yl, xr, yr
保证

输出描述

m 行
每行一个正整数为所求的异或和

示例1

输入:

3 1
1 2 2 3

输出:

6

说明:

(2^3^3^4)==6

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 235ms, 内存消耗: 10232K, 提交时间: 2020-03-21 14:01:08

#include <stdio.h>
inline int g(int x){return (x&3)<2?((x>>1)&2)^x:((x>>1)&2)^2;}
int main(){
    int n,m,x1,y1,x2,y2;
    scanf("%d%d", &n, &m);
    for(int i=0;i<m;++i)
    {
        scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
        printf("%d\n", g(x2+y2-1)^g(x1+y2-2)^g(x1+y1-3)^g(x2+y1-2));
    }
    return 0;
}

C++14(g++5.4) 解法, 执行用时: 190ms, 内存消耗: 2244K, 提交时间: 2019-07-10 14:16:26

#include <stdio.h>
inline int f(int x){return ((x>>1)&2)^(x&2)^x^(((x>>1)&1)*x);}
int main(){
	int n,m,x1,y1,x2,y2;
	scanf("%d%d", &n, &m);
	while(m--){
		scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
		printf("%d\n", f(x2+y2-1)^f(x1+y2-2)^f(x1+y1-3)^f(x2+y1-2));
	}
	return 0;
}

上一题