题目链接

LOJ:https://loj.ac/problem/3083

洛谷:https://www.luogu.org/problemnew/show/P5300

Solution

逐位考虑,可以发现问题就是求一个\(\rm 01\)矩阵的全\(\rm 0\)子矩形个数。

那么我们可以用一个上升的单调栈来求这个,总复杂度\(O(n^2\log v)\)。

#include<bits/stdc++.h>
using namespace std; void read(int &x) {
x=0;int f=1;char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
} void print(int x) {
if(x<0) putchar('-'),x=-x;
if(!x) return ;print(x/10),putchar(x%10+48);
}
void write(int x) {if(!x) putchar('0');else print(x);putchar('\n');} #define lf double
#define ll long long #define pii pair<int,int >
#define vec vector<int > #define pb push_back
#define mp make_pair
#define fr first
#define sc second #define FOR(i,l,r) for(int i=l,i##_r=r;i<=i##_r;i++) const int maxn = 1e3+10;
const int inf = 1e9;
const lf eps = 1e-8;
const int mod = 1e9+7; int add(int x,int y) {return x+y>=mod?x+y-mod:x+y;}
int del(int x,int y) {return x-y<0?x-y+mod:x-y;}
int mul(int x,int y) {return 1ll*x*y-1ll*x*y/mod*mod;} int s[maxn][maxn],a[maxn][maxn],in[maxn][maxn],n,ans1,ans2,top,sta[maxn]; int calc() {
FOR(i,1,n) FOR(j,1,n) s[i][j]=a[i][j]*(s[i-1][j]+1);
ll res=0;
FOR(i,1,n) {
sta[top=0]=0;ll tmp=0;
FOR(j,1,n) {
tmp+=s[i][j];
while(top&&s[i][sta[top]]>=s[i][j])
tmp-=(s[i][sta[top]]-s[i][j])*(sta[top]-sta[top-1]),top--; //弹栈的时候把不合法贡献减去
sta[++top]=j;res+=tmp;
}
}return res%mod; } void solve(int x) {
FOR(i,1,n) FOR(j,1,n) a[i][j]=(in[i][j]>>x)&1;
ans1=add(ans1,mul(calc(),1<<x));
FOR(i,1,n) FOR(j,1,n) a[i][j]^=1,ans2=add(ans2,mul(i*j,1<<x));
ans2=del(ans2,mul(calc(),1<<x));
} int main() {
read(n);FOR(i,1,n) FOR(j,1,n) read(in[i][j]);
FOR(i,0,30) solve(i);printf("%d %d\n",ans1,ans2);
return 0;
}

[LOJ3083] [GXOI2019] 与或和的更多相关文章

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

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

  2. [LOJ3086] [GXOI2019] 逼死强迫症

    题目链接 LOJ:https://loj.ac/problem/3086 洛谷:https://www.luogu.org/problemnew/show/P5303 Solution 显然不考虑\( ...

  3. GZOI/GXOI2019

    陆陆续续做完了-- 与或和(单调栈) 这是一道一眼题-- 看到位运算,按位考虑贡献.对于每一位,将矩阵中的元素变为"当前元素的这一位是否为\(1\)",那么原矩阵变为\(01\)矩 ...

  4. 「ZJOI Day2」游记

    Day-1 晚上一直在出自己做的模拟赛的T1,真的快要死掉了. 分类讨论几十种情况. 窝还是找了Bluesky大佬一起来验题,她瞬间就A掉了这一道题目...自闭了.. 诶,我还是太弱了. 之前教练组织 ...

  5. Codeforces Forethought Future Cup Elimination Round 选做

    1146C Tree Diameter 题意 交互题.有一棵 \(n(n\le 100)\) 个点的树,你可以进行不超过 \(9\) 次询问,每次询问两个点集中两个不在同一点集的点的最大距离.求树的直 ...

随机推荐

  1. lower_bound( )和upper_bound( )怎么用嘞↓↓↓

    lower_bound( )和upper_bound( )都是利用二分查找的方法在一个排好序的数组中进行查找的. 在从小到大的排序数组中, lower_bound( begin,end,num):从数 ...

  2. php 把数字转化为大写中文—升级版

    继上篇之后,发现某同事悄悄改了新版本,于是被我偷偷保存起来了,功能一样,不过他的比较短小,emmm.放了快一年了,悄悄放到博客里面. 功能需求在另一篇博客里 <?php function cny ...

  3. IDEA启动Springboot时,解决报错java.lang.NoClassDefFoundError: javax/servlet/Filter

    如下所示,将spring-boot-starter-tomcat依赖中的<scope>provided</scope>注释掉 <dependency> <gr ...

  4. Spring Boot-intellij idea导入方式搭建SpringBoot

    Spring Boot概念 从最根本上来讲,Spring Boot就是一些库的集合,它能够被任意项目的构建系统所使用.简便起见,该框架也提供了命令行界面,它可以用来运行和测试Boot应用.框架的发布版 ...

  5. 清理收藏夹中的json

    1.json的字符串与对象转换 $.parseJson(str)与JSON.parse(str) 返回值是true.另:json对象和字符串的相互转换 JSON.stringify(obj) 将JSO ...

  6. 大div套多个小div,怎样设置外div的高度自适应?

    在最后一个div 后面加上 overflow:hidden;如下: <div style="width:580px; height:auto; margin:0 auto; <d ...

  7. 数据分析入门——pandas之DataFrame多层/多级索引与聚合操作

    一.行多层索引 1.隐式创建 在构造函数中给index.colunms等多个数组实现(datafarme与series都可以) df的多级索引创建方法类似: 2.显式创建pd.MultiIndex 其 ...

  8. Python3.7安装(解决ssl问题)

    摘自:https://blog.csdn.net/love_cjiajia/article/details/82254371 python3.7安装(解决ssl的问题) 1) 安装准备 yum -y ...

  9. JVM 线上故障排查基本操作--内容问题排查

    内存问题排查 说完了 CPU 的问题排查,再说说内存的排查,通常,内存的问题就是 GC 的问题,因为 Java 的内存由 GC 管理.有2种情况,一种是内存溢出了,一种是内存没有溢出,但 GC 不健康 ...

  10. LeetCode_409. Longest Palindrome

    409. Longest Palindrome Easy Given a string which consists of lowercase or uppercase letters, find t ...