题目链接:

[GXOI/GZOI2019]与或和

既然求的是二进制运算的和,那么我们按位考虑,这样就将矩阵变成了一个$01$矩阵。

对于或运算,就是求有多少个子矩形中有$1$。

直接求不好办,考虑有多少个矩形只有$0$。

我们统计以每个$0$为矩形右下角的矩形有多少个。

对于第$i$行的每一列维护出从这一行开始往上有多少个连续的$0$。

现在问题就变成了对于第$i$行的每一列,之前有多少个格子能作为矩形的左上角和它匹配。

用单调栈维护一个单调递增的序列对每行分别统计答案即可。

对于与运算,就是将总子矩形数$-$包含$0$的子矩形数,对$0$再做一遍即可。

#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<bitset>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define pr pair<int,int>
using namespace std;
const int mod=1e9+7;
ll ans1,ans2;
int a[1010][1010];
int b[1010][1010];
int n;
int mx[1010];
int top;
pr st[1010];
ll sum;
ll find1()
{
memset(mx,0,sizeof(mx));
ll res=0;
for(int i=1;i<=n;++i)
{
ll num=0;
top=0;
for(int j=1;j<=n;++j)
{
mx[j]=b[i][j]?mx[j]+1:0;
int len=1;
while(top&&st[top].first>=mx[j])
{
num-=st[top].first*st[top].second;
len+=st[top].second;
top--;
}
num+=mx[j]*len;
res=(res+num)%mod;
st[++top]=make_pair(mx[j],len);
}
}
return res;
}
ll find2()
{
memset(mx,0,sizeof(mx));
ll res=0;
for(int i=1;i<=n;++i)
{
ll num=0;
top=0;
for(int j=1;j<=n;++j)
{
mx[j]=(!b[i][j])?mx[j]+1:0;
int len=1;
while(top&&st[top].first>=mx[j])
{
num-=st[top].first*st[top].second;
len+=st[top].second;
top--;
}
num+=mx[j]*len;
res=(res+num)%mod;
st[++top]=make_pair(mx[j],len);
}
}
return res;
}
int main()
{
scanf("%d",&n);
sum=1ll*n*(n+1)/2*n*(n+1)/2;
sum%=mod;
for(int i=1;i<=n;++i)
{
for(int j=1;j<=n;++j)
{
scanf("%d",&a[i][j]);
}
}
for(int k=0;k<=31;++k)
{
for(int i=1;i<=n;++i)
{
for(int j=1;j<=n;++j)
{
if(a[i][j]&(1<<k))
{
b[i][j]=1;
}
else
{
b[i][j]=0;
}
}
}
ans1+=(1ll<<k)%mod*find1()%mod,ans1%=mod;
ans2+=(1ll<<k)%mod*(sum-find2()+mod)%mod,ans2%=mod;
}
ans1=(ans1%mod+mod)%mod,ans2=(ans2%mod+mod)%mod;
printf("%lld %lld",ans1,ans2);
}

[LOJ3083][GXOI/GZOI2019]与或和——单调栈的更多相关文章

  1. 洛谷.5300.[GXOI/GZOI2019]与或和(单调栈)

    LOJ BZOJ 洛谷 想了一个奇葩的单调栈,算的时候要在中间取\(\min\),感觉不靠谱不写了=-= 调了十分钟发现输出没取模=v= BZOJ好逗逼啊 题面连pdf都不挂了 哈哈哈哈 枚举每一位. ...

  2. [GXOI/GZOI2019]与或和(单调栈)

    想了想决定把这几题也随便水个解题报告... bzoj  luogu 思路: 首先肯定得拆成二进制30位啊 此后每一位的就是个01矩阵 Q1就是全是1的矩阵个数 Q2就是总矩阵个数减去全是0的矩阵个数 ...

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

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

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

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

  5. 「洛谷5300」「GXOI/GZOI2019」与或和【单调栈+二进制转化】

    题目链接 [洛谷传送门] 题解 按位处理. 把每一位对应的图都处理出来 然后单调栈处理一下就好了. \(and\)操作处理全\(1\). \(or\)操作处理全\(0\). 代码 #include & ...

  6. LOJ#3083. 「GXOI / GZOI2019」与或和(单调栈)

    题面 传送门 题解 按位考虑贡献,如果\(mp[i][j]\)这一位为\(1\)就设为\(1\)否则设为\(0\),对\(or\)的贡献就是全为\(1\)的子矩阵个数,对\(and\)的贡献就是总矩阵 ...

  7. [GXOI/GZOI2019]与或和(位运算,单调栈)

    题目链接懒得放了. 题目大意懒得写了. 省选原题哪有找不到的…… 说实话,其实这题是个大水题,被我十秒钟内口胡出来了. 首先位运算除了拆位还能干啥?以下以与为例,或是差不多的. 我们考虑有多少个子矩阵 ...

  8. [GX/GZOI2019]与或和(单调栈+按位运算)

    首先看到与或,很显然想到按照位拆分运算.然后就变成了0/1矩阵,要使矩阵在当前位与为1,则矩阵全为1,如果是或为1,则是矩阵不全为0,然后求全为0/1的矩阵个数即可.记录c[i][j]表示以a[i][ ...

  9. P5300 [GXOI/GZOI2019]与或和

    题目地址:P5300 [GXOI/GZOI2019]与或和 考虑按位计算贡献 对于 AND 运算,只有全 \(1\) 子矩阵才会有贡献 对于 OR 运算,所以非全 \(0\) 子矩阵均有贡献 如果求一 ...

随机推荐

  1. Xaramin IOS 开发常见问题

    调试时提示找不到obj某某文件,勾选后编译,再取消勾选后再次调试 APP不能上网(而且无法通过配置允许上网的APP,因为根本 找不到需要的APP),不要使用IOS11测试版本,自动禁网 截图路径 %U ...

  2. 广州.NET微软技术俱乐部提技术问题的正确方式

    这是 北京.NET微软技术俱乐部 里一个人问问题的方式, 很赞, 所以希望大家问问题也采用这种方式. 耗时少, 使用12月8日活动上董志强先生介绍的windows 10 Snip&Sketch ...

  3. Tips on GORM, Avoid Error about "duplicate column name: id"

    The GORM is an super easy ORM solution for Go language. But many people would get the error about du ...

  4. Docker for Win10中文乱码问题

    environment:win10  docker+centos7+nginx1.9.9 issue:在docker运行nginx(centos),volume本地html目录挂载到nginx的htm ...

  5. 第四篇 CSS

    在标签上设置style属性: background-color:#2459a2: height:48px: ... 编写CSS样式: 如何注释:/* 或 */ 一. 在标签的属性中编写 <!DO ...

  6. SQL Server捕获发生The query processor ran out of internal resources and could not produce a query plan...错误的SQL语句

    最近收到一SQL Server数据库服务器的告警邮件,告警内容具体如下所示: DATE/TIME: 10/23/2018 4:30:26 PM DESCRIPTION:  The query proc ...

  7. C#-委托delegate

    目录 委托的定义 委托的声明 委托的实例 委托的注意细节 泛型委托(详见<精通C#>--10.4泛型委托) 1.Action<>委托 3.Func<>委托 附录 委 ...

  8. 创建你的一个composer包

    如何创建自己的一个composer包,这个其实很好解决的!只要你了解composer相关的知识便不难做到. 首先,你还不知道什么是composer的话,请先学习下composer的相关知识.简单的说, ...

  9. 我的第一个python web开发框架(31)——定制ORM(七)

    几个复杂的ORM方式都已介绍完了,剩下一些常用的删除.获取记录数量.统计合计数.获取最大值.获取最小值等方法我就不一一详细介绍了,直接给出代码大家自行查看. #!/usr/bin/env python ...

  10. 【Linux基础】查看硬件信息-内存和硬盘

     1.使用free命令查看内存使用 (1)内存总量大小:查看Mem中的total值3697M free -m total used free shared buffers cached -/+ buf ...