[GX/GZOI2019]与或和(单调栈+按位运算)
2024-08-29 19:14:50
首先看到与或,很显然想到按照位拆分运算。然后就变成了0/1矩阵,要使矩阵在当前位与为1,则矩阵全为1,如果是或为1,则是矩阵不全为0,然后求全为0/1的矩阵个数即可。记录c[i][j]表示以a[i][j]在该位向上0/1的长度。然后对于每一行,单调栈求解即可。
#include<bits/stdc++.h>
using namespace std;
const int N=,mod=1e9+;
int n,ans1,ans2,top,a[N][N],b[N][N],c[N][N],st[N],sum[N];
int calc()
{
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
c[i][j]=b[i][j]?c[i-][j]+:;
int ret=;
for(int i=;i<=n;i++)
{
st[]=top=;
for(int j=;j<=n;j++)
if(!c[i][j])st[]=j,top=;
else{
while(top&&c[i][j]<=c[i][st[top]])top--;
st[++top]=j,sum[top]=(sum[top-]+1ll*(j-st[top-])*c[i][j])%mod;
ret=(ret+sum[top])%mod;
}
}
return ret;
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
scanf("%d",&a[i][j]);
for(int t=;t<=;t++)
{
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
b[i][j]=(a[i][j]>>t)&;
ans1=(ans1+(1ll<<t)*calc())%mod;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
b[i][j]^=;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
ans2=(ans2+1ll*(n-i+)*(n-j+)%mod*(1ll<<t))%mod;
ans2=(ans2-(1ll<<t)*calc()%mod+mod)%mod;
}
printf("%d %d",ans1,ans2);
}
最新文章
- netty5 HTTP协议栈浅析与实践
- 19、ASP.NET MVC入门到精通——Unity
- .Net 闭包理解
- About_类与对象
- HTML基础知识总结
- 【HDU 2874】Connections between cities(LCA)
- Spark 实时计算整合案例
- GCD编程 之 略微提高篇
- day05
- java中的接口和抽象类是什么?
- cnetos6.4 x64 阿里云环境初探--安装pip,及pymysql
- CKEditor + CKFinder 实现编辑上传图片配置 (二)
- CSS3媒体查询(Media&#160;Queries)
- Windows下visual studio code搭建golang开发环境
- SQL点滴19—T-SQL中的透视和逆透视
- 字体图标 轻量级 Font Awesome
- jquery左右轮播
- jsp中EL表达式不起作用的问题1
- MACD技术的高级应用--MACD与波浪
- SourceInsight工具增强——AStyle(代码格式化)、PC-Lint(静态检查)
热门文章
- 使用openssl做CA服务器,并且生成证书。
- 吴裕雄--天生自然C++语言学习笔记:C++ 修饰符类型
- 吴裕雄--天生自然Django框架开发笔记:Django 模板
- MySQL授权用户登录访问指定数据库
- Mybatis实现增删改查(二)
- 7. react 基础 - React Developer Tools 的安装 及 使用
- python一个正则表达式的不解
- 文献阅读报告 - Social LSTM:Human Trajectory Prediction in Crowded Spaces
- Numa解释
- 问:为什么java是单继承,但却是多实现的呢?