开始完全没思路

在洛谷看到样例一,突发奇想,决定先做一下元素只有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. 二。Hibernate 查询 HQL、SQL方式

    hibernate的查询1.HQL方式:所有查询都是根据java对象名来完成,对象名替换表名2.SQL方式:保留原来的sql查询风格3.可以通过设置第一条和最大条数来实现各种数据库的分页查询4.通过B ...

  2. AI移动自动化测试框架设计(解读)

    声明:原文出自"前端之巅"微信公众号"爱奇艺基于AI的移动端自动化测试框架的设计"一文,作者:何梁伟,爱奇艺Android架构师.文章提供了一种基于AI算法的自 ...

  3. 正则表达式和re模块

    目录 re的元字符 字符集[ ] 转义符 分组 ( ) |符号 re下的常用方法 分组 re的元字符 import re ret = re.findall("e..a", &quo ...

  4. 浅析RPC远程过程调用基本原理

    在校期间大家都写过不少程序,比如写个hello world服务类,然后本地调用下,如下所示.这些程序的特点是服务消费方和服务提供方是本地调用关系. 而一旦踏入公司尤其是大型互联网公司就会发现,公司的系 ...

  5. 宝塔控制面板创建ftp后链接不上的解决方法

    很多的新手在安装宝塔面板并且创建完ftp管理后链接ftp居然链接不上?有许多朋友都不知道本站q302博客也是基于宝塔控制面板管理的,本站在安装网站完成后也和你们一样ftp链接不上,后面经过多次测试之后 ...

  6. webstorm配置svn详解

    1. 打开webstorm-> file -> setting -> plguins 输入svn如果没有SVNToolBox就在下面的列表中安装SVNToolBox插件即可. 2.c ...

  7. nginx的配置与应用

    Nginx在应用程序中主要有以下作用(应用):1.解决跨域.2.请求过滤.3.配置Gzip.4.负载均衡.5.静态资源服务器. Nginx的配置结构 Nginx主要是通过修改配置文件nginx.con ...

  8. 排序—时间复杂度为O(n2)的三种排序算法

    1 如何评价.分析一个排序算法? 很多语言.数据库都已经封装了关于排序算法的实现代码.所以我们学习排序算法目的更多的不是为了去实现这些代码,而是灵活的应用这些算法和解决更为复杂的问题,所以更重要的是学 ...

  9. Warning: Using a password on the command line interface can be insecure.

    [root@qttc ~]# /usr/local/mysql/bin/mysqldump  -uroot -proot db > bak.sqlWarning: Using a passwor ...

  10. nodejs 实现跨域

    1.nodejs let http = require('http'); http.createServer((req,res) => { res.setHeader("Access- ...