『Codeforces 1186E 』Vus the Cossack and a Field (性质+大力讨论)
Description
给出一个$n\times m$的$01$矩阵$A$。
记矩阵$X$每一个元素取反以后的矩阵为$X'$,(每一个cell 都01倒置)
定义对$n \times m$的矩阵$A$进行一次变幻操作,变幻后矩阵的大小是$2n \times 2m$的。
具体来说,我们会把$A$复制一份到$A$的右下方,计算$A'$并放置在$A$的正右方和正下方。
设连续操作$n$的结果是$f^n(A)$ 即 $f^n(A) = \left\{\begin{matrix} f(f^{n-1}(A)) & (n\geq 2)\\ \begin{Bmatrix} A & A' \\ A' & A \end{Bmatrix} & (n=1)\\A & (n = 0)\end{matrix}\right.$
设矩阵$L = f^{\infty} (A)$ ,给出$Q$个询问,$x1,y1,x2,y2$,求出$L$中子矩阵的和。
对于$100\%$的数据满足$1 \leq n,m \leq 10^3 , 1 \leq Q \leq 10^6 , 1 \leq x1\leq x2 \leq 10^9 , 1 \leq y1\leq y2 \leq 10^9$
Idea & Solution
我们不妨对于每个矩阵整体考虑。设没有进行翻转运算的矩阵为$0$,否则为$1$
必然是长这样的:$\begin{matrix} 0 & 1 & 1& 0 & 1 & 0 & 0 & 1& ...\\ 1 & 0 & 0 & 1 & 0 &1 & 1 & 0 &...\\ 1 & 0 & 0 & 1 & 0 &1 & 1 & 0 & ...\\ 0 & 1 & 1& 0 & 1 & 0 & 0 & 1& ... \\ &&&&...\end{matrix}$
我们会显然的发现第一个数字为$0$的序列都相同,第一个数字为$1$的序列都相同。
而两个序列恰好取反,于是我们可以尝试寻找第一行的性质。
如果我们从$0$开始编号,那么起始点就是$0$,其值为$0$.
对于第1行的第$i$个数字,必然是某一次扩展后产生的,我们会发现,一次扩展会对第一行的宽度$\times 2$
所以,第$i$个数字是$01$是和$Highestbit(i)$相反的,所以我们可以归纳一下发现,对于第$1$行第$i$个元素如果二进制上的$1$的个数为偶数那么就是$0$否则就是$1$.
同时我们会发现纵向和横向的情况一模一样,所以可以进一步推论,$countbit(x) + countbit(y) $为偶数那么就是$0$否则就是$1$.
我们可能会发现,对于二维前缀和上的一个矩阵,$0$的个数和$1$的个数大致相等,可以分$x , y$坐标的奇偶性讨论$4$种可能即可计算。
最后使用二维前缀和求子矩阵和。
复杂度是$O(nm + T)$
# include<bits/stdc++.h>
# define int long long
using namespace std;
const int N=;
int s0[N][N],s1[N][N],a[N][N],b[N][N];
int n,m,q;
int count(int x) { int ret=;while(x){if(x&)ret++;x>>=;}return ret;}
pair<int,int> find(int x,int y) { return make_pair((x-)/n,(y-)/m);}
int check(int x,int y) { return (count(x)+count(y))&;}
inline int read()
{
int X=,w=; char c=;
while(c<''||c>'') {w|=c=='-';c=getchar();}
while(c>=''&&c<='') X=(X<<)+(X<<)+(c^),c=getchar();
return w?-X:X;
}
void write(int x)
{
if (x>) write(x/);
putchar(''+x%);
}
int solve(int x,int y)
{
if (x<= || y<=) return ;
pair<int,int>tmp=find(x,y); int cx = tmp.first, cy = tmp.second;
if ((cx&) && (cy&)) {
int ret = ((cx*cy-)>>)*n*m,h=x-cx*n,w=y-cy*m;
ret=ret+h*((cy-)>>)*m+w*((cx-)>>)*n;
if (check(cx,cy)==) ret+=s0[h][w]; else ret+=s1[h][w];
if (cx>= && cy>=) { if (check(cx-,cy-)==) ret+=s0[n][m]; else ret+=s1[n][m]; }
if (cx>=) { if (check(cx-,cy)==) ret+=s0[n][w]; else ret+=s1[n][w]; }
if (cy>=) { if (check(cx,cy-)==) ret+=s0[h][m]; else ret+=s1[h][m]; }
return ret;
} else if ((cx&) && !(cy&)) {
int ret = (cx*cy>>)*n*m,h=x-cx*n,w=y-cy*m;
ret=ret+h*(cy>>)*m+w*((cx-)>>)*n;
if (check(cx,cy)==) ret+=s0[h][w]; else ret+=s1[h][w];
if (cx>=) { if (check(cx-,cy)==) ret+=s0[n][w]; else ret+=s1[n][w]; }
return ret;
} else if (!(cx&) && (cy&)) {
int ret = (cx*cy>>)*n*m,h=x-cx*n,w=y-cy*m;
ret=ret+h*((cy-)>>)*m+w*(cx>>)*n;
if (check(cx,cy)==) ret+=s0[h][w]; else ret+=s1[h][w];
if (cy>=) { if (check(cx,cy-)==) ret+=s0[h][m]; else ret+=s1[h][m]; }
return ret;
} else if (!(cx&) && !(cy&)) {
int ret = (cx*cy>>)*n*m,h=x-cx*n,w=y-cy*m;
ret=ret+h*(cy>>)*m+w*(cx>>)*n;
if (check(cx,cy)==) ret+=s0[h][w]; else ret+=s1[h][w];
return ret;
}
}
signed main()
{
n=read();m=read();q=read();
for (int i=;i<=n;i++) {
for (int j=;j<=m;j++) {
char c=; while (c!=''&&c!='') c=getchar();
a[i][j]=(c==''); b[i][j]=-a[i][j];
}
}
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
s0[i][j]=s0[i-][j]+s0[i][j-]-s0[i-][j-]+a[i][j],
s1[i][j]=s1[i-][j]+s1[i][j-]-s1[i-][j-]+b[i][j];
while (q--) {
int x1=read(),y1=read(),x2=read(),y2=read();
int ans = solve(x2,y2)-solve(x2,y1-)-solve(x1-,y2)+solve(x1-,y1-);
write(ans); putchar('\n');
}
return ;
}
『Codeforces 1186E 』Vus the Cossack and a Field (性质+大力讨论)的更多相关文章
- E. Vus the Cossack and a Field (求一有规律矩形区域值) (有一结论待证)
E. Vus the Cossack and a Field (求一有规律矩形区域值) 题意:给出一个原01矩阵,它按照以下规则拓展:向右和下拓展一个相同大小的 0 1 分别和原矩阵对应位置相反的矩阵 ...
- CodeForces - 1186 C. Vus the Cossack and Strings (异或)
Vus the Cossack has two binary strings, that is, strings that consist only of "0" and &quo ...
- Codeforces F. Vus the Cossack and Numbers(贪心)
题目描述: D. Vus the Cossack and Numbers Vus the Cossack has nn real numbers aiai. It is known that the ...
- Vus the Cossack and Strings(Codeforces Round #571 (Div. 2))(大佬的位运算实在是太强了!)
C. Vus the Cossack and Strings Vus the Cossack has two binary strings, that is, strings that consist ...
- Codeforces Round #571 (Div. 2)-D. Vus the Cossack and Numbers
Vus the Cossack has nn real numbers aiai. It is known that the sum of all numbers is equal to 00. He ...
- 似魔鬼的 『 document.write 』
在平时的工作中,楼主很少用 document.write 方法,一直觉得 document.write 是个危险的方法.楼主不用,并不代表别人不用,最近给维护的项目添了一点代码,更加深了我对 &quo ...
- 拾遗:『Linux Capability』
『Linux Capability』 For the purpose of performing permission checks, traditional UNIX implementations ...
- 『创意欣赏』20款精致的 iOS7 APP 图标设计
这篇文章给大家分享20款精致的 iOS7 移动应用程序图标,遵循图形设计的现代潮流,所有图标都非常了不起,给人惊喜.通过学习这些移动应用程序图标,设计人员可以提高他们的创作,使移动用户界面看起来更有趣 ...
- 『设计前沿』14款精致的国外 iOS7 图标设计示例
每天都有大量的应用程序发布到 iOS App Store 上,在数量巨大的应用中想要引起用户的主要,首要的就是独特的图标设计.这篇文章收集了14款精致的国外 iOS7 图标设计示例,希望能带给你设计灵 ...
随机推荐
- X86逆向9:通过关键常量破解
本章将讲解一下关于关键全局变量的一些内容,关键的全局变量对于软件的破解非常的有用,找到了关键全局变量并改写它同样可以完成完美爆破一个程序,这里我将使用CM小例子来讲解搜索关键变量的一些技巧,最后我们来 ...
- redis 学习(18)-- AOF
redis -- AOF 什么是 AOF 通过日志方式将redis中的写命令进行日志记录,保存在硬盘文件中. 日志记录的实质是将写命令写在硬盘的缓冲区中,再根据相关策略把数据刷新到磁盘中. 当redi ...
- Digester库
在之前所学习关于启动简单的Tomcat部分实现的代码中,我们使用一个启动类Bootstrap类 来实例化连接器.servlet容器.wrapper实例.和其他组件,然后调用各个对象的set方法将他们关 ...
- 浅读vue-router源码,了解vue-router基本原理
项目中使用vue-router的时候,会进行以下操作(可能具体不是这么写的,但是原理一样): 定义映射关系routes: 定义router实例的时候传入vue和参数{routes...}: 定义vue ...
- luogu题解P2312解方程--暴力模+秦九韶
题目链接 https://www.luogu.org/problemnew/show/P2312 分析 这道题很毒啊,这么大的数. 但是如果多项式\(\sum_{i=0}^N a[i]*X^i=0\) ...
- vue的数据代理
1. vue数据代理: data对象的所有属性的操作(读/写)由vm对象来代理操作2. 好处: 通过vm对象就可以方便的操作data中的数据3. 实现: 1). 通过Object.defineProp ...
- OSCP-FristiLeaks
环境搭建 靶机下载: https://www.vulnhub.com/entry/fristileaks-13,133/ 安装:直接用virtualbox打开 网络桥接 找到靶机IP 虚拟机启动就显示 ...
- window, linux, mac 比较文件和文件夹的区别
windows 端 winmerge beyondcompare Mac 和 linux 端 Meld kdiff3 diff command 更多可参考:https://alternativeto ...
- php--常见算法1
<?php //递归输出123321 function digui($num){ echo $num; if($num<3){ digui($num+1); } echo $num; } ...
- deep_learning_RNN序列模型
吴恩达<深度学习-序列模型>1 --循环序列模型:https://blog.csdn.net/weixin_41043240/article/details/79415134