LG5300 「GZOI2019/GXOI2019」与或和 二进制+单调栈

问题描述

Freda 学习了位运算和矩阵以后,决定对这种简洁而优美的运算,以及蕴含深邃空间的结构进行更加深入的研究。

对于一个由非负整数构成的矩阵,她定义矩阵的 \(\texttt{AND}\) 值为矩阵中所有数二进制 \(\texttt{AND(&)}\) 的运算结果;定义矩阵的 \(\texttt{OR}\) 值为矩阵中所有数二进制 \(\texttt{OR(|)}\) 的运算结果。

给定一个 \(N \times N\) 的矩阵,她希望求出:

  1. 该矩阵的所有子矩阵的 \(\texttt{AND}\) 值之和(所有子矩阵 \(\texttt{AND}\) 值相加的结果)。
  2. 该矩阵的所有子矩阵的 \(\texttt{OR}\) 值之和(所有子矩阵 \(\texttt{OR}\) 值相加的结果)。

接下来的剧情你应该已经猜到——Freda 并不想花费时间解决如此简单的问题,所以这个问题就交给你了。

由于答案可能非常的大,你只需要输出答案对 \(1,000,000,007 (10^9 + 7)\) 取模后的结果。

LG5300


题解

发现 and 和 or 大毒瘤出现开幕雷击,于是考虑按位计算贡献。

问题就简化为了01矩阵。

于是一个子矩阵全是0的话对or有负贡献,全是1的话对and有正贡献。

单调栈维护即可


\(\mathrm{Code}\)

#include<bits/stdc++.h>
using namespace std;

#define int long long

template <typename Tp>
void read(Tp &x){
    x=0;char ch=1;int fh=1;
    while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
    if(ch=='-') ch=getchar(),fh=-1;
    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    x*=fh;
}

const int mod=1000000007;
const int maxn=1007;

int a[maxn][maxn],n;
long long ansor,ansand;
int s[maxn],h[maxn],val[maxn],pos;
int mx;

void Init(void){
    read(n);
    for(int i=1;i<=n;i++) for(int j=1;j<=n;j++)
        read(a[i][j]),mx=max(mx,a[i][j]);
}

long long sqr(long long x){
    return (long long)x*(x+1)/2;
}

int calc(int need){
    long long res=0;
    memset(h,0,sizeof(h));
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if((a[i][j]&1)==need) h[j]++;
            else h[j]=0;
            if(h[j]>s[pos]) s[++pos]=h[j],val[pos]=1;
            else{
                int k=0;
                while(h[j]<s[pos]){
                    k+=val[pos];
                    res=(res+(s[pos]-max(s[pos-1],h[j]))*sqr(k)%mod)%mod;
                    --pos;
                }
                s[++pos]=h[j],val[pos]=k+1;
            }
        }
        int k=0;
        while(pos){
            k+=val[pos];
            res=(res+(s[pos]-s[pos-1])*sqr(k)%mod)%mod;
            --pos;
        }
    }
    return res;
}

void Work(void){
    int tp=0;
    while(mx){
        ansand=(ansand+calc(1)*(1<<tp)%mod)%mod;
        ansor=(ansor+(sqr(n)*sqr(n)%mod-calc(0))*(1<<tp)%mod)%mod;
        mx>>=1;tp++;
        for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) a[i][j]>>=1;
    }
    ansand=(ansand%mod+mod)%mod;
    ansor=(ansor%mod+mod)%mod;
    printf("%lld %lld\n",ansand,ansor);
}

signed main(){
//  freopen("andorsum.in","r",stdin);freopen("andorsum.out","w",stdout);
    Init();
    Work();
}

原文地址:https://www.cnblogs.com/liubainian/p/12181424.html

时间: 2024-10-06 21:53:36

LG5300 「GZOI2019/GXOI2019」与或和 二进制+单调栈的相关文章

怎样将「插件化」接入到项目之中?

本期移动开发精英社群讨论的主题是「插件化」,上网查了一下,发现一篇 CSDN 博主写的文章<Android 使用动态载入框架DL进行插件化开发>.此处引用原作者的话: 随着应用的不断迭代,应用的体积不断增大,项目越来越臃肿,冗余添加.项目新功能的加入,无法确定与用户匹配性,发生严重异常往往牵一发而动全身,仅仅能紧急公布补丁版本号,强制用户进行更新.结果频繁的更新.反而easy减少用户使用黏性,或者是公司业务的不断发展,同系的应用越来越多,传统方式须要通过用户量最大的主项目进行引导下载并安装.

「C语言」常量和变量的表示及应用

先发布,还在修改完善中.. 在程序运行中,其值不能改变的量成为常量.在基本数据类型中,常量可分为整型常量.实型常量.符号常量和字符型常量(包括字符常量和字符串常量),现分别介绍如下: 整型常量 即整常数,由一个或多个数字组成,可以带正负号 C语言中整型常量可用十进制.八进制和十六进制3种形式表示 十进制整数:由0~9数字组成,不能以0开始,没有前缀 八进制整数:以0为前缀,其后由0~7的数字组成,没有小数部分 十六进制整数:以0x或0X开头,其后由0~9的数字和a~f(或A~F字母组成) 另外长

Chrome 扩展 Stylish :给不喜欢某个网站一键「换肤」

原文地址:http://whosmall.com/?post=419 本文标签: Chrome扩展 Chrome浏览器 Chrome插件 Chrome扩展Stylish Stylish是什么 Stylish 是什么? 开门见山,Stylish 的作用是,它可以把百度首页变成这样: 它还能把知乎「拍扁」,让微博网页版变得简洁无比,让 Feedly 用上Material Design-- 这个神奇的 Stylish实际上是一个浏览器插件,适用于 Chrome,Firefox,Opera 以及 Saf

3D高科技投影 麦可「复活登台」幕后

美国告示牌音乐颁奖典礼,日前在赌城盛大举行,主办单位利用高科技投影技术,让麦可杰克森「复活」登台表演,3D全像投影,加上影片与真人舞群无缝接轨,高科技让过世的大明星彷佛活了过来. 流行乐天王麦可杰克森死而复生,过世将近5年的他,又现身在今年美国告示牌音乐颁奖典礼上,金光闪闪现身舞台中央,麦可杰克森回来了,再现招牌的动感舞步,流露巨星风采,主办单位利用3D全像摄影技术,秘密制作了半年多,把他带回到世人眼前. 特效专家:「观众在告示牌典礼上看到的是,麦可的头部数字影像,连接到一名演员身上,我们实时捕

「Maven Tips」(一)自动更新jar包

maven中手动去更新jar包,是一件比较繁琐麻烦的事情,使用Range Dependency则可以省去这一步骤. 部分jar包可能会自动升级到beat版本! 官方说明文档:Dependency Version Ranges Range Meaning (,1.0] version ≤ 1.0 1.0 固定1.0版本 [1.0]   [1.2,1.3] 1.2 ≤ version ≤ 1.3 [1.0,2.0) 1.0 ≤ version ≤ 2.0 [1.5,) version ≥ 1.5 (

Linux 小知识翻译 - 「桌面环境」

这次聊聊桌面环境. 上次聊了 X Window System 相关的内容,虽然令人意外,但X Window System 和桌面环境不是一回事.请大家稍微考虑一下. X Window System 是指提供GUI环境的软件或者协议.与之相对,「桌面环境」是指工具栏,图标,窗口管理器,桌面管理器等等各式各样软件组合起来的GUI软件包. 换句话说,就是「使用桌面所必需的软件的集合」. 有名的桌面环境有「GNOME」和「KDE」.最近,很多Linux的发行版并不关心使用的桌面环境是「GNOME」还是「

王堅:「資料」改變了商業模式,運算能力決定企業的競爭力

阿里巴巴集團技術委員會主席.阿里巴巴的雲端建立者,王堅博士於上週來到台灣,出席了阿里巴巴針對台灣創業者舉辦的一場大會時,發表了他對於雲端運算.大數據以及人工智慧的一些看法以及建議. 由於是針對創業者的場合,王堅針對現在創業者最注意的四個趨勢:網際網路.大數據.雲端運算和人工智慧提出了建議.王堅表示,當初阿里巴巴談電子商務的時候,並不是大家想的簡單的把商店搬到網路上如此而已,而是從「相信網際網路是未來商業的基礎設施」這個基本觀念出發.而現在,你可以看到當初有這樣想法的網路公司,現在都已經成長為科技

AC日记——#2057. 「TJOI / HEOI2016」游戏 LOJ

#2057. 「TJOI / HEOI2016」游戏 思路: 最大流: 代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define INF 0x3f3f3f3f #define maxn 2000005 int n,m,s,t,que[maxn],deep[maxn],toth,totl,F[max

Javascript中颇受诟病的「this错乱」问题

function Countdown(seconds) { this._seconds = seconds; } Countdown.prototype._step = function() { console.log(this._seconds); if (this._seconds > 0) { this._seconds -= 1; } else { clearInterval(this._timer); } }; Countdown.prototype.start = function(