题目链接懒得放了。

题目大意懒得写了。

省选原题哪有找不到的……


说实话,其实这题是个大水题,被我十秒钟内口胡出来了。

首先位运算除了拆位还能干啥?以下以与为例,或是差不多的。

我们考虑有多少个子矩阵会对这一位答案产生贡献,其实就是全 $1$ 的子矩阵。

问题转化为计算全 $1$ 子矩阵的个数。

这是一个简单题。考虑枚举右下角,发现包括这个右下角的子矩阵肯定长这样:(画的比较丑,意会就好了)

也就是高度单调递增。

高度可以做到 $O(1)$ 转移(从 $h[i-1][j]$)转移。

至于递增的高度,直接一个单调栈。(设为 $s$)

那么这个点为右下角的矩阵个数为 $(s_1-s_0)h[i][s_1]+(s_2-s_1)h[i][s_2]+\cdots+(s_{top}-s_{top-1})h[i][s_{top}]$。这个也可以入出栈时随便更新一下。

时间复杂度 $O(n^2\log a_i)$。

(然而一开始式子推错了,调了好久,回来再看看发现自己就是个sb……)

#include<bits/stdc++.h>
using namespace std;
const int maxn=,mod=;
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline int read(){
char ch=getchar();int x=,f=;
while(ch<'' || ch>'') f|=ch=='-',ch=getchar();
while(ch>='' && ch<='') x=x*+ch-'',ch=getchar();
return f?-x:x;
}
int n,a[maxn][maxn],b[maxn][maxn],ans1,ans2,h[maxn],stk[maxn],tp,sum;
int calc1(){
int ans=;
MEM(h,);
FOR(i,,n){
MEM(stk,);tp=sum=;
FOR(j,,n) h[j]=b[i][j]?h[j]+:;
FOR(j,,n){
while(tp && h[j]<h[stk[tp]]){
sum=(sum-1ll*h[stk[tp]]*(stk[tp]-stk[tp-])%mod+mod)%mod;
tp--;
}
stk[++tp]=j;
sum=(sum+1ll*h[stk[tp]]*(stk[tp]-stk[tp-]))%mod;
ans=(ans+sum)%mod;
}
}
return ans;
}
int calc2(){
int ans=;
MEM(h,);
FOR(i,,n){
MEM(stk,);tp=sum=;
FOR(j,,n) h[j]=b[i][j]?:h[j]+;
FOR(j,,n){
while(tp && h[j]<h[stk[tp]]){
sum=(sum-1ll*h[stk[tp]]*(stk[tp]-stk[tp-])%mod+mod)%mod;
tp--;
}
stk[++tp]=j;
sum=(sum+1ll*h[stk[tp]]*(stk[tp]-stk[tp-]))%mod;
ans=(ans+sum)%mod;
}
}
int tot=1ll*n*(n+)*n*(n+)/%mod;
return (tot-ans+mod)%mod;
}
int main(){
n=read();
FOR(i,,n) FOR(j,,n) a[i][j]=read();
FOR(_,,){
FOR(i,,n) FOR(j,,n) b[i][j]=(a[i][j]>>_)&;
ans1=(ans1+1ll*calc1()*(<<_))%mod;
ans2=(ans2+1ll*calc2()*(<<_))%mod;
}
printf("%d %d\n",ans1,ans2);
}

[GXOI/GZOI2019]与或和(位运算,单调栈)的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. P5300 [GXOI/GZOI2019]与或和

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

随机推荐

  1. ABA问题的产生及解决

    什么是ABA问题 在CAS算法中,需要取出内存中某时刻的数据(由用户完成),在下一时刻比较并交换(CPU保证原子操作),这个时间差会导致数据的变化. 1.线程1从内存位置V中取出A2.线程2从内存位置 ...

  2. mysql判断是否存在数据库和表,进行删除和创建

    1.存在莫数据库,则删除创建一个新库 drop database if exists `tpm_business`; CREATE DATABASE tpm_business DEFAULT CHAR ...

  3. Eclipse/Idea 代码格式化部分忽略

    有时候我们写一些代码的时候,格式化后,会使代码格式变得不美观.不易读,这里在看一些源码的时候发现有这么一种操作,随手记下 效果 那个代码像以下这样,@formatter:off开启关闭格式化,@for ...

  4. 前端学习:JS(面向对象)代码笔记

    前端学习:JS(面向对象)代码笔记 前端学习:JS面向对象知识学习(图解) 创建类和对象 创建对象方式1调用Object函数 <body> </body> <script ...

  5. MVC+Ninject+三层架构+代码生成 -- 总结(二、建項目)

    1.項目分層,其中SqlSugar 是一個ORM 庫類. 2.VS庫類 視圖.

  6. 4种引用与垃圾回收 :StrongReference, SoftReference, WeakReference , PhantomReference

  7. 基于注解的SpringAOP源码解析(二)

    在上篇文章 中我们搭建了一个阅读源码的demo工程,然后简单介绍了一下@EnableAspectJAutoProxy注解,这个注解最重要的功能就是为向Spring中注入了一个beanAnnotatio ...

  8. mybatis源码/mybatis执行流程源码解析

    https://www.cnblogs.com/cxiaocai/tag/%E9%9D%A2%E8%AF%95%E9%A2%98/public SqlSession session; public S ...

  9. Kubernetes CNI网络插件

    CNI 容器网络接口,就是在网络解决方案由网络插件提供,这些插件配置容器网络则通过CNI定义的接口来完成,也就是CNI定义的是容器运行环境与网络插件之间的接口规范.这个接口只关心容器的网络连接,在创建 ...

  10. 结合 Vue.observable 写一个简易 Vuex

    作为 Vue 全家桶的一员,Vuex 的重要性不言而喻,不管是用来管理状态,还是封装 Controler 都很好用 不过在一些体量较小的项目中,为了几个简单的状态或者处理函数而引入 Vuex,就像是高 ...