• 【洛谷5300】[GXOI/GZOI2019] 与或和(单调栈水题)


    点此看题面

    • 给定一个(n imes n)的矩阵,分别求出所有子矩阵(AND)值之和及所有子矩阵(OR)值之和。
    • (nle1000)

    按位讨论+单调栈

    由于按位与和按位或二进制下每位是独立的,完全可以按位讨论。

    那么就变成一个(01)矩阵,利用总数-全(0)矩阵数=含(1)矩阵数的简单容斥转化掉按位或之后,问题就在于如何求出全(1)矩阵和全(0)矩阵的数目。

    以全(1)矩阵为例,设(f_{i,j})((i,j))向上连续(1)的数目,则((i,j))(0)(f_{i,j}=0),否则(f_{i,j}=f_{i-1,j}+1)

    那么右下角为((i,j)),左下角为((i,k))的矩形数目就是(min_{p=k}^jf_{i,p})。更新时加入一个(f_{i,j})相当于全局向它取(min),用单调栈维护即可。

    代码:(O(n^2logV))

    #include<bits/stdc++.h>
    #define Tp template<typename Ty>
    #define Ts template<typename Ty,typename... Ar>
    #define Reg register
    #define RI Reg int
    #define Con const
    #define CI Con int&
    #define I inline
    #define W while
    #define N 1000
    #define X 1000000007
    using namespace std;
    int n,a[N+5][N+5],s[N+5][N+5];
    namespace FastIO
    {
    	#define FS 100000
    	#define tc() (FA==FB&&(FB=(FA=FI)+fread(FI,1,FS,stdin),FA==FB)?EOF:*FA++)
    	char oc,FI[FS],*FA=FI,*FB=FI;
    	Tp I void read(Ty& x) {x=0;W(!isdigit(oc=tc()));W(x=(x<<3)+(x<<1)+(oc&15),isdigit(oc=tc()));}
    	Ts I void read(Ty& x,Ar&... y) {read(x),read(y...);}
    }using namespace FastIO;
    int S[N+5],P[N+5],f[N+5][N+5];I int Calc()//求全1矩阵数目
    {
    	RI i,j,t=0,g,T;for(i=1;i<=n;++i) for(g=T=0,j=1;j<=n;++j)
    	{
    		f[i][j]=s[i][j]?f[i-1][j]+1:0;W(T&&S[T]>=f[i][j]) g=(g-S[T]*(P[T]-P[T-1])+X)%X,--T;//维护单调性,g维护总和
    		S[++T]=f[i][j],P[T]=j,g=(g+S[T]*(P[T]-P[T-1]))%X,t=(t+g)%X;//加入当前段,然后更新答案
    	}
    	return t;
    }
    int main()
    {
    	RI i,j,tot=0;for(read(n),i=1;i<=n;++i) for(j=1;j<=n;++j) read(a[i][j]),tot=(tot+i*j)%X;//tot统计矩阵总数
    	RI t1=0,t2=0;for(RI k=0;k<=30;++k)//按位讨论
    	{
    		for(i=1;i<=n;++i) for(j=1;j<=n;++j) s[i][j]=a[i][j]>>k&1;t1=(t1+(1LL*Calc()<<k))%X;//全1矩阵数
    		for(i=1;i<=n;++i) for(j=1;j<=n;++j) s[i][j]^=1;t2=(t2+((1LL*tot-Calc()+X)<<k))%X;//总数-全0矩阵数
    	}
    	return printf("%d %d
    ",t1,t2),0;
    }
    
    败得义无反顾,弱得一无是处
  • 相关阅读:
    ios tableviewcontroller
    jsp第十次作业
    jsp第九次作业
    jsp第八次作业
    jsp第七次作业
    jsp第六次作业
    jsp第五次作业
    jsp第四周作业-2
    jsp第四周作业-1
    软件测试第四周作业
  • 原文地址:https://www.cnblogs.com/chenxiaoran666/p/Luogu5300.html
Copyright © 2020-2023  润新知