题目地址:P5300 [GXOI/GZOI2019]与或和

考虑按位计算贡献

对于 AND 运算,只有全 \(1\) 子矩阵才会有贡献

对于 OR 运算,所以非全 \(0\) 子矩阵均有贡献

如果求一个 01 矩阵中全 \(0/1\) 子矩阵的个数呢?

单调栈可以 \(O(n^2)\) 实现

总时间复杂度 \(O(n^2k)\) 其中 \(k\) 是二进制位数

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e3 + 6, P = 1e9 + 7;
int n, a[N][N], h[N], s[N], w[N], p;
ll ans[2];

inline ll get(int x) {
    return (1ll * x * (x + 1)) >> 1;
}

inline ll calc(int o) {
    ll cnt = 0;
    for (int j = 1; j <= n; j++) h[j] = 0;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            if ((a[i][j] & 1) == o) ++h[j];
            else h[j] = 0;
            if (h[j] > s[p]) s[++p] = h[j], w[p] = 1;
            else {
                int k = 0;
                while (s[p] > h[j]) {
                    k += w[p];
                    cnt += (s[p] - max(s[p-1], h[j])) * get(k);
                    --p;
                }
                s[++p] = h[j], w[p] = k + 1;
            }
        }
        int k = 0;
        while (p) {
            k += w[p];
            cnt += (s[p] - s[p-1]) * (get(k));
            --p;
        }
    }
    return cnt % P;
}

void work(int o) {
    if (o == 32) return;
    ans[0] += calc(1) * (1 << o) % P, ans[0] %= P;
    ans[1] += (get(n) * get(n) % P - calc(0)) * (1 << o) % P, ans[1] %= P;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            a[i][j] >>= 1;
    work(o + 1);
}

int main() {
    cin >> n;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            scanf("%d", &a[i][j]);
    work(0);
    cout << (ans[0] + P) % P << " " << (ans[1] + P) % P << endl;
    return 0;
}

P5300 [GXOI/GZOI2019]与或和的更多相关文章

  1. luogu P5300 [GXOI/GZOI2019]与或和

    传送门 题目涉及按位与以及按位或运算,所以可以拆位考虑,枚举某个二进制位,然后某个位置如果那个数的第\(i\)位是\(0\)就放\(0\),否则放\(1\),这一位的贡献就是位运算后值为\(1\)的子 ...

  2. 【题解】Luogu P5300 [GXOI/GZOI2019]与或和

    原题传送门 我们珂以拆位,拆成一个个0/1矩阵 贡献珂以用全0,全1的子矩阵的个数来计算 全0,全1的子矩阵的个数珂以用悬线法/单调栈解决 #include <bits/stdc++.h> ...

  3. GXOI/GZOI2019题解

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

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

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

  5. [LOJ3087][GXOI/GZOI2019]旅行者——堆优化dijkstra

    题目链接: [GXOI/GZOI2019]旅行者 我们考虑每条边的贡献,对每个点求出能到达它的最近的感兴趣的城市(设为$f[i]$,最短距离设为$a[i]$)和它能到达的离它最近的感兴趣的城市(设为$ ...

  6. [LOJ3088][GXOI/GZOI2019]旧词——树链剖分+线段树

    题目链接: [GXOI/GZOI2019]旧词 对于$k=1$的情况,可以参见[LNOI2014]LCA,将询问离线然后从$1$号点开始对这个点到根的路径链修改,每次询问就是对询问点到根路径链查询即可 ...

  7. [LOJ3086][GXOI/GZOI2019]逼死强迫症——递推+矩阵乘法

    题目链接: [GXOI/GZOI2019]逼死强迫症 设$f[i][j]$表示前$i$列有$j$个$1*1$的格子的方案数,那么可以列出递推式子: $f[i][0]=f[i-1][0]+f[i-2][ ...

  8. [LOJ3084][GXOI/GZOI2019]宝牌一大堆——DP

    题目链接: [GXOI/GZOI2019]宝牌一大堆 求最大值容易想到$DP$,但如果将$7$种和牌都考虑进来的话,$DP$状态不好设,我们将比较特殊的七小对和国士无双单独求,其他的进行$DP$. 观 ...

  9. P5305 [GXOI/GZOI2019]旧词

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

随机推荐

  1. AtCoder Grand Contest 032-B - Balanced Neighbors (构造)

    Time Limit: 2 sec / Memory Limit: 1024 MB Score : 700700 points Problem Statement You are given an i ...

  2. 使用VScode配合chrome实现网页自动刷新

    1.使用插件:livereload 2.VScode商店中搜索上述插件安装 3.Chrome商店中搜素上述插件安装 并设置允许访问文件网址: 4.在两方插件都打开的情况下,VScode中按下ctrl+ ...

  3. Riccati方程(微分方程)

    形如:$$\frac{dy}{dx}=P(x)y^{2}+Q(x)y+R(x)$$ 其中P(x).Q(x).R(x)是连续可微函数 或形如 $$\frac{dy}{dx}=ay^{2}+\frac{k ...

  4. Spring Boot与分布式

    ---恢复内容开始--- 分布式.Dubbo/Zookeeper.Spring Boot/Cloud 一.分布式应用 在分布式系统中,国内常用zookeeper+dubbo组合, 而Spring Bo ...

  5. Photoshop打造唯美的蓝色古装外景人物图片

    <点小图查看大图> 最终效果 1.打开原图素材大图,按Ctrl + J 把背景图层复制一层,用模糊工具把红圈区域背景模糊处理. <图1> 2.创建可选颜色调整图层,对黄色,绿色 ...

  6. Python Scrapy反爬虫常见解决方案(包含5种方法)

    爬虫的本质就是“抓取”第二方网站中有价值的数据,因此,每个网站都会或多或少地采用一些反爬虫技术来防范爬虫.比如前面介绍的通过 User-Agent 请求头验证是否为浏览器.使用 JavaScript ...

  7. spring 方法验证参数

    1:实体使用 @Valid    使用 validation  类注解 2:String 使用 controller 添加 @Validated @NotBlank(message = "i ...

  8. 起步wex5 谷歌浏览器兼容性问题,CheckBox不显示

  9. Centos7 安装gitLab

    我这里使用的是centos 7 64bit,我试过centos 6也是可以的! 1. 安装依赖软件 yum -y install policycoreutils openssh-server open ...

  10. ElementUI DatePicker 日期选择器控制选择时间范围

    选择今天以及今天之后的日期 <el-date-picker v-model="value1" type="date" placeholder=" ...