开始完全没思路

在洛谷看到样例一,突发奇想,决定先做一下元素只有0/1的情况

发现子任务1是全1子矩阵

子任务2是总子矩阵个数减去全0子矩阵

发现全0/1矩阵可以构造单调栈解决。具体做法:前缀和求出每个格子上面有多少颜色为0/1的格子(是0是1有求子任务1/2决定),然后发现可以每次在单调栈中找出相邻的两个值,算出内部区块的面积,多次累加后发现刚好是全0/1子矩阵的个数

小技巧:把单调队列的第0项的坐标置0,可以避免特判

让后求总子矩阵个数也很简单,递推解决(我数学不好,瑟瑟发抖)

公式:  ff[i][j] = ff[i - 1][j] + ff[i][j - 1] - ff[i - 1][j - 1] + i * j;

那么总子矩阵个数即为f[n][n]

让后向元素任意值得矩阵迈进

发现恰好可以以二进制来展开获得0/1矩阵

代码:

for (register int i = 0; i < n; ++i)
    for (register int j = 0; j < n; ++j)
        a[i][j] = (atot[i][j] & (1 << flr)) ? 1 : 0;

atot为读入数组,a为需要的0/1数组

flr表示现在在二进制的flr位

让后算出来的答案乘以(1 << flr)累加到总答案上

打完以后发现30分

快速浏览代码没找到错误(我太菜了)

后来点开了题解,正准备浏jie览jian,突然发现有一处没有MOD,

MOD了以后果断(???)AC...

贴个代码

  1. #include <cstdio>
  2. #define ll long long
  3.  
  4. const ll MOD = 1e9+;
  5.  
  6. inline ll read(){
  7. ll x = ; int zf = ; char ch = ' ';
  8. while (ch != '-' && (ch < '' || ch > '')) ch = getchar();
  9. if (ch == '-') zf = -, ch = getchar();
  10. while (ch >= '' && ch <= '') x = x * + ch - '', ch = getchar(); return x * zf;
  11. }
  12.  
  13. ll atot[][];
  14. int a[][];
  15. int sum[][];
  16.  
  17. ll ff[][];
  18.  
  19. ll or_init;
  20.  
  21. struct Node{
  22. ll pos;
  23. ll hei;
  24. } ddstk[];
  25. int top;
  26.  
  27. int main(){
  28. int n = read();
  29. for (register int i = ; i < n; ++i)
  30. for (register int j = ; j < n; ++j)
  31. atot[i][j] = read();
  32. for (register int i = ; i <= n; ++i){
  33. for (register int j = ; j <= n; ++j){
  34. ff[i][j] = ff[i - ][j] + ff[i][j - ] - ff[i - ][j - ] + i * j;
  35. if (ff[i][j] < )
  36. ff[i][j] += MOD;
  37. ff[i][j] %= MOD;
  38. }
  39. }
  40. or_init = ff[n][n];
  41. ll ans1 = , cur_ans1, ans2 = , cur_ans2;
  42. ddstk[].pos = ;
  43. for (int flr = ; flr < ; ++flr){
  44. for (register int i = ; i < n; ++i)
  45. for (register int j = ; j < n; ++j)
  46. a[i][j] = (atot[i][j] & ( << flr)) ? : ;
  47. //getAnd
  48. for (register int i = ; i < n; ++i)
  49. for (register int j = ; j < n; ++j)
  50. if (i != )
  51. sum[i][j] = (a[i][j] == ) ? sum[i - ][j] + : ;
  52. else
  53. sum[i][j] = (a[i][j] == ) ? : ;
  54. cur_ans1 = ;
  55. for (register int i = ; i < n; ++i){
  56. top = ;
  57. for (register int k = ; k < n; ++k){
  58. while (top){
  59. if (sum[i][k] <= ddstk[top].hei)
  60. --top;
  61. else
  62. break;
  63. }
  64. ddstk[++top].pos = k + ;
  65. ddstk[top].hei = sum[i][k];
  66. for (int l = top; l >= ; --l){
  67. cur_ans1 += ddstk[l].hei * (ddstk[l].pos - ddstk[l - ].pos);
  68. cur_ans1 %= MOD;
  69. }
  70. }
  71. }
  72. ans1 += (cur_ans1 * ((1ll << flr) % MOD)) % MOD;
  73. ans1 %= MOD;
  74. //getOr
  75. for (register int i = ; i < n; ++i)
  76. for (register int j = ; j < n; ++j)
  77. if (i != )
  78. sum[i][j] = (a[i][j] == ) ? sum[i - ][j] + : ;
  79. else
  80. sum[i][j] = (a[i][j] == ) ? : ;
  81. cur_ans2 = ;
  82. for (register int i = ; i < n; ++i){
  83. top = ;
  84. for (register int k = ; k < n; ++k){
  85. while (top){
  86. if (sum[i][k] <= ddstk[top].hei)
  87. --top;
  88. else
  89. break;
  90. }
  91. ddstk[++top].pos = k + ;
  92. ddstk[top].hei = sum[i][k];
  93. for (int l = top; l >= ; --l){
  94. cur_ans2 += ddstk[l].hei * (ddstk[l].pos - ddstk[l - ].pos);
  95. cur_ans2 %= MOD;
  96. }
  97. }
  98. }
  99. cur_ans2 = (or_init - cur_ans2 + MOD) % MOD;
  100. ans2 += (cur_ans2 * ((1ll << flr) % MOD)) % MOD;
  101. ans2 %= MOD;
  102. }
  103. printf("%lld %lld", ans1, ans2);
  104. return ;
  105. }

题解:[GXOI/GZOI2019]与或和的更多相关文章

  1. 题解-GXOI/GZOI2019 特技飞行

    Problem loj3085 bzoj不放题面差评 题意概要:给出两条竖直直线,再给出 \(n\) 架飞机的初始航线:一条接通这两条直线的线段,保证航线交点不在两条直线上.现要求安排所有飞机在航线相 ...

  2. GXOI/GZOI2019题解

    GXOI/GZOI2019题解 P5300 [GXOI/GZOI2019]与或和 一眼题.. 显然枚举每个二进制位,答案就变成了全1子矩阵数量. 这个xjb推推,单调栈一下就行了. #include& ...

  3. 「GXOI / GZOI2019」简要题解

    「GXOI / GZOI2019」简要题解 LOJ#3083. 「GXOI / GZOI2019」与或和 https://loj.ac/problem/3083 题意:求一个矩阵的所有子矩阵的与和 和 ...

  4. 【BZOJ5505】[GXOI/GZOI2019]逼死强迫症(矩阵快速幂)

    [BZOJ5505][GXOI/GZOI2019]逼死强迫症(矩阵快速幂) 题面 BZOJ 洛谷 题解 如果没有那两个\(1*1\)的东西,答案就是斐波那契数,可以简单的用\(dp\)得到. 大概是设 ...

  5. P5305 [GXOI/GZOI2019]旧词

    题目地址:P5305 [GXOI/GZOI2019]旧词 这里是官方题解 \[\sum_{i \leq x}^{}\ depth(lca(i,y))^k\] \(k = 1\) 求的是 \(\sum_ ...

  6. P5304 [GXOI/GZOI2019]旅行者

    题目地址:P5304 [GXOI/GZOI2019]旅行者 这里是官方题解 一个图 \(n\) 点 \(m\) 条边,里面有 \(k\) 个特殊点,问这 \(k\) 个点之间两两最短路的最小值是多少? ...

  7. P5303 [GXOI/GZOI2019]逼死强迫症

    题目地址:P5303 [GXOI/GZOI2019]逼死强迫症 这里是官方题解 初步分析 从题目和数据范围很容易看出来这是一个递推 + 矩阵快速幂,那么主要问题在于递推的过程. 满足条件的答案一定是以 ...

  8. P5302 [GXOI/GZOI2019]特技飞行

    题目地址:P5302 [GXOI/GZOI2019]特技飞行 这里是官方题解(by lydrainbowcat) 题意 给 \(10^5\) 条直线,给 \(x = st\) 和 \(x = ed\) ...

  9. P5301 [GXOI/GZOI2019]宝牌一大堆

    题目地址:P5301 [GXOI/GZOI2019]宝牌一大堆 这里是官方题解(by lydrainbowcat) 部分分 直接搜索可以得到暴力分,因为所有和牌方案一共只有一千万左右,稍微优化一下数据 ...

随机推荐

  1. Linux:Day18(上) dns服务基础进阶

    DNS:Domain Name Service,协议(C/S,53/udp,53/tcp):应用层协议. BIND:Bekerley Internat Name Domain,ISC(www.isc. ...

  2. SIM 800C指令笔记

    拨号ATD137xxxxxxxx; 挂断-对方挂断收到NO CARRIER消息 挂断-主动挂断ATH 接电话ATA 打入电话消息RING 设置来电电话号码显示AT+CLIP=1显示消息格式:+CLIP ...

  3. destruct析构函数里操作文件出现的问题

    这几天要给后台加一个记录操作日志的功能,可是项目已经开发完了不可能再去改以前的代码了,那有什么快捷的方法呢? 项目使用的ThinkPHP3.23 ,为了方便权限控制,后台控制器结构为:普通控制器 ex ...

  4. 03-三层交换机的OSPF实验

    三层交换机的OSPF实验 1.OSPF介绍 开放式最短路径优先(英语:Open Shortest Path First,缩写为 OSPF)是对链路状态路由协议的一种实现,隶属内部网关协议(IGP),故 ...

  5. ubuntu14.04按照mysql5.7

    1.安装mysql5.5 https://www.cnblogs.com/zhuyp1015/p/3561470.html https://www.cnblogs.com/ruofengzhishan ...

  6. [UVa-437] Color Length

    无法用复杂状态进行转移时改变计算方式:巧妙的整体考虑:压缩空间优化时间 传送门:$>here<$ 题意 给出两个字符串a,b,可以将他们穿插起来(相对位置不变).要求最小化ΣL(c),其中 ...

  7. DRF 缓存解决方案 drf-extensions / redis

    drf-extensions 概述 drf-extensions组件内部提供了 DRF  的本地内存方式的缓存方式 本地内存方式缓存在项目重启后则会消失 官方点击 这里 安装 pip3 install ...

  8. win10子系统 (linux for windows)打造python, pytorch开发环境

    一.windows设置 0.启用windows子系统 控制面板--程序--启用或关闭windows功能--勾选适用于linux的Windows子系统 确定后会重启电脑 1.下载Ubuntu 在Micr ...

  9. 【BZOJ3996】[TJOI2015]线性代数(最小割)

    [BZOJ3996][TJOI2015]线性代数(最小割) 题面 BZOJ 洛谷 题解 首先把式子拆开,发现我们的答案式就是这个: \[\sum_{i=1}^n\sum_{j=1}^n B_{i,j} ...

  10. Java复习总结——继承

    访问权限 Java中有三个访问权限修饰符:private.protected以及public,如果不加访问修饰符,表示包级可见. 可以对类或类中的成员(字段以及方法)加上访问修饰符. 类可见表示其他类 ...