开始完全没思路

在洛谷看到样例一,突发奇想,决定先做一下元素只有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...

贴个代码

#include <cstdio>
#define ll long long const ll MOD = 1e9+; inline ll read(){
ll x = ; int zf = ; char ch = ' ';
while (ch != '-' && (ch < '' || ch > '')) ch = getchar();
if (ch == '-') zf = -, ch = getchar();
while (ch >= '' && ch <= '') x = x * + ch - '', ch = getchar(); return x * zf;
} ll atot[][];
int a[][];
int sum[][]; ll ff[][]; ll or_init; struct Node{
ll pos;
ll hei;
} ddstk[];
int top; int main(){
int n = read();
for (register int i = ; i < n; ++i)
for (register int j = ; j < n; ++j)
atot[i][j] = read();
for (register int i = ; i <= n; ++i){
for (register int j = ; j <= n; ++j){
ff[i][j] = ff[i - ][j] + ff[i][j - ] - ff[i - ][j - ] + i * j;
if (ff[i][j] < )
ff[i][j] += MOD;
ff[i][j] %= MOD;
}
}
or_init = ff[n][n];
ll ans1 = , cur_ans1, ans2 = , cur_ans2;
ddstk[].pos = ;
for (int flr = ; flr < ; ++flr){
for (register int i = ; i < n; ++i)
for (register int j = ; j < n; ++j)
a[i][j] = (atot[i][j] & ( << flr)) ? : ;
//getAnd
for (register int i = ; i < n; ++i)
for (register int j = ; j < n; ++j)
if (i != )
sum[i][j] = (a[i][j] == ) ? sum[i - ][j] + : ;
else
sum[i][j] = (a[i][j] == ) ? : ;
cur_ans1 = ;
for (register int i = ; i < n; ++i){
top = ;
for (register int k = ; k < n; ++k){
while (top){
if (sum[i][k] <= ddstk[top].hei)
--top;
else
break;
}
ddstk[++top].pos = k + ;
ddstk[top].hei = sum[i][k];
for (int l = top; l >= ; --l){
cur_ans1 += ddstk[l].hei * (ddstk[l].pos - ddstk[l - ].pos);
cur_ans1 %= MOD;
}
}
}
ans1 += (cur_ans1 * ((1ll << flr) % MOD)) % MOD;
ans1 %= MOD;
//getOr
for (register int i = ; i < n; ++i)
for (register int j = ; j < n; ++j)
if (i != )
sum[i][j] = (a[i][j] == ) ? sum[i - ][j] + : ;
else
sum[i][j] = (a[i][j] == ) ? : ;
cur_ans2 = ;
for (register int i = ; i < n; ++i){
top = ;
for (register int k = ; k < n; ++k){
while (top){
if (sum[i][k] <= ddstk[top].hei)
--top;
else
break;
}
ddstk[++top].pos = k + ;
ddstk[top].hei = sum[i][k];
for (int l = top; l >= ; --l){
cur_ans2 += ddstk[l].hei * (ddstk[l].pos - ddstk[l - ].pos);
cur_ans2 %= MOD;
}
}
}
cur_ans2 = (or_init - cur_ans2 + MOD) % MOD;
ans2 += (cur_ans2 * ((1ll << flr) % MOD)) % MOD;
ans2 %= MOD;
}
printf("%lld %lld", ans1, ans2);
return ;
}

题解:[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. 【原创】从Rest到Graphql

    引言 开局两张图,内容全靠编- ok,如图所示,我在去年曾经写过一篇文章<闲侃前后端分离的必要性>.嗯,我知道肯定很多人没看过.所以我做一个总结,其实啰里八嗦了一篇文章,就是想说一下现在的 ...

  2. Java Core - ‘==’和‘equals’的区别

    不管是‘==’还是‘equals’,他们的比较都需要区分类型来讨论的: ‘==’ 当比较的数据类型是基本类型时,比较值是否相同 当比较的数据类型是引用类型时,不仅比较值相同还比较其所在内存地址是否相同 ...

  3. mysql 8.0.X 创建新的数据库、用户并授权

    一.创建数据库 mysql> create database jira; Query OK, 0 rows affected (0.09 sec) 二.创建用户 mysql> create ...

  4. 【转】Linux中的特殊权限粘滞位(sticky bit)详解

    Linux下的文件权限 在linux下每一个文件和目录都有自己的访问权限,访问权限确定了用户能否访问文件或者目录和怎样进行访问.最为我们熟知的一个文件或目录可能拥有三种权限,分别是读.写.和执行操作, ...

  5. Appium环境搭建-精简版

    Appium自动化环境准备 安装配置JDK 下载Android SDK并配置环境变量 安装模拟器或连接真机 安装appium desktop 安装python和pycharm (开发语言和开发工具) ...

  6. [ffmpeg] 解码API

    版本迭代 ffmpeg解码API经过了好几个版本的迭代,上一个版本的API是 解码视频:avcodec_decode_video2 解码音频:avcodec_decode_audio4 我们现在能看到 ...

  7. 上传图片,通过node服务器存储在指定目录

    最近做毕设,需要上传图片,因为在本地服务器运行,所以想着前端上传后,通过node服务器接收图片,存储在指定的目录下. 一.前端实现 1.前端的页面和上传图片是利用element-ui组件实现的,&qu ...

  8. Go语言中的Package问题

    问题一.Go使用Package组织源码的好处是什么? 1.任何源码属于一个包 2.用包组织便于代码的易读和复用 问题二.Go语言中Package的种类 Go语言中存在两种包.一种是可执行程序的包.一种 ...

  9. MT【323】向量模的范围

    已知单位向量 $\overrightarrow e_1,\overrightarrow e_2$ 的夹角为 $120^\circ$,$\left|x\overrightarrow e_1+y\over ...

  10. 搭建Linux下的SVN服务器

    ______________________________________________配置SVN步骤______________________________________________ ...