题目

一个$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. docker compose项目

    本文参考: https://www.cnblogs.com/jmcui/p/9395375.html https://www.cnblogs.com/jmcui/p/9512795.html 1.Do ...

  2. Linux下通过md5sum生成MD5文件&校验MD5

    生成md5值 随便找个文件执行:md5sum file_name  即可生成该文件对应md5值. 也可以一次生成多个文件的md5值:md5sum file_name1 file_name2 file_ ...

  3. Prime Path POJ-3126

    The ministers of the cabinet were quite upset by the message from the Chief of Security stating that ...

  4. 分布式事务:Saga模式

    1 Saga相关概念 1987年普林斯顿大学的Hector Garcia-Molina和Kenneth Salem发表了一篇Paper Sagas,讲述的是如何处理long lived transac ...

  5. Csharp 基础笔记知识点整理

    /* * @version: V.1.0.0.1 * @Author: fenggang * @Date: 2019-06-16 21:26:59 * @LastEditors: fenggang * ...

  6. Ext.urlEncode与Ext.urlDecode

    Ext.urlEncode与Ext.urlDecode: 用于js对象和查询字符串之间的相互转换 Ext.urlEncode例子如下: /* Ext.urlEncode( object, [recur ...

  7. 《Scala程序设计》暨Scala简介

    JVM语言 JVM上的语言越来越多了,从前几年的groovy.Scala和Clojure,现在又听说一门Kotlin.对于前三种语言,groovy算是JVM平台上的动态脚本语言,可以类比Python: ...

  8. 一步一步从PostgreSQL安装到delphi 访问

    今天,我们使用ubuntu 19 来安装PostgreSQL. 1.直接使用包安装 sudo apt-get install postgresql 按Y,直接安装. 安装完毕. 初次安装后,默认生成一 ...

  9. C# 获取指定类型的文件

    C# 获取指定类型的文件 public static List<FileInfo> getFile(string path, string extName) { List<FileI ...

  10. Prometheus学习笔记(5)Grafana可视化展示

    目录 一.Grafana安装和启动 二.配置数据源 三.配置dashboard 四.配置grafana告警 一.Grafana安装和启动 Grafana支持查询Prometheus.从Grafana ...