题目链接

【洛谷传送门】

题解

按位处理。
把每一位对应的图都处理出来
然后单调栈处理一下就好了。
\(and\)操作处理全\(1\)。
\(or\)操作处理全\(0\)。

代码

#include <bits/stdc++.h>
#define gc getchar
using namespace std;
typedef long long ll;
const int N = 1000 + 4;
const int P = 1e9 + 7;
const int BIT = 31;
int n;
ll ans = 0ll;
ll sum[N][N];
int stk[N];
template <typename T> void read(T &x) {
    x = 0; T fl = 1; char c = 0;
    for (; c < '0' || c > '9'; c = gc()) if (c == '-') fl = -1;
    for (; c >= '0' && c <= '9'; c = gc()) x = (x << 1) + (x << 3) + (c ^ 48);
    x *= fl;
}
struct Matrix_BIT {
    int a[N][N];
} mat[BIT + 5];
int main() {
    cin >> n;
    for (int i = 1; i <= n; i ++)
        for (int j = 1, x; j <= n; j ++) {
            read(x);
            for (int k = 0; k <= BIT; k ++) mat[k].a[i][j] = (x >> k) & 1;
        }
    ans = 0ll;
    for (int k = 0; k <= BIT; k ++) {
        for (int i = 1; i <= n; i ++)
            for (int j = 1; j <= n; j ++)
                if (mat[k].a[i][j] == 1) sum[i][j] = sum[i - 1][j] + 1;
                else sum[i][j] = 0;
        for (int i = 1; i <= n; i ++) {
            ll res = 0ll; int top = 0;
            for (int j = 1; j <= n; j ++) {
                res += sum[i][j];
                while (top && sum[i][stk[top]] >= sum[i][j]) {
                    res -= (stk[top] - stk[top - 1]) * (sum[i][stk[top]] - sum[i][j]);
                    -- top;
                }
                ans = (ans + (res << k)) % P;
                stk[++ top] = j;
            }
        }
    }
    printf("%lld ", ans); ans = 0ll;
    for (int k = 0; k <= BIT; k ++) {
        for (int i = 1; i <= n; i ++)
            for (int j = 1; j <= n; j ++)
                if (mat[k].a[i][j] == 0) sum[i][j] = sum[i - 1][j] + 1;
                else sum[i][j] = 0;
        for (int i = 1; i <= n; i ++) {
            ll res = 0; int top = 0;
            for (int j = 1; j <= n; j ++) {
                res += sum[i][j];
                while (top && sum[i][stk[top]] >= sum[i][j]) {
                    res -= (stk[top] - stk[top - 1]) * (sum[i][stk[top]] - sum[i][j]);
                    -- top;
                }
                ans = (ans + ((1ll * i * j - res) << k)) % P;
                stk[++ top] = j;
            }
        }
    }
    printf("%lld\n", ans);
    return 0;
}

「洛谷5300」「GXOI/GZOI2019」与或和【单调栈+二进制转化】的更多相关文章

  1. 【BZOJ5502】[GXOI/GZOI2019]与或和(单调栈)

    [BZOJ5502][GXOI/GZOI2019]与或和(单调栈) 题面 BZOJ 洛谷 题解 看到位运算就直接拆位,于是问题变成了求有多少个全\(0\)子矩阵和有多少个全\(1\)子矩阵. 这两个操 ...

  2. 洛谷P2866 [USACO06NOV]糟糕的一天Bad Hair Day(单调栈)

    题目描述 Some of Farmer John's N cows (1 ≤ N ≤ 80,000) are having a bad hair day! Since each cow is self ...

  3. 「GXOI / GZOI2019」简要题解

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

  4. LOJ#3083.「GXOI / GZOI2019」与或和_单调栈_拆位

    #3083. 「GXOI / GZOI2019」与或和 题目大意 给定一个\(N\times N\)的矩阵,求所有子矩阵的\(AND(\&)\)之和.\(OR(|)\)之和. 数据范围 \(1 ...

  5. Loj #3085. 「GXOI / GZOI2019」特技飞行

    Loj #3085. 「GXOI / GZOI2019」特技飞行 题目描述 公元 \(9012\) 年,Z 市的航空基地计划举行一场特技飞行表演.表演的场地可以看作一个二维平面直角坐标系,其中横坐标代 ...

  6. 【LOJ】#3088. 「GXOI / GZOI2019」旧词

    LOJ#3088. 「GXOI / GZOI2019」旧词 不懂啊5e4感觉有点小 就是离线询问,在每个x上挂上y的询问 然后树剖,每个节点维护轻儿子中已经被加入的点的个数个数乘上\(dep[u]^{ ...

  7. 【LOJ】#3087. 「GXOI / GZOI2019」旅行者

    LOJ#3087. 「GXOI / GZOI2019」旅行者 正着求一遍dij,反着求一遍,然后枚举每条边,从u到v,如果到u最近的点和v能到的最近的点不同,那么可以更新答案 没了 #include ...

  8. 【LOJ】#3086. 「GXOI / GZOI2019」逼死强迫症

    LOJ#3086. 「GXOI / GZOI2019」逼死强迫症 这个就是设状态为\(S,j\)表示轮廓线为\(S\),然后用的1×1个数为j 列出矩阵转移 这样会算重两个边相邻的,只要算出斐波那契数 ...

  9. 【LOJ】#3085. 「GXOI / GZOI2019」特技飞行

    LOJ#3085. 「GXOI / GZOI2019」特技飞行 这显然是两道题,求\(C\)是一个曼哈顿转切比雪夫后的线段树扫描线 求\(AB\),对向交换最大化和擦身而过最大化一定分别为最大值和最小 ...

随机推荐

  1. Linux高级运维 第四章 文件的基本管理和XFS文件系统备份恢复

    4.1 Linux系统目录结构和相对/绝对路径 4.1.1系统目录结构 在windows系统中,查看文件先进入相应的盘符,然后进入文件目录 在windows中,它是多根  c:\    d:\   e ...

  2. Android为TV端助力:UDP协议(接收组播和单播)

    private static String MulticastHost="224.9.9.98";private static int POST=19999;private sta ...

  3. Android Studio打包SDK后,为什么没有bundles文件夹?

    在Android Studio中,将项目打包成jar包,按照网上说的方法打包完成后,在intermediates文件夹下没有bundles,AS版本3.1.2,后来发现,原来是intermediate ...

  4. Win10中Vue.js的安装和项目搭建

    一. 提前准备工作 1.Node.js环境 2.Windows10 3.npm(前端包管理工具) 4.webpack(前端资源加载/打包工具) 二. 开始安装 1..下载并安装Node.js 下载地址 ...

  5. shiro经典通俗易懂javase例子

    package com.cun; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.*; import org. ...

  6. 分布式系统CAP理论

    在单机的数据库系统之中,我们很容易实现一套满足ACID 特性的 事务处理系统, 事务的一致性不存在问题. 但是在分布式系统之中,由于数据分布在不同的主机结点上,如何对着些数据进行分布式的事务处理就具有 ...

  7. C# 得到EXCEL表格中的有效行数和列数 中 CurrentRegion 的有效范围

  8. python从开始到放弃想标题的day12

    上次有说道函数的返回值,但是不是所有的数据类型都有返回值,一些常用的比如str基本都有返回值,list基本都没有返回值,dict基本都有返回值,还有就是函数和函数之间的数据是互不影响的,哪怕是一个函数 ...

  9. ARTS打卡第四周

    Algorithm 只出现一次的数字   给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用 ...

  10. 题解 P1944 最长括号匹配_NOI导刊2009提高(1)

    栈,模拟 把每个元素逐个入栈 如果和栈顶元素匹配,那么一块弹出去,同时标记这里是可匹配的. 取出连续的,最长的可匹配的序列即可. #include <iostream> #include ...