题目

一个$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. 1.ZooKeeper ACL权限控制

    参考:https://blog.csdn.net/liuxiao723846/article/details/79391650 ZK 类似文件系统,Client 可以在上面创建节点.更新节点.删除节点 ...

  2. python爬虫之Scrapy学习

    在爬虫的路上,学习scrapy是一个必不可少的环节.也许有好多朋友此时此刻也正在接触并学习scrapy,那么很好,我们一起学习.开始接触scrapy的朋友可能会有些疑惑,毕竟是一个框架,上来不知从何学 ...

  3. 汽车行业MES系统在产品追溯方面的应用分析

    一.追溯系统定义及分类 追溯系统是指根据或利用已记录的标识,这种标识对每一批产品都具有唯一性,即标识和被追溯对象间是一一对应关系. 追溯系统早期因先后发生多起食品安全事件,比如1996年英国疯牛病,丹 ...

  4. Webpack如何配置sourceMap

    前言:在写这篇文章之前,我必须要吐槽一下webpack了.特别喜欢更新版本,更新就算了,文档还跟不上.文档真的让人迷惑了,大爷的. 背景:由于我正在写sourceMap反向定位源码的功能,所以最近需要 ...

  5. Docker 0x13: Docker 构建集群/服务/Compose/分布式服务栈

    目录 Docker 构建集群/服务/Compose/分布式服务栈 集群 初始化集群服务 安装docker-machine 管理节点和工作节点 docker集群构建完成 集群中部署应用 集群服务访问特性 ...

  6. 【异常】ERROR in ch.qos.logback.core.joran.spi.Interpreter@159:22 - no applicable action for [charset], current ElementPath is [[configuration][appender][encoder][charset]]

    一.异常信息 Exception in thread "restartedMain" java.lang.reflect.InvocationTargetException at ...

  7. Odoo字段类型详解

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10826099.html   一:基本字段类型 Binary:二进制类型,用于保存图片.视频.文件.附件等,在 ...

  8. rootkit——一种特殊的恶意软件,它的功能是在安装目标上隐藏自身及指定的文件、进程和网络链接等信息,一般都和木马、后门等其他恶意程序结合使用

    Rootkit是指其主要功能为隐藏其他程式进程的软件,可能是一个或一个以上的软件组合:广义而言,Rootkit也可视为一项技术.   目录 1 rootkit是什么 2 rootkit的功能 root ...

  9. python测试开发django-66.图片403forbidden

    前言 用 django 开发 web 页面,在 HTML 页面上添加图片时,发现本地图片可以正常显示,但是添加一个互联网的图片,却不能正常显示. 本地 static 图片 先在本地 static 放一 ...

  10. 高小兰 201671010414 实验十四 团队项目评审&课程学习总结

    项目 内容 软件工程 https://www.cnblogs.com/nwnu-daizh/ 作业要求 https://www.cnblogs.com/sunmiaokun/p/11095027.ht ...