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)$

  1. # include<bits/stdc++.h>
  2. # define int long long
  3. using namespace std;
  4. const int N=;
  5. int s0[N][N],s1[N][N],a[N][N],b[N][N];
  6. int n,m,q;
  7. int count(int x) { int ret=;while(x){if(x&)ret++;x>>=;}return ret;}
  8. pair<int,int> find(int x,int y) { return make_pair((x-)/n,(y-)/m);}
  9. int check(int x,int y) { return (count(x)+count(y))&;}
  10. inline int read()
  11. {
  12. int X=,w=; char c=;
  13. while(c<''||c>'') {w|=c=='-';c=getchar();}
  14. while(c>=''&&c<='') X=(X<<)+(X<<)+(c^),c=getchar();
  15. return w?-X:X;
  16. }
  17. void write(int x)
  18. {
  19. if (x>) write(x/);
  20. putchar(''+x%);
  21. }
  22. int solve(int x,int y)
  23. {
  24. if (x<= || y<=) return ;
  25. pair<int,int>tmp=find(x,y); int cx = tmp.first, cy = tmp.second;
  26. if ((cx&) && (cy&)) {
  27. int ret = ((cx*cy-)>>)*n*m,h=x-cx*n,w=y-cy*m;
  28. ret=ret+h*((cy-)>>)*m+w*((cx-)>>)*n;
  29. if (check(cx,cy)==) ret+=s0[h][w]; else ret+=s1[h][w];
  30. if (cx>= && cy>=) { if (check(cx-,cy-)==) ret+=s0[n][m]; else ret+=s1[n][m]; }
  31. if (cx>=) { if (check(cx-,cy)==) ret+=s0[n][w]; else ret+=s1[n][w]; }
  32. if (cy>=) { if (check(cx,cy-)==) ret+=s0[h][m]; else ret+=s1[h][m]; }
  33. return ret;
  34. } else if ((cx&) && !(cy&)) {
  35. int ret = (cx*cy>>)*n*m,h=x-cx*n,w=y-cy*m;
  36. ret=ret+h*(cy>>)*m+w*((cx-)>>)*n;
  37. if (check(cx,cy)==) ret+=s0[h][w]; else ret+=s1[h][w];
  38. if (cx>=) { if (check(cx-,cy)==) ret+=s0[n][w]; else ret+=s1[n][w]; }
  39. return ret;
  40. } else if (!(cx&) && (cy&)) {
  41. int ret = (cx*cy>>)*n*m,h=x-cx*n,w=y-cy*m;
  42. ret=ret+h*((cy-)>>)*m+w*(cx>>)*n;
  43. if (check(cx,cy)==) ret+=s0[h][w]; else ret+=s1[h][w];
  44. if (cy>=) { if (check(cx,cy-)==) ret+=s0[h][m]; else ret+=s1[h][m]; }
  45. return ret;
  46. } else if (!(cx&) && !(cy&)) {
  47. int ret = (cx*cy>>)*n*m,h=x-cx*n,w=y-cy*m;
  48. ret=ret+h*(cy>>)*m+w*(cx>>)*n;
  49. if (check(cx,cy)==) ret+=s0[h][w]; else ret+=s1[h][w];
  50. return ret;
  51. }
  52. }
  53. signed main()
  54. {
  55. n=read();m=read();q=read();
  56. for (int i=;i<=n;i++) {
  57. for (int j=;j<=m;j++) {
  58. char c=; while (c!=''&&c!='') c=getchar();
  59. a[i][j]=(c==''); b[i][j]=-a[i][j];
  60. }
  61. }
  62. for (int i=;i<=n;i++)
  63. for (int j=;j<=m;j++)
  64. s0[i][j]=s0[i-][j]+s0[i][j-]-s0[i-][j-]+a[i][j],
  65. s1[i][j]=s1[i-][j]+s1[i][j-]-s1[i-][j-]+b[i][j];
  66. while (q--) {
  67. int x1=read(),y1=read(),x2=read(),y2=read();
  68. int ans = solve(x2,y2)-solve(x2,y1-)-solve(x1-,y2)+solve(x1-,y1-);
  69. write(ans); putchar('\n');
  70. }
  71. return ;
  72. }

『Codeforces 1186E 』Vus the Cossack and a Field (性质+大力讨论)的更多相关文章

  1. E. Vus the Cossack and a Field (求一有规律矩形区域值) (有一结论待证)

    E. Vus the Cossack and a Field (求一有规律矩形区域值) 题意:给出一个原01矩阵,它按照以下规则拓展:向右和下拓展一个相同大小的 0 1 分别和原矩阵对应位置相反的矩阵 ...

  2. 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 ...

  3. 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 ...

  4. 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 ...

  5. 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 ...

  6. 似魔鬼的 『 document.write 』

    在平时的工作中,楼主很少用 document.write 方法,一直觉得 document.write 是个危险的方法.楼主不用,并不代表别人不用,最近给维护的项目添了一点代码,更加深了我对 &quo ...

  7. 拾遗:『Linux Capability』

    『Linux Capability』 For the purpose of performing permission checks, traditional UNIX implementations ...

  8. 『创意欣赏』20款精致的 iOS7 APP 图标设计

    这篇文章给大家分享20款精致的 iOS7 移动应用程序图标,遵循图形设计的现代潮流,所有图标都非常了不起,给人惊喜.通过学习这些移动应用程序图标,设计人员可以提高他们的创作,使移动用户界面看起来更有趣 ...

  9. 『设计前沿』14款精致的国外 iOS7 图标设计示例

    每天都有大量的应用程序发布到 iOS App Store 上,在数量巨大的应用中想要引起用户的主要,首要的就是独特的图标设计.这篇文章收集了14款精致的国外 iOS7 图标设计示例,希望能带给你设计灵 ...

随机推荐

  1. git回退

    以前,如果是要去除某一块功能,我都是选择性删除,选择性注释,然后前后逻辑各种查看,各种比较.每一次,改完这些我总感觉心好累啊!!!然后,我就发现了 Git 一个非常强大的功能:回滚.当然我还是喜欢叫它 ...

  2. 深入理解计算机系统 第十一章 网络编程 part2 第二遍

    客户端和服务器通过因特网这个全球网络来通信.从程序员的观点来看,我们可以把因特网看成是一个全球范围的主机集合,具有以下几个属性: 1.每个因特网主机都有一个唯一的 32 为名字,称为它的 IP 地址 ...

  3. win DLL 笔记

    DLL 头文件: #ifdef DLL_API #else #define DLL 导出类 class DLL_API point { public: void aaa() { } } 导出类中函数 ...

  4. 豆瓣网post 爬取带验证码

    # -*- coding: utf- -*- import scrapy import requests from ..bao.jiema import get_number fromdata = { ...

  5. 【ExtJs】获取grid选中的records

    var records = me.grid.getSelectionModel().getSelection(); //获取所有选中的行 var record =records[0]; //获取选中行 ...

  6. React中使用遍历

    1.使用for(let item of items){} render(){ var itemList = [] for(let item of items){ itemList.push(<I ...

  7. 【Git的基本操作三】基本操作命令

    基本操作 (1) 状态查看操作 git status 作用:查看工作区.暂存区状态 (2) 添加操作 git add [filename] 作用:将工作区文件的 添加/修改,添加到暂存区 (3) 提交 ...

  8. Mac EI 10.11.3 MySQL5.7.11 .dmg 安装(便捷设置,密码重置,卸载)

    MySQL 5.7+ 安装成功以后会弹出一个临时密码 后面需要通过临时密码设置新的密码 重置root密码:安装成功后,使用临时密码登陆:敲入命令,mysqladmin -u root -p passw ...

  9. MyBatis、JDBC相关知识

    引言 在mybatis的基础知识中我们已经可以对mybatis的工作方式窥斑见豹.但是,为什么还要要学习mybatis的工作原理?因为,随着mybatis框架的不断发展,如今已经越来越趋于自动化,从代 ...

  10. JavaWeb【三、Web程序编写】

    步骤 1.在WebApps创建项目目录,如myapp文件夹 2.编写index.jsp,若路径后不加具体文件名,则默认访问index 3.创建WEB-INF目录,并在其中添加classes.lib文件 ...