题目

一个$n\times m \times l $的立方体,有一些位置有障碍

一次操作会随机选择一个立方体,共有\(w\)次操作

询问所有操作都不选到障碍点,被选到至少一次的点的期望

$n ,m,l \le 60\ , \ w \le 10^9 $

题解

  • 只需要计算不包含障碍且包含一个点的立方体个数

  • 40pts

  • 枚举每一个立方体,前缀和判断一个立方体中是否有障碍,差分统计一个点被多少个立方体包含

  • 时间复杂度:\(O(n^6)\)

  • 100pts

  • \(dp[0-7][x][y][z]\) 表示八个方向的立方体个数

  • 枚举立方体层的范围,将这些层的障碍或起来压成一层

  • 变成在二维上统计矩形的个数,用单调栈即可

  • 前缀和之后可以求出\(dp\),答案可以用\(dp\)统计

  • 时间复杂度:\(O(n^4)\)

    \(O(n^6)\)

    #include<bits/stdc++.h>
    #define mod 998244353
    const int N=100;
    using namespace std;
    int n,m,l,w,a[N][N][N],s[N][N][N],ans,cnt,v[N][N][N],c[N][N][N];
    void inc(int&x,int y){x+=y;if(x>=mod)x-=mod;} int pw(int x,int y){
    int re=1;
    while(y){
    if(y&1)re=1ll*re*x%mod;
    y>>=1;x=1ll*x*x%mod;
    }return re;
    } int cal1(int x){return x*(x+1)/2;}
    int cal2(int i1,int j1,int k1,int i2,int j2,int k2){
    return s[i2][j2][k2]
    -s[i1-1][j2][k2]-s[i2][j1-1][k2]-s[i2][j2][k1-1]
    +s[i1-1][j1-1][k2]+s[i1-1][j2][k1-1]+s[i2][j1-1][k1-1]
    -s[i1-1][j1-1][k1-1];
    }
    void put(int i1,int j1,int k1,int i2,int j2,int k2){
    c[i1][j1][k1]++;
    c[i2+1][j1][k1]--;c[i1][j2+1][k1]--;c[i1][j1][k2+1]--;
    c[i2+1][j2+1][k1]++;c[i2+1][j1][k2+1]++;c[i1][j2+1][k2+1]++;
    c[i2+1][j2+1][k2+1]--;
    }
    void pre(){
    for(int i=1;i<=n;++i)
    for(int j=1;j<=m;++j)
    for(int k=1;k<=l;++k){
    s[i][j][k] =
    a[i][j][k]
    +s[i-1][j][k]+s[i][j-1][k]+s[i][j][k-1]
    -s[i-1][j-1][k]-s[i-1][j][k-1]-s[i][j-1][k-1]
    +s[i-1][j-1][k-1];
    }
    for(int i1=1;i1<=n;++i1)
    for(int j1=1;j1<=m;++j1)
    for(int k1=1;k1<=l;++k1){
    for(int i2=i1;i2<=n;++i2){
    if(cal2(i1,j1,k1,i2,j1,k1))break;
    for(int j2=j1;j2<=m;++j2){
    if(cal2(i1,j1,k1,i2,j2,k1))break;
    for(int k2=k1;k2<=l;++k2){
    if(cal2(i1,j1,k1,i2,j2,k2))break;
    put(i1,j1,k1,i2,j2,k2);
    cnt++;
    }
    }
    }
    }
    for(int i=1;i<=n;++i)
    for(int j=1;j<=m;++j)
    for(int k=1;k<=l;++k){
    c[i][j][k] =
    c[i][j][k]
    +c[i-1][j][k]+c[i][j-1][k]+c[i][j][k-1]
    -c[i-1][j-1][k]-c[i-1][j][k-1]-c[i][j-1][k-1]
    +c[i-1][j-1][k-1];
    }
    }
    int main(){
    freopen("dream.in","r",stdin);
    freopen("dream.out","w",stdout);
    scanf("%d%d%d%d",&n,&m,&l,&w);
    for(int i=1;i<=n;++i)
    for(int j=1;j<=m;++j)
    for(int k=1;k<=l;++k)scanf("%d",&a[i][j][k]),a[i][j][k]^=1;
    for(int i=1;i<=n;++i)
    for(int j=1;j<=m;++j)
    for(int k=1;k<=l;++k)scanf("%d",&v[i][j][k]);
    pre();
    int ip=pw(1ll*cal1(n)*cal1(m)%mod*cal1(l)%mod,mod-2);
    int tmp=pw(1ll*cnt*ip%mod,w);
    for(int I=1;I<=n;++I)
    for(int J=1;J<=m;++J)
    for(int K=1;K<=l;++K)if(!a[I][J][K]){
    a[I][J][K]=1;
    inc(ans,1ll*v[I][J][K]*(tmp-pw(1ll*(cnt-c[I][J][K]+mod)*ip%mod,w)+mod)%mod);
    a[I][J][K]=0;
    }
    cout<<ans<<endl;
    }

    \(O(n^4)\)

    #include<bits/stdc++.h>
    #define mod 998244353
    #define ll long long
    using namespace std;
    const int N=110;
    int n,m,l,w,a[N][N][N],v[N][N][N],s[8][N][N][N],c[N][N],d[N],st[N],f[N],tp,sum,ans;
    void inc(int&x,int y){x+=y;if(x>=mod)x-=mod;}
    int pw(int x,int y){
    int re=1;
    while(y){
    if(y&1)re=(ll)re*x%mod;
    y>>=1;x=(ll)x*x%mod;
    }return re;
    }
    void ins(int x){
    while(tp&&d[x]<=d[st[tp]])tp--;
    sum=f[tp]+abs(x-st[tp])*d[x];
    st[++tp]=x,f[tp]=sum;
    }
    void cal1(int t,int i1,int j1,int k1){
    int i2=t&1?i1+1:i1-1,j2=t&2?j1+1:j1-1,k2=t&4?k1+1:k1-1;
    s[t][i1][j1][k1]=
    (0ll+
    s[t][i1][j1][k1]
    +s[t][i2][j1][k1]+s[t][i1][j2][k1]+s[t][i1][j1][k2]
    -s[t][i1][j2][k2]-s[t][i2][j1][k2]-s[t][i2][j2][k1]
    +s[t][i2][j2][k2]
    )%mod;
    }
    //三维前缀和
    int cal2(int i1,int j1,int k1){
    ll re=
    s[6][i1-1][1][1]+s[7][i1+1][1][1]
    +s[5][1][j1-1][1]+s[7][1][j1+1][1]
    +s[3][1][1][k1-1]+s[7][1][1][k1+1]
    -s[2][i1-1][1][k1-1]-s[3][i1+1][1][k1-1]-s[7][i1+1][1][k1+1]-s[6][i1-1][1][k1+1]
    -s[4][i1-1][j1-1][1]-s[5][i1+1][j1-1][1]-s[7][i1+1][j1+1][1]-s[6][i1-1][j1+1][1]
    -s[1][1][j1-1][k1-1]-s[3][1][j1+1][k1-1]-s[7][1][j1+1][k1+1]-s[5][1][j1-1][k1+1]
    +s[0][i1-1][j1-1][k1-1]+s[1][i1+1][j1-1][k1-1]+s[2][i1-1][j1+1][k1-1]+s[3][i1+1][j1+1][k1-1]
    +s[4][i1-1][j1-1][k1+1]+s[5][i1+1][j1-1][k1+1]+s[6][i1-1][j1+1][k1+1]+s[7][i1+1][j1+1][k1+1]
    ;
    return re%mod;
    }
    //四个卦限-两个卦限+一个卦限
    int main(){
    freopen("dream.in","r",stdin);
    freopen("dream.out","w",stdout);
    scanf("%d%d%d%d",&n,&m,&l,&w);
    for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)for(int k=1;k<=l;++k)scanf("%d",&a[i][j][k]);
    for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)for(int k=1;k<=l;++k)scanf("%d",&v[i][j][k]);
    for(int i1=1;i1<=n;++i1)
    for(int i2=i1;i2<=n;++i2){
    for(int j=1;j<=m;++j)for(int k=1;k<=l;++k)
    c[j][k]=i1==i2?a[i1][j][k]:c[j][k]&a[i2][j][k];
    for(int k=1;k<=l;++k)d[k]=0;
    for(int j=1;j<=m;++j){
    for(int k=1;k<=l;++k)
    if(c[j][k])d[k]++;else d[k]=0;
    st[sum=tp=0]=0;
    for(int k=1;k<=l;++k){
    ins(k);
    s[1][i1][j][k]+=sum;
    s[0][i2][j][k]+=sum;
    }
    st[sum=tp=0]=l+1;
    for(int k=l;k>=1;--k){
    ins(k);
    s[5][i1][j][k]+=sum;
    s[4][i2][j][k]+=sum;
    }
    }
    for(int k=1;k<=l;++k)d[k]=0;
    for(int j=m;j>=1;--j){
    for(int k=1;k<=l;++k)
    if(c[j][k])d[k]++;else d[k]=0;
    st[sum=tp=0]=0;
    for(int k=1;k<=l;++k){
    ins(k);
    s[3][i1][j][k]+=sum;
    s[2][i2][j][k]+=sum;
    }
    st[sum=tp=0]=l+1;
    for(int k=l;k>=1;--k){
    ins(k);
    s[7][i1][j][k]+=sum;
    s[6][i2][j][k]+=sum;
    }
    } }
    for(int i=1;i<=n;++i){
    for(int j=1;j<=m;++j){
    for(int k=1;k<=l;++k)cal1(0,i,j,k);
    for(int k=l;k>=1;--k)cal1(4,i,j,k);
    }
    for(int j=m;j>=1;--j){
    for(int k=1;k<=l;++k)cal1(2,i,j,k);
    for(int k=l;k>=1;--k)cal1(6,i,j,k);
    }
    }
    for(int i=n;i>=1;--i){
    for(int j=1;j<=m;++j){
    for(int k=1;k<=l;++k)cal1(1,i,j,k);
    for(int k=l;k>=1;--k)cal1(5,i,j,k);
    }
    for(int j=m;j>=1;--j){
    for(int k=1;k<=l;++k)cal1(3,i,j,k);
    for(int k=l;k>=1;--k)cal1(7,i,j,k);
    }
    }
    int tmp=pw(s[7][1][1][1],w);
    for(int i=1;i<=n;++i)
    for(int j=1;j<=m;++j)
    for(int k=1;k<=l;++k)if(a[i][j][k]){
    inc(ans , 1ll * v[i][j][k] * (tmp-pw(cal2(i,j,k),w)+mod) %mod);
    }
    ans=1ll*ans*pw(1ll*n*m*l*(n+1)*(m+1)*(l+1)/8%mod,mod-1-w)%mod;
    cout<<ans<<endl;
    return 0;
    }

【JZOJ6230】【20190625】梦批糼的更多相关文章

  1. 5.29 SD省队培训D1

    5.29 SD省队培训D1 自闭的一天 T1 梦批糼 先咕一咕(两天之内一定补上) T2 等你哈苏德 继续咕(一星期之内补上) T3喜欢最最痛 四十分做法: 首先,我们发现同一个点加两条额外边是一件非 ...

  2. DB 查询分析器 6.03 如何灵活、快捷地操作国产达梦数据库

    DB 查询分析器 6.03 如何灵活.快捷地操作国产达梦数据库 马根峰 (广东联合电子服务股份有限公司, 广州 510300) 摘要       本文详细地介绍了"万能数据库查询分析器&qu ...

  3. 最新 梦网科技java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.梦网科技等10家互联网公司的校招Offer,因为某些自身原因最终选择了梦网科技.6.7月主要是做系统复习.项目复盘.Leet ...

  4. 最新 创梦天地java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.创梦天地等10家互联网公司的校招Offer,因为某些自身原因最终选择了创梦天地.6.7月主要是做系统复习.项目复盘.Leet ...

  5. 【干货分享】流程DEMO-事务呈批表

    流程名: 事务呈批表  业务描述: 办公采购.会议费用等事务的申请.流程发起时,会检查预算,如果预算不够,将不允许发起费用申请,如果预算够用,将发起流程,同时占用相应金额的预算,但撤销流程会释放相应金 ...

  6. 一个技术汪的开源梦 —— 基于 .Net Core 的组件 Nuget 包制作 & 发布

    一个技术汪的开源梦 —— 目录 微软的 ASP.Net Core 强化了 Nuget 的使用,所有的 .Net Core 组件均有 Nuget 管理,所以有必要探讨一下 .Net Core 组件制作 ...

  7. 一个技术汪的开源梦 —— 基于 .Net Core 的公共组件之 Http 请求客户端

    一个技术汪的开源梦 —— 目录 想必大家在项目开发的时候应该都在程序中调用过自己内部的接口或者使用过第三方提供的接口,咱今天不讨论 REST ,最常用的请求应该就是 GET 和 POST 了,那下面开 ...

  8. 一个技术汪的开源梦 —— 基于 .Net Core 的公共组件之序列化

    一个技术汪的开源梦 —— 目录 想必大家在项目中都接触过 JSON 或者 XML 吧,为了将对象在网络上传输或者将其持久化必须将其序列化为一个字符串然后进行后续操作.常见的就是将其序列化成 JSON ...

  9. 一个技术汪的开源梦 —— 基于 .Net Core 的公共组件之目录结构

    一个技术汪的开源梦 —— 目录 这篇文章是开源公共组件的开篇那就先说说项目的 Github 目录结构和 .Net Core 的项目结构. 1. GitHub 目录结构和相关文件 - src 源码项目目 ...

随机推荐

  1. 基于Mybatis-Plus实现自动化操作创建时间和修改时间

    引入 在实际开发中,总会避免不了操作数据库,而在数据库中每个表都会有create_time和update_time字段记录操作时间,我们在操作这两个时间的时候也可能会出现不一致的情况,或者说这两个字段 ...

  2. windows上 nginx 配置代理服务,配置多域名,以及最简单实现跨域配置

    Nginx,不用多说啦,大家都熟悉的不能再熟悉了,它是一款轻量级的高性能Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,最近在本地研究将nginx和resin配合使用,使服务 ...

  3. 关于注解sql和动态sql的写法

    注解写sql一般写在mapper层,如果sql语句复杂建议不要写注解sql 拼接容易出错 二动态sql的话要在 main 下面创建一个resource ——mapper—— Mapper.xml 再在 ...

  4. java之maven之初识maven

    1.maven是一个项目管理工具. 包括项目创建.资源管理.项目运行.项目发布等功能. 2.为什么使用 maven? a. jar 依赖管理(升级.降级)等 b. 项目之间依赖管理 c. 资源文件管理 ...

  5. 12 ARM汇编

    Android系统采用java作为平台软件基础开发语言,NDK使Android平台可以运行C/C++代码这些代码汇编成ARM的elf可执行文件. 原生程序生成过程 经历4步:1.预处理2.编译3.汇编 ...

  6. BERT解析及文本分类应用

    目录 前言 BERT模型概览 Seq2Seq Attention Transformer encoder部分 Decoder部分 BERT Embedding 预训练 文本分类试验 参考文献 前言 在 ...

  7. MongoDB Spark Connector 实战指南

    Why Spark with MongoDB? 高性能,官方号称 100x faster,因为可以全内存运行,性能提升肯定是很明显的 简单易用,支持 Java.Python.Scala.SQL 等多种 ...

  8. prometheus学习系列七: Prometheus promQL查询语言

    Prometheus promQL查询语言 Prometheus提供了一种名为PromQL (Prometheus查询语言)的函数式查询语言,允许用户实时选择和聚合时间序列数据.表达式的结果既可以显示 ...

  9. 浅谈Python设计模式 - 外观模式

    声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 外观模式 外观模式的核心在于将复杂的内部实现包装起来,只向外界提供简单的调用接口 ...

  10. IDEA 创建类是自动添加注释和创建方法时快速添加注释

    1.创建类是自动添加注释 /*** @Author: chiyl* @DateTime: ${DATE} ${TIME}* @Description: TODO*/2. 创建方法时快速添加注释2.1 ...