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

题面

BZOJ

洛谷

题解

看到位运算就直接拆位,于是问题变成了求有多少个全\(0\)子矩阵和有多少个全\(1\)子矩阵。

这两个操作本质就是一样的,不妨考虑有多少个全\(1\)子矩阵。

预处理出每个元素向上能够找的最多的\(1\)的个数,对于每一行从做往右扫一遍,拿一个单调栈维护一下,这样子就可以计算出以每个元素为右下角时的贡献了。

时间复杂度\(O(n^2logV)\),在BZOJ上因为常数太大T了QwQ。

#include<iostream>
#include<cstdio>
using namespace std;
#define MAX 1010
#define MOD 1000000007
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int n,a[MAX][MAX],b[MAX][MAX],u[MAX][MAX];
int Q[MAX],h,t,ans1=0,ans2=0;
int main()
{
n=read();
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)a[i][j]=read();
for(int k=0;k<31;++k)
{
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)b[i][j]=(a[i][j]>>k)&1;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
if(!b[i][j])u[i][j]=0;
else u[i][j]=u[i-1][j]+1;
for(int i=1;i<=n;++i)
{
Q[h=t=1]=0;int now=0;
for(int j=1;j<=n;++j)
{
while(h<t&&u[i][Q[t]]>=u[i][j])now=(now+MOD-1ll*(Q[t]-Q[t-1])*u[i][Q[t]]%MOD)%MOD,--t;
now=(now+1ll*(j-Q[t])*u[i][j])%MOD;Q[++t]=j;
ans1=(ans1+1ll*now*(1<<k))%MOD;
}
}
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)b[i][j]^=1;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
if(!b[i][j])u[i][j]=0;
else u[i][j]=u[i-1][j]+1;
ans2=(ans2+1ll*(1<<k)%MOD*(1ll*n*(n+1)/2*n*(n+1)/2%MOD)%MOD)%MOD;
for(int i=1;i<=n;++i)
{
Q[h=t=1]=0;int now=0;
for(int j=1;j<=n;++j)
{
while(h<t&&u[i][Q[t]]>=u[i][j])now=(now+MOD-1ll*(Q[t]-Q[t-1])*u[i][Q[t]]%MOD)%MOD,--t;
now=(now+1ll*(j-Q[t])*u[i][j])%MOD;Q[++t]=j;
ans2=(ans2+MOD-1ll*now*(1<<k)%MOD)%MOD;
}
}
continue;
}
printf("%d %d\n",ans1,ans2);
return 0;
}

【BZOJ5502】[GXOI/GZOI2019]与或和(单调栈)的更多相关文章

  1. [LOJ3083][GXOI/GZOI2019]与或和——单调栈

    题目链接: [GXOI/GZOI2019]与或和 既然求的是二进制运算的和,那么我们按位考虑,这样就将矩阵变成了一个$01$矩阵. 对于或运算,就是求有多少个子矩形中有$1$. 直接求不好办,考虑有多 ...

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

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

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

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

  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. 2019Java查漏补缺(三)

    1.为什么这个public的类的类名必须和文件名相同    是为了方便虚拟机在相应的路径中找到相应的类所对应的字节码文件    2.java8 的一些新特性:     3: 数据库隔离级别 隔离级别 ...

  2. Spring Boot 相关

    SpringBoot工程 参数解析 HTTP Method Request / Response / Session Error/重定向 Logger IoC AOP/Aspect   1:Sprin ...

  3. fiddler几种功能强大的用法

    参考网址: http://caibaojian.com/fiddler.html http://www.cnblogs.com/tangdongchu/p/4178552.html 1.fiddler ...

  4. 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 ...

  5. keepalived+nginx负载均衡+ApacheWeb实现高可用

    1.Keepalived高可用软件 Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能.因此,kee ...

  6. Spring Boot使用注解实现AOP

    第一步: 添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId& ...

  7. iOS Accessibility指南

    开发者经常会为用户开发一些令人充满惊喜的App.但是,开发者真的为每一个潜在的用户都做适配了么?是否每个人都可以真正使用你的APP呢? 设计APP.产品或者任何类型的服务,都要考虑到所有用户,包括视力 ...

  8. Thirft简单使用

    安装Thrift 到thrift官网下载thrift.exe http://thrift.apache.org/download 将thrift-0.10.0.exe复制到C:\Program Fil ...

  9. RabbitMQ远程执行任务RPC。

    如果想发一条命令给远程机器,再把结果返回 这种模式叫RPC:远程过程调用 发送方将发送的消息放在一个queue里,由接收方取. 接收方再把执行结果放在另外一个queue里,由发送方取 实际上,发送方把 ...

  10. 新数据革命: 开源C#图形化爬虫引擎Hawk5发布

    https://ferventdesert.github.io/Hawk/ Hawk是一款由沙漠之鹰历时五年个人业余时间开发的,开源图形化爬虫和数据清洗工具,GitHub Star超过2k+,前几代版 ...