[LOJ3083][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]与或和——单调栈的更多相关文章
- 洛谷.5300.[GXOI/GZOI2019]与或和(单调栈)
LOJ BZOJ 洛谷 想了一个奇葩的单调栈,算的时候要在中间取\(\min\),感觉不靠谱不写了=-= 调了十分钟发现输出没取模=v= BZOJ好逗逼啊 题面连pdf都不挂了 哈哈哈哈 枚举每一位. ...
- [GXOI/GZOI2019]与或和(单调栈)
想了想决定把这几题也随便水个解题报告... bzoj luogu 思路: 首先肯定得拆成二进制30位啊 此后每一位的就是个01矩阵 Q1就是全是1的矩阵个数 Q2就是总矩阵个数减去全是0的矩阵个数 ...
- 【BZOJ5502】[GXOI/GZOI2019]与或和(单调栈)
[BZOJ5502][GXOI/GZOI2019]与或和(单调栈) 题面 BZOJ 洛谷 题解 看到位运算就直接拆位,于是问题变成了求有多少个全\(0\)子矩阵和有多少个全\(1\)子矩阵. 这两个操 ...
- LOJ#3083.「GXOI / GZOI2019」与或和_单调栈_拆位
#3083. 「GXOI / GZOI2019」与或和 题目大意 给定一个\(N\times N\)的矩阵,求所有子矩阵的\(AND(\&)\)之和.\(OR(|)\)之和. 数据范围 \(1 ...
- 「洛谷5300」「GXOI/GZOI2019」与或和【单调栈+二进制转化】
题目链接 [洛谷传送门] 题解 按位处理. 把每一位对应的图都处理出来 然后单调栈处理一下就好了. \(and\)操作处理全\(1\). \(or\)操作处理全\(0\). 代码 #include & ...
- LOJ#3083. 「GXOI / GZOI2019」与或和(单调栈)
题面 传送门 题解 按位考虑贡献,如果\(mp[i][j]\)这一位为\(1\)就设为\(1\)否则设为\(0\),对\(or\)的贡献就是全为\(1\)的子矩阵个数,对\(and\)的贡献就是总矩阵 ...
- [GXOI/GZOI2019]与或和(位运算,单调栈)
题目链接懒得放了. 题目大意懒得写了. 省选原题哪有找不到的…… 说实话,其实这题是个大水题,被我十秒钟内口胡出来了. 首先位运算除了拆位还能干啥?以下以与为例,或是差不多的. 我们考虑有多少个子矩阵 ...
- [GX/GZOI2019]与或和(单调栈+按位运算)
首先看到与或,很显然想到按照位拆分运算.然后就变成了0/1矩阵,要使矩阵在当前位与为1,则矩阵全为1,如果是或为1,则是矩阵不全为0,然后求全为0/1的矩阵个数即可.记录c[i][j]表示以a[i][ ...
- P5300 [GXOI/GZOI2019]与或和
题目地址:P5300 [GXOI/GZOI2019]与或和 考虑按位计算贡献 对于 AND 运算,只有全 \(1\) 子矩阵才会有贡献 对于 OR 运算,所以非全 \(0\) 子矩阵均有贡献 如果求一 ...
随机推荐
- ext遍历表单中所有输入项,并全部设置为只读
baseInfoForm.getForm().getFields().each(function (field) { // 设置只读 field.setReadOnly(true); })
- VS2017在线安装包下载
VS2017个人免费版即社区官方下载地址为:https://download.microsoft.com/download/D/1/4/D142F7E7-4D7E-4F3B-A399-5BACA91E ...
- Linux系统下virtuoso数据库安装与使用
最近在调研关联数据的一些东西,需要用到rdf数据库,所以接触了virtuoso数据库.安装的坑其实并不多,之前在windows 10上安过一次.这次在ubuntu 18.04上安装一下,其他的linu ...
- 两种动态SQL
参考:http://www.cnblogs.com/wanyuan8/archive/2011/11/09/2243483.htmlhttp://www.cnblogs.com/xbf321/arch ...
- ASP.NET -- WebForm -- ScriptManager 类
ASP.NET -- WebForm -- ScriptManager 类 通过 ScriptManager 可注册随后将作为页面一部分呈现的脚本. 1. 注册并立即执行脚本. --RegisterS ...
- Python简单多进程demo
''' 多线程使用场景: 怎样用Python的多线程提高效率? io操作不占用CPU 计算操作占用CPU Python多线程不适合CPU操作密集型的任务,适合io操作密集型的任务 如果有CPU操作密集 ...
- 【Python 20】BMR计算器4.0(异常处理)
1.案例描述 基础代谢率(BMR):我们安静状态下(通常为静卧状态)消耗的最低热量,人的其他活动都建立在这个基础上. 计算公式: BMR(男) = (13.7*体重kg)+(5.0*身高cm)-(6. ...
- 初始数据结构(python语言)
数据结构 概念:数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成 算法复杂度 时间复杂度 时间复杂度是同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法 ...
- 19.java反射入门
一.反射机制是什么反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为jav ...
- Git—推送代码至Github
Git—上传代码至Github 首先得有个Github的账户,然后创建一个库. 然后找到指向改库的URL 第一次上传需要设置用户邮箱,打开git安装文件/bin下面找到git.bash并打开,设置全局 ...