博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
题解: [GXOI/GZOI2019]与或和
阅读量:5241 次
发布时间:2019-06-14

本文共 1521 字,大约阅读时间需要 5 分钟。

我们考虑简化题意:

由于与运算和或运算在每一位上都是独立的,我们可以考虑对每一位进行计算。

子任务1是全1子矩阵

子任务2是总子矩阵个数减去全0子矩阵

然后就是单调栈原题 :洛谷 3400 仓鼠窝

#include 
using namespace std;#define re register#define ll long long#define gc getchar()inline int read(){ re int x(0),f(1);re char c(gc); while(c>'9'||c<'0')f=c=='-'?-1:1,c=gc; while(c>='0'&&c<='9')x=x*10+c-48,c=gc; return f*x;}const int N=1010,mod=1e9+7;int n,a[N][N],h[N][N],top,s[N];ll ans;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) { if((a[i][j]>>k)&1) h[i][j]=h[i-1][j]+1; else h[i][j]=0; } for(int i=1;i<=n;++i) { ll an(0);top=0; for(int j=1;j<=n;++j) { an+=h[i][j]; while(top&&h[i][s[top]]>=h[i][j]) an-=(s[top]-s[top-1])*(h[i][s[top--]]-h[i][j]); ans+=an<
>k)&1) h[i][j]=0; else h[i][j]=h[i-1][j]+1; } for(int i=1;i<=n;++i) { ll an(0);top=0; for(int j=1;j<=n;++j) { an+=h[i][j]; while(top&&h[i][s[top]]>=h[i][j]) an-=(s[top]-s[top-1])*(h[i][s[top--]]-h[i][j]); ans+=(1LL*i*j-an)<

  

转载于:https://www.cnblogs.com/zijinjun/p/11137421.html

你可能感兴趣的文章
linux后台运行和关闭SSH运行,查看后台任务
查看>>
桥接模式-Bridge(Java实现)
查看>>
303. Range Sum Query - Immutable
查看>>
【★】浅谈计算机与随机数
查看>>
Leetcode 226: Invert Binary Tree
查看>>
C# Dynamic通用反序列化Json类型并遍历属性比较
查看>>
前台freemark获取后台的值
查看>>
Leetcode: Unique Binary Search Trees II
查看>>
C++ FFLIB 之FFDB: 使用 Mysql&Sqlite 实现CRUD
查看>>
Spring-hibernate整合
查看>>
c++ map
查看>>
exit和return的区别
查看>>
Django 相关
查看>>
git init
查看>>
训练记录
查看>>
IList和DataSet性能差别 转自 http://blog.csdn.net/ilovemsdn/article/details/2954335
查看>>
Hive教程(1)
查看>>
第16周总结
查看>>
C#编程时应注意的性能处理
查看>>
Fragment
查看>>